diff options
Diffstat (limited to 'editor')
331 files changed, 32647 insertions, 12941 deletions
diff --git a/editor/SCsub b/editor/SCsub index d149cc6273..87153f3b2b 100644 --- a/editor/SCsub +++ b/editor/SCsub @@ -5,7 +5,6 @@ Import("env") env.editor_sources = [] import os -import os.path import glob import editor_builders @@ -59,7 +58,7 @@ if env["tools"]: else: docs += Glob(d + "/*.xml") # Custom. - _make_doc_data_class_path(os.path.join(env.Dir("#").abspath, "editor")) + _make_doc_data_class_path(env.Dir("#editor").abspath) docs = sorted(docs) env.Depends("#editor/doc_data_compressed.gen.h", docs) @@ -69,10 +68,17 @@ if env["tools"]: env.Run(editor_builders.make_doc_header, "Generating documentation header."), ) - path = env.Dir(".").abspath + # Editor interface and class reference translations incur a significant size + # cost for the editor binary (see godot-proposals#3421). + # To limit it, we only include translations with a high enough completion + # ratio (30% for the editor UI, 10% for the class reference). + # Generated with `make include-list` for each resource. # Editor translations - tlist = glob.glob(path + "/translations/*.po") + to_include = ( + "ar,bg,bn,ca,cs,de,el,eo,es_AR,es,fi,fr,gl,he,hu,id,it,ja,ko,lv,ms,nb,nl,pl,pt_BR,pt,ro,ru,sk,sv,th,tr,uk,vi,zh_CN,zh_TW" + ).split(",") + tlist = [env.Dir("#editor/translations").abspath + "/" + f + ".po" for f in to_include] env.Depends("#editor/editor_translations.gen.h", tlist) env.CommandNoCache( "#editor/editor_translations.gen.h", @@ -81,7 +87,8 @@ if env["tools"]: ) # Documentation translations - tlist = glob.glob(env.Dir("#doc").abspath + "/translations/*.po") + to_include = "de,es,fr,ja,zh_CN".split(",") + tlist = [env.Dir("#doc/translations").abspath + "/" + f + ".po" for f in to_include] env.Depends("#editor/doc_translations.gen.h", tlist) env.CommandNoCache( "#editor/doc_translations.gen.h", @@ -90,8 +97,8 @@ if env["tools"]: ) # Fonts - flist = glob.glob(path + "/../thirdparty/fonts/*.ttf") - flist.extend(glob.glob(path + "/../thirdparty/fonts/*.otf")) + flist = glob.glob(env.Dir("#thirdparty").abspath + "/fonts/*.ttf") + flist.extend(glob.glob(env.Dir("#thirdparty").abspath + "/fonts/*.otf")) flist.sort() env.Depends("#editor/builtin_fonts.gen.h", flist) env.CommandNoCache( @@ -101,6 +108,7 @@ if env["tools"]: ) env.add_source_files(env.editor_sources, "*.cpp") + env.add_source_files(env.editor_sources, "register_exporters.gen.cpp") SConscript("debugger/SCsub") SConscript("fileserver/SCsub") diff --git a/editor/action_map_editor.cpp b/editor/action_map_editor.cpp index 363d542fd5..dc0c62fbc9 100644 --- a/editor/action_map_editor.cpp +++ b/editor/action_map_editor.cpp @@ -36,8 +36,8 @@ ///////////////////////////////////////// -// Maps to 2*axis if value is neg, or + 1 if value is pos. -static const char *_joy_axis_descriptions[JOY_AXIS_MAX * 2] = { +// Maps to 2*axis if value is neg, or 2*axis+1 if value is pos. +static const char *_joy_axis_descriptions[(size_t)JoyAxis::MAX * 2] = { TTRC("Left Stick Left, Joystick 0 Left"), TTRC("Left Stick Right, Joystick 0 Right"), TTRC("Left Stick Up, Joystick 0 Up"), @@ -67,11 +67,11 @@ String InputEventConfigurationDialog::get_event_text(const Ref<InputEvent> &p_ev Ref<InputEventJoypadMotion> jpmotion = p_event; if (jpmotion.is_valid()) { String desc = TTR("Unknown Joypad Axis"); - if (jpmotion->get_axis() < JOY_AXIS_MAX) { - desc = RTR(_joy_axis_descriptions[2 * jpmotion->get_axis() + (jpmotion->get_axis_value() < 0 ? 0 : 1)]); + if (jpmotion->get_axis() < JoyAxis::MAX) { + desc = RTR(_joy_axis_descriptions[2 * (size_t)jpmotion->get_axis() + (jpmotion->get_axis_value() < 0 ? 0 : 1)]); } - return vformat("Joypad Axis %s %s (%s)", itos(jpmotion->get_axis()), jpmotion->get_axis_value() < 0 ? "-" : "+", desc); + return vformat("Joypad Axis %s %s (%s)", itos((int64_t)jpmotion->get_axis()), jpmotion->get_axis_value() < 0 ? "-" : "+", desc); } else { return p_event->as_text(); } @@ -108,7 +108,7 @@ void InputEventConfigurationDialog::_set_event(const Ref<InputEvent> &p_event) { if (k.is_valid()) { show_phys_key = true; - physical_key_checkbox->set_pressed(k->get_physical_keycode() != 0 && k->get_keycode() == 0); + physical_key_checkbox->set_pressed(k->get_physical_keycode() != Key::NONE && k->get_keycode() == Key::NONE); } else if (joyb.is_valid() || joym.is_valid() || mb.is_valid()) { show_device = true; @@ -238,10 +238,16 @@ void InputEventConfigurationDialog::_listen_window_input(const Ref<InputEvent> & Ref<InputEventJoypadButton> joyb = p_event; Ref<InputEventJoypadMotion> joym = p_event; - int type = k.is_valid() ? INPUT_KEY : joyb.is_valid() ? INPUT_JOY_BUTTON : - joym.is_valid() ? INPUT_JOY_MOTION : - mb.is_valid() ? INPUT_MOUSE_BUTTON : - 0; + int type = 0; + if (k.is_valid()) { + type = INPUT_KEY; + } else if (joyb.is_valid()) { + type = INPUT_JOY_BUTTON; + } else if (joym.is_valid()) { + type = INPUT_JOY_MOTION; + } else if (mb.is_valid()) { + type = INPUT_MOUSE_BUTTON; + } if (!(allowed_input_types & type)) { return; @@ -254,7 +260,7 @@ void InputEventConfigurationDialog::_listen_window_input(const Ref<InputEvent> & return; } else { // Always make the value 1 or -1 for display consistency - joym->set_axis_value(SGN(axis_value)); + joym->set_axis_value(SIGN(axis_value)); } } @@ -262,9 +268,9 @@ void InputEventConfigurationDialog::_listen_window_input(const Ref<InputEvent> & k->set_pressed(false); // to avoid serialisation of 'pressed' property - doesn't matter for actions anyway. // Maintain physical keycode option state if (physical_key_checkbox->is_pressed()) { - k->set_keycode(KEY_NONE); + k->set_keycode(Key::NONE); } else { - k->set_physical_keycode(KEY_NONE); + k->set_physical_keycode(Key::NONE); } } @@ -319,7 +325,7 @@ void InputEventConfigurationDialog::_update_input_list() { mouse_root->set_collapsed(collapse); mouse_root->set_meta("__type", INPUT_MOUSE_BUTTON); - MouseButton mouse_buttons[9] = { MOUSE_BUTTON_LEFT, MOUSE_BUTTON_RIGHT, MOUSE_BUTTON_MIDDLE, MOUSE_BUTTON_WHEEL_UP, MOUSE_BUTTON_WHEEL_DOWN, MOUSE_BUTTON_WHEEL_LEFT, MOUSE_BUTTON_WHEEL_RIGHT, MOUSE_BUTTON_XBUTTON1, MOUSE_BUTTON_XBUTTON2 }; + MouseButton mouse_buttons[9] = { MouseButton::LEFT, MouseButton::RIGHT, MouseButton::MIDDLE, MouseButton::WHEEL_UP, MouseButton::WHEEL_DOWN, MouseButton::WHEEL_LEFT, MouseButton::WHEEL_RIGHT, MouseButton::MB_XBUTTON1, MouseButton::MB_XBUTTON2 }; for (int i = 0; i < 9; i++) { Ref<InputEventMouseButton> mb; mb.instantiate(); @@ -343,7 +349,7 @@ void InputEventConfigurationDialog::_update_input_list() { joyb_root->set_collapsed(collapse); joyb_root->set_meta("__type", INPUT_JOY_BUTTON); - for (int i = 0; i < JOY_BUTTON_MAX; i++) { + for (int i = 0; i < (int)JoyButton::MAX; i++) { Ref<InputEventJoypadButton> joyb; joyb.instantiate(); joyb->set_button_index((JoyButton)i); @@ -366,7 +372,7 @@ void InputEventConfigurationDialog::_update_input_list() { joya_root->set_collapsed(collapse); joya_root->set_meta("__type", INPUT_JOY_MOTION); - for (int i = 0; i < JOY_AXIS_MAX * 2; i++) { + for (int i = 0; i < (int)JoyAxis::MAX * 2; i++) { int axis = i / 2; int direction = (i & 1) ? 1 : -1; Ref<InputEventJoypadMotion> joym; @@ -447,10 +453,10 @@ void InputEventConfigurationDialog::_physical_keycode_toggled(bool p_checked) { if (p_checked) { k->set_physical_keycode(k->get_keycode()); - k->set_keycode(KEY_NONE); + k->set_keycode(Key::NONE); } else { k->set_keycode((Key)k->get_physical_keycode()); - k->set_physical_keycode(KEY_NONE); + k->set_physical_keycode(Key::NONE); } _set_event(k); @@ -474,9 +480,9 @@ void InputEventConfigurationDialog::_input_list_item_selected() { if (physical_key_checkbox->is_pressed()) { k->set_physical_keycode(keycode); - k->set_keycode(KEY_NONE); + k->set_keycode(Key::NONE); } else { - k->set_physical_keycode(KEY_NONE); + k->set_physical_keycode(Key::NONE); k->set_keycode(keycode); } @@ -571,7 +577,13 @@ void InputEventConfigurationDialog::popup_and_configure(const Ref<InputEvent> &p for (int i = 0; i < MOD_MAX; i++) { mod_checkboxes[i]->set_pressed(false); } - physical_key_checkbox->set_pressed(false); + + // Enable the Physical Key checkbox by default to encourage its use. + // Physical Key should be used for most game inputs as it allows keys to work + // on non-QWERTY layouts out of the box. + // This is especially important for WASD movement layouts. + physical_key_checkbox->set_pressed(true); + store_command_checkbox->set_pressed(true); _set_current_device(0); @@ -702,7 +714,7 @@ InputEventConfigurationDialog::InputEventConfigurationDialog() { physical_key_checkbox = memnew(CheckBox); physical_key_checkbox->set_text(TTR("Use Physical Keycode")); - physical_key_checkbox->set_tooltip(TTR("Stores the physical position of the key on the keyboard rather than the keys value. Used for compatibility with non-latin layouts.")); + physical_key_checkbox->set_tooltip(TTR("Stores the physical position of the key on the keyboard rather than the key's value. Used for compatibility with non-latin layouts.\nThis should generally be enabled for most game shortcuts, but not in non-game applications.")); physical_key_checkbox->connect("toggled", callable_mp(this, &InputEventConfigurationDialog::_physical_keycode_toggled)); physical_key_checkbox->hide(); additional_options_container->add_child(physical_key_checkbox); @@ -835,7 +847,7 @@ void ActionMapEditor::_tree_button_pressed(Object *p_item, int p_column, int p_i int event_index = item->get_meta("__index"); Array events = action["events"]; - events.remove(event_index); + events.remove_at(event_index); action["events"] = events; emit_signal(SNAME("action_edited"), action_name, action); diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index 02b4a12b92..f7f88ad0d5 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -187,7 +187,7 @@ void AnimationBezierTrackEdit::_draw_line_clipped(const Vector2 &p_from, const V Vector2 from = p_from; Vector2 to = p_to; - if (from.x == to.x) { + if (from.x == to.x && from.y == to.y) { return; } if (to.x < from.x) { @@ -222,11 +222,6 @@ void AnimationBezierTrackEdit::_notification(int p_what) { bezier_icon = get_theme_icon(SNAME("KeyBezierPoint"), SNAME("EditorIcons")); bezier_handle_icon = get_theme_icon(SNAME("KeyBezierHandle"), SNAME("EditorIcons")); selected_icon = get_theme_icon(SNAME("KeyBezierSelected"), SNAME("EditorIcons")); - if (handle_mode_option->get_item_count() == 0) { - handle_mode_option->add_icon_item(get_theme_icon(SNAME("BezierHandlesFree"), SNAME("EditorIcons")), TTR("Free"), HANDLE_MODE_FREE); - handle_mode_option->add_icon_item(get_theme_icon(SNAME("BezierHandlesBalanced"), SNAME("EditorIcons")), TTR("Balanced"), HANDLE_MODE_BALANCED); - handle_mode_option->add_icon_item(get_theme_icon(SNAME("BezierHandlesMirror"), SNAME("EditorIcons")), TTR("Mirror"), HANDLE_MODE_MIRROR); - } } if (p_what == NOTIFICATION_RESIZED) { int right_limit = get_size().width - timeline->get_buttons_width(); @@ -420,9 +415,9 @@ void AnimationBezierTrackEdit::_notification(int p_what) { //draw editor handles { - float scale = timeline->get_zoom_scale(); edit_points.clear(); + float scale = timeline->get_zoom_scale(); for (int i = 0; i < animation->track_get_key_count(track); i++) { float offset = animation->track_get_key_time(track, i); float value = animation->bezier_track_get_key_value(track, i); @@ -438,7 +433,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) { if (moving_handle != 0 && moving_handle_key == i) { in_vec = moving_handle_left; } - Vector2 pos_in = Vector2(((offset + in_vec.x) - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value + in_vec.y)); + Vector2 pos_in(((offset + in_vec.x) - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value + in_vec.y)); Vector2 out_vec = animation->bezier_track_get_key_out_handle(track, i); @@ -446,7 +441,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) { out_vec = moving_handle_right; } - Vector2 pos_out = Vector2(((offset + out_vec.x) - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value + out_vec.y)); + Vector2 pos_out(((offset + out_vec.x) - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value + out_vec.y)); _draw_line_clipped(pos, pos_in, accent, limit, right_limit); _draw_line_clipped(pos, pos_out, accent, limit, right_limit); @@ -581,11 +576,21 @@ void AnimationBezierTrackEdit::_clear_selection() { update(); } +void AnimationBezierTrackEdit::_change_selected_keys_handle_mode(Animation::HandleMode p_mode) { + undo_redo->create_action(TTR("Update Selected Key Handles")); + double ratio = timeline->get_zoom_scale() * v_zoom; + for (Set<int>::Element *E = selection.back(); E; E = E->prev()) { + const int key_index = E->get(); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_handle_mode", track, key_index, animation->bezier_track_get_key_handle_mode(track, key_index), ratio); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_handle_mode", track, key_index, p_mode, ratio); + } + undo_redo->commit_action(); +} + void AnimationBezierTrackEdit::_clear_selection_for_anim(const Ref<Animation> &p_anim) { if (!(animation == p_anim)) { return; } - //selection.clear(); _clear_selection(); } @@ -618,7 +623,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN) { const float v_zoom_orig = v_zoom; if (mb->is_command_pressed()) { timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05); @@ -631,7 +636,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { update(); } - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) { const float v_zoom_orig = v_zoom; if (mb->is_command_pressed()) { timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() * 1.05); @@ -644,7 +649,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { update(); } - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_MIDDLE) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::MIDDLE) { if (mb->is_pressed()) { int x = mb->get_position().x - timeline->get_name_limit(); panning_timeline_from = x / timeline->get_zoom_scale(); @@ -655,7 +660,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) { menu_insert_key = mb->get_position(); if (menu_insert_key.x >= timeline->get_name_limit() && menu_insert_key.x <= get_size().width - timeline->get_buttons_width()) { Vector2 popup_pos = get_global_transform().xform(mb->get_position()); @@ -667,6 +672,9 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { menu->add_icon_item(get_theme_icon(SNAME("Duplicate"), SNAME("EditorIcons")), TTR("Duplicate Selected Key(s)"), MENU_KEY_DUPLICATE); menu->add_separator(); menu->add_icon_item(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Delete Selected Key(s)"), MENU_KEY_DELETE); + menu->add_separator(); + menu->add_icon_item(get_theme_icon(SNAME("BezierHandlesFree"), SNAME("EditorIcons")), TTR("Make Handles Free"), MENU_KEY_SET_HANDLE_FREE); + menu->add_icon_item(get_theme_icon(SNAME("BezierHandlesBalanced"), SNAME("EditorIcons")), TTR("Make Handles Balanced"), MENU_KEY_SET_HANDLE_BALANCED); } menu->set_as_minsize(); @@ -675,11 +683,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { - if (close_icon_rect.has_point(mb->get_position())) { - emit_signal(SNAME("close_request")); - return; - } + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { for (const KeyValue<int, Rect2> &E : subtracks) { if (E.value.has_point(mb->get_position())) { set_animation_and_track(animation, E.key); @@ -746,7 +750,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { //insert new point if (mb->is_command_pressed() && mb->get_position().x >= timeline->get_name_limit() && mb->get_position().x < get_size().width - timeline->get_buttons_width()) { Array new_point; - new_point.resize(5); + new_point.resize(6); float h = (get_size().height / 2 - mb->get_position().y) * v_zoom + v_scroll; @@ -755,6 +759,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { new_point[2] = 0; new_point[3] = 0.25; new_point[4] = 0; + new_point[5] = 0; float time = ((mb->get_position().x - timeline->get_name_limit()) / timeline->get_zoom_scale()) + timeline->get_value(); while (animation->track_find_key(track, time, true) != -1) { @@ -792,7 +797,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } } - if (box_selecting_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (box_selecting_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { if (box_selecting) { //do actual select if (!box_selecting_add) { @@ -822,7 +827,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { update(); } - if (moving_handle != 0 && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (moving_handle != 0 && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { undo_redo->create_action(TTR("Move Bezier Points")); undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", track, moving_handle_key, moving_handle_left); undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", track, moving_handle_key, moving_handle_right); @@ -834,7 +839,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { update(); } - if (moving_selection_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (moving_selection_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { if (moving_selection) { //combit it @@ -929,7 +934,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { + if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_MIDDLE) != MouseButton::NONE) { v_scroll += mm->get_relative().y * v_zoom; if (v_scroll > 100000) { v_scroll = 100000; @@ -986,33 +991,49 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { if (moving_handle == -1) { moving_handle_left = moving_handle_value; - if (moving_handle_left.x > 0) { - moving_handle_left.x = 0; - } - if (handle_mode_option->get_selected() == HANDLE_MODE_BALANCED) { - Vector2 scale = Vector2(timeline->get_zoom_scale(), v_zoom); - moving_handle_right = (-(moving_handle_left * scale).normalized() * (moving_handle_right * scale).length()) / scale; + if (animation->bezier_track_get_key_handle_mode(track, moving_handle_key) == Animation::HANDLE_MODE_BALANCED) { + double ratio = timeline->get_zoom_scale() * v_zoom; + Transform2D xform; + xform.set_scale(Vector2(1.0, 1.0 / ratio)); - } else if (handle_mode_option->get_selected() == HANDLE_MODE_MIRROR) { - moving_handle_right = -moving_handle_left; - } - } + Vector2 vec_out = xform.xform(moving_handle_right); + Vector2 vec_in = xform.xform(moving_handle_left); - if (moving_handle == 1) { - moving_handle_right = moving_handle_value; - if (moving_handle_right.x < 0) { - moving_handle_right.x = 0; + moving_handle_right = xform.affine_inverse().xform(-vec_in.normalized() * vec_out.length()); } + } else if (moving_handle == 1) { + moving_handle_right = moving_handle_value; + + if (animation->bezier_track_get_key_handle_mode(track, moving_handle_key) == Animation::HANDLE_MODE_BALANCED) { + double ratio = timeline->get_zoom_scale() * v_zoom; + Transform2D xform; + xform.set_scale(Vector2(1.0, 1.0 / ratio)); - if (handle_mode_option->get_selected() == HANDLE_MODE_BALANCED) { - Vector2 scale = Vector2(timeline->get_zoom_scale(), v_zoom); - moving_handle_left = (-(moving_handle_right * scale).normalized() * (moving_handle_left * scale).length()) / scale; - } else if (handle_mode_option->get_selected() == HANDLE_MODE_MIRROR) { - moving_handle_left = -moving_handle_right; + Vector2 vec_in = xform.xform(moving_handle_left); + Vector2 vec_out = xform.xform(moving_handle_right); + + moving_handle_left = xform.affine_inverse().xform(-vec_out.normalized() * vec_in.length()); } } + update(); + } + + bool is_finishing_key_handle_drag = moving_handle != 0 && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT; + if (is_finishing_key_handle_drag) { + undo_redo->create_action(TTR("Move Bezier Points")); + if (moving_handle == -1) { + double ratio = timeline->get_zoom_scale() * v_zoom; + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", track, moving_handle_key, moving_handle_left, ratio); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_in_handle", track, moving_handle_key, animation->bezier_track_get_key_in_handle(track, moving_handle_key), ratio); + } else if (moving_handle == 1) { + double ratio = timeline->get_zoom_scale() * v_zoom; + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", track, moving_handle_key, moving_handle_right, ratio); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_out_handle", track, moving_handle_key, animation->bezier_track_get_key_out_handle(track, moving_handle_key), ratio); + } + undo_redo->commit_action(); + moving_handle = 0; update(); } } @@ -1021,7 +1042,7 @@ void AnimationBezierTrackEdit::_menu_selected(int p_index) { switch (p_index) { case MENU_KEY_INSERT: { Array new_point; - new_point.resize(5); + new_point.resize(6); float h = (get_size().height / 2 - menu_insert_key.y) * v_zoom + v_scroll; @@ -1030,6 +1051,7 @@ void AnimationBezierTrackEdit::_menu_selected(int p_index) { new_point[2] = 0; new_point[3] = 0.25; new_point[4] = 0; + new_point[5] = Animation::HANDLE_MODE_BALANCED; float time = ((menu_insert_key.x - timeline->get_name_limit()) / timeline->get_zoom_scale()) + timeline->get_value(); while (animation->track_find_key(track, time, true) != -1) { @@ -1048,6 +1070,12 @@ void AnimationBezierTrackEdit::_menu_selected(int p_index) { case MENU_KEY_DELETE: { delete_selection(); } break; + case MENU_KEY_SET_HANDLE_FREE: { + _change_selected_keys_handle_mode(Animation::HANDLE_MODE_FREE); + } break; + case MENU_KEY_SET_HANDLE_BALANCED: { + _change_selected_keys_handle_mode(Animation::HANDLE_MODE_BALANCED); + } break; } } @@ -1118,6 +1146,7 @@ void AnimationBezierTrackEdit::delete_selection() { undo_redo->add_do_method(this, "_clear_selection_for_anim", animation); undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); undo_redo->commit_action(); + //selection.clear(); } } @@ -1150,8 +1179,6 @@ AnimationBezierTrackEdit::AnimationBezierTrackEdit() { set_focus_mode(FOCUS_CLICK); set_clip_contents(true); - handle_mode = HANDLE_MODE_FREE; - handle_mode_option = memnew(OptionButton); close_button = memnew(Button); close_button->connect("pressed", Callable(this, SNAME("emit_signal")), varray(SNAME("close_request"))); @@ -1160,7 +1187,6 @@ AnimationBezierTrackEdit::AnimationBezierTrackEdit() { right_column = memnew(VBoxContainer); right_column->add_child(close_button); right_column->add_spacer(); - right_column->add_child(handle_mode_option); add_child(right_column); menu = memnew(PopupMenu); diff --git a/editor/animation_bezier_editor.h b/editor/animation_bezier_editor.h index 578c6f9337..4b46777cfe 100644 --- a/editor/animation_bezier_editor.h +++ b/editor/animation_bezier_editor.h @@ -36,21 +36,14 @@ class AnimationBezierTrackEdit : public Control { GDCLASS(AnimationBezierTrackEdit, Control); - enum HandleMode { - HANDLE_MODE_FREE, - HANDLE_MODE_BALANCED, - HANDLE_MODE_MIRROR - }; - enum { MENU_KEY_INSERT, MENU_KEY_DUPLICATE, - MENU_KEY_DELETE + MENU_KEY_DELETE, + MENU_KEY_SET_HANDLE_FREE, + MENU_KEY_SET_HANDLE_BALANCED, }; - HandleMode handle_mode; - OptionButton *handle_mode_option; - VBoxContainer *right_column; Button *close_button; @@ -69,8 +62,6 @@ class AnimationBezierTrackEdit : public Control { Ref<Texture2D> bezier_handle_icon; Ref<Texture2D> selected_icon; - Rect2 close_icon_rect; - Map<int, Rect2> subtracks; float v_scroll = 0; @@ -104,10 +95,12 @@ class AnimationBezierTrackEdit : public Control { int moving_handle_key = 0; Vector2 moving_handle_left; Vector2 moving_handle_right; + int moving_handle_mode; // value from Animation::HandleMode void _clear_selection(); void _clear_selection_for_anim(const Ref<Animation> &p_anim); void _select_at_anim(const Ref<Animation> &p_anim, int p_track, float p_pos); + void _change_selected_keys_handle_mode(Animation::HandleMode p_mode); Vector2 menu_insert_key; diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index 14ca35a664..f36a2099d5 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -39,6 +39,7 @@ #include "editor_scale.h" #include "scene/animation/animation_player.h" #include "scene/main/window.h" +#include "scene/scene_string_names.h" #include "servers/audio/audio_stream.h" class AnimationTrackKeyEdit : public Object { @@ -165,21 +166,40 @@ public: } switch (animation->track_get_type(track)) { - case Animation::TYPE_TRANSFORM3D: { - Dictionary d_old = animation->track_get_key_value(track, key); - Dictionary d_new = d_old.duplicate(); - d_new[p_name] = p_value; - setting = true; - undo_redo->create_action(TTR("Anim 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); - undo_redo->add_do_method(this, "_update_obj", animation); - undo_redo->add_undo_method(this, "_update_obj", animation); - undo_redo->commit_action(); + case Animation::TYPE_POSITION_3D: + case Animation::TYPE_ROTATION_3D: + case Animation::TYPE_SCALE_3D: { + if (name == "position" || name == "rotation" || name == "scale") { + Variant old = animation->track_get_key_value(track, key); + setting = true; + String chan; + switch (animation->track_get_type(track)) { + case Animation::TYPE_POSITION_3D: + chan = "Position3D"; + break; + case Animation::TYPE_ROTATION_3D: + chan = "Rotation3D"; + break; + case Animation::TYPE_SCALE_3D: + chan = "Scale3D"; + break; + default: { + } + } + + undo_redo->create_action(vformat(TTR("Anim Change %s"), chan)); + undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, p_value); + undo_redo->add_undo_method(animation.ptr(), "track_set_key_value", track, key, old); + 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; + } - setting = false; - return true; } break; + case Animation::TYPE_BLEND_SHAPE: case Animation::TYPE_VALUE: { if (name == "value") { Variant value = p_value; @@ -315,6 +335,22 @@ public: setting = false; return true; } + + if (name == "handle_mode") { + const Variant &value = p_value; + + setting = true; + undo_redo->create_action(TTR("Anim Change Keyframe Value"), UndoRedo::MERGE_ENDS); + int prev = animation->bezier_track_get_key_handle_mode(track, key); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_handle_mode", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_handle_mode", track, key, prev); + 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; case Animation::TYPE_AUDIO: { if (name == "stream") { @@ -412,13 +448,15 @@ public: } switch (animation->track_get_type(track)) { - case Animation::TYPE_TRANSFORM3D: { - Dictionary d = animation->track_get_key_value(track, key); - ERR_FAIL_COND_V(!d.has(name), false); - r_ret = d[p_name]; - return true; - + case Animation::TYPE_POSITION_3D: + case Animation::TYPE_ROTATION_3D: + case Animation::TYPE_SCALE_3D: { + if (name == "position" || name == "rotation" || name == "scale") { + r_ret = animation->track_get_key_value(track, key); + return true; + } } break; + case Animation::TYPE_BLEND_SHAPE: case Animation::TYPE_VALUE: { if (name == "value") { r_ret = animation->track_get_key_value(track, key); @@ -477,6 +515,11 @@ public: return true; } + if (name == "handle_mode") { + r_ret = animation->bezier_track_get_key_handle_mode(track, key); + return true; + } + } break; case Animation::TYPE_AUDIO: { if (name == "stream") { @@ -523,11 +566,17 @@ public: } switch (animation->track_get_type(track)) { - case Animation::TYPE_TRANSFORM3D: { - p_list->push_back(PropertyInfo(Variant::VECTOR3, "location")); - p_list->push_back(PropertyInfo(Variant::QUATERNION, "rotation")); + case Animation::TYPE_POSITION_3D: { + p_list->push_back(PropertyInfo(Variant::VECTOR3, "position")); + } break; + case Animation::TYPE_ROTATION_3D: { + p_list->push_back(PropertyInfo(Variant::VECTOR3, "rotation")); + } break; + case Animation::TYPE_SCALE_3D: { p_list->push_back(PropertyInfo(Variant::VECTOR3, "scale")); - + } break; + case Animation::TYPE_BLEND_SHAPE: { + p_list->push_back(PropertyInfo(Variant::FLOAT, "value")); } break; case Animation::TYPE_VALUE: { Variant v = animation->track_get_key_value(track, key); @@ -557,7 +606,8 @@ public: } break; case Animation::TYPE_METHOD: { p_list->push_back(PropertyInfo(Variant::STRING_NAME, "name")); - p_list->push_back(PropertyInfo(Variant::INT, "arg_count", PROPERTY_HINT_RANGE, "0,5,1")); + static_assert(VARIANT_ARG_MAX == 8, "PROPERTY_HINT_RANGE needs to be updated if VARIANT_ARG_MAX != 8"); + p_list->push_back(PropertyInfo(Variant::INT, "arg_count", PROPERTY_HINT_RANGE, "0,8,1")); Dictionary d = animation->track_get_key_value(track, key); ERR_FAIL_COND(!d.has("args")); @@ -582,6 +632,7 @@ public: p_list->push_back(PropertyInfo(Variant::FLOAT, "value")); p_list->push_back(PropertyInfo(Variant::VECTOR2, "in_handle")); p_list->push_back(PropertyInfo(Variant::VECTOR2, "out_handle")); + p_list->push_back(PropertyInfo(Variant::INT, "handle_mode", PROPERTY_HINT_ENUM, "Free,Balanced")); } break; case Animation::TYPE_AUDIO: { @@ -779,19 +830,34 @@ public: } switch (animation->track_get_type(track)) { - case Animation::TYPE_TRANSFORM3D: { - Dictionary d_old = animation->track_get_key_value(track, key); - Dictionary d_new = d_old.duplicate(); - d_new[p_name] = p_value; - + case Animation::TYPE_POSITION_3D: + case Animation::TYPE_ROTATION_3D: + case Animation::TYPE_SCALE_3D: { + Variant old = animation->track_get_key_value(track, key); if (!setting) { + String chan; + switch (animation->track_get_type(track)) { + case Animation::TYPE_POSITION_3D: + chan = "Position3D"; + break; + case Animation::TYPE_ROTATION_3D: + chan = "Rotation3D"; + break; + case Animation::TYPE_SCALE_3D: + chan = "Scale3D"; + break; + default: { + } + } + setting = true; - undo_redo->create_action(TTR("Anim Multi Change Transform")); + undo_redo->create_action(vformat(TTR("Anim Multi Change %s"), chan)); } - 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); + undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, p_value); + undo_redo->add_undo_method(animation.ptr(), "track_set_key_value", track, key, old); update_obj = true; } break; + case Animation::TYPE_BLEND_SHAPE: case Animation::TYPE_VALUE: { if (name == "value") { Variant value = p_value; @@ -906,6 +972,17 @@ public: 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; + } else if (name == "handle_mode") { + const Variant &value = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + int prev = animation->bezier_track_get_key_handle_mode(track, key); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_handle_mode", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_handle_mode", track, key, prev); + update_obj = true; } } break; case Animation::TYPE_AUDIO: { @@ -1009,13 +1086,16 @@ public: } switch (animation->track_get_type(track)) { - case Animation::TYPE_TRANSFORM3D: { - Dictionary d = animation->track_get_key_value(track, key); - ERR_FAIL_COND_V(!d.has(name), false); - r_ret = d[p_name]; - return true; + case Animation::TYPE_POSITION_3D: + case Animation::TYPE_ROTATION_3D: + case Animation::TYPE_SCALE_3D: { + if (name == "position" || name == "rotation" || name == "scale") { + r_ret = animation->track_get_key_value(track, key); + return true; + } } break; + case Animation::TYPE_BLEND_SHAPE: case Animation::TYPE_VALUE: { if (name == "value") { r_ret = animation->track_get_key_value(track, key); @@ -1074,6 +1154,11 @@ public: return true; } + if (name == "handle_mode") { + r_ret = animation->bezier_track_get_key_handle_mode(track, key); + return true; + } + } break; case Animation::TYPE_AUDIO: { if (name == "stream") { @@ -1159,11 +1244,18 @@ public: if (same_track_type) { switch (animation->track_get_type(first_track)) { - case Animation::TYPE_TRANSFORM3D: { - p_list->push_back(PropertyInfo(Variant::VECTOR3, "location")); - p_list->push_back(PropertyInfo(Variant::QUATERNION, "rotation")); + case Animation::TYPE_POSITION_3D: { + p_list->push_back(PropertyInfo(Variant::VECTOR3, "position")); + } break; + case Animation::TYPE_ROTATION_3D: { + p_list->push_back(PropertyInfo(Variant::QUATERNION, "scale")); + } break; + case Animation::TYPE_SCALE_3D: { p_list->push_back(PropertyInfo(Variant::VECTOR3, "scale")); } break; + case Animation::TYPE_BLEND_SHAPE: { + p_list->push_back(PropertyInfo(Variant::FLOAT, "value")); + } break; case Animation::TYPE_VALUE: { if (same_key_type) { Variant v = animation->track_get_key_value(first_track, first_key); @@ -1195,7 +1287,8 @@ public: } break; case Animation::TYPE_METHOD: { p_list->push_back(PropertyInfo(Variant::STRING_NAME, "name")); - p_list->push_back(PropertyInfo(Variant::INT, "arg_count", PROPERTY_HINT_RANGE, "0,5,1")); + static_assert(VARIANT_ARG_MAX == 8, "PROPERTY_HINT_RANGE needs to be updated if VARIANT_ARG_MAX != 8"); + p_list->push_back(PropertyInfo(Variant::INT, "arg_count", PROPERTY_HINT_RANGE, "0,8,1")); Dictionary d = animation->track_get_key_value(first_track, first_key); ERR_FAIL_COND(!d.has("args")); @@ -1219,6 +1312,7 @@ public: p_list->push_back(PropertyInfo(Variant::FLOAT, "value")); p_list->push_back(PropertyInfo(Variant::VECTOR2, "in_handle")); p_list->push_back(PropertyInfo(Variant::VECTOR2, "out_handle")); + p_list->push_back(PropertyInfo(Variant::INT, "handle_mode", PROPERTY_HINT_ENUM, "Free,Balanced")); } break; case Animation::TYPE_AUDIO: { p_list->push_back(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream")); @@ -1323,8 +1417,20 @@ void AnimationTimelineEdit::_anim_length_changed(double p_new_len) { void AnimationTimelineEdit::_anim_loop_pressed() { undo_redo->create_action(TTR("Change Animation Loop")); - undo_redo->add_do_method(animation.ptr(), "set_loop", loop->is_pressed()); - undo_redo->add_undo_method(animation.ptr(), "set_loop", animation->has_loop()); + switch (animation->get_loop_mode()) { + case Animation::LoopMode::LOOP_NONE: { + undo_redo->add_do_method(animation.ptr(), "set_loop_mode", Animation::LoopMode::LOOP_LINEAR); + } break; + case Animation::LoopMode::LOOP_LINEAR: { + undo_redo->add_do_method(animation.ptr(), "set_loop_mode", Animation::LoopMode::LOOP_PINGPONG); + } break; + case Animation::LoopMode::LOOP_PINGPONG: { + undo_redo->add_do_method(animation.ptr(), "set_loop_mode", Animation::LoopMode::LOOP_NONE); + } break; + default: + break; + } + undo_redo->add_undo_method(animation.ptr(), "set_loop_mode", animation->get_loop_mode()); undo_redo->commit_action(); } @@ -1359,7 +1465,10 @@ void AnimationTimelineEdit::_notification(int p_what) { add_track->get_popup()->clear(); add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyValue"), SNAME("EditorIcons")), TTR("Property Track")); - add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyXform"), SNAME("EditorIcons")), TTR("3D Transform Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyXPosition"), SNAME("EditorIcons")), TTR("3D Position Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyXRotation"), SNAME("EditorIcons")), TTR("3D Rotation Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyXScale"), SNAME("EditorIcons")), TTR("3D Scale Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyBlendShape"), SNAME("EditorIcons")), TTR("Blend Shape Track")); add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyCall"), SNAME("EditorIcons")), TTR("Call Method Track")); add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyBezier"), SNAME("EditorIcons")), TTR("Bezier Curve Track")); add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyAudio"), SNAME("EditorIcons")), TTR("Audio Playback Track")); @@ -1607,7 +1716,24 @@ void AnimationTimelineEdit::update_values() { length->set_tooltip(TTR("Animation length (seconds)")); time_icon->set_tooltip(TTR("Animation length (seconds)")); } - loop->set_pressed(animation->has_loop()); + + switch (animation->get_loop_mode()) { + case Animation::LoopMode::LOOP_NONE: { + loop->set_icon(get_theme_icon("Loop", "EditorIcons")); + loop->set_pressed(false); + } break; + case Animation::LoopMode::LOOP_LINEAR: { + loop->set_icon(get_theme_icon("Loop", "EditorIcons")); + loop->set_pressed(true); + } break; + case Animation::LoopMode::LOOP_PINGPONG: { + loop->set_icon(get_theme_icon("PingPongLoop", "EditorIcons")); + loop->set_pressed(true); + } break; + default: + break; + } + editing = false; } @@ -1636,48 +1762,48 @@ void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) { const Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { + if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) { get_zoom()->set_value(get_zoom()->get_value() * 1.05); accept_event(); } - if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { + if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN) { get_zoom()->set_value(get_zoom()->get_value() / 1.05); accept_event(); } - if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { + if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) { if (track_edit) { track_edit->get_editor()->goto_prev_step(true); } accept_event(); } - if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { + if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN) { if (track_edit) { track_edit->get_editor()->goto_next_step(true); } accept_event(); } - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && hsize_rect.has_point(mb->get_position())) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && hsize_rect.has_point(mb->get_position())) { dragging_hsize = true; dragging_hsize_from = mb->get_position().x; dragging_hsize_at = name_limit; } - if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && dragging_hsize) { + if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && dragging_hsize) { dragging_hsize = false; } if (mb.is_valid() && mb->get_position().x > get_name_limit() && mb->get_position().x < (get_size().width - get_buttons_width())) { - if (!panning_timeline && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (!panning_timeline && mb->get_button_index() == MouseButton::LEFT) { int x = mb->get_position().x - get_name_limit(); float ofs = x / get_zoom_scale() + get_value(); - emit_signal(SNAME("timeline_changed"), ofs, false, Input::get_singleton()->is_key_pressed(KEY_ALT)); + emit_signal(SNAME("timeline_changed"), ofs, false, Input::get_singleton()->is_key_pressed(Key::ALT)); dragging_timeline = true; } - if (!dragging_timeline && mb->get_button_index() == MOUSE_BUTTON_MIDDLE) { + if (!dragging_timeline && mb->get_button_index() == MouseButton::MIDDLE) { int x = mb->get_position().x - get_name_limit(); panning_timeline_from = x / get_zoom_scale(); panning_timeline = true; @@ -1685,11 +1811,11 @@ void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) { } } - if (dragging_timeline && mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && !mb->is_pressed()) { + if (dragging_timeline && mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && !mb->is_pressed()) { dragging_timeline = false; } - if (panning_timeline && mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_MIDDLE && !mb->is_pressed()) { + if (panning_timeline && mb.is_valid() && mb->get_button_index() == MouseButton::MIDDLE && !mb->is_pressed()) { panning_timeline = false; } @@ -1713,7 +1839,7 @@ void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) { if (dragging_timeline) { int x = mm->get_position().x - get_name_limit(); float ofs = x / get_zoom_scale() + get_value(); - emit_signal(SNAME("timeline_changed"), ofs, false, Input::get_singleton()->is_key_pressed(KEY_ALT)); + emit_signal(SNAME("timeline_changed"), ofs, false, Input::get_singleton()->is_key_pressed(Key::ALT)); } if (panning_timeline) { int x = mm->get_position().x - get_name_limit(); @@ -1828,9 +1954,12 @@ void AnimationTrackEdit::_notification(int p_what) { Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); Color color = get_theme_color(SNAME("font_color"), SNAME("Label")); - Ref<Texture2D> type_icons[6] = { + Ref<Texture2D> type_icons[9] = { get_theme_icon(SNAME("KeyValue"), SNAME("EditorIcons")), - get_theme_icon(SNAME("KeyXform"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyTrackPosition"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyTrackRotation"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyTrackScale"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyTrackBlendShape"), SNAME("EditorIcons")), get_theme_icon(SNAME("KeyCall"), SNAME("EditorIcons")), get_theme_icon(SNAME("KeyBezier"), SNAME("EditorIcons")), get_theme_icon(SNAME("KeyAudio"), SNAME("EditorIcons")), @@ -1979,7 +2108,7 @@ void AnimationTrackEdit::_notification(int p_what) { update_mode_rect.position.y = int(get_size().height - update_icon->get_height()) / 2; update_mode_rect.size = update_icon->get_size(); - if (animation->track_get_type(track) == Animation::TYPE_VALUE) { + if (!animation->track_is_compressed(track) && animation->track_get_type(track) == Animation::TYPE_VALUE) { draw_texture(update_icon, update_mode_rect.position); } // Make it easier to click. @@ -2021,7 +2150,7 @@ void AnimationTrackEdit::_notification(int p_what) { interp_mode_rect.position.y = int(get_size().height - icon->get_height()) / 2; interp_mode_rect.size = icon->get_size(); - if (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_TRANSFORM3D) { + if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { draw_texture(icon, interp_mode_rect.position); } // Make it easier to click. @@ -2031,7 +2160,7 @@ void AnimationTrackEdit::_notification(int p_what) { ofs += icon->get_width() + hsep; interp_mode_rect.size.x += hsep; - if (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_TRANSFORM3D) { + if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { draw_texture(down_icon, Vector2(ofs, int(get_size().height - down_icon->get_height()) / 2)); interp_mode_rect.size.x += down_icon->get_width(); } else { @@ -2050,25 +2179,25 @@ void AnimationTrackEdit::_notification(int p_what) { Ref<Texture2D> icon = wrap_icon[loop_wrap ? 1 : 0]; - loop_mode_rect.position.x = ofs; - loop_mode_rect.position.y = int(get_size().height - icon->get_height()) / 2; - loop_mode_rect.size = icon->get_size(); + loop_wrap_rect.position.x = ofs; + loop_wrap_rect.position.y = int(get_size().height - icon->get_height()) / 2; + loop_wrap_rect.size = icon->get_size(); - if (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_TRANSFORM3D) { - draw_texture(icon, loop_mode_rect.position); + if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { + draw_texture(icon, loop_wrap_rect.position); } - loop_mode_rect.position.y = 0; - loop_mode_rect.size.y = get_size().height; + loop_wrap_rect.position.y = 0; + loop_wrap_rect.size.y = get_size().height; ofs += icon->get_width() + hsep; - loop_mode_rect.size.x += hsep; + loop_wrap_rect.size.x += hsep; - if (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_TRANSFORM3D) { + if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { draw_texture(down_icon, Vector2(ofs, int(get_size().height - down_icon->get_height()) / 2)); - loop_mode_rect.size.x += down_icon->get_width(); + loop_wrap_rect.size.x += down_icon->get_width(); } else { - loop_mode_rect = Rect2(); + loop_wrap_rect = Rect2(); } ofs += down_icon->get_width(); @@ -2079,7 +2208,7 @@ void AnimationTrackEdit::_notification(int p_what) { { // Erase. - Ref<Texture2D> icon = get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")); + Ref<Texture2D> icon = get_theme_icon(animation->track_is_compressed(track) ? SNAME("Lock") : SNAME("Remove"), SNAME("EditorIcons")); remove_rect.position.x = ofs + ((get_size().width - ofs) - icon->get_width()) / 2; remove_rect.position.y = int(get_size().height - icon->get_height()) / 2; @@ -2168,6 +2297,11 @@ void AnimationTrackEdit::draw_key(int p_index, float p_pixels_sec, int p_x, bool Ref<Texture2D> icon_to_draw = p_selected ? selected_icon : type_icon; + if (animation->track_get_type(track) == Animation::TYPE_VALUE && !Math::is_equal_approx(animation->track_get_key_transition(track, p_index), real_t(1.0))) { + // Use a different icon for keys with non-linear easing. + icon_to_draw = get_theme_icon(p_selected ? SNAME("KeyEasedSelected") : SNAME("KeyValueEased"), SNAME("EditorIcons")); + } + // Override type icon for invalid value keys, unless selected. if (!p_selected && animation->track_get_type(track) == Animation::TYPE_VALUE) { const Variant &v = animation->track_get_key_value(track, p_index); @@ -2284,9 +2418,12 @@ void AnimationTrackEdit::set_animation_and_track(const Ref<Animation> &p_animati track = p_track; update(); - Ref<Texture2D> type_icons[6] = { + Ref<Texture2D> type_icons[9] = { get_theme_icon(SNAME("KeyValue"), SNAME("EditorIcons")), - get_theme_icon(SNAME("KeyXform"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyXPosition"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyXRotation"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyXScale"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyBlendShape"), SNAME("EditorIcons")), get_theme_icon(SNAME("KeyCall"), SNAME("EditorIcons")), get_theme_icon(SNAME("KeyBezier"), SNAME("EditorIcons")), get_theme_icon(SNAME("KeyAudio"), SNAME("EditorIcons")), @@ -2415,7 +2552,7 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const { return TTR("Interpolation Mode"); } - if (loop_mode_rect.has_point(p_pos)) { + if (loop_wrap_rect.has_point(p_pos)) { return TTR("Loop Wrap Mode (Interpolate end with beginning on loop)"); } @@ -2456,17 +2593,21 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const { if (key_idx != -1) { String text = TTR("Time (s): ") + rtos(animation->track_get_key_time(track, key_idx)) + "\n"; switch (animation->track_get_type(track)) { - case Animation::TYPE_TRANSFORM3D: { - Dictionary d = animation->track_get_key_value(track, key_idx); - if (d.has("location")) { - text += "Pos: " + String(d["location"]) + "\n"; - } - if (d.has("rotation")) { - text += "Rot: " + String(d["rotation"]) + "\n"; - } - if (d.has("scale")) { - text += "Scale: " + String(d["scale"]) + "\n"; - } + case Animation::TYPE_POSITION_3D: { + Vector3 t = animation->track_get_key_value(track, key_idx); + text += "Position: " + String(t) + "\n"; + } break; + case Animation::TYPE_ROTATION_3D: { + Quaternion t = animation->track_get_key_value(track, key_idx); + text += "Rotation: " + String(t) + "\n"; + } break; + case Animation::TYPE_SCALE_3D: { + Vector3 t = animation->track_get_key_value(track, key_idx); + text += "Scale: " + String(t) + "\n"; + } break; + case Animation::TYPE_BLEND_SHAPE: { + float t = animation->track_get_key_value(track, key_idx); + text += "Blend Shape: " + itos(t) + "\n"; } break; case Animation::TYPE_VALUE: { const Variant &v = animation->track_get_key_value(track, key_idx); @@ -2506,6 +2647,17 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const { text += "In-Handle: " + ih + "\n"; Vector2 oh = animation->bezier_track_get_key_out_handle(track, key_idx); text += "Out-Handle: " + oh + "\n"; + int hm = animation->bezier_track_get_key_handle_mode(track, key_idx); + text += "Handle mode: "; + switch (hm) { + case Animation::HANDLE_MODE_FREE: { + text += "Free"; + } break; + case Animation::HANDLE_MODE_BALANCED: { + text += "Balanced"; + } break; + } + text += "\n"; } break; case Animation::TYPE_AUDIO: { String stream_name = "null"; @@ -2559,7 +2711,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { Point2 pos = mb->get_position(); if (check_rect.has_point(pos)) { @@ -2614,7 +2766,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) { accept_event(); } - if (loop_mode_rect.has_point(pos)) { + if (loop_wrap_rect.has_point(pos)) { if (!menu) { menu = memnew(PopupMenu); add_child(menu); @@ -2625,7 +2777,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) { menu->add_icon_item(get_theme_icon(SNAME("InterpWrapLoop"), SNAME("EditorIcons")), TTR("Wrap Loop Interp"), MENU_LOOP_WRAP); menu->set_as_minsize(); - Vector2 popup_pos = get_screen_position() + loop_mode_rect.position + Vector2(0, loop_mode_rect.size.height); + Vector2 popup_pos = get_screen_position() + loop_wrap_rect.position + Vector2(0, loop_wrap_rect.size.height); menu->set_position(popup_pos); menu->popup(); accept_event(); @@ -2644,65 +2796,68 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) { // Check keyframes. - float scale = timeline->get_zoom_scale(); - int limit = timeline->get_name_limit(); - int limit_end = get_size().width - timeline->get_buttons_width(); - // Left Border including space occupied by keyframes on t=0. - int limit_start_hitbox = limit - type_icon->get_width(); - - if (pos.x >= limit_start_hitbox && pos.x <= limit_end) { - int key_idx = -1; - float key_distance = 1e20; - - // Select should happen in the opposite order of drawing for more accurate overlap select. - for (int i = animation->track_get_key_count(track) - 1; i >= 0; i--) { - Rect2 rect = get_key_rect(i, scale); - float offset = animation->track_get_key_time(track, i) - timeline->get_value(); - offset = offset * scale + limit; - rect.position.x += offset; + if (!animation->track_is_compressed(track)) { // Selecting compressed keyframes for editing is not possible. - if (rect.has_point(pos)) { - if (is_key_selectable_by_distance()) { - float distance = ABS(offset - pos.x); - if (key_idx == -1 || distance < key_distance) { + float scale = timeline->get_zoom_scale(); + int limit = timeline->get_name_limit(); + int limit_end = get_size().width - timeline->get_buttons_width(); + // Left Border including space occupied by keyframes on t=0. + int limit_start_hitbox = limit - type_icon->get_width(); + + if (pos.x >= limit_start_hitbox && pos.x <= limit_end) { + int key_idx = -1; + float key_distance = 1e20; + + // Select should happen in the opposite order of drawing for more accurate overlap select. + for (int i = animation->track_get_key_count(track) - 1; i >= 0; i--) { + Rect2 rect = get_key_rect(i, scale); + float offset = animation->track_get_key_time(track, i) - timeline->get_value(); + offset = offset * scale + limit; + rect.position.x += offset; + + if (rect.has_point(pos)) { + if (is_key_selectable_by_distance()) { + float distance = ABS(offset - pos.x); + if (key_idx == -1 || distance < key_distance) { + key_idx = i; + key_distance = distance; + } + } else { + // First one does it. key_idx = i; - key_distance = distance; + break; } - } else { - // First one does it. - key_idx = i; - break; } } - } - if (key_idx != -1) { - if (mb->is_command_pressed() || mb->is_shift_pressed()) { - if (editor->is_key_selected(track, key_idx)) { - emit_signal(SNAME("deselect_key"), key_idx); + if (key_idx != -1) { + if (mb->is_command_pressed() || mb->is_shift_pressed()) { + if (editor->is_key_selected(track, key_idx)) { + emit_signal(SNAME("deselect_key"), key_idx); + } else { + emit_signal(SNAME("select_key"), key_idx, false); + moving_selection_attempt = true; + select_single_attempt = -1; + moving_selection_from_ofs = (mb->get_position().x - limit) / timeline->get_zoom_scale(); + } } else { - emit_signal(SNAME("select_key"), key_idx, false); + if (!editor->is_key_selected(track, key_idx)) { + emit_signal(SNAME("select_key"), key_idx, true); + select_single_attempt = -1; + } else { + select_single_attempt = key_idx; + } + moving_selection_attempt = true; - select_single_attempt = -1; moving_selection_from_ofs = (mb->get_position().x - limit) / timeline->get_zoom_scale(); } - } else { - if (!editor->is_key_selected(track, key_idx)) { - emit_signal(SNAME("select_key"), key_idx, true); - select_single_attempt = -1; - } else { - select_single_attempt = key_idx; - } - - moving_selection_attempt = true; - moving_selection_from_ofs = (mb->get_position().x - limit) / timeline->get_zoom_scale(); + accept_event(); } - accept_event(); } } } - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) { Point2 pos = mb->get_position(); if (pos.x >= timeline->get_name_limit() && pos.x <= get_size().width - timeline->get_buttons_width()) { // Can do something with menu too! show insert key. @@ -2732,7 +2887,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && clicking_on_name) { + if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && clicking_on_name) { if (!path) { path_popup = memnew(Popup); path_popup->set_wrap_controls(true); @@ -2754,7 +2909,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } if (mb.is_valid() && moving_selection_attempt) { - if (!mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (!mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { moving_selection_attempt = false; if (moving_selection) { emit_signal(SNAME("move_selection_commit")); @@ -2765,7 +2920,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) { select_single_attempt = -1; } - if (moving_selection && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { + if (moving_selection && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) { moving_selection_attempt = false; moving_selection = false; emit_signal(SNAME("move_selection_cancel")); @@ -2773,7 +2928,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT && moving_selection_attempt) { + if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE && moving_selection_attempt) { if (!moving_selection) { moving_selection = true; emit_signal(SNAME("move_selection_begin")); @@ -2929,6 +3084,9 @@ void AnimationTrackEdit::set_in_group(bool p_enable) { } void AnimationTrackEdit::append_to_selection(const Rect2 &p_box, bool p_deselection) { + if (animation->track_is_compressed(track)) { + return; // Compressed keyframes can't be edited + } // Left Border including space occupied by keyframes on t=0. int limit_start_hitbox = timeline->get_name_limit() - type_icon->get_width(); Rect2 select_rect(limit_start_hitbox, 0, get_size().width - timeline->get_name_limit() - timeline->get_buttons_width(), get_size().height); @@ -3272,6 +3430,10 @@ void AnimationTrackEditor::_timeline_changed(float p_new_pos, bool p_drag, bool } void AnimationTrackEditor::_track_remove_request(int p_track) { + if (animation->track_is_compressed(p_track)) { + EditorNode::get_singleton()->show_warning(TTR("Compressed tracks can't be edited or removed. Re-import the animation with compression disabled in order to edit.")); + return; + } int idx = p_track; if (idx >= 0 && idx < animation->get_track_count()) { undo_redo->create_action(TTR("Remove Anim Track")); @@ -3321,9 +3483,15 @@ static bool track_type_is_resettable(Animation::TrackType p_type) { switch (p_type) { case Animation::TYPE_VALUE: [[fallthrough]]; + case Animation::TYPE_BLEND_SHAPE: + [[fallthrough]]; case Animation::TYPE_BEZIER: [[fallthrough]]; - case Animation::TYPE_TRANSFORM3D: + case Animation::TYPE_POSITION_3D: + [[fallthrough]]; + case Animation::TYPE_ROTATION_3D: + [[fallthrough]]; + case Animation::TYPE_SCALE_3D: return true; default: return false; @@ -3338,7 +3506,7 @@ void AnimationTrackEditor::make_insert_queue() { void AnimationTrackEditor::commit_insert_queue() { bool reset_allowed = true; AnimationPlayer *player = AnimationPlayerEditor::get_singleton()->get_player(); - if (player->has_animation("RESET") && player->get_animation("RESET") == animation) { + if (player->has_animation(SceneStringNames::get_singleton()->RESET) && player->get_animation(SceneStringNames::get_singleton()->RESET) == animation) { // Avoid messing with the reset animation itself. reset_allowed = false; } else { @@ -3416,7 +3584,7 @@ void AnimationTrackEditor::_query_insert(const InsertData &p_id) { for (const InsertData &E : insert_data) { // Prevent insertion of multiple tracks. - if (E.path == p_id.path) { + if (E.path == p_id.path && E.type == p_id.type) { return; // Already inserted a track this frame. } } @@ -3466,7 +3634,11 @@ void AnimationTrackEditor::_insert_track(bool p_create_reset, bool p_create_bezi } } -void AnimationTrackEditor::insert_transform_key(Node3D *p_node, const String &p_sub, const Transform3D &p_xform) { +void AnimationTrackEditor::insert_transform_key(Node3D *p_node, const String &p_sub, const Animation::TrackType p_type, const Variant p_value) { + ERR_FAIL_COND(!root); + ERR_FAIL_COND_MSG( + (p_type != Animation::TYPE_POSITION_3D && p_type != Animation::TYPE_ROTATION_3D && p_type != Animation::TYPE_SCALE_3D), + "Track type must be Position/Rotation/Scale 3D."); if (!keying) { return; } @@ -3474,7 +3646,6 @@ void AnimationTrackEditor::insert_transform_key(Node3D *p_node, const String &p_ return; } - ERR_FAIL_COND(!root); // Let's build a node path. String path = root->get_path_to(p_node); if (p_sub != "") { @@ -3486,53 +3657,44 @@ void AnimationTrackEditor::insert_transform_key(Node3D *p_node, const String &p_ int track_idx = -1; for (int i = 0; i < animation->get_track_count(); i++) { - if (animation->track_get_type(i) != Animation::TYPE_TRANSFORM3D) { + if (animation->track_get_path(i) != np) { continue; } - if (animation->track_get_path(i) != np) { + if (animation->track_get_type(i) != p_type) { continue; } - track_idx = i; - break; } InsertData id; - Dictionary val; - id.path = np; - id.track_idx = track_idx; - id.value = p_xform; - id.type = Animation::TYPE_TRANSFORM3D; // TRANSLATORS: This describes the target of new animation track, will be inserted into another string. id.query = vformat(TTR("node '%s'"), p_node->get_name()); id.advance = false; - - // Dialog insert. + id.track_idx = track_idx; + id.value = p_value; + id.type = p_type; _query_insert(id); } -bool AnimationTrackEditor::has_transform_track(Node3D *p_node, const String &p_sub) { +bool AnimationTrackEditor::has_track(Node3D *p_node, const String &p_sub, const Animation::TrackType p_type) { + ERR_FAIL_COND_V(!root, false); if (!keying) { return false; } if (!animation.is_valid()) { return false; } - if (!root) { - return false; - } - //let's build a node path + // Let's build a node path. String path = root->get_path_to(p_node); if (p_sub != "") { path += ":" + p_sub; } - int track_id = animation->find_track(path); + + int track_id = animation->find_track(path, p_type); if (track_id >= 0) { - if (animation->track_get_type(track_id) == Animation::TYPE_TRANSFORM3D) { - return true; - } + return true; } return false; } @@ -3764,15 +3926,15 @@ void AnimationTrackEditor::insert_value_key(const String &p_property, const Vari Ref<Animation> AnimationTrackEditor::_create_and_get_reset_animation() { AnimationPlayer *player = AnimationPlayerEditor::get_singleton()->get_player(); - if (player->has_animation("RESET")) { - return player->get_animation("RESET"); + if (player->has_animation(SceneStringNames::get_singleton()->RESET)) { + return player->get_animation(SceneStringNames::get_singleton()->RESET); } else { Ref<Animation> reset_anim; reset_anim.instantiate(); reset_anim->set_length(ANIM_MIN_LENGTH); - undo_redo->add_do_method(player, "add_animation", "RESET", reset_anim); + undo_redo->add_do_method(player, "add_animation", SceneStringNames::get_singleton()->RESET, reset_anim); undo_redo->add_do_method(AnimationPlayerEditor::get_singleton(), "_animation_player_changed", player); - undo_redo->add_undo_method(player, "remove_animation", "RESET"); + undo_redo->add_undo_method(player, "remove_animation", SceneStringNames::get_singleton()->RESET); undo_redo->add_undo_method(AnimationPlayerEditor::get_singleton(), "_animation_player_changed", player); return reset_anim; } @@ -3977,18 +4139,14 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD Variant value; switch (p_id.type) { + case Animation::TYPE_POSITION_3D: + case Animation::TYPE_ROTATION_3D: + case Animation::TYPE_SCALE_3D: + case Animation::TYPE_BLEND_SHAPE: case Animation::TYPE_VALUE: { value = p_id.value; } break; - case Animation::TYPE_TRANSFORM3D: { - Transform3D tr = p_id.value; - Dictionary d; - d["location"] = tr.origin; - d["scale"] = tr.basis.get_scale(); - d["rotation"] = Quaternion(tr.basis); - value = d; - } break; case Animation::TYPE_BEZIER: { Array array; array.resize(5); @@ -4064,7 +4222,7 @@ bool AnimationTrackEditor::is_selection_active() const { } bool AnimationTrackEditor::is_snap_enabled() const { - return snap->is_pressed() ^ Input::get_singleton()->is_key_pressed(KEY_CTRL); + return snap->is_pressed() ^ Input::get_singleton()->is_key_pressed(Key::CTRL); } void AnimationTrackEditor::_update_tracks() { @@ -4404,8 +4562,13 @@ void AnimationTrackEditor::_new_track_node_selected(NodePath p_path) { ERR_FAIL_COND(!node); NodePath path_to = root->get_path_to(node); - if (adding_track_type == Animation::TYPE_TRANSFORM3D && !node->is_class("Node3D")) { - EditorNode::get_singleton()->show_warning(TTR("Transform3D tracks only apply to 3D-based nodes.")); + if (adding_track_type == Animation::TYPE_BLEND_SHAPE && !node->is_class("MeshInstance3D")) { + EditorNode::get_singleton()->show_warning(TTR("Blend Shape tracks only apply to MeshInstance3D nodes.")); + return; + } + + if ((adding_track_type == Animation::TYPE_POSITION_3D || adding_track_type == Animation::TYPE_ROTATION_3D || adding_track_type == Animation::TYPE_SCALE_3D) && !node->is_class("Node3D")) { + EditorNode::get_singleton()->show_warning(TTR("Position/Rotation/Scale 3D tracks only apply to 3D-based nodes.")); return; } @@ -4415,7 +4578,16 @@ void AnimationTrackEditor::_new_track_node_selected(NodePath p_path) { prop_selector->set_type_filter(Vector<Variant::Type>()); prop_selector->select_property_from_instance(node); } break; - case Animation::TYPE_TRANSFORM3D: + case Animation::TYPE_BLEND_SHAPE: { + adding_track_path = path_to; + Vector<Variant::Type> filter; + filter.push_back(Variant::FLOAT); + prop_selector->set_type_filter(filter); + prop_selector->select_property_from_instance(node); + } break; + case Animation::TYPE_POSITION_3D: + case Animation::TYPE_ROTATION_3D: + case Animation::TYPE_SCALE_3D: case Animation::TYPE_METHOD: { undo_redo->create_action(TTR("Add Track")); undo_redo->add_do_method(animation.ptr(), "add_track", adding_track_type); @@ -4584,7 +4756,27 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) { } switch (animation->track_get_type(p_track)) { - case Animation::TYPE_TRANSFORM3D: { + case Animation::TYPE_POSITION_3D: { + if (!root->has_node(animation->track_get_path(p_track))) { + EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key.")); + return; + } + Node3D *base = Object::cast_to<Node3D>(root->get_node(animation->track_get_path(p_track))); + + if (!base) { + EditorNode::get_singleton()->show_warning(TTR("Track is not of type Node3D, can't insert key")); + return; + } + + Vector3 pos = base->get_position(); + + undo_redo->create_action(TTR("Add Position Key")); + undo_redo->add_do_method(animation.ptr(), "position_track_insert_key", p_track, p_ofs, pos); + undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); + undo_redo->commit_action(); + + } break; + case Animation::TYPE_ROTATION_3D: { if (!root->has_node(animation->track_get_path(p_track))) { EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key.")); return; @@ -4596,18 +4788,35 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) { return; } - Transform3D xf = base->get_transform(); + Quaternion rot = base->get_transform().basis.operator Quaternion(); + + undo_redo->create_action(TTR("Add Rotation Key")); + undo_redo->add_do_method(animation.ptr(), "rotation_track_insert_key", p_track, p_ofs, rot); + undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); + undo_redo->commit_action(); + + } break; + case Animation::TYPE_SCALE_3D: { + if (!root->has_node(animation->track_get_path(p_track))) { + EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key.")); + return; + } + Node3D *base = Object::cast_to<Node3D>(root->get_node(animation->track_get_path(p_track))); + + if (!base) { + EditorNode::get_singleton()->show_warning(TTR("Track is not of type Node3D, can't insert key")); + return; + } - Vector3 loc = xf.get_origin(); - Vector3 scale = xf.basis.get_scale_local(); - Quaternion rot = xf.basis; + Vector3 scale = base->get_scale(); - undo_redo->create_action(TTR("Add Transform Track Key")); - undo_redo->add_do_method(animation.ptr(), "transform_track_insert_key", p_track, p_ofs, loc, rot, scale); + undo_redo->create_action(TTR("Add Scale Key")); + undo_redo->add_do_method(animation.ptr(), "scale_track_insert_key", p_track, p_ofs, scale); undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); undo_redo->commit_action(); } break; + case Animation::TYPE_BLEND_SHAPE: case Animation::TYPE_VALUE: { NodePath bp; Variant value; @@ -4638,12 +4847,13 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) { Variant value; _find_hint_for_track(p_track, bp, &value); Array arr; - arr.resize(5); + arr.resize(6); arr[0] = value; arr[1] = -0.25; arr[2] = 0; arr[3] = 0.25; arr[4] = 0; + arr[5] = 0; undo_redo->create_action(TTR("Add Track Key")); undo_redo->add_do_method(animation.ptr(), "track_insert_key", p_track, p_ofs, arr); @@ -4994,27 +5204,27 @@ void AnimationTrackEditor::_box_selection_draw() { void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { + if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) { timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() * 1.05); scroll->accept_event(); } - if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { + if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN) { timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05); scroll->accept_event(); } - if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { + if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) { goto_prev_step(true); scroll->accept_event(); } - if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { + if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN) { goto_next_step(true); scroll->accept_event(); } - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { box_selecting = true; box_selecting_from = scroll->get_global_transform().xform(mb->get_position()); @@ -5042,12 +5252,12 @@ void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { + if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_MIDDLE) != MouseButton::NONE) { timeline->set_value(timeline->get_value() - mm->get_relative().x / timeline->get_zoom_scale()); } if (mm.is_valid() && box_selecting) { - if (!(mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT)) { + if ((mm->get_button_mask() & MouseButton::MASK_LEFT) == MouseButton::NONE) { // No longer. box_selection->hide(); box_selecting = false; @@ -5196,7 +5406,7 @@ void AnimationTrackEditor::goto_prev_step(bool p_from_mouse_event) { if (step == 0) { step = 1; } - if (p_from_mouse_event && Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (p_from_mouse_event && Input::get_singleton()->is_key_pressed(Key::SHIFT)) { // Use more precise snapping when holding Shift. // This is used when scrobbling the timeline using Alt + Mouse wheel. step *= 0.25; @@ -5219,7 +5429,7 @@ void AnimationTrackEditor::goto_next_step(bool p_from_mouse_event) { if (step == 0) { step = 1; } - if (p_from_mouse_event && Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (p_from_mouse_event && Input::get_singleton()->is_key_pressed(Key::SHIFT)) { // Use more precise snapping when holding Shift. // This is used when scrobbling the timeline using Alt + Mouse wheel. // Do not use precise snapping when using the menu action or keyboard shortcut, @@ -5277,8 +5487,17 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) { } switch (animation->track_get_type(i)) { - case Animation::TYPE_TRANSFORM3D: - text += " (Transform)"; + case Animation::TYPE_POSITION_3D: + text += " (Position)"; + break; + case Animation::TYPE_ROTATION_3D: + text += " (Rotation)"; + break; + case Animation::TYPE_SCALE_3D: + text += " (Scale)"; + break; + case Animation::TYPE_BLEND_SHAPE: + text += " (BlendShape)"; break; case Animation::TYPE_METHOD: text += " (Methods)"; @@ -5646,7 +5865,7 @@ float AnimationTrackEditor::snap_time(float p_value, bool p_relative) { snap_increment = step->get_value(); } - if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) { // Use more precise snapping when holding Shift. snap_increment *= 0.25; } @@ -5760,10 +5979,10 @@ void AnimationTrackEditor::_pick_track_filter_input(const Ref<InputEvent> &p_ie) if (k.is_valid()) { switch (k->get_keycode()) { - case KEY_UP: - case KEY_DOWN: - case KEY_PAGEUP: - case KEY_PAGEDOWN: { + case Key::UP: + case Key::DOWN: + case Key::PAGEUP: + case Key::PAGEDOWN: { pick_track->get_scene_tree()->get_scene_tree()->gui_input(k); pick_track->get_filter_line_edit()->accept_event(); } break; @@ -5924,14 +6143,14 @@ AnimationTrackEditor::AnimationTrackEditor() { edit->get_popup()->add_item(TTR("Scale Selection"), EDIT_SCALE_SELECTION); edit->get_popup()->add_item(TTR("Scale From Cursor"), EDIT_SCALE_FROM_CURSOR); edit->get_popup()->add_separator(); - edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection", TTR("Duplicate Selection"), KEY_MASK_CMD | KEY_D), EDIT_DUPLICATE_SELECTION); - edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection_transposed", TTR("Duplicate Transposed"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_D), EDIT_DUPLICATE_TRANSPOSED); + edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection", TTR("Duplicate Selection"), KeyModifierMask::CMD | Key::D), EDIT_DUPLICATE_SELECTION); + edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection_transposed", TTR("Duplicate Transposed"), KeyModifierMask::SHIFT | KeyModifierMask::CMD | Key::D), EDIT_DUPLICATE_TRANSPOSED); edit->get_popup()->add_separator(); - edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/delete_selection", TTR("Delete Selection"), KEY_DELETE), EDIT_DELETE_SELECTION); + edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/delete_selection", TTR("Delete Selection"), Key::KEY_DELETE), EDIT_DELETE_SELECTION); edit->get_popup()->add_separator(); - edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_next_step", TTR("Go to Next Step"), KEY_MASK_CMD | KEY_RIGHT), EDIT_GOTO_NEXT_STEP); - edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_prev_step", TTR("Go to Previous Step"), KEY_MASK_CMD | KEY_LEFT), EDIT_GOTO_PREV_STEP); + edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_next_step", TTR("Go to Next Step"), KeyModifierMask::CMD | Key::RIGHT), EDIT_GOTO_NEXT_STEP); + edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_prev_step", TTR("Go to Previous Step"), KeyModifierMask::CMD | Key::LEFT), EDIT_GOTO_PREV_STEP); edit->get_popup()->add_separator(); edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/apply_reset", TTR("Apply Reset")), EDIT_APPLY_RESET); edit->get_popup()->add_separator(); diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index 576edef0c8..2bdc1d4107 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -35,7 +35,7 @@ #include "editor/editor_spin_slider.h" #include "editor/property_editor.h" #include "editor/property_selector.h" -#include "scene/animation/animation_cache.h" + #include "scene/gui/control.h" #include "scene/gui/file_dialog.h" #include "scene/gui/menu_button.h" @@ -159,7 +159,7 @@ class AnimationTrackEdit : public Control { Rect2 update_mode_rect; Rect2 interp_mode_rect; - Rect2 loop_mode_rect; + Rect2 loop_wrap_rect; Rect2 remove_rect; Rect2 bezier_edit_rect; @@ -466,6 +466,7 @@ class AnimationTrackEditor : public VBoxContainer { Animation::TrackType track_type = Animation::TrackType::TYPE_ANIMATION; Animation::InterpolationType interp_type = Animation::InterpolationType::INTERPOLATION_CUBIC; Animation::UpdateMode update_mode = Animation::UpdateMode::UPDATE_CAPTURE; + Animation::LoopMode loop_mode = Animation::LoopMode::LOOP_LINEAR; bool loop_wrap = false; bool enabled = false; @@ -527,8 +528,8 @@ public: void set_anim_pos(float p_pos); void insert_node_value_key(Node *p_node, const String &p_property, const Variant &p_value, bool p_only_if_exists = false); void insert_value_key(const String &p_property, const Variant &p_value, bool p_advance); - void insert_transform_key(Node3D *p_node, const String &p_sub, const Transform3D &p_xform); - bool has_transform_track(Node3D *p_node, const String &p_sub); + void insert_transform_key(Node3D *p_node, const String &p_sub, const Animation::TrackType p_type, const Variant p_value); + bool has_track(Node3D *p_node, const String &p_sub, const Animation::TrackType p_type); void make_insert_queue(); void commit_insert_queue(); diff --git a/editor/animation_track_editor_plugins.cpp b/editor/animation_track_editor_plugins.cpp index 4ee8b991e4..dd3e08b299 100644 --- a/editor/animation_track_editor_plugins.cpp +++ b/editor/animation_track_editor_plugins.cpp @@ -419,7 +419,7 @@ Rect2 AnimationTrackEditSpriteFrame::get_key_rect(int p_index, float p_pixels_se // Go through other track to find if animation is set String animation_path = get_animation()->track_get_path(get_track()); animation_path = animation_path.replace(":frame", ":animation"); - int animation_track = get_animation()->find_track(animation_path); + int animation_track = get_animation()->find_track(animation_path, get_animation()->track_get_type(get_track())); float track_time = get_animation()->track_get_key_time(get_track(), p_index); int animaiton_index = get_animation()->track_find_key(animation_track, track_time); animation = get_animation()->track_get_key_value(animation_track, animaiton_index); @@ -511,7 +511,7 @@ void AnimationTrackEditSpriteFrame::draw_key(int p_index, float p_pixels_sec, in // Go through other track to find if animation is set String animation_path = get_animation()->track_get_path(get_track()); animation_path = animation_path.replace(":frame", ":animation"); - int animation_track = get_animation()->find_track(animation_path); + int animation_track = get_animation()->find_track(animation_path, get_animation()->track_get_type(get_track())); float track_time = get_animation()->track_get_key_time(get_track(), p_index); int animaiton_index = get_animation()->track_find_key(animation_track, track_time); animation = get_animation()->track_get_key_value(animation_track, animaiton_index); @@ -1098,7 +1098,7 @@ void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && get_default_cursor_shape() == CURSOR_HSIZE) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && get_default_cursor_shape() == CURSOR_HSIZE) { len_resizing = true; len_resizing_start = mb->is_shift_pressed(); len_resizing_from_px = mb->get_position().x; @@ -1108,7 +1108,7 @@ void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) { return; } - if (len_resizing && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (len_resizing && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { float ofs_local = -len_resizing_rel / get_timeline()->get_zoom_scale(); if (len_resizing_start) { float prev_ofs = get_animation()->audio_track_get_key_start_offset(get_track(), len_resizing_index); diff --git a/editor/audio_stream_preview.h b/editor/audio_stream_preview.h index 9cf47fd51a..8b83235b35 100644 --- a/editor/audio_stream_preview.h +++ b/editor/audio_stream_preview.h @@ -66,14 +66,13 @@ class AudioStreamPreviewGenerator : public Node { Thread *thread = nullptr; // Needed for the bookkeeping of the Map - Preview &operator=(const Preview &p_rhs) { + void operator=(const Preview &p_rhs) { preview = p_rhs.preview; base_stream = p_rhs.base_stream; playback = p_rhs.playback; generating.set_to(generating.is_set()); id = p_rhs.id; thread = p_rhs.thread; - return *this; } Preview(const Preview &p_rhs) { preview = p_rhs.preview; diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 7bf82fbd1b..1f01e9d4cf 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -127,7 +127,7 @@ void FindReplaceBar::unhandled_input(const Ref<InputEvent> &p_event) { bool accepted = true; switch (k->get_keycode()) { - case KEY_ESCAPE: { + case Key::ESCAPE: { _hide_bar(); } break; default: { @@ -542,7 +542,7 @@ void FindReplaceBar::_search_text_changed(const String &p_text) { } void FindReplaceBar::_search_text_submitted(const String &p_text) { - if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) { search_prev(); } else { search_next(); @@ -553,7 +553,7 @@ void FindReplaceBar::_replace_text_submitted(const String &p_text) { if (selection_only->is_pressed() && text_editor->has_selection()) { _replace_all(); _hide_bar(); - } else if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + } else if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) { _replace(); search_prev(); } else { @@ -766,9 +766,9 @@ void CodeTextEditor::_text_editor_gui_input(const Ref<InputEvent> &p_event) { if (mb.is_valid()) { if (mb->is_pressed() && mb->is_command_pressed()) { - if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { + if (mb->get_button_index() == MouseButton::WHEEL_UP) { _zoom_in(); - } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { + } else if (mb->get_button_index() == MouseButton::WHEEL_DOWN) { _zoom_out(); } } @@ -1314,10 +1314,10 @@ void CodeTextEditor::delete_lines() { int count = Math::abs(to_line - from_line) + 1; text_editor->set_caret_line(from_line, false); + text_editor->deselect(); for (int i = 0; i < count; i++) { _delete_line(from_line); } - text_editor->deselect(); } else { _delete_line(text_editor->get_caret_line()); } @@ -1654,7 +1654,7 @@ void CodeTextEditor::_toggle_scripts_pressed() { void CodeTextEditor::_error_pressed(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { goto_error(); } } @@ -1788,9 +1788,9 @@ void CodeTextEditor::update_toggle_scripts_button() { CodeTextEditor::CodeTextEditor() { code_complete_func = nullptr; - ED_SHORTCUT("script_editor/zoom_in", TTR("Zoom In"), KEY_MASK_CMD | KEY_EQUAL); - ED_SHORTCUT("script_editor/zoom_out", TTR("Zoom Out"), KEY_MASK_CMD | KEY_MINUS); - ED_SHORTCUT("script_editor/reset_zoom", TTR("Reset Zoom"), KEY_MASK_CMD | KEY_0); + ED_SHORTCUT("script_editor/zoom_in", TTR("Zoom In"), KeyModifierMask::CMD | Key::EQUAL); + ED_SHORTCUT("script_editor/zoom_out", TTR("Zoom Out"), KeyModifierMask::CMD | Key::MINUS); + ED_SHORTCUT("script_editor/reset_zoom", TTR("Reset Zoom"), KeyModifierMask::CMD | Key::KEY_0); text_editor = memnew(CodeEdit); add_child(text_editor); @@ -1824,6 +1824,7 @@ CodeTextEditor::CodeTextEditor() { text_editor->set_draw_line_numbers(true); text_editor->set_highlight_matching_braces_enabled(true); text_editor->set_auto_indent_enabled(true); + text_editor->set_deselect_on_focus_loss_enabled(false); status_bar = memnew(HBoxContainer); add_child(status_bar); diff --git a/editor/code_editor.h b/editor/code_editor.h index 3c52a0c6e8..6e3bd88112 100644 --- a/editor/code_editor.h +++ b/editor/code_editor.h @@ -53,7 +53,6 @@ public: void popup_find_line(CodeEdit *p_edit); int get_line() const; - void set_text_editor(CodeEdit *p_text_editor); GotoLineDialog(); }; @@ -101,7 +100,6 @@ class FindReplaceBar : public HBoxContainer { void _search_text_changed(const String &p_text); void _search_text_submitted(const String &p_text); void _replace_text_submitted(const String &p_text); - void _update_size(); protected: void _notification(int p_what); diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index c773f51342..d00fdd0ce7 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -240,7 +240,7 @@ void ConnectDialog::_remove_bind() { int idx = st.get_slice("/", 1).to_int() - 1; ERR_FAIL_INDEX(idx, cdbinds->params.size()); - cdbinds->params.remove(idx); + cdbinds->params.remove_at(idx); cdbinds->notify_changed(); } @@ -378,7 +378,7 @@ void ConnectDialog::_advanced_pressed() { error_label->hide(); } else { set_min_size(Size2(600, 500) * EDSCALE); - set_size(Size2()); + reset_size(); connect_to_label->set_text(TTR("Connect to Script:")); tree->set_connect_to_script_mode(true); @@ -723,7 +723,7 @@ void ConnectionsDock::_open_connection_dialog(TreeItem &item) { c = '_'; } else { // Remove any other characters. - midname.remove(i); + midname.remove_at(i); i--; continue; } diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp index f0b27702e7..dec4f50f03 100644 --- a/editor/create_dialog.cpp +++ b/editor/create_dialog.cpp @@ -352,10 +352,10 @@ void CreateDialog::_sbox_input(const Ref<InputEvent> &p_ie) { Ref<InputEventKey> k = p_ie; if (k.is_valid()) { switch (k->get_keycode()) { - case KEY_UP: - case KEY_DOWN: - case KEY_PAGEUP: - case KEY_PAGEDOWN: { + case Key::UP: + case Key::DOWN: + case Key::PAGEUP: + case Key::PAGEDOWN: { search_options->gui_input(k); search_box->accept_event(); } break; @@ -576,7 +576,7 @@ void CreateDialog::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co drop_idx--; } - favorite_list.remove(from_idx); + favorite_list.remove_at(from_idx); if (ds < 0) { favorite_list.insert(drop_idx, type); diff --git a/editor/debugger/debug_adapter/debug_adapter_protocol.cpp b/editor/debugger/debug_adapter/debug_adapter_protocol.cpp index 2e0e6cb7c8..36fbf8adf1 100644 --- a/editor/debugger/debug_adapter/debug_adapter_protocol.cpp +++ b/editor/debugger/debug_adapter/debug_adapter_protocol.cpp @@ -192,10 +192,12 @@ int DebugAdapterProtocol::parse_variant(const Variant &p_var) { case Variant::VECTOR2I: { int id = variable_id++; Vector2 vec = p_var; + const String type_scalar = Variant::get_type_name(p_var.get_type() == Variant::VECTOR2 ? Variant::FLOAT : Variant::INT); DAP::Variable x, y; x.name = "x"; y.name = "y"; - x.type = y.type = Variant::get_type_name(p_var.get_type() == Variant::VECTOR2 ? Variant::FLOAT : Variant::INT); + x.type = type_scalar; + y.type = type_scalar; x.value = rtos(vec.x); y.value = rtos(vec.y); @@ -209,12 +211,16 @@ int DebugAdapterProtocol::parse_variant(const Variant &p_var) { case Variant::RECT2I: { int id = variable_id++; Rect2 rect = p_var; + const String type_scalar = Variant::get_type_name(p_var.get_type() == Variant::RECT2 ? Variant::FLOAT : Variant::INT); DAP::Variable x, y, w, h; x.name = "x"; y.name = "y"; w.name = "w"; h.name = "h"; - x.type = y.type = w.type = h.type = Variant::get_type_name(p_var.get_type() == Variant::RECT2 ? Variant::FLOAT : Variant::INT); + x.type = type_scalar; + y.type = type_scalar; + w.type = type_scalar; + h.type = type_scalar; x.value = rtos(rect.position.x); y.value = rtos(rect.position.y); w.value = rtos(rect.size.x); @@ -232,11 +238,14 @@ int DebugAdapterProtocol::parse_variant(const Variant &p_var) { case Variant::VECTOR3I: { int id = variable_id++; Vector3 vec = p_var; + const String type_scalar = Variant::get_type_name(p_var.get_type() == Variant::VECTOR3 ? Variant::FLOAT : Variant::INT); DAP::Variable x, y, z; x.name = "x"; y.name = "y"; z.name = "z"; - x.type = y.type = z.type = Variant::get_type_name(p_var.get_type() == Variant::VECTOR3 ? Variant::FLOAT : Variant::INT); + x.type = type_scalar; + y.type = type_scalar; + z.type = type_scalar; x.value = rtos(vec.x); y.value = rtos(vec.y); z.value = rtos(vec.z); @@ -251,11 +260,14 @@ int DebugAdapterProtocol::parse_variant(const Variant &p_var) { case Variant::TRANSFORM2D: { int id = variable_id++; Transform2D transform = p_var; + const String type_vec2 = Variant::get_type_name(Variant::VECTOR2); DAP::Variable x, y, origin; x.name = "x"; y.name = "y"; origin.name = "origin"; - x.type = y.type = origin.type = Variant::get_type_name(Variant::VECTOR2); + x.type = type_vec2; + y.type = type_vec2; + origin.type = type_vec2; x.value = transform.elements[0]; y.value = transform.elements[1]; origin.value = transform.elements[2]; @@ -291,12 +303,16 @@ int DebugAdapterProtocol::parse_variant(const Variant &p_var) { case Variant::QUATERNION: { int id = variable_id++; Quaternion quat = p_var; + const String type_float = Variant::get_type_name(Variant::FLOAT); DAP::Variable x, y, z, w; x.name = "x"; y.name = "y"; z.name = "z"; w.name = "w"; - x.type = y.type = z.type = w.type = Variant::get_type_name(Variant::FLOAT); + x.type = type_float; + y.type = type_float; + z.type = type_float; + w.type = type_float; x.value = rtos(quat.x); y.value = rtos(quat.y); z.value = rtos(quat.z); @@ -313,10 +329,12 @@ int DebugAdapterProtocol::parse_variant(const Variant &p_var) { case Variant::AABB: { int id = variable_id++; AABB aabb = p_var; + const String type_vec3 = Variant::get_type_name(Variant::VECTOR3); DAP::Variable position, size; position.name = "position"; size.name = "size"; - position.type = size.type = Variant::get_type_name(Variant::VECTOR3); + position.type = type_vec3; + size.type = type_vec3; position.value = aabb.position; size.value = aabb.size; position.variablesReference = parse_variant(aabb.position); @@ -331,11 +349,14 @@ int DebugAdapterProtocol::parse_variant(const Variant &p_var) { case Variant::BASIS: { int id = variable_id++; Basis basis = p_var; + const String type_vec2 = Variant::get_type_name(Variant::VECTOR2); DAP::Variable x, y, z; x.name = "x"; y.name = "y"; z.name = "z"; - x.type = y.type = z.type = Variant::get_type_name(Variant::VECTOR2); + x.type = type_vec2; + y.type = type_vec2; + z.type = type_vec2; x.value = basis.elements[0]; y.value = basis.elements[1]; z.value = basis.elements[2]; @@ -372,12 +393,16 @@ int DebugAdapterProtocol::parse_variant(const Variant &p_var) { case Variant::COLOR: { int id = variable_id++; Color color = p_var; + const String type_float = Variant::get_type_name(Variant::FLOAT); DAP::Variable r, g, b, a; r.name = "r"; g.name = "g"; b.name = "b"; a.name = "a"; - r.type = g.type = b.type = a.type = Variant::get_type_name(Variant::FLOAT); + r.type = type_float; + g.type = type_float; + b.type = type_float; + a.type = type_float; r.value = rtos(color.r); g.value = rtos(color.g); b.value = rtos(color.b); diff --git a/editor/debugger/editor_debugger_inspector.cpp b/editor/debugger/editor_debugger_inspector.cpp index e53f66e72e..9346b8f1af 100644 --- a/editor/debugger/editor_debugger_inspector.cpp +++ b/editor/debugger/editor_debugger_inspector.cpp @@ -55,9 +55,14 @@ bool EditorDebuggerRemoteObject::_get(const StringName &p_name, Variant &r_ret) } void EditorDebuggerRemoteObject::_get_property_list(List<PropertyInfo> *p_list) const { - p_list->clear(); //sorry, no want category - for (const PropertyInfo &E : prop_list) { - p_list->push_back(E); + p_list->clear(); // Sorry, no want category. + for (const PropertyInfo &prop : prop_list) { + if (prop.name == "script") { + // Skip the script property, it's always added by the non-virtual method. + continue; + } + + p_list->push_back(prop); } } diff --git a/editor/debugger/editor_debugger_node.cpp b/editor/debugger/editor_debugger_node.cpp index 188f5708aa..85cf1558fe 100644 --- a/editor/debugger/editor_debugger_node.cpp +++ b/editor/debugger/editor_debugger_node.cpp @@ -183,6 +183,11 @@ ScriptEditorDebugger *EditorDebuggerNode::get_default_debugger() const { return Object::cast_to<ScriptEditorDebugger>(tabs->get_tab_control(0)); } +String EditorDebuggerNode::get_server_uri() const { + ERR_FAIL_COND_V(server.is_null(), ""); + return server->get_uri(); +} + Error EditorDebuggerNode::start(const String &p_uri) { stop(); ERR_FAIL_COND_V(p_uri.find("://") < 0, ERR_INVALID_PARAMETER); @@ -265,15 +270,20 @@ void EditorDebuggerNode::_notification(int p_what) { if (error_count == 0 && warning_count == 0) { debugger_button->set_text(TTR("Debugger")); + debugger_button->remove_theme_color_override("font_color"); debugger_button->set_icon(Ref<Texture2D>()); } else { debugger_button->set_text(TTR("Debugger") + " (" + itos(error_count + warning_count) + ")"); if (error_count >= 1 && warning_count >= 1) { debugger_button->set_icon(get_theme_icon(SNAME("ErrorWarning"), SNAME("EditorIcons"))); + // Use error color to represent the highest level of severity reported. + debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); } else if (error_count >= 1) { debugger_button->set_icon(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); + debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); } else { debugger_button->set_icon(get_theme_icon(SNAME("Warning"), SNAME("EditorIcons"))); + debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); } } last_error_count = error_count; diff --git a/editor/debugger/editor_debugger_node.h b/editor/debugger/editor_debugger_node.h index 4d9e846834..135122db68 100644 --- a/editor/debugger/editor_debugger_node.h +++ b/editor/debugger/editor_debugger_node.h @@ -188,8 +188,9 @@ public: void set_camera_override(CameraOverride p_override); CameraOverride get_camera_override(); - Error start(const String &p_uri = "tcp://"); + String get_server_uri() const; + Error start(const String &p_uri = "tcp://"); void stop(); void add_debugger_plugin(const Ref<Script> &p_script); diff --git a/editor/debugger/editor_debugger_server.cpp b/editor/debugger/editor_debugger_server.cpp index 8c3833af50..34904d55aa 100644 --- a/editor/debugger/editor_debugger_server.cpp +++ b/editor/debugger/editor_debugger_server.cpp @@ -41,15 +41,18 @@ class EditorDebuggerServerTCP : public EditorDebuggerServer { private: Ref<TCPServer> server; + String endpoint; public: static EditorDebuggerServer *create(const String &p_protocol); - virtual void poll() {} - virtual Error start(const String &p_uri); - virtual void stop(); - virtual bool is_active() const; - virtual bool is_connection_available() const; - virtual Ref<RemoteDebuggerPeer> take_connection(); + + virtual void poll() override {} + virtual String get_uri() const override; + virtual Error start(const String &p_uri) override; + virtual void stop() override; + virtual bool is_active() const override; + virtual bool is_connection_available() const override; + virtual Ref<RemoteDebuggerPeer> take_connection() override; EditorDebuggerServerTCP(); }; @@ -63,21 +66,42 @@ EditorDebuggerServerTCP::EditorDebuggerServerTCP() { server.instantiate(); } +String EditorDebuggerServerTCP::get_uri() const { + return endpoint; +} + Error EditorDebuggerServerTCP::start(const String &p_uri) { - int bind_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port"); + // Default host and port String bind_host = (String)EditorSettings::get_singleton()->get("network/debug/remote_host"); + int bind_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port"); + + // Optionally override if (!p_uri.is_empty() && p_uri != "tcp://") { String scheme, path; Error err = p_uri.parse_url(scheme, bind_host, bind_port, path); ERR_FAIL_COND_V(err != OK, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(!bind_host.is_valid_ip_address() && bind_host != "*", ERR_INVALID_PARAMETER); } - const Error err = server->listen(bind_port, bind_host); - if (err != OK) { - EditorNode::get_log()->add_message(String("Error listening on port ") + itos(bind_port), EditorLog::MSG_TYPE_ERROR); - return err; + + // Try listening on ports + const int max_attempts = 5; + for (int attempt = 1;; ++attempt) { + const Error err = server->listen(bind_port, bind_host); + if (err == OK) { + break; + } + if (attempt >= max_attempts) { + EditorNode::get_log()->add_message(vformat("Cannot listen on port %d, remote debugging unavailable.", bind_port), EditorLog::MSG_TYPE_ERROR); + return err; + } + int last_port = bind_port++; + EditorNode::get_log()->add_message(vformat("Cannot listen on port %d, trying %d instead.", last_port, bind_port), EditorLog::MSG_TYPE_WARNING); } - return err; + + // Endpoint that the client should connect to + endpoint = vformat("tcp://%s:%d", bind_host, bind_port); + + return OK; } void EditorDebuggerServerTCP::stop() { diff --git a/editor/debugger/editor_debugger_server.h b/editor/debugger/editor_debugger_server.h index 844d1a9e5a..6a4ca895d1 100644 --- a/editor/debugger/editor_debugger_server.h +++ b/editor/debugger/editor_debugger_server.h @@ -47,8 +47,10 @@ public: static void register_protocol_handler(const String &p_protocol, CreateServerFunc p_func); static EditorDebuggerServer *create(const String &p_protocol); + + virtual String get_uri() const = 0; virtual void poll() = 0; - virtual Error start(const String &p_uri = "") = 0; + virtual Error start(const String &p_uri) = 0; virtual void stop() = 0; virtual bool is_active() const = 0; virtual bool is_connection_available() const = 0; diff --git a/editor/debugger/editor_performance_profiler.cpp b/editor/debugger/editor_performance_profiler.cpp index 08ed675d16..952f46e9a5 100644 --- a/editor/debugger/editor_performance_profiler.cpp +++ b/editor/debugger/editor_performance_profiler.cpp @@ -249,7 +249,7 @@ TreeItem *EditorPerformanceProfiler::_create_monitor_item(const StringName &p_mo void EditorPerformanceProfiler::_marker_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { Vector<StringName> active; for (OrderedHashMap<StringName, Monitor>::Element i = monitors.front(); i; i = i.next()) { if (i.value().item->is_checked(0)) { diff --git a/editor/debugger/editor_profiler.cpp b/editor/debugger/editor_profiler.cpp index 2fe7cd7886..d08ae1de8a 100644 --- a/editor/debugger/editor_profiler.cpp +++ b/editor/debugger/editor_profiler.cpp @@ -438,7 +438,7 @@ void EditorProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) { Ref<InputEventMouseMotion> mm = p_ev; if ( - (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) || + (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) || (mm.is_valid())) { int x = me->get_position().x - 1; x = x * frame_metrics.size() / graph->get_size().width; @@ -453,7 +453,7 @@ void EditorProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) { x = frame_metrics.size() - 1; } - if (mb.is_valid() || mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + if (mb.is_valid() || (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { updating_frame = true; if (x < total_metrics) diff --git a/editor/debugger/editor_visual_profiler.cpp b/editor/debugger/editor_visual_profiler.cpp index f17ad0d36c..4739458f8e 100644 --- a/editor/debugger/editor_visual_profiler.cpp +++ b/editor/debugger/editor_visual_profiler.cpp @@ -370,8 +370,8 @@ void EditorVisualProfiler::_update_frame(bool p_focus_selected) { float total_gpu = E->get_metadata(2); total_cpu += cpu_time; total_gpu += gpu_time; - E->set_metadata(1, cpu_time); - E->set_metadata(2, gpu_time); + E->set_metadata(1, total_cpu); + E->set_metadata(2, total_gpu); } category->set_icon(0, track_icon); @@ -517,7 +517,7 @@ void EditorVisualProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) { Ref<InputEventMouseMotion> mm = p_ev; if ( - (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) || + (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) || (mm.is_valid())) { int half_w = graph->get_size().width / 2; int x = me->get_position().x; @@ -549,7 +549,7 @@ void EditorVisualProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) { hover_metric = -1; } - if (mb.is_valid() || mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + if (mb.is_valid() || (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { //cursor_metric=x; updating_frame = true; diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index a312c161a8..b18c225f23 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -578,6 +578,12 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da error->set_tooltip(0, tooltip); error->set_tooltip(1, tooltip); + if (warning_count == 0 && error_count == 0) { + expand_all_button->set_disabled(false); + collapse_all_button->set_disabled(false); + clear_button->set_disabled(false); + } + if (oe.warning) { warning_count++; } else { @@ -1404,12 +1410,17 @@ void ScriptEditorDebugger::_clear_errors_list() { error_tree->clear(); error_count = 0; warning_count = 0; + update_tabs(); + + expand_all_button->set_disabled(true); + collapse_all_button->set_disabled(true); + clear_button->set_disabled(true); } // Right click on specific file(s) or folder(s). void ScriptEditorDebugger::_error_tree_item_rmb_selected(const Vector2 &p_pos) { item_menu->clear(); - item_menu->set_size(Size2(1, 1)); + item_menu->reset_size(); if (error_tree->is_anything_selected()) { item_menu->add_icon_item(get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons")), TTR("Copy Error"), ACTION_COPY_ERROR); @@ -1662,28 +1673,31 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { errors_tab = memnew(VBoxContainer); errors_tab->set_name(TTR("Errors")); - HBoxContainer *errhb = memnew(HBoxContainer); - errors_tab->add_child(errhb); + HBoxContainer *error_hbox = memnew(HBoxContainer); + errors_tab->add_child(error_hbox); - Button *expand_all = memnew(Button); - expand_all->set_text(TTR("Expand All")); - expand_all->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_expand_errors_list)); - errhb->add_child(expand_all); + expand_all_button = memnew(Button); + expand_all_button->set_text(TTR("Expand All")); + expand_all_button->set_disabled(true); + expand_all_button->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_expand_errors_list)); + error_hbox->add_child(expand_all_button); - Button *collapse_all = memnew(Button); - collapse_all->set_text(TTR("Collapse All")); - collapse_all->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_collapse_errors_list)); - errhb->add_child(collapse_all); + collapse_all_button = memnew(Button); + collapse_all_button->set_text(TTR("Collapse All")); + collapse_all_button->set_disabled(true); + collapse_all_button->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_collapse_errors_list)); + error_hbox->add_child(collapse_all_button); Control *space = memnew(Control); space->set_h_size_flags(SIZE_EXPAND_FILL); - errhb->add_child(space); - - clearbutton = memnew(Button); - clearbutton->set_text(TTR("Clear")); - clearbutton->set_h_size_flags(0); - clearbutton->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_clear_errors_list)); - errhb->add_child(clearbutton); + error_hbox->add_child(space); + + clear_button = memnew(Button); + clear_button->set_text(TTR("Clear")); + clear_button->set_h_size_flags(0); + clear_button->set_disabled(true); + clear_button->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_clear_errors_list)); + error_hbox->add_child(clear_button); error_tree = memnew(Tree); error_tree->set_columns(2); diff --git a/editor/debugger/script_editor_debugger.h b/editor/debugger/script_editor_debugger.h index 1c1c0fd3e5..76209aef46 100644 --- a/editor/debugger/script_editor_debugger.h +++ b/editor/debugger/script_editor_debugger.h @@ -94,7 +94,9 @@ private: VBoxContainer *errors_tab; Tree *error_tree; - Button *clearbutton; + Button *expand_all_button; + Button *collapse_all_button; + Button *clear_button; PopupMenu *item_menu; EditorFileDialog *file_dialog; diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp index d07d77c112..f18284638f 100644 --- a/editor/dependency_editor.cpp +++ b/editor/dependency_editor.cpp @@ -270,7 +270,7 @@ DependencyEditor::DependencyEditor() { ///////////////////////////////////// void DependencyEditorOwners::_list_rmb_select(int p_item, const Vector2 &p_pos) { file_options->clear(); - file_options->set_size(Size2(1, 1)); + file_options->reset_size(); if (p_item >= 0) { file_options->add_item(TTR("Open"), FILE_OPEN); } @@ -464,7 +464,7 @@ void DependencyRemoveDialog::show(const Vector<String> &p_folders, const Vector< if (removed_deps.is_empty()) { owners->hide(); text->set_text(TTR("Remove the selected files from the project? (Cannot be undone.)\nDepending on your filesystem configuration, the files will either be moved to the system trash or deleted permanently.")); - set_size(Size2()); + reset_size(); popup_centered(); } else { _build_removed_dependency_tree(removed_deps); diff --git a/editor/doc_tools.cpp b/editor/doc_tools.cpp index beead74c53..f1d427648a 100644 --- a/editor/doc_tools.cpp +++ b/editor/doc_tools.cpp @@ -41,7 +41,7 @@ #include "scene/resources/theme.h" // Used for a hack preserving Mono properties on non-Mono builds. -#include "modules/modules_enabled.gen.h" +#include "modules/modules_enabled.gen.h" // For mono. void DocTools::merge_from(const DocTools &p_data) { for (KeyValue<String, DocData::ClassDoc> &E : class_list) { @@ -57,25 +57,21 @@ void DocTools::merge_from(const DocTools &p_data) { c.brief_description = cf.brief_description; c.tutorials = cf.tutorials; - for (int i = 0; i < c.methods.size(); i++) { - DocData::MethodDoc &m = c.methods.write[i]; + for (int i = 0; i < c.constructors.size(); i++) { + DocData::MethodDoc &m = c.constructors.write[i]; - for (int j = 0; j < cf.methods.size(); j++) { - if (cf.methods[j].name != m.name) { + for (int j = 0; j < cf.constructors.size(); j++) { + if (cf.constructors[j].name != m.name) { continue; } - const char *operator_prefix = "operator "; // Operators use a space at the end, making this prefix an invalid identifier (and differentiating from methods). - - if (cf.methods[j].name == c.name || cf.methods[j].name.begins_with(operator_prefix)) { - // Since constructors and operators can repeat, we need to check the type of + { + // Since constructors can repeat, we need to check the type of // the arguments so we make sure they are different. - - if (cf.methods[j].arguments.size() != m.arguments.size()) { + if (cf.constructors[j].arguments.size() != m.arguments.size()) { continue; } - - int arg_count = cf.methods[j].arguments.size(); + int arg_count = cf.constructors[j].arguments.size(); Vector<bool> arg_used; arg_used.resize(arg_count); for (int l = 0; l < arg_count; ++l) { @@ -85,7 +81,7 @@ void DocTools::merge_from(const DocTools &p_data) { // have to check one by one so we make sure we have an exact match for (int k = 0; k < arg_count; ++k) { for (int l = 0; l < arg_count; ++l) { - if (cf.methods[j].arguments[k].type == m.arguments[l].type && !arg_used[l]) { + if (cf.constructors[j].arguments[k].type == m.arguments[l].type && !arg_used[l]) { arg_used.write[l] = true; break; } @@ -102,6 +98,21 @@ void DocTools::merge_from(const DocTools &p_data) { } } + const DocData::MethodDoc &mf = cf.constructors[j]; + + m.description = mf.description; + break; + } + } + + for (int i = 0; i < c.methods.size(); i++) { + DocData::MethodDoc &m = c.methods.write[i]; + + for (int j = 0; j < cf.methods.size(); j++) { + if (cf.methods[j].name != m.name) { + continue; + } + const DocData::MethodDoc &mf = cf.methods[j]; m.description = mf.description; @@ -165,6 +176,54 @@ void DocTools::merge_from(const DocTools &p_data) { } } + for (int i = 0; i < c.operators.size(); i++) { + DocData::MethodDoc &m = c.operators.write[i]; + + for (int j = 0; j < cf.operators.size(); j++) { + if (cf.operators[j].name != m.name) { + continue; + } + + { + // Since operators can repeat, we need to check the type of + // the arguments so we make sure they are different. + if (cf.operators[j].arguments.size() != m.arguments.size()) { + continue; + } + int arg_count = cf.operators[j].arguments.size(); + Vector<bool> arg_used; + arg_used.resize(arg_count); + for (int l = 0; l < arg_count; ++l) { + arg_used.write[l] = false; + } + // also there is no guarantee that argument ordering will match, so we + // have to check one by one so we make sure we have an exact match + for (int k = 0; k < arg_count; ++k) { + for (int l = 0; l < arg_count; ++l) { + if (cf.operators[j].arguments[k].type == m.arguments[l].type && !arg_used[l]) { + arg_used.write[l] = true; + break; + } + } + } + bool not_the_same = false; + for (int l = 0; l < arg_count; ++l) { + if (!arg_used[l]) { // at least one of the arguments was different + not_the_same = true; + } + } + if (not_the_same) { + continue; + } + } + + const DocData::MethodDoc &mf = cf.operators[j]; + + m.description = mf.description; + break; + } + } + #ifndef MODULE_MONO_ENABLED // The Mono module defines some properties that we want to keep when // re-generating docs with a non-Mono build, to prevent pointless diffs @@ -282,11 +341,17 @@ void DocTools::generate(bool p_basic_types) { } DocData::PropertyDoc prop; - prop.name = E.name; - prop.overridden = inherited; + if (inherited) { + String parent = ClassDB::get_parent_class(c.name); + while (!ClassDB::has_property(parent, prop.name, true)) { + parent = ClassDB::get_parent_class(parent); + } + prop.overrides = parent; + } + bool default_value_valid = false; Variant default_value; @@ -544,6 +609,8 @@ void DocTools::generate(bool p_basic_types) { tid.data_type = "style"; c.theme_properties.push_back(tid); } + + c.theme_properties.sort(); } classes.pop_front(); @@ -650,11 +717,6 @@ void DocTools::generate(bool p_basic_types) { DocData::MethodDoc method; method.name = mi.name; - if (method.name == cname) { - method.qualifiers = "constructor"; - } else if (method.name.begins_with("operator")) { - method.qualifiers = "operator"; - } for (int j = 0; j < mi.arguments.size(); j++) { PropertyInfo arginfo = mi.arguments[j]; @@ -694,7 +756,13 @@ void DocTools::generate(bool p_basic_types) { method.qualifiers += "static"; } - c.methods.push_back(method); + if (method.name == cname) { + c.constructors.push_back(method); + } else if (method.name.begins_with("operator")) { + c.operators.push_back(method); + } else { + c.methods.push_back(method); + } } List<PropertyInfo> properties; @@ -916,7 +984,7 @@ static Error _parse_methods(Ref<XMLParser> &parser, Vector<DocData::MethodDoc> & methods.push_back(method); } else { - ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + parser->get_node_name() + "."); + ERR_FAIL_V_MSG(ERR_FILE_CORRUPT, "Invalid tag in doc file: " + parser->get_node_name() + ", expected " + element + "."); } } else if (parser->get_node_type() == XMLParser::NODE_ELEMENT_END && parser->get_node_name() == section) { @@ -1044,10 +1112,15 @@ Error DocTools::_load(Ref<XMLParser> parser) { break; // End of <tutorials>. } } + } else if (name2 == "constructors") { + Error err2 = _parse_methods(parser, c.constructors); + ERR_FAIL_COND_V(err2, err2); } else if (name2 == "methods") { Error err2 = _parse_methods(parser, c.methods); ERR_FAIL_COND_V(err2, err2); - + } else if (name2 == "operators") { + Error err2 = _parse_methods(parser, c.operators); + ERR_FAIL_COND_V(err2, err2); } else if (name2 == "signals") { Error err2 = _parse_methods(parser, c.signals); ERR_FAIL_COND_V(err2, err2); @@ -1269,6 +1342,8 @@ Error DocTools::save_classes(const String &p_default_path, const Map<String, Str } _write_string(f, 1, "</tutorials>"); + _write_method_doc(f, "constructor", c.constructors); + _write_method_doc(f, "method", c.methods); if (!c.properties.is_empty()) { @@ -1288,7 +1363,7 @@ Error DocTools::save_classes(const String &p_default_path, const Map<String, Str const DocData::PropertyDoc &p = c.properties[i]; if (c.properties[i].overridden) { - _write_string(f, 2, "<member name=\"" + p.name + "\" type=\"" + p.type + "\" setter=\"" + p.setter + "\" getter=\"" + p.getter + "\" override=\"true\"" + additional_attributes + " />"); + _write_string(f, 2, "<member name=\"" + p.name + "\" type=\"" + p.type + "\" setter=\"" + p.setter + "\" getter=\"" + p.getter + "\" overrides=\"" + p.overrides + "\"" + additional_attributes + " />"); } else { _write_string(f, 2, "<member name=\"" + p.name + "\" type=\"" + p.type + "\" setter=\"" + p.setter + "\" getter=\"" + p.getter + "\"" + additional_attributes + ">"); _write_string(f, 3, p.description.strip_edges().xml_escape()); @@ -1344,6 +1419,8 @@ Error DocTools::save_classes(const String &p_default_path, const Map<String, Str _write_string(f, 1, "</theme_items>"); } + _write_method_doc(f, "operator", c.operators); + _write_string(f, 0, "</class>"); } diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp index c895e2c158..414264e697 100644 --- a/editor/editor_about.cpp +++ b/editor/editor_about.cpp @@ -155,7 +155,7 @@ EditorAbout::EditorAbout() { Label *about_text = memnew(Label); about_text->set_v_size_flags(Control::SIZE_SHRINK_CENTER); about_text->set_text(String::utf8("\xc2\xa9 2007-2021 Juan Linietsky, Ariel Manzur.\n\xc2\xa9 2014-2021 ") + - TTR("Godot Engine contributors") + "\n"); + TTR("Godot Engine contributors") + "\n"); version_info_vbc->add_child(about_text); hbc->add_child(version_info_vbc); diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index b9f1c1af54..dd9f10a23b 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -303,7 +303,7 @@ void EditorAudioBus::_volume_changed(float p_normalized) { const float p_db = this->_normalized_volume_to_scaled_db(p_normalized); - if (Input::get_singleton()->is_key_pressed(KEY_CTRL)) { + if (Input::get_singleton()->is_key_pressed(Key::CTRL)) { // Snap the value when holding Ctrl for easier editing. // To do so, it needs to be converted back to normalized volume (as the slider uses that unit). slider->set_value(_scaled_db_to_normalized_volume(Math::round(p_db))); @@ -363,7 +363,7 @@ float EditorAudioBus::_scaled_db_to_normalized_volume(float db) { void EditorAudioBus::_show_value(float slider_value) { float db; - if (Input::get_singleton()->is_key_pressed(KEY_CTRL)) { + if (Input::get_singleton()->is_key_pressed(Key::CTRL)) { // Display the correct (snapped) value when holding Ctrl db = Math::round(_normalized_volume_to_scaled_db(slider_value)); } else { @@ -534,7 +534,7 @@ void EditorAudioBus::gui_input(const Ref<InputEvent> &p_event) { ERR_FAIL_COND(p_event.is_null()); Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) { Vector2 pos = mb->get_position(); bus_popup->set_position(get_global_position() + pos); bus_popup->popup(); @@ -543,7 +543,7 @@ void EditorAudioBus::gui_input(const Ref<InputEvent> &p_event) { void EditorAudioBus::_effects_gui_input(Ref<InputEvent> p_event) { Ref<InputEventKey> k = p_event; - if (k.is_valid() && k->is_pressed() && !k->is_echo() && k->get_keycode() == KEY_DELETE) { + if (k.is_valid() && k->is_pressed() && !k->is_echo() && k->get_keycode() == Key::KEY_DELETE) { TreeItem *current_effect = effects->get_selected(); if (current_effect && current_effect->get_metadata(0).get_type() == Variant::INT) { _delete_effect_pressed(0); @@ -925,8 +925,8 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) { hbc->add_child(bus_options); bus_popup = bus_options->get_popup(); - bus_popup->add_shortcut(ED_SHORTCUT("audio_bus_editor/duplicate_selected_bus", TTR("Duplicate Bus"), KEY_MASK_CMD | KEY_D)); - bus_popup->add_shortcut(ED_SHORTCUT("audio_bus_editor/delete_selected_bus", TTR("Delete Bus"), KEY_DELETE)); + bus_popup->add_shortcut(ED_SHORTCUT("audio_bus_editor/duplicate_selected_bus", TTR("Duplicate Bus"), KeyModifierMask::CMD | Key::D)); + bus_popup->add_shortcut(ED_SHORTCUT("audio_bus_editor/delete_selected_bus", TTR("Delete Bus"), Key::KEY_DELETE)); bus_popup->set_item_disabled(1, is_master); bus_popup->add_item(TTR("Reset Volume")); bus_popup->connect("index_pressed", callable_mp(this, &EditorAudioBus::_bus_popup_pressed)); diff --git a/editor/editor_audio_buses.h b/editor/editor_audio_buses.h index e1aaa060c6..eb54bb3efb 100644 --- a/editor/editor_audio_buses.h +++ b/editor/editor_audio_buses.h @@ -230,11 +230,10 @@ private: render_db_value = n.render_db_value; } - _FORCE_INLINE_ AudioNotch &operator=(const EditorAudioMeterNotches::AudioNotch &n) { + _FORCE_INLINE_ void operator=(const EditorAudioMeterNotches::AudioNotch &n) { relative_position = n.relative_position; db_value = n.db_value; render_db_value = n.render_db_value; - return *this; } _FORCE_INLINE_ AudioNotch() {} diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp index 0840c3b6a8..25e76c2262 100644 --- a/editor/editor_autoload_settings.cpp +++ b/editor/editor_autoload_settings.cpp @@ -117,7 +117,7 @@ bool EditorAutoloadSettings::_autoload_name_is_valid(const String &p_name, Strin for (const String &E : keywords) { if (E == p_name) { if (r_error) { - *r_error = TTR("Invalid name.") + " " + TTR("Keyword cannot be used as an autoload name."); + *r_error = TTR("Invalid name.") + " " + TTR("Keyword cannot be used as an AutoLoad name."); } return false; @@ -373,13 +373,13 @@ Node *EditorAutoloadSettings::_create_autoload(const String &p_path) { Object *obj = ClassDB::instantiate(ibt); - ERR_FAIL_COND_V_MSG(obj == nullptr, nullptr, "Cannot instance script for autoload, expected 'Node' inheritance, got: " + String(ibt) + "."); + ERR_FAIL_COND_V_MSG(obj == nullptr, nullptr, "Cannot instance script for AutoLoad, expected 'Node' inheritance, got: " + String(ibt) + "."); n = Object::cast_to<Node>(obj); n->set_script(s); } - ERR_FAIL_COND_V_MSG(!n, nullptr, "Path in autoload not a node or script: " + p_path + "."); + ERR_FAIL_COND_V_MSG(!n, nullptr, "Path in AutoLoad not a node or script: " + p_path + "."); return n; } @@ -692,18 +692,18 @@ bool EditorAutoloadSettings::autoload_add(const String &p_name, const String &p_ String error; if (!_autoload_name_is_valid(name, &error)) { - EditorNode::get_singleton()->show_warning(TTR("Can't add autoload:") + "\n" + error); + EditorNode::get_singleton()->show_warning(TTR("Can't add AutoLoad:") + "\n" + error); return false; } const String &path = p_path; if (!FileAccess::exists(path)) { - EditorNode::get_singleton()->show_warning(TTR("Can't add autoload:") + "\n" + vformat(TTR("%s is an invalid path. File does not exist."), path)); + EditorNode::get_singleton()->show_warning(TTR("Can't add AutoLoad:") + "\n" + vformat(TTR("%s is an invalid path. File does not exist."), path)); return false; } if (!path.begins_with("res://")) { - EditorNode::get_singleton()->show_warning(TTR("Can't add autoload:") + "\n" + vformat(TTR("%s is an invalid path. Not in resource path (res://)."), path)); + EditorNode::get_singleton()->show_warning(TTR("Can't add AutoLoad:") + "\n" + vformat(TTR("%s is an invalid path. Not in resource path (res://)."), path)); return false; } diff --git a/editor/editor_builders.py b/editor/editor_builders.py index ff0daa86ff..67d4b8534f 100644 --- a/editor/editor_builders.py +++ b/editor/editor_builders.py @@ -26,7 +26,9 @@ def make_doc_header(target, source, env): decomp_size = len(buf) import zlib - buf = zlib.compress(buf) + # Use maximum zlib compression level to further reduce file size + # (at the cost of initial build times). + buf = zlib.compress(buf, zlib.Z_BEST_COMPRESSION) g.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n") g.write("#ifndef _DOC_DATA_RAW_H\n") @@ -92,7 +94,9 @@ def make_translations_header(target, source, env, category): with open(sorted_paths[i], "rb") as f: buf = f.read() decomp_size = len(buf) - buf = zlib.compress(buf) + # Use maximum zlib compression level to further reduce file size + # (at the cost of initial build times). + buf = zlib.compress(buf, zlib.Z_BEST_COMPRESSION) name = os.path.splitext(os.path.basename(sorted_paths[i]))[0] g.write("static const unsigned char _{}_translation_{}_compressed[] = {{\n".format(category, name)) diff --git a/editor/editor_command_palette.cpp b/editor/editor_command_palette.cpp index e69ced8522..52e55de84c 100644 --- a/editor/editor_command_palette.cpp +++ b/editor/editor_command_palette.cpp @@ -149,10 +149,10 @@ void EditorCommandPalette::_sbox_input(const Ref<InputEvent> &p_ie) { Ref<InputEventKey> k = p_ie; if (k.is_valid()) { switch (k->get_keycode()) { - case KEY_UP: - case KEY_DOWN: - case KEY_PAGEUP: - case KEY_PAGEDOWN: { + case Key::UP: + case Key::DOWN: + case Key::PAGEUP: + case Key::PAGEDOWN: { search_options->gui_input(k); } break; default: @@ -212,6 +212,12 @@ void EditorCommandPalette::_add_command(String p_command_name, String p_key_name command.callable = p_binded_action; command.shortcut = p_shortcut_text; + // Commands added from plugins don't exist yet when the history is loaded, so we assign the last use time here if it was recorded. + Dictionary command_history = EditorSettings::get_singleton()->get_project_metadata("command_palette", "command_history", Dictionary()); + if (command_history.has(p_key_name)) { + command.last_used = command_history[p_key_name]; + } + commands[p_key_name] = command; } @@ -242,7 +248,9 @@ void EditorCommandPalette::register_shortcuts_as_command() { Array history_entries = command_history.keys(); for (int i = 0; i < history_entries.size(); i++) { const String &history_key = history_entries[i]; - commands[history_key].last_used = command_history[history_key]; + if (commands.has(history_key)) { + commands[history_key].last_used = command_history[history_key]; + } } } diff --git a/editor/editor_command_palette.h b/editor/editor_command_palette.h index 39821a1169..8836c7b0fb 100644 --- a/editor/editor_command_palette.h +++ b/editor/editor_command_palette.h @@ -99,6 +99,6 @@ public: static EditorCommandPalette *get_singleton(); }; -Ref<Shortcut> ED_SHORTCUT_AND_COMMAND(const String &p_path, const String &p_name, Key p_keycode = KEY_NONE, String p_command = ""); +Ref<Shortcut> ED_SHORTCUT_AND_COMMAND(const String &p_path, const String &p_name, Key p_keycode = Key::NONE, String p_command = ""); #endif //EDITOR_COMMAND_PALETTE_H diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index aee9c21007..6fd8cb47ea 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -70,7 +70,7 @@ void EditorHistory::cleanup_history() { } if (fail) { - history.remove(i); + history.remove_at(i); i--; } } @@ -510,7 +510,7 @@ void EditorData::remove_custom_type(const String &p_type) { for (Map<String, Vector<CustomType>>::Element *E = custom_types.front(); E; E = E->next()) { for (int i = 0; i < E->get().size(); i++) { if (E->get()[i].name == p_type) { - E->get().remove(i); + E->get().remove_at(i); if (E->get().is_empty()) { custom_types.erase(E->key()); } @@ -570,7 +570,7 @@ void EditorData::remove_scene(int p_idx) { ScriptEditor::get_singleton()->close_builtin_scripts_from_scene(edited_scene[p_idx].path); } - edited_scene.remove(p_idx); + edited_scene.remove_at(p_idx); } bool EditorData::_find_updated_instances(Node *p_root, Node *p_node, Set<String> &checked_paths) { @@ -751,7 +751,7 @@ void EditorData::move_edited_scene_to_index(int p_idx) { ERR_FAIL_INDEX(p_idx, edited_scene.size()); EditedScene es = edited_scene[current_edited_scene]; - edited_scene.remove(current_edited_scene); + edited_scene.remove_at(current_edited_scene); edited_scene.insert(p_idx, es); current_edited_scene = p_idx; } @@ -893,8 +893,13 @@ bool EditorData::script_class_is_parent(const String &p_class, const String &p_i if (!ScriptServer::is_global_class(p_class)) { return false; } - String base = script_class_get_base(p_class); + Ref<Script> script = script_class_load_script(p_class); + if (script.is_null()) { + return false; + } + + String base = script_class_get_base(p_class); Ref<Script> base_script = script->get_base_script(); while (p_inherits != base) { diff --git a/editor/editor_data.h b/editor/editor_data.h index 9184ddcf39..976d718b8e 100644 --- a/editor/editor_data.h +++ b/editor/editor_data.h @@ -135,8 +135,6 @@ private: Vector<Callable> undo_redo_callbacks; Map<StringName, Callable> move_element_functions; - void _cleanup_history(); - Vector<EditedScene> edited_scene; int current_edited_scene; diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 2010ee01db..55a2c319fe 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -82,7 +82,7 @@ bool EditorExportPreset::_get(const StringName &p_name, Variant &r_ret) const { void EditorExportPreset::_get_property_list(List<PropertyInfo> *p_list) const { for (const PropertyInfo &E : properties) { - if (platform->get_option_visibility(E.name, values)) { + if (platform->get_export_option_visibility(E.name, values)) { p_list->push_back(E); } } @@ -488,8 +488,8 @@ void EditorExportPlatform::_edit_files_with_filter(DirAccess *da, const Vector<S String cur_dir_no_prefix = cur_dir.replace("res://", ""); Vector<String> dirs; - String f; - while ((f = da->get_next()) != "") { + String f = da->get_next(); + while (!f.is_empty()) { if (da->current_is_dir()) { dirs.push_back(f); } else { @@ -506,6 +506,7 @@ void EditorExportPlatform::_edit_files_with_filter(DirAccess *da, const Vector<S } } } + f = da->get_next(); } da->list_dir_end(); @@ -1491,13 +1492,16 @@ void EditorExport::add_export_preset(const Ref<EditorExportPreset> &p_preset, in } String EditorExportPlatform::test_etc2() const { + // String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); + // bool etc_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc"); + // bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2"); String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); bool etc_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc"); bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2"); - if (driver == "GLES2" && !etc_supported) { - return TTR("Target platform requires 'ETC' texture compression for GLES2. Enable 'Import Etc' in Project Settings."); - } else if (driver == "Vulkan" && !etc2_supported) { + if (driver == "opengl3" && !etc_supported) { + return TTR("Target platform requires 'ETC' texture compression for OpenGL. Enable 'Import Etc' in Project Settings."); + } else if (driver == "vulkan" && !etc2_supported) { // FIXME: Review if this is true for Vulkan. return TTR("Target platform requires 'ETC2' texture compression for Vulkan. Enable 'Import Etc 2' in Project Settings."); } @@ -1508,10 +1512,13 @@ String EditorExportPlatform::test_etc2_or_pvrtc() const { String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2"); bool pvrtc_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_pvrtc"); + // String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); + // bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2"); + // bool pvrtc_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_pvrtc"); - if (driver == "GLES2" && !pvrtc_supported) { - return TTR("Target platform requires 'PVRTC' texture compression for GLES2. Enable 'Import Pvrtc' in Project Settings."); - } else if (driver == "Vulkan" && !etc2_supported && !pvrtc_supported) { + if (driver == "opengl3" && !pvrtc_supported) { + return TTR("Target platform requires 'PVRTC' texture compression for OpenGL. Enable 'Import Pvrtc' in Project Settings."); + } else if (driver == "vulkan" && !etc2_supported && !pvrtc_supported) { // FIXME: Review if this is true for Vulkan. return TTR("Target platform requires 'ETC2' or 'PVRTC' texture compression for Vulkan. Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings."); } @@ -1528,7 +1535,7 @@ Ref<EditorExportPreset> EditorExport::get_export_preset(int p_idx) { } void EditorExport::remove_export_preset(int p_idx) { - export_presets.remove(p_idx); + export_presets.remove_at(p_idx); save_presets(); } diff --git a/editor/editor_export.h b/editor/editor_export.h index b681f52330..1a5b8e6026 100644 --- a/editor/editor_export.h +++ b/editor/editor_export.h @@ -240,7 +240,7 @@ public: virtual void get_export_options(List<ExportOption> *r_options) = 0; virtual bool should_update_export_options() { return false; } - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { return true; } + virtual bool get_export_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { return true; } virtual String get_os_name() const = 0; virtual String get_name() const = 0; diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index 675234959a..ec8651ac7c 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -302,7 +302,7 @@ void EditorFileDialog::_post_popup() { bool exists = dir_access->dir_exists(recentd[i]); if (!exists) { // Remove invalid directory from the list of Recent directories. - recentd.remove(i--); + recentd.remove_at(i--); } else { recent->add_item(name, folder); recent->set_item_metadata(recent->get_item_count() - 1, recentd[i]); @@ -576,7 +576,7 @@ void EditorFileDialog::_item_dc_selected(int p_item) { void EditorFileDialog::_item_list_item_rmb_selected(int p_item, const Vector2 &p_pos) { // Right click on specific file(s) or folder(s). item_menu->clear(); - item_menu->set_size(Size2(1, 1)); + item_menu->reset_size(); // Allow specific actions only on one item. bool single_item_selected = item_list->get_selected_items().size() == 1; @@ -598,7 +598,7 @@ void EditorFileDialog::_item_list_item_rmb_selected(int p_item, const Vector2 &p item_menu->add_icon_item(item_list->get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons")), TTR("Copy Path"), ITEM_MENU_COPY_PATH); } if (allow_delete) { - item_menu->add_icon_item(item_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Delete"), ITEM_MENU_DELETE, KEY_DELETE); + item_menu->add_icon_item(item_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Delete"), ITEM_MENU_DELETE, Key::KEY_DELETE); } if (single_item_selected) { item_menu->add_separator(); @@ -620,12 +620,12 @@ void EditorFileDialog::_item_list_rmb_clicked(const Vector2 &p_pos) { } item_menu->clear(); - item_menu->set_size(Size2(1, 1)); + item_menu->reset_size(); if (can_create_dir) { - item_menu->add_icon_item(item_list->get_theme_icon(SNAME("folder"), SNAME("FileDialog")), TTR("New Folder..."), ITEM_MENU_NEW_FOLDER, KEY_MASK_CMD | KEY_N); + item_menu->add_icon_item(item_list->get_theme_icon(SNAME("folder"), SNAME("FileDialog")), TTR("New Folder..."), ITEM_MENU_NEW_FOLDER, KeyModifierMask::CMD | Key::N); } - item_menu->add_icon_item(item_list->get_theme_icon(SNAME("Reload"), SNAME("EditorIcons")), TTR("Refresh"), ITEM_MENU_REFRESH, KEY_F5); + item_menu->add_icon_item(item_list->get_theme_icon(SNAME("Reload"), SNAME("EditorIcons")), TTR("Refresh"), ITEM_MENU_REFRESH, Key::F5); item_menu->add_separator(); item_menu->add_icon_item(item_list->get_theme_icon(SNAME("Filesystem"), SNAME("EditorIcons")), TTR("Open in File Manager"), ITEM_MENU_SHOW_IN_EXPLORER); @@ -761,10 +761,11 @@ void EditorFileDialog::update_file_list() { List<String> files; List<String> dirs; - String item; + String item = dir_access->get_next(); - while ((item = dir_access->get_next()) != "") { + while (!item.is_empty()) { if (item == "." || item == "..") { + item = dir_access->get_next(); continue; } @@ -775,6 +776,7 @@ void EditorFileDialog::update_file_list() { dirs.push_back(item); } } + item = dir_access->get_next(); } dirs.sort_custom<NaturalNoCaseComparator>(); @@ -1117,7 +1119,7 @@ void EditorFileDialog::_delete_items() { } } if (folders.size() + files.size() > 0) { - remove_dialog->set_size(Size2(1, 1)); + remove_dialog->reset_size(); remove_dialog->show(folders, files); } } @@ -1445,7 +1447,7 @@ void EditorFileDialog::_save_to_recent() { for (int i = 0; i < recent.size(); i++) { bool cres = recent[i].begins_with("res://"); if (recent[i] == dir || (res == cres && count > max)) { - recent.remove(i); + recent.remove_at(i); i--; } else { count++; @@ -1476,18 +1478,18 @@ EditorFileDialog::EditorFileDialog() { mode = FILE_MODE_SAVE_FILE; set_title(TTR("Save a File")); - ED_SHORTCUT("file_dialog/go_back", TTR("Go Back"), KEY_MASK_ALT | KEY_LEFT); - ED_SHORTCUT("file_dialog/go_forward", TTR("Go Forward"), KEY_MASK_ALT | KEY_RIGHT); - ED_SHORTCUT("file_dialog/go_up", TTR("Go Up"), KEY_MASK_ALT | KEY_UP); - ED_SHORTCUT("file_dialog/refresh", TTR("Refresh"), KEY_F5); - ED_SHORTCUT("file_dialog/toggle_hidden_files", TTR("Toggle Hidden Files"), KEY_MASK_CMD | KEY_H); - ED_SHORTCUT("file_dialog/toggle_favorite", TTR("Toggle Favorite"), KEY_MASK_ALT | KEY_F); - ED_SHORTCUT("file_dialog/toggle_mode", TTR("Toggle Mode"), KEY_MASK_ALT | KEY_V); - ED_SHORTCUT("file_dialog/create_folder", TTR("Create Folder"), KEY_MASK_CMD | KEY_N); - ED_SHORTCUT("file_dialog/delete", TTR("Delete"), KEY_DELETE); - ED_SHORTCUT("file_dialog/focus_path", TTR("Focus Path"), KEY_MASK_CMD | KEY_D); - ED_SHORTCUT("file_dialog/move_favorite_up", TTR("Move Favorite Up"), KEY_MASK_CMD | KEY_UP); - ED_SHORTCUT("file_dialog/move_favorite_down", TTR("Move Favorite Down"), KEY_MASK_CMD | KEY_DOWN); + ED_SHORTCUT("file_dialog/go_back", TTR("Go Back"), KeyModifierMask::ALT | Key::LEFT); + ED_SHORTCUT("file_dialog/go_forward", TTR("Go Forward"), KeyModifierMask::ALT | Key::RIGHT); + ED_SHORTCUT("file_dialog/go_up", TTR("Go Up"), KeyModifierMask::ALT | Key::UP); + ED_SHORTCUT("file_dialog/refresh", TTR("Refresh"), Key::F5); + ED_SHORTCUT("file_dialog/toggle_hidden_files", TTR("Toggle Hidden Files"), KeyModifierMask::CMD | Key::H); + ED_SHORTCUT("file_dialog/toggle_favorite", TTR("Toggle Favorite"), KeyModifierMask::ALT | Key::F); + ED_SHORTCUT("file_dialog/toggle_mode", TTR("Toggle Mode"), KeyModifierMask::ALT | Key::V); + ED_SHORTCUT("file_dialog/create_folder", TTR("Create Folder"), KeyModifierMask::CMD | Key::N); + ED_SHORTCUT("file_dialog/delete", TTR("Delete"), Key::KEY_DELETE); + ED_SHORTCUT("file_dialog/focus_path", TTR("Focus Path"), KeyModifierMask::CMD | Key::D); + ED_SHORTCUT("file_dialog/move_favorite_up", TTR("Move Favorite Up"), KeyModifierMask::CMD | Key::UP); + ED_SHORTCUT("file_dialog/move_favorite_down", TTR("Move Favorite Down"), KeyModifierMask::CMD | Key::DOWN); HBoxContainer *pathhb = memnew(HBoxContainer); diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 767856f939..4f02a82fb5 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -577,7 +577,7 @@ bool EditorFileSystem::_update_scan_actions() { ERR_CONTINUE(idx == -1); _delete_internal_files(ia.dir->files[idx]->file); memdelete(ia.dir->files[idx]); - ia.dir->files.remove(idx); + ia.dir->files.remove_at(idx); fs_changed = true; @@ -1536,7 +1536,7 @@ void EditorFileSystem::update_file(const String &p_file) { } } memdelete(fs->files[cpos]); - fs->files.remove(cpos); + fs->files.remove_at(cpos); } call_deferred(SNAME("emit_signal"), "filesystem_changed"); //update later @@ -1633,7 +1633,7 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); ERR_FAIL_COND_V(!importer.is_valid(), ERR_FILE_CORRUPT); List<ResourceImporter::ImportOption> options; - importer->get_import_options(&options); + importer->get_import_options(p_files[i], &options); //set default values for (const ResourceImporter::ImportOption &E : options) { source_file_options[p_files[i]][E.option.name] = E.default_value; @@ -1714,7 +1714,7 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector //store options in provided order, to avoid file changing. Order is also important because first match is accepted first. List<ResourceImporter::ImportOption> options; - importer->get_import_options(&options); + importer->get_import_options(file, &options); //set default values for (const ResourceImporter::ImportOption &F : options) { String base = F.option.name; @@ -1851,7 +1851,7 @@ void EditorFileSystem::_reimport_file(const String &p_file, const Map<StringName //mix with default params, in case a parameter is missing List<ResourceImporter::ImportOption> opts; - importer->get_import_options(&opts); + importer->get_import_options(p_file, &opts); for (const ResourceImporter::ImportOption &E : opts) { if (!params.has(E.option.name)) { //this one is not present params[E.option.name] = E.default_value; @@ -2163,7 +2163,8 @@ Error EditorFileSystem::_resource_import(const String &p_path) { } bool EditorFileSystem::_should_skip_directory(const String &p_path) { - if (p_path.begins_with(ProjectSettings::get_singleton()->get_project_data_path())) { + String project_data_path = ProjectSettings::get_singleton()->get_project_data_path(); + if (p_path == project_data_path || p_path.begins_with(project_data_path + "/")) { return true; } diff --git a/editor/editor_folding.cpp b/editor/editor_folding.cpp index 29e3236ac2..c98606730c 100644 --- a/editor/editor_folding.cpp +++ b/editor/editor_folding.cpp @@ -262,10 +262,6 @@ void EditorFolding::_do_object_unfolds(Object *p_object, Set<RES> &resources) { if (E.type == Variant::OBJECT) { RES res = p_object->get(E.name); - print_line("res: " + String(E.name) + " valid " + itos(res.is_valid())); - if (res.is_valid()) { - print_line("path " + res->get_path()); - } if (res.is_valid() && !resources.has(res) && res->get_path() != String() && !res->get_path().is_resource_file()) { resources.insert(res); _do_object_unfolds(res.ptr(), resources); diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index e5d6315ef7..a644e3e991 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -67,7 +67,7 @@ m_name->add_data(FontJapanese); \ m_name->add_data(FontFallback); -#define MAKE_DEFAULT_FONT(m_name, m_variations, m_base_size) \ +#define MAKE_DEFAULT_FONT(m_name, m_variations) \ Ref<Font> m_name; \ m_name.instantiate(); \ if (CustomFont.is_valid()) { \ @@ -89,12 +89,11 @@ } \ m_name->set_variation_coordinates(variations); \ } \ - m_name->set_base_size(m_base_size); \ m_name->set_spacing(TextServer::SPACING_TOP, -EDSCALE); \ m_name->set_spacing(TextServer::SPACING_BOTTOM, -EDSCALE); \ MAKE_FALLBACKS(m_name); -#define MAKE_BOLD_FONT(m_name, m_variations, m_base_size) \ +#define MAKE_BOLD_FONT(m_name, m_variations) \ Ref<Font> m_name; \ m_name.instantiate(); \ if (CustomFontBold.is_valid()) { \ @@ -116,12 +115,11 @@ } \ m_name->set_variation_coordinates(variations); \ } \ - m_name->set_base_size(m_base_size); \ m_name->set_spacing(TextServer::SPACING_TOP, -EDSCALE); \ m_name->set_spacing(TextServer::SPACING_BOTTOM, -EDSCALE); \ MAKE_FALLBACKS_BOLD(m_name); -#define MAKE_SOURCE_FONT(m_name, m_variations, m_base_size) \ +#define MAKE_SOURCE_FONT(m_name, m_variations) \ Ref<Font> m_name; \ m_name.instantiate(); \ if (CustomFontSource.is_valid()) { \ @@ -143,7 +141,6 @@ } \ m_name->set_variation_coordinates(variations); \ } \ - m_name->set_base_size(m_base_size); \ m_name->set_spacing(TextServer::SPACING_TOP, -EDSCALE); \ m_name->set_spacing(TextServer::SPACING_BOTTOM, -EDSCALE); \ MAKE_FALLBACKS(m_name); @@ -275,7 +272,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { Ref<FontData> dfmono = load_cached_internal_font(_font_Hack_Regular, _font_Hack_Regular_size, font_hinting, font_antialiased, true); // Default font - MAKE_DEFAULT_FONT(df, String(), default_font_size); + MAKE_DEFAULT_FONT(df, String()); p_theme->set_default_theme_font(df); // Default theme font p_theme->set_default_theme_font_size(default_font_size); @@ -283,7 +280,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { p_theme->set_font("main", "EditorFonts", df); // Bold font - MAKE_BOLD_FONT(df_bold, String(), default_font_size); + MAKE_BOLD_FONT(df_bold, String()); p_theme->set_font_size("bold_size", "EditorFonts", default_font_size); p_theme->set_font("bold", "EditorFonts", df_bold); @@ -310,7 +307,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { // Documentation fonts String code_font_custom_variations = EditorSettings::get_singleton()->get("interface/editor/code_font_custom_variations"); - MAKE_SOURCE_FONT(df_code, code_font_custom_variations, default_font_size); + MAKE_SOURCE_FONT(df_code, code_font_custom_variations); p_theme->set_font_size("doc_size", "EditorFonts", int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE); p_theme->set_font("doc", "EditorFonts", df); p_theme->set_font_size("doc_bold_size", "EditorFonts", int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE); diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index c049db8ef6..c95b1c753e 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -33,13 +33,14 @@ #include "core/core_constants.h" #include "core/input/input.h" #include "core/os/keyboard.h" +#include "core/version_generated.gen.h" #include "doc_data_compressed.gen.h" #include "editor/plugins/script_editor_plugin.h" #include "editor_node.h" #include "editor_scale.h" #include "editor_settings.h" -#define CONTRIBUTE_URL "https://docs.godotengine.org/en/latest/community/contributing/updating_the_class_reference.html" +#define CONTRIBUTE_URL vformat("%s/community/contributing/updating_the_class_reference.html", VERSION_DOCS_URL) DocTools *EditorHelp::doc = nullptr; @@ -108,6 +109,9 @@ void EditorHelp::_class_desc_select(const String &p_select) { } else if (tag == "constant") { topic = "class_constant"; table = &this->constant_line; + } else if (tag == "theme_item") { + topic = "theme_item"; + table = &this->theme_property_line; } else { return; } @@ -233,8 +237,7 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview class_desc->push_cell(); class_desc->push_paragraph(RichTextLabel::ALIGN_RIGHT, Control::TEXT_DIRECTION_AUTO, ""); } else { - static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 }; - class_desc->add_text(String(prefix)); + _add_bulletpoint(); } _add_type(p_method.return_type, p_method.return_enum); @@ -310,6 +313,11 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview } } +void EditorHelp::_add_bulletpoint() { + static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 }; + class_desc->add_text(String(prefix)); +} + Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) { if (!doc->class_list.has(p_class)) { return ERR_DOES_NOT_EXIST; @@ -330,6 +338,153 @@ Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) { return OK; } +void EditorHelp::_update_method_list(const Vector<DocData::MethodDoc> p_methods, bool &r_method_descrpitons) { + Ref<Font> doc_code_font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts")); + class_desc->pop(); + class_desc->pop(); + + class_desc->add_newline(); + class_desc->push_font(doc_code_font); + class_desc->push_indent(1); + class_desc->push_table(2); + class_desc->set_table_column_expand(1, true); + + bool any_previous = false; + for (int pass = 0; pass < 2; pass++) { + Vector<DocData::MethodDoc> m; + + for (int i = 0; i < p_methods.size(); i++) { + const String &q = p_methods[i].qualifiers; + if ((pass == 0 && q.find("virtual") != -1) || (pass == 1 && q.find("virtual") == -1)) { + m.push_back(p_methods[i]); + } + } + + if (any_previous && !m.is_empty()) { + class_desc->push_cell(); + class_desc->pop(); //cell + class_desc->push_cell(); + class_desc->pop(); //cell + } + + String group_prefix; + for (int i = 0; i < m.size(); i++) { + const String new_prefix = m[i].name.substr(0, 3); + bool is_new_group = false; + + if (i < m.size() - 1 && new_prefix == m[i + 1].name.substr(0, 3) && new_prefix != group_prefix) { + is_new_group = i > 0; + group_prefix = new_prefix; + } else if (group_prefix != "" && new_prefix != group_prefix) { + is_new_group = true; + group_prefix = ""; + } + + if (is_new_group && pass == 1) { + class_desc->push_cell(); + class_desc->pop(); //cell + class_desc->push_cell(); + class_desc->pop(); //cell + } + + if (m[i].description != "" || m[i].errors_returned.size() > 0) { + r_method_descrpitons = true; + } + + _add_method(m[i], true); + } + + any_previous = !m.is_empty(); + } + + class_desc->pop(); //table + class_desc->pop(); + class_desc->pop(); // font + class_desc->add_newline(); + class_desc->add_newline(); +} + +void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc, const Vector<DocData::MethodDoc> p_methods, const String &p_method_type) { + Ref<Font> doc_font = get_theme_font(SNAME("doc"), SNAME("EditorFonts")); + Ref<Font> doc_bold_font = get_theme_font(SNAME("doc_bold"), SNAME("EditorFonts")); + Ref<Font> doc_code_font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts")); + String link_color_text = title_color.to_html(false); + class_desc->pop(); + class_desc->pop(); + + class_desc->add_newline(); + class_desc->add_newline(); + + for (int pass = 0; pass < 2; pass++) { + Vector<DocData::MethodDoc> methods_filtered; + + for (int i = 0; i < p_methods.size(); i++) { + const String &q = p_methods[i].qualifiers; + if ((pass == 0 && q.find("virtual") != -1) || (pass == 1 && q.find("virtual") == -1)) { + methods_filtered.push_back(p_methods[i]); + } + } + + for (int i = 0; i < methods_filtered.size(); i++) { + class_desc->push_font(doc_code_font); + _add_method(methods_filtered[i], false); + class_desc->pop(); + + class_desc->add_newline(); + class_desc->add_newline(); + + class_desc->push_color(text_color); + class_desc->push_font(doc_font); + class_desc->push_indent(1); + if (methods_filtered[i].errors_returned.size()) { + class_desc->append_text(TTR("Error codes returned:")); + class_desc->add_newline(); + class_desc->push_list(0, RichTextLabel::LIST_DOTS, false); + for (int j = 0; j < methods_filtered[i].errors_returned.size(); j++) { + if (j > 0) { + class_desc->add_newline(); + } + int val = methods_filtered[i].errors_returned[j]; + String text = itos(val); + for (int k = 0; k < CoreConstants::get_global_constant_count(); k++) { + if (CoreConstants::get_global_constant_value(k) == val && CoreConstants::get_global_constant_enum(k) == SNAME("Error")) { + text = CoreConstants::get_global_constant_name(k); + break; + } + } + + class_desc->push_bold(); + class_desc->append_text(text); + class_desc->pop(); + } + class_desc->pop(); + class_desc->add_newline(); + class_desc->add_newline(); + } + if (!methods_filtered[i].description.strip_edges().is_empty()) { + _add_text(DTR(methods_filtered[i].description)); + } else { + class_desc->add_image(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); + class_desc->add_text(" "); + class_desc->push_color(comment_color); + if (p_classdoc.is_script_doc) { + class_desc->append_text(TTR("There is currently no description for this " + p_method_type + ".")); + } else { + class_desc->append_text(TTR("There is currently no description for this " + p_method_type + ". Please help us by [color=$color][url=$url]contributing one[/url][/color]!").replace("$url", CONTRIBUTE_URL).replace("$color", link_color_text)); + } + class_desc->pop(); + } + + class_desc->pop(); + class_desc->pop(); + class_desc->pop(); + class_desc->add_newline(); + class_desc->add_newline(); + class_desc->add_newline(); + } + } +} + void EditorHelp::_update_doc() { if (!doc->class_list.has(edited_class)) { return; @@ -518,7 +673,7 @@ void EditorHelp::_update_doc() { class_desc->add_newline(); class_desc->push_font(doc_code_font); class_desc->push_indent(1); - class_desc->push_table(2); + class_desc->push_table(4); class_desc->set_table_column_expand(1, true); for (int i = 0; i < cd.properties.size(); i++) { @@ -528,13 +683,14 @@ void EditorHelp::_update_doc() { } property_line[cd.properties[i].name] = class_desc->get_line_count() - 2; //gets overridden if description + // Property type. class_desc->push_cell(); class_desc->push_paragraph(RichTextLabel::ALIGN_RIGHT, Control::TEXT_DIRECTION_AUTO, ""); class_desc->push_font(doc_code_font); _add_type(cd.properties[i].type, cd.properties[i].enumeration); class_desc->pop(); class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // cell bool describe = false; @@ -555,6 +711,7 @@ void EditorHelp::_update_doc() { describe = false; } + // Property name. class_desc->push_cell(); class_desc->push_font(doc_code_font); class_desc->push_color(headline_color); @@ -570,18 +727,43 @@ void EditorHelp::_update_doc() { property_descr = true; } + class_desc->pop(); + class_desc->pop(); + class_desc->pop(); // cell + + // Property value. + class_desc->push_cell(); + class_desc->push_font(doc_code_font); + if (cd.properties[i].default_value != "") { class_desc->push_color(symbol_color); - class_desc->add_text(cd.properties[i].overridden ? " [" + TTR("override:") + " " : " [" + TTR("default:") + " "); + if (cd.properties[i].overridden) { + class_desc->add_text(" ["); + class_desc->push_meta("@member " + cd.properties[i].overrides + "." + cd.properties[i].name); + _add_text(vformat(TTR("overrides %s:"), cd.properties[i].overrides)); + class_desc->pop(); + class_desc->add_text(" "); + } else { + class_desc->add_text(" [" + TTR("default:") + " "); + } class_desc->pop(); + class_desc->push_color(value_color); _add_text(_fix_constant(cd.properties[i].default_value)); class_desc->pop(); + class_desc->push_color(symbol_color); class_desc->add_text("]"); class_desc->pop(); } + class_desc->pop(); + class_desc->pop(); // cell + + // Property setters and getters. + class_desc->push_cell(); + class_desc->push_font(doc_code_font); + if (cd.is_script_doc && (cd.properties[i].setter != "" || cd.properties[i].getter != "")) { class_desc->push_color(symbol_color); class_desc->add_text(" [" + TTR("property:") + " "); @@ -609,12 +791,10 @@ void EditorHelp::_update_doc() { } class_desc->pop(); - class_desc->pop(); - - class_desc->pop(); + class_desc->pop(); // cell } - class_desc->pop(); //table + class_desc->pop(); // table class_desc->pop(); class_desc->pop(); // font class_desc->add_newline(); @@ -622,7 +802,9 @@ void EditorHelp::_update_doc() { } // Methods overview - bool method_descr = false; + bool constructor_descriptions = false; + bool method_descriptions = false; + bool operator_descriptions = false; bool sort_methods = EditorSettings::get_singleton()->get("text_editor/help/sort_functions_alphabetically"); Vector<DocData::MethodDoc> methods; @@ -640,81 +822,43 @@ void EditorHelp::_update_doc() { methods.push_back(cd.methods[i]); } - if (methods.size()) { + if (!cd.constructors.is_empty()) { if (sort_methods) { - methods.sort(); + cd.constructors.sort(); } + section_line.push_back(Pair<String, int>(TTR("Constructors"), class_desc->get_line_count() - 2)); + class_desc->push_color(title_color); + class_desc->push_font(doc_title_font); + class_desc->add_text(TTR("Constructors")); + _update_method_list(cd.constructors, constructor_descriptions); + } + + if (!methods.is_empty()) { + if (sort_methods) { + methods.sort(); + } section_line.push_back(Pair<String, int>(TTR("Methods"), class_desc->get_line_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); class_desc->add_text(TTR("Methods")); - class_desc->pop(); - class_desc->pop(); - - class_desc->add_newline(); - class_desc->push_font(doc_code_font); - class_desc->push_indent(1); - class_desc->push_table(2); - class_desc->set_table_column_expand(1, true); - - bool any_previous = false; - for (int pass = 0; pass < 2; pass++) { - Vector<DocData::MethodDoc> m; - - for (int i = 0; i < methods.size(); i++) { - const String &q = methods[i].qualifiers; - if ((pass == 0 && q.find("virtual") != -1) || (pass == 1 && q.find("virtual") == -1)) { - m.push_back(methods[i]); - } - } - - if (any_previous && !m.is_empty()) { - class_desc->push_cell(); - class_desc->pop(); //cell - class_desc->push_cell(); - class_desc->pop(); //cell - } - - String group_prefix; - for (int i = 0; i < m.size(); i++) { - const String new_prefix = m[i].name.substr(0, 3); - bool is_new_group = false; - - if (i < m.size() - 1 && new_prefix == m[i + 1].name.substr(0, 3) && new_prefix != group_prefix) { - is_new_group = i > 0; - group_prefix = new_prefix; - } else if (group_prefix != "" && new_prefix != group_prefix) { - is_new_group = true; - group_prefix = ""; - } - - if (is_new_group && pass == 1) { - class_desc->push_cell(); - class_desc->pop(); //cell - class_desc->push_cell(); - class_desc->pop(); //cell - } - - if (m[i].description != "" || m[i].errors_returned.size() > 0) { - method_descr = true; - } - - _add_method(m[i], true); - } + _update_method_list(methods, method_descriptions); + } - any_previous = !m.is_empty(); + if (!cd.operators.is_empty()) { + if (sort_methods) { + cd.operators.sort(); } - class_desc->pop(); //table - class_desc->pop(); - class_desc->pop(); // font - class_desc->add_newline(); - class_desc->add_newline(); + section_line.push_back(Pair<String, int>(TTR("Operators"), class_desc->get_line_count() - 2)); + class_desc->push_color(title_color); + class_desc->push_font(doc_title_font); + class_desc->add_text(TTR("Operators")); + _update_method_list(cd.operators, operator_descriptions); } // Theme properties - if (cd.theme_properties.size()) { + if (!cd.theme_properties.is_empty()) { section_line.push_back(Pair<String, int>(TTR("Theme Properties"), class_desc->get_line_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); @@ -722,27 +866,54 @@ void EditorHelp::_update_doc() { class_desc->pop(); class_desc->pop(); + class_desc->add_newline(); + class_desc->add_newline(); + class_desc->push_indent(1); - class_desc->push_table(2); - class_desc->set_table_column_expand(1, true); + + String theme_data_type; + Map<String, String> data_type_names; + data_type_names["color"] = TTR("Colors"); + data_type_names["constant"] = TTR("Constants"); + data_type_names["font"] = TTR("Fonts"); + data_type_names["font_size"] = TTR("Font Sizes"); + data_type_names["icon"] = TTR("Icons"); + data_type_names["style"] = TTR("Styles"); for (int i = 0; i < cd.theme_properties.size(); i++) { theme_property_line[cd.theme_properties[i].name] = class_desc->get_line_count() - 2; //gets overridden if description - class_desc->push_cell(); - class_desc->push_paragraph(RichTextLabel::ALIGN_RIGHT, Control::TEXT_DIRECTION_AUTO, ""); + if (theme_data_type != cd.theme_properties[i].data_type) { + theme_data_type = cd.theme_properties[i].data_type; + + class_desc->push_color(title_color); + class_desc->push_font(doc_title_font); + if (data_type_names.has(theme_data_type)) { + class_desc->add_text(data_type_names[theme_data_type]); + } else { + class_desc->add_text(""); + } + class_desc->pop(); + class_desc->pop(); + + class_desc->add_newline(); + class_desc->add_newline(); + } + + // Theme item header. class_desc->push_font(doc_code_font); + _add_bulletpoint(); + + // Theme item object type. _add_type(cd.theme_properties[i].type); - class_desc->pop(); - class_desc->pop(); - class_desc->pop(); - class_desc->push_cell(); - class_desc->push_font(doc_code_font); + // Theme item name. class_desc->push_color(headline_color); + class_desc->add_text(" "); _add_text(cd.theme_properties[i].name); class_desc->pop(); + // Theme item default value. if (cd.theme_properties[i].default_value != "") { class_desc->push_color(symbol_color); class_desc->add_text(" [" + TTR("default:") + " "); @@ -755,27 +926,29 @@ void EditorHelp::_update_doc() { class_desc->pop(); } - class_desc->pop(); + class_desc->pop(); // monofont + // Theme item description. if (cd.theme_properties[i].description != "") { class_desc->push_font(doc_font); class_desc->push_color(comment_color); - class_desc->add_text(U" – "); + class_desc->push_indent(1); _add_text(DTR(cd.theme_properties[i].description)); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // indent + class_desc->pop(); // color + class_desc->pop(); // font } - class_desc->pop(); // cell + + class_desc->add_newline(); + class_desc->add_newline(); } - class_desc->pop(); // table class_desc->pop(); class_desc->add_newline(); - class_desc->add_newline(); } // Signals - if (cd.signals.size()) { + if (!cd.signals.is_empty()) { if (sort_methods) { cd.signals.sort(); } @@ -794,10 +967,10 @@ void EditorHelp::_update_doc() { for (int i = 0; i < cd.signals.size(); i++) { signal_line[cd.signals[i].name] = class_desc->get_line_count() - 2; //gets overridden if description + class_desc->push_font(doc_code_font); // monofont class_desc->push_color(headline_color); - static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 }; - class_desc->add_text(String(prefix)); + _add_bulletpoint(); _add_text(cd.signals[i].name); class_desc->pop(); class_desc->push_color(symbol_color); @@ -844,7 +1017,7 @@ void EditorHelp::_update_doc() { } // Constants and enums - if (cd.constants.size()) { + if (!cd.constants.is_empty()) { Map<String, Vector<DocData::ConstantDoc>> enums; Vector<DocData::ConstantDoc> constants; @@ -928,8 +1101,7 @@ void EditorHelp::_update_doc() { class_desc->push_font(doc_code_font); class_desc->push_color(headline_color); - static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 }; - class_desc->add_text(String(prefix)); + _add_bulletpoint(); _add_text(enum_list[i].name); class_desc->pop(); class_desc->push_color(symbol_color); @@ -939,10 +1111,12 @@ void EditorHelp::_update_doc() { _add_text(_fix_constant(enum_list[i].value)); class_desc->pop(); class_desc->pop(); - if (enum_list[i].description != "") { + + class_desc->add_newline(); + + if (enum_list[i].description.strip_edges() != "") { class_desc->push_font(doc_font); class_desc->push_color(comment_color); - class_desc->add_text(U" – "); _add_text(DTR(enum_list[i].description)); class_desc->pop(); class_desc->pop(); @@ -988,13 +1162,11 @@ void EditorHelp::_update_doc() { Vector<float> color = stripped.split_floats(","); if (color.size() >= 3) { class_desc->push_color(Color(color[0], color[1], color[2])); - static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 }; - class_desc->add_text(String(prefix)); + _add_bulletpoint(); class_desc->pop(); } } else { - static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 }; - class_desc->add_text(String(prefix)); + _add_bulletpoint(); } class_desc->push_color(headline_color); @@ -1008,10 +1180,12 @@ void EditorHelp::_update_doc() { class_desc->pop(); class_desc->pop(); + + class_desc->add_newline(); + if (constants[i].description != "") { class_desc->push_font(doc_font); class_desc->push_color(comment_color); - class_desc->add_text(U" – "); _add_text(DTR(constants[i].description)); class_desc->pop(); class_desc->pop(); @@ -1052,8 +1226,7 @@ void EditorHelp::_update_doc() { class_desc->push_cell(); class_desc->push_font(doc_code_font); - static const char32_t prefix[3] = { 0x25CF /* filled circle */, ' ', 0 }; - class_desc->add_text(String(prefix)); + _add_bulletpoint(); _add_type(cd.properties[i].type, cd.properties[i].enumeration); class_desc->add_text(" "); @@ -1195,86 +1368,31 @@ void EditorHelp::_update_doc() { } } + // Constructor descriptions + if (constructor_descriptions) { + section_line.push_back(Pair<String, int>(TTR("Constructor Descriptions"), class_desc->get_line_count() - 2)); + class_desc->push_color(title_color); + class_desc->push_font(doc_title_font); + class_desc->add_text(TTR("Constructor Descriptions")); + _update_method_descriptions(cd, cd.constructors, "constructor"); + } + // Method descriptions - if (method_descr) { + if (method_descriptions) { section_line.push_back(Pair<String, int>(TTR("Method Descriptions"), class_desc->get_line_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); class_desc->add_text(TTR("Method Descriptions")); - class_desc->pop(); - class_desc->pop(); - - class_desc->add_newline(); - class_desc->add_newline(); - - for (int pass = 0; pass < 2; pass++) { - Vector<DocData::MethodDoc> methods_filtered; - - for (int i = 0; i < methods.size(); i++) { - const String &q = methods[i].qualifiers; - if ((pass == 0 && q.find("virtual") != -1) || (pass == 1 && q.find("virtual") == -1)) { - methods_filtered.push_back(methods[i]); - } - } - - for (int i = 0; i < methods_filtered.size(); i++) { - class_desc->push_font(doc_code_font); - _add_method(methods_filtered[i], false); - class_desc->pop(); - - class_desc->add_newline(); - class_desc->add_newline(); - - class_desc->push_color(text_color); - class_desc->push_font(doc_font); - class_desc->push_indent(1); - if (methods_filtered[i].errors_returned.size()) { - class_desc->append_text(TTR("Error codes returned:")); - class_desc->add_newline(); - class_desc->push_list(0, RichTextLabel::LIST_DOTS, false); - for (int j = 0; j < methods_filtered[i].errors_returned.size(); j++) { - if (j > 0) { - class_desc->add_newline(); - } - int val = methods_filtered[i].errors_returned[j]; - String text = itos(val); - for (int k = 0; k < CoreConstants::get_global_constant_count(); k++) { - if (CoreConstants::get_global_constant_value(k) == val && CoreConstants::get_global_constant_enum(k) == SNAME("Error")) { - text = CoreConstants::get_global_constant_name(k); - break; - } - } - - class_desc->push_bold(); - class_desc->append_text(text); - class_desc->pop(); - } - class_desc->pop(); - class_desc->add_newline(); - class_desc->add_newline(); - } - if (!methods_filtered[i].description.strip_edges().is_empty()) { - _add_text(DTR(methods_filtered[i].description)); - } else { - class_desc->add_image(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); - class_desc->add_text(" "); - class_desc->push_color(comment_color); - if (cd.is_script_doc) { - class_desc->append_text(TTR("There is currently no description for this method.")); - } else { - class_desc->append_text(TTR("There is currently no description for this method. Please help us by [color=$color][url=$url]contributing one[/url][/color]!").replace("$url", CONTRIBUTE_URL).replace("$color", link_color_text)); - } - class_desc->pop(); - } + _update_method_descriptions(cd, methods, "method"); + } - class_desc->pop(); - class_desc->pop(); - class_desc->pop(); - class_desc->add_newline(); - class_desc->add_newline(); - class_desc->add_newline(); - } - } + // Operator descriptions + if (operator_descriptions) { + section_line.push_back(Pair<String, int>(TTR("Operator Descriptions"), class_desc->get_line_count() - 2)); + class_desc->push_color(title_color); + class_desc->push_font(doc_title_font); + class_desc->add_text(TTR("Operator Descriptions")); + _update_method_descriptions(cd, cd.operators, "operator"); } scroll_locked = false; } @@ -1373,14 +1491,15 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { bbcode = bbcode.replace("[/gdscript]", "[/codeblock]"); for (int pos = bbcode.find("[csharp]"); pos != -1; pos = bbcode.find("[csharp]")) { - if (bbcode.find("[/csharp]") == -1) { + int end_pos = bbcode.find("[/csharp]"); + if (end_pos == -1) { WARN_PRINT("Unclosed [csharp] block or parse fail in code (search for tag errors)"); break; } - bbcode.erase(pos, bbcode.find("[/csharp]") + 9 - pos); + bbcode = bbcode.left(pos) + bbcode.substr(end_pos + 9); // 9 is length of "[/csharp]". while (bbcode[pos] == '\n') { - bbcode.erase(pos, 1); + bbcode = bbcode.left(pos) + bbcode.substr(pos + 1); } } break; @@ -1389,14 +1508,15 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { bbcode = bbcode.replace("[/csharp]", "[/codeblock]"); for (int pos = bbcode.find("[gdscript]"); pos != -1; pos = bbcode.find("[gdscript]")) { - if (bbcode.find("[/gdscript]") == -1) { + int end_pos = bbcode.find("[/gdscript]"); + if (end_pos == -1) { WARN_PRINT("Unclosed [gdscript] block or parse fail in code (search for tag errors)"); break; } - bbcode.erase(pos, bbcode.find("[/gdscript]") + 11 - pos); + bbcode = bbcode.left(pos) + bbcode.substr(end_pos + 11); // 11 is length of "[/gdscript]". while (bbcode[pos] == '\n') { - bbcode.erase(pos, 1); + bbcode = bbcode.left(pos) + bbcode.substr(pos + 1); } } break; @@ -1479,7 +1599,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { p_rt->add_text("["); pos = brk_pos + 1; - } else if (tag.begins_with("method ") || tag.begins_with("member ") || tag.begins_with("signal ") || tag.begins_with("enum ") || tag.begins_with("constant ")) { + } else if (tag.begins_with("method ") || tag.begins_with("member ") || tag.begins_with("signal ") || tag.begins_with("enum ") || tag.begins_with("constant ") || tag.begins_with("theme_item ")) { int tag_end = tag.find(" "); String link_tag = tag.substr(0, tag_end); @@ -1965,7 +2085,7 @@ void FindBar::unhandled_input(const Ref<InputEvent> &p_event) { bool accepted = true; switch (k->get_keycode()) { - case KEY_ESCAPE: { + case Key::ESCAPE: { _hide_bar(); } break; default: { @@ -1985,7 +2105,7 @@ void FindBar::_search_text_changed(const String &p_text) { } void FindBar::_search_text_submitted(const String &p_text) { - if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) { search_prev(); } else { search_next(); diff --git a/editor/editor_help.h b/editor/editor_help.h index 7a45b1abc1..393e4a940a 100644 --- a/editor/editor_help.h +++ b/editor/editor_help.h @@ -57,7 +57,6 @@ class FindBar : public HBoxContainer { int results_count; - void _show_search(); void _hide_bar(); void _search_text_changed(const String &p_text); @@ -66,8 +65,6 @@ class FindBar : public HBoxContainer { void _update_results_count(); void _update_matches_label(); - void _update_size(); - protected: void _notification(int p_what); virtual void unhandled_input(const Ref<InputEvent> &p_event) override; @@ -148,6 +145,8 @@ class EditorHelp : public VBoxContainer { void _add_type(const String &p_type, const String &p_enum = String()); void _add_method(const DocData::MethodDoc &p_method, bool p_overview = true); + void _add_bulletpoint(); + void _class_list_select(const String &p_select); void _class_desc_select(const String &p_select); void _class_desc_input(const Ref<InputEvent> &p_input); @@ -155,6 +154,8 @@ class EditorHelp : public VBoxContainer { Error _goto_desc(const String &p_class, int p_vscr = -1); //void _update_history_buttons(); + void _update_method_list(const Vector<DocData::MethodDoc> p_methods, bool &r_method_descrpitons); + void _update_method_descriptions(const DocData::ClassDoc p_classdoc, const Vector<DocData::MethodDoc> p_methods, const String &p_method_type); void _update_doc(); void _request_help(const String &p_string); diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp index e56b10720d..578e21861e 100644 --- a/editor/editor_help_search.cpp +++ b/editor/editor_help_search.cpp @@ -67,10 +67,10 @@ void EditorHelpSearch::_search_box_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventKey> key = p_event; if (key.is_valid()) { switch (key->get_keycode()) { - case KEY_UP: - case KEY_DOWN: - case KEY_PAGEUP: - case KEY_PAGEDOWN: { + case Key::UP: + case Key::DOWN: + case Key::PAGEUP: + case Key::PAGEDOWN: { results_tree->gui_input(key); search_box->accept_event(); } break; @@ -226,7 +226,9 @@ EditorHelpSearch::EditorHelpSearch() { filter_combo->add_item(TTR("Display All"), SEARCH_ALL); filter_combo->add_separator(); filter_combo->add_item(TTR("Classes Only"), SEARCH_CLASSES); + filter_combo->add_item(TTR("Constructors Only"), SEARCH_CONSTRUCTORS); filter_combo->add_item(TTR("Methods Only"), SEARCH_METHODS); + filter_combo->add_item(TTR("Operators Only"), SEARCH_OPERATORS); filter_combo->add_item(TTR("Signals Only"), SEARCH_SIGNALS); filter_combo->add_item(TTR("Constants Only"), SEARCH_CONSTANTS); filter_combo->add_item(TTR("Properties Only"), SEARCH_PROPERTIES); @@ -334,6 +336,17 @@ bool EditorHelpSearch::Runner::_phase_match_classes() { // Match members if the term is long enough. if (term.length() > 1) { + if (search_flags & SEARCH_CONSTRUCTORS) { + for (int i = 0; i < class_doc.constructors.size(); i++) { + String method_name = (search_flags & SEARCH_CASE_SENSITIVE) ? class_doc.constructors[i].name : class_doc.constructors[i].name.to_lower(); + if (method_name.find(term) > -1 || + (term.begins_with(".") && method_name.begins_with(term.substr(1))) || + (term.ends_with("(") && method_name.ends_with(term.left(term.length() - 1).strip_edges())) || + (term.begins_with(".") && term.ends_with("(") && method_name == term.substr(1, term.length() - 2).strip_edges())) { + match.constructors.push_back(const_cast<DocData::MethodDoc *>(&class_doc.constructors[i])); + } + } + } if (search_flags & SEARCH_METHODS) { for (int i = 0; i < class_doc.methods.size(); i++) { String method_name = (search_flags & SEARCH_CASE_SENSITIVE) ? class_doc.methods[i].name : class_doc.methods[i].name.to_lower(); @@ -345,6 +358,17 @@ bool EditorHelpSearch::Runner::_phase_match_classes() { } } } + if (search_flags & SEARCH_OPERATORS) { + for (int i = 0; i < class_doc.operators.size(); i++) { + String method_name = (search_flags & SEARCH_CASE_SENSITIVE) ? class_doc.operators[i].name : class_doc.operators[i].name.to_lower(); + if (method_name.find(term) > -1 || + (term.begins_with(".") && method_name.begins_with(term.substr(1))) || + (term.ends_with("(") && method_name.ends_with(term.left(term.length() - 1).strip_edges())) || + (term.begins_with(".") && term.ends_with("(") && method_name == term.substr(1, term.length() - 2).strip_edges())) { + match.operators.push_back(const_cast<DocData::MethodDoc *>(&class_doc.operators[i])); + } + } + } if (search_flags & SEARCH_SIGNALS) { for (int i = 0; i < class_doc.signals.size(); i++) { if (_match_string(term, class_doc.signals[i].name)) { diff --git a/editor/editor_help_search.h b/editor/editor_help_search.h index bc57c0e3c6..7285f76c01 100644 --- a/editor/editor_help_search.h +++ b/editor/editor_help_search.h @@ -43,12 +43,14 @@ class EditorHelpSearch : public ConfirmationDialog { enum SearchFlags { SEARCH_CLASSES = 1 << 0, - SEARCH_METHODS = 1 << 1, - SEARCH_SIGNALS = 1 << 2, - SEARCH_CONSTANTS = 1 << 3, - SEARCH_PROPERTIES = 1 << 4, - SEARCH_THEME_ITEMS = 1 << 5, - SEARCH_ALL = SEARCH_CLASSES | SEARCH_METHODS | SEARCH_SIGNALS | SEARCH_CONSTANTS | SEARCH_PROPERTIES | SEARCH_THEME_ITEMS, + SEARCH_CONSTRUCTORS = 1 << 1, + SEARCH_METHODS = 1 << 2, + SEARCH_OPERATORS = 1 << 3, + SEARCH_SIGNALS = 1 << 4, + SEARCH_CONSTANTS = 1 << 5, + SEARCH_PROPERTIES = 1 << 6, + SEARCH_THEME_ITEMS = 1 << 7, + SEARCH_ALL = SEARCH_CLASSES | SEARCH_CONSTRUCTORS | SEARCH_METHODS | SEARCH_OPERATORS | SEARCH_SIGNALS | SEARCH_CONSTANTS | SEARCH_PROPERTIES | SEARCH_THEME_ITEMS, SEARCH_CASE_SENSITIVE = 1 << 29, SEARCH_SHOW_HIERARCHY = 1 << 30 }; @@ -99,7 +101,9 @@ class EditorHelpSearch::Runner : public RefCounted { struct ClassMatch { DocData::ClassDoc *doc; bool name = false; + Vector<DocData::MethodDoc *> constructors; Vector<DocData::MethodDoc *> methods; + Vector<DocData::MethodDoc *> operators; Vector<DocData::MethodDoc *> signals; Vector<DocData::ConstantDoc *> constants; Vector<DocData::PropertyDoc *> properties; diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index 4d0f27c5d4..a6cd07dab3 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -39,6 +39,7 @@ #include "editor_scale.h" #include "editor_settings.h" #include "multi_node_edit.h" +#include "scene/property_utils.h" #include "scene/resources/packed_scene.h" Size2 EditorProperty::get_minimum_size() const { @@ -245,13 +246,15 @@ void EditorProperty::_notification(int p_what) { } Color color; - if (draw_red) { - color = get_theme_color(is_read_only() ? SNAME("readonly_error_color") : SNAME("error_color")); + if (draw_warning) { + color = get_theme_color(is_read_only() ? SNAME("readonly_warning_color") : SNAME("warning_color")); } else { color = get_theme_color(is_read_only() ? SNAME("readonly_color") : SNAME("property_color")); } if (label.find(".") != -1) { - color.a = 0.5; //this should be un-hacked honestly, as it's used for editor overrides + // FIXME: Move this to the project settings editor, as this is only used + // for project settings feature tag overrides. + color.a = 0.5; } int ofs = get_theme_constant(SNAME("font_offset")); @@ -303,6 +306,20 @@ void EditorProperty::_notification(int p_what) { revert_rect = Rect2(); } + if (!pin_hidden && pinned) { + Ref<Texture2D> pinned_icon = get_theme_icon(SNAME("Pin"), SNAME("EditorIcons")); + int margin_w = get_theme_constant(SNAME("hseparator"), SNAME("Tree")) * 2; + int total_icon_w = margin_w + pinned_icon->get_width(); + int text_w = font->get_string_size(label, font_size, rtl ? HALIGN_RIGHT : HALIGN_LEFT, text_limit - total_icon_w).x; + int y = (size.height - pinned_icon->get_height()) / 2; + if (rtl) { + draw_texture(pinned_icon, Vector2(size.width - ofs - text_w - total_icon_w, y), color); + } else { + draw_texture(pinned_icon, Vector2(ofs + text_w + margin_w, y), color); + } + text_limit -= total_icon_w; + } + int v_ofs = (size.height - font->get_height(font_size)) / 2; if (rtl) { draw_string(font, Point2(size.width - ofs - text_limit, v_ofs + font->get_ascent(font_size)), label, HALIGN_RIGHT, text_limit, font_size, color); @@ -396,177 +413,12 @@ bool EditorProperty::is_read_only() const { return read_only; } -bool EditorPropertyRevert::may_node_be_in_instance(Node *p_node) { - Node *edited_scene = EditorNode::get_singleton()->get_edited_scene(); - - bool might_be = false; - Node *node = p_node; - - while (node) { - if (node == edited_scene) { - if (node->get_scene_inherited_state().is_valid()) { - might_be = true; - break; - } - might_be = false; - break; - } - if (node->get_scene_instance_state().is_valid()) { - might_be = true; - break; - } - node = node->get_owner(); - } - - return might_be; // or might not be -} - -bool EditorPropertyRevert::get_instantiated_node_original_property(Node *p_node, const StringName &p_prop, Variant &value, bool p_check_class_default) { - Node *node = p_node; - Node *orig = node; - - Node *edited_scene = EditorNode::get_singleton()->get_edited_scene(); - - bool found = false; - - while (node) { - Ref<SceneState> ss; - - if (node == edited_scene) { - ss = node->get_scene_inherited_state(); - - } else { - ss = node->get_scene_instance_state(); - } - - if (ss.is_valid()) { - NodePath np = node->get_path_to(orig); - int node_idx = ss->find_node_by_path(np); - if (node_idx >= 0) { - bool lfound = false; - Variant lvar; - lvar = ss->get_property_value(node_idx, p_prop, lfound); - if (lfound) { - found = true; - value = lvar; - } - } - } - if (node == edited_scene) { - //just in case - break; - } - node = node->get_owner(); - } - - if (p_check_class_default && !found && p_node) { - //if not found, try default class value - Variant attempt = ClassDB::class_get_default_property_value(p_node->get_class_name(), p_prop); - if (attempt.get_type() != Variant::NIL) { - found = true; - value = attempt; - } - } - - return found; -} - -bool EditorPropertyRevert::is_node_property_different(Node *p_node, const Variant &p_current, const Variant &p_orig) { - // this is a pretty difficult function, because a property may not be saved but may have - // the flag to not save if one or if zero - - //make sure there is an actual state - { - Node *node = p_node; - if (!node) { - return false; - } - - Node *edited_scene = EditorNode::get_singleton()->get_edited_scene(); - bool found_state = false; - - while (node) { - Ref<SceneState> ss; - - if (node == edited_scene) { - ss = node->get_scene_inherited_state(); - - } else { - ss = node->get_scene_instance_state(); - } - - if (ss.is_valid()) { - found_state = true; - break; - } - if (node == edited_scene) { - //just in case - break; - } - node = node->get_owner(); - } - - if (!found_state) { - return false; //pointless to check if we are not comparing against anything. - } - } - - return is_property_value_different(p_current, p_orig); -} - -bool EditorPropertyRevert::is_property_value_different(const Variant &p_a, const Variant &p_b) { - if (p_a.get_type() == Variant::FLOAT && p_b.get_type() == Variant::FLOAT) { - //this must be done because, as some scenes save as text, there might be a tiny difference in floats due to numerical error - return !Math::is_equal_approx((float)p_a, (float)p_b); - } else { - return p_a != p_b; - } -} - Variant EditorPropertyRevert::get_property_revert_value(Object *p_object, const StringName &p_property) { - // If the object implements property_can_revert, rely on that completely - // (i.e. don't then try to revert to default value - the property_get_revert implementation - // can do that if so desired) if (p_object->has_method("property_can_revert") && p_object->call("property_can_revert", p_property)) { return p_object->call("property_get_revert", p_property); } - Ref<Script> scr = p_object->get_script(); - Node *node = Object::cast_to<Node>(p_object); - if (node && EditorPropertyRevert::may_node_be_in_instance(node)) { - //if this node is an instance or inherits, but it has a script attached which is unrelated - //to the one set for the parent and also has a default value for the property, consider that - //has precedence over the value from the parent, because that is an explicit source of defaults - //closer in the tree to the current node - bool ignore_parent = false; - if (scr.is_valid()) { - Variant sorig; - if (EditorPropertyRevert::get_instantiated_node_original_property(node, "script", sorig) && !scr->inherits_script(sorig)) { - Variant dummy; - if (scr->get_property_default_value(p_property, dummy)) { - ignore_parent = true; - } - } - } - - if (!ignore_parent) { - //check for difference including instantiation - Variant vorig; - if (EditorPropertyRevert::get_instantiated_node_original_property(node, p_property, vorig, false)) { - return vorig; - } - } - } - - if (scr.is_valid()) { - Variant orig_value; - if (scr->get_property_default_value(p_property, orig_value)) { - return orig_value; - } - } - - //report default class value instead - return ClassDB::class_get_default_property_value(p_object->get_class_name(), p_property); + return PropertyUtils::get_property_default_value(p_object, p_property); } bool EditorPropertyRevert::can_property_revert(Object *p_object, const StringName &p_property) { @@ -575,18 +427,25 @@ bool EditorPropertyRevert::can_property_revert(Object *p_object, const StringNam return false; } Variant current_value = p_object->get(p_property); - return EditorPropertyRevert::is_property_value_different(current_value, revert_value); + return PropertyUtils::is_property_value_different(current_value, revert_value); } -void EditorProperty::update_reload_status() { +void EditorProperty::update_revert_and_pin_status() { if (property == StringName()) { return; //no property, so nothing to do } - bool has_reload = EditorPropertyRevert::can_property_revert(object, property); + bool new_pinned = false; + if (can_pin) { + Node *node = Object::cast_to<Node>(object); + CRASH_COND(!node); + new_pinned = node->is_property_pinned(property); + } + bool new_can_revert = EditorPropertyRevert::can_property_revert(object, property) && !is_read_only(); - if (has_reload != can_revert) { - can_revert = has_reload; + if (new_can_revert != can_revert || new_pinned != pinned) { + can_revert = new_can_revert; + pinned = new_pinned; update(); } } @@ -625,8 +484,8 @@ bool EditorProperty::is_checked() const { return checked; } -void EditorProperty::set_draw_red(bool p_draw_red) { - draw_red = p_draw_red; +void EditorProperty::set_draw_warning(bool p_draw_warning) { + draw_warning = p_draw_warning; update(); } @@ -650,8 +509,8 @@ bool EditorProperty::is_keying() const { return keying; } -bool EditorProperty::is_draw_red() const { - return draw_red; +bool EditorProperty::is_draw_warning() const { + return draw_warning; } void EditorProperty::_focusable_focused(int p_index) { @@ -712,7 +571,7 @@ void EditorProperty::gui_input(const Ref<InputEvent> &p_event) { if (is_layout_rtl()) { mpos.x = get_size().x - mpos.x; } - bool button_left = me->get_button_mask() & MOUSE_BUTTON_MASK_LEFT; + bool button_left = (me->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE; bool new_keying_hover = keying_rect.has_point(mpos) && !button_left; if (new_keying_hover != keying_hover) { @@ -741,7 +600,7 @@ void EditorProperty::gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { Vector2 mpos = mb->get_position(); if (is_layout_rtl()) { mpos.x = get_size().x - mpos.x; @@ -788,10 +647,10 @@ void EditorProperty::gui_input(const Ref<InputEvent> &p_event) { update(); emit_signal(SNAME("property_checked"), property, checked); } - } else if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { - _ensure_popup(); + } else if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) { + _update_popup(); menu->set_position(get_screen_position() + get_local_mouse_position()); - menu->set_size(Vector2(1, 1)); + menu->reset_size(); menu->popup(); select(); return; @@ -912,6 +771,56 @@ float EditorProperty::get_name_split_ratio() const { void EditorProperty::set_object_and_property(Object *p_object, const StringName &p_property) { object = p_object; property = p_property; + _update_pin_flags(); +} + +static bool _is_value_potential_override(Node *p_node, const String &p_property) { + // Consider a value is potentially overriding another if either of the following is true: + // a) The node is foreign (inheriting or an instance), so the original value may come from another scene. + // b) The node belongs to the scene, but the original value comes from somewhere but the builtin class (i.e., a script). + Node *edited_scene = EditorNode::get_singleton()->get_edited_scene(); + Vector<SceneState::PackState> states_stack = PropertyUtils::get_node_states_stack(p_node, edited_scene); + if (states_stack.size()) { + return true; + } else { + bool is_class_default = false; + PropertyUtils::get_property_default_value(p_node, p_property, &states_stack, false, nullptr, &is_class_default); + return !is_class_default; + } +} + +void EditorProperty::_update_pin_flags() { + can_pin = false; + pin_hidden = true; + if (read_only) { + return; + } + if (Node *node = Object::cast_to<Node>(object)) { + // Avoid errors down the road by ignoring nodes which are not part of a scene + if (!node->get_owner()) { + bool is_scene_root = false; + for (int i = 0; i < EditorNode::get_singleton()->get_editor_data().get_edited_scene_count(); ++i) { + if (EditorNode::get_singleton()->get_editor_data().get_edited_scene_root(i) == node) { + is_scene_root = true; + break; + } + } + if (!is_scene_root) { + return; + } + } + if (!_is_value_potential_override(node, property)) { + return; + } + pin_hidden = false; + { + Set<StringName> storable_properties; + node->get_storable_properties(storable_properties); + if (storable_properties.has(node->get_property_store_alias(property))) { + can_pin = true; + } + } + } } Control *EditorProperty::make_custom_tooltip(const String &p_text) const { @@ -953,6 +862,10 @@ void EditorProperty::menu_option(int p_option) { case MENU_COPY_PROPERTY_PATH: { DisplayServer::get_singleton()->clipboard_set(property); } break; + case MENU_PIN_VALUE: { + emit_signal(SNAME("property_pinned"), property, !pinned); + update(); + } break; } } @@ -969,8 +882,8 @@ void EditorProperty::_bind_methods() { ClassDB::bind_method(D_METHOD("set_checked", "checked"), &EditorProperty::set_checked); ClassDB::bind_method(D_METHOD("is_checked"), &EditorProperty::is_checked); - ClassDB::bind_method(D_METHOD("set_draw_red", "draw_red"), &EditorProperty::set_draw_red); - ClassDB::bind_method(D_METHOD("is_draw_red"), &EditorProperty::is_draw_red); + ClassDB::bind_method(D_METHOD("set_draw_warning", "draw_warning"), &EditorProperty::set_draw_warning); + ClassDB::bind_method(D_METHOD("is_draw_warning"), &EditorProperty::is_draw_warning); ClassDB::bind_method(D_METHOD("set_keying", "keying"), &EditorProperty::set_keying); ClassDB::bind_method(D_METHOD("is_keying"), &EditorProperty::is_keying); @@ -993,7 +906,7 @@ void EditorProperty::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "read_only"), "set_read_only", "is_read_only"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "checkable"), "set_checkable", "is_checkable"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "checked"), "set_checked", "is_checked"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "draw_red"), "set_draw_red", "is_draw_red"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "draw_warning"), "set_draw_warning", "is_draw_warning"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "keying"), "set_keying", "is_keying"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "deletable"), "set_deletable", "is_deletable"); ADD_SIGNAL(MethodInfo("property_changed", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT))); @@ -1001,12 +914,14 @@ void EditorProperty::_bind_methods() { ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING_NAME, "property"))); ADD_SIGNAL(MethodInfo("property_deleted", PropertyInfo(Variant::STRING_NAME, "property"))); ADD_SIGNAL(MethodInfo("property_keyed_with_value", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT))); - ADD_SIGNAL(MethodInfo("property_checked", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::STRING, "bool"))); + ADD_SIGNAL(MethodInfo("property_checked", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::BOOL, "checked"))); + ADD_SIGNAL(MethodInfo("property_pinned", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::BOOL, "pinned"))); ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::OBJECT, "resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource"))); ADD_SIGNAL(MethodInfo("object_id_selected", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::INT, "id"))); ADD_SIGNAL(MethodInfo("selected", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::INT, "focusable_idx"))); GDVIRTUAL_BIND(_update_property) + ClassDB::bind_method(D_METHOD("_update_revert_and_pin_status"), &EditorProperty::update_revert_and_pin_status); } EditorProperty::EditorProperty() { @@ -1018,13 +933,16 @@ EditorProperty::EditorProperty() { read_only = false; checkable = false; checked = false; - draw_red = false; + draw_warning = false; keying = false; deletable = false; keying_hover = false; revert_hover = false; check_hover = false; can_revert = false; + can_pin = false; + pin_hidden = false; + pinned = false; use_folding = false; property_usage = 0; selected = false; @@ -1036,17 +954,29 @@ EditorProperty::EditorProperty() { set_process_unhandled_key_input(true); } -void EditorProperty::_ensure_popup() { +void EditorProperty::_update_popup() { if (menu) { - return; + menu->clear(); + } else { + menu = memnew(PopupMenu); + add_child(menu); + menu->connect("id_pressed", callable_mp(this, &EditorProperty::menu_option)); } - menu = memnew(PopupMenu); menu->add_shortcut(ED_GET_SHORTCUT("property_editor/copy_property"), MENU_COPY_PROPERTY); menu->add_shortcut(ED_GET_SHORTCUT("property_editor/paste_property"), MENU_PASTE_PROPERTY); menu->add_shortcut(ED_GET_SHORTCUT("property_editor/copy_property_path"), MENU_COPY_PROPERTY_PATH); - menu->connect("id_pressed", callable_mp(this, &EditorProperty::menu_option)); menu->set_item_disabled(MENU_PASTE_PROPERTY, is_read_only()); - add_child(menu); + if (!pin_hidden) { + menu->add_separator(); + if (can_pin) { + menu->add_check_item(TTR("Pin value"), MENU_PIN_VALUE); + menu->set_item_checked(menu->get_item_index(MENU_PIN_VALUE), pinned); + menu->set_item_tooltip(menu->get_item_index(MENU_PIN_VALUE), TTR("Pinning a value forces it to be saved even if it's equal to the default.")); + } else { + menu->add_check_item(vformat(TTR("Pin value [Disabled because '%s' is editor-only]"), property), MENU_PIN_VALUE); + menu->set_item_disabled(menu->get_item_index(MENU_PIN_VALUE), true); + } + } } //////////////////////////////////////////////// @@ -1084,11 +1014,15 @@ bool EditorInspectorPlugin::can_handle(Object *p_object) { } void EditorInspectorPlugin::parse_begin(Object *p_object) { - GDVIRTUAL_CALL(_parse_begin); + GDVIRTUAL_CALL(_parse_begin, p_object); +} + +void EditorInspectorPlugin::parse_category(Object *p_object, const String &p_category) { + GDVIRTUAL_CALL(_parse_category, p_object, p_category); } -void EditorInspectorPlugin::parse_category(Object *p_object, const String &p_parse_category) { - GDVIRTUAL_CALL(_parse_category, p_object, p_parse_category); +void EditorInspectorPlugin::parse_group(Object *p_object, const String &p_group) { + GDVIRTUAL_CALL(_parse_group, p_object, p_group); } bool EditorInspectorPlugin::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { @@ -1099,8 +1033,8 @@ bool EditorInspectorPlugin::parse_property(Object *p_object, const Variant::Type return false; } -void EditorInspectorPlugin::parse_end() { - GDVIRTUAL_CALL(_parse_end); +void EditorInspectorPlugin::parse_end(Object *p_object) { + GDVIRTUAL_CALL(_parse_end, p_object); } void EditorInspectorPlugin::_bind_methods() { @@ -1109,10 +1043,11 @@ void EditorInspectorPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("add_property_editor_for_multiple_properties", "label", "properties", "editor"), &EditorInspectorPlugin::add_property_editor_for_multiple_properties); GDVIRTUAL_BIND(_can_handle, "object") - GDVIRTUAL_BIND(_parse_begin) + GDVIRTUAL_BIND(_parse_begin, "object") GDVIRTUAL_BIND(_parse_category, "object", "category") + GDVIRTUAL_BIND(_parse_group, "object", "group") GDVIRTUAL_BIND(_parse_property, "object", "type", "name", "hint_type", "hint_string", "usage_flags", "wide"); - GDVIRTUAL_BIND(_parse_end) + GDVIRTUAL_BIND(_parse_end, "object") } //////////////////////////////////////////////// @@ -1287,7 +1222,7 @@ void EditorInspectorSection::_notification(int p_what) { Color c = bg_color; c.a *= 0.4; if (foldable && header_rect.has_point(get_local_mouse_position())) { - c = c.lightened(Input::get_singleton()->is_mouse_button_pressed(MOUSE_BUTTON_LEFT) ? -0.05 : 0.2); + c = c.lightened(Input::get_singleton()->is_mouse_button_pressed(MouseButton::LEFT) ? -0.05 : 0.2); } draw_rect(header_rect, c); @@ -1405,7 +1340,7 @@ void EditorInspectorSection::gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Tree")); int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Tree")); if (mb->get_position().y > font->get_height(font_size)) { //clicked outside @@ -1608,7 +1543,7 @@ void EditorInspectorArray::_panel_gui_input(Ref<InputEvent> p_event, int p_index if (key_ref.is_valid()) { const InputEventKey &key = **key_ref; - if (array_elements[p_index].panel->has_focus() && key.is_pressed() && key.get_keycode() == KEY_DELETE) { + if (array_elements[p_index].panel->has_focus() && key.is_pressed() && key.get_keycode() == Key::KEY_DELETE) { _move_element(begin_array_index + p_index, -1); array_elements[p_index].panel->accept_event(); } @@ -1616,12 +1551,12 @@ void EditorInspectorArray::_panel_gui_input(Ref<InputEvent> p_event, int p_index Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) { + if (mb->get_button_index() == MouseButton::RIGHT) { popup_array_index_pressed = begin_array_index + p_index; rmb_popup->set_item_disabled(OPTION_MOVE_UP, popup_array_index_pressed == 0); rmb_popup->set_item_disabled(OPTION_MOVE_DOWN, popup_array_index_pressed == count - 1); rmb_popup->set_position(mb->get_global_position()); - rmb_popup->set_size(Vector2()); + rmb_popup->reset_size(); rmb_popup->popup(); } } @@ -1673,11 +1608,11 @@ void EditorInspectorArray::_move_element(int p_element_index, int p_to_pos) { properties_as_array.insert(p_to_pos < 0 ? properties_as_array.size() : p_to_pos, Dictionary()); } else if (p_to_pos < 0) { // Delete the element. - properties_as_array.remove(p_element_index); + properties_as_array.remove_at(p_element_index); } else { // Move the element. properties_as_array.insert(p_to_pos, properties_as_array[p_element_index].duplicate()); - properties_as_array.remove(p_to_pos < p_element_index ? p_element_index + 1 : p_element_index); + properties_as_array.remove_at(p_to_pos < p_element_index ? p_element_index + 1 : p_element_index); } // Change the array size then set the properties. @@ -2259,10 +2194,7 @@ void EditorInspector::remove_inspector_plugin(const Ref<EditorInspectorPlugin> & for (int i = idx; i < inspector_plugin_count - 1; i++) { inspector_plugins[i] = inspector_plugins[i + 1]; } - - if (idx == inspector_plugin_count - 1) { - inspector_plugins[idx] = Ref<EditorInspectorPlugin>(); - } + inspector_plugins[inspector_plugin_count - 1] = Ref<EditorInspectorPlugin>(); inspector_plugin_count--; } @@ -2294,6 +2226,7 @@ void EditorInspector::_parse_added_editors(VBoxContainer *current_vbox, Ref<Edit ep->connect("property_deleted", callable_mp(this, &EditorInspector::_property_deleted), varray(), CONNECT_DEFERRED); ep->connect("property_keyed_with_value", callable_mp(this, &EditorInspector::_property_keyed_with_value)); ep->connect("property_checked", callable_mp(this, &EditorInspector::_property_checked)); + ep->connect("property_pinned", callable_mp(this, &EditorInspector::_property_pinned)); ep->connect("selected", callable_mp(this, &EditorInspector::_property_selected)); ep->connect("multiple_properties_changed", callable_mp(this, &EditorInspector::_multiple_properties_changed)); ep->connect("resource_selected", callable_mp(this, &EditorInspector::_resource_selected), varray(), CONNECT_DEFERRED); @@ -2322,7 +2255,8 @@ void EditorInspector::_parse_added_editors(VBoxContainer *current_vbox, Ref<Edit ep->set_read_only(read_only); ep->update_property(); - ep->update_reload_status(); + ep->_update_pin_flags(); + ep->update_revert_and_pin_status(); ep->set_deletable(deletable_properties); ep->update_cache(); } @@ -2393,14 +2327,15 @@ void EditorInspector::update_tree() { valid_plugins.push_back(inspector_plugins[i]); } - // Decide if properties should be drawn in red. - bool draw_red = false; + // Decide if properties should be drawn with the warning color (yellow). + bool draw_warning = false; if (is_inside_tree()) { Node *nod = Object::cast_to<Node>(object); Node *es = EditorNode::get_singleton()->get_edited_scene(); if (nod && es != nod && nod->get_owner() != es) { - // Draw in red edited nodes that are not in the currently edited scene. - draw_red = true; + // Draw in warning color edited nodes that are not in the currently edited scene, + // as changes may be lost in the future. + draw_warning = true; } } @@ -2695,6 +2630,12 @@ void EditorInspector::update_tree() { c.a /= level; section->setup(acc_path, component, object, c, use_folding); + // Add editors at the start of a group. + for (Ref<EditorInspectorPlugin> &ped : valid_plugins) { + ped->parse_group(object, path); + _parse_added_editors(section->get_vbox(), ped); + } + vbox_per_path[root_vbox][acc_path] = section->get_vbox(); } @@ -2855,7 +2796,7 @@ void EditorInspector::update_tree() { editor_property_map[prop].push_back(ep); } } - ep->set_draw_red(draw_red); + ep->set_draw_warning(draw_warning); ep->set_use_folding(use_folding); ep->set_checkable(checkable); ep->set_checked(checked); @@ -2874,6 +2815,7 @@ void EditorInspector::update_tree() { ep->connect("property_deleted", callable_mp(this, &EditorInspector::_property_deleted), varray(), CONNECT_DEFERRED); ep->connect("property_keyed_with_value", callable_mp(this, &EditorInspector::_property_keyed_with_value)); ep->connect("property_checked", callable_mp(this, &EditorInspector::_property_checked)); + ep->connect("property_pinned", callable_mp(this, &EditorInspector::_property_pinned)); ep->connect("selected", callable_mp(this, &EditorInspector::_property_selected)); ep->connect("multiple_properties_changed", callable_mp(this, &EditorInspector::_multiple_properties_changed)); ep->connect("resource_selected", callable_mp(this, &EditorInspector::_resource_selected), varray(), CONNECT_DEFERRED); @@ -2884,7 +2826,8 @@ void EditorInspector::update_tree() { ep->set_tooltip(property_prefix + p.name); } ep->update_property(); - ep->update_reload_status(); + ep->_update_pin_flags(); + ep->update_revert_and_pin_status(); ep->update_cache(); if (current_selected && ep->property == current_selected) { @@ -2902,7 +2845,7 @@ void EditorInspector::update_tree() { // Get the lists of to add at the end. for (Ref<EditorInspectorPlugin> &ped : valid_plugins) { - ped->parse_end(); + ped->parse_end(object); _parse_added_editors(main_vbox, ped); } } @@ -2914,7 +2857,7 @@ void EditorInspector::update_property(const String &p_prop) { for (EditorProperty *E : editor_property_map[p_prop]) { E->update_property(); - E->update_reload_status(); + E->update_revert_and_pin_status(); E->update_cache(); } } @@ -3140,12 +3083,20 @@ void EditorInspector::_edit_set(const String &p_name, const Variant &p_value, bo } else { undo_redo->create_action(vformat(TTR("Set %s"), p_name), UndoRedo::MERGE_ENDS); undo_redo->add_do_property(object, p_name, p_value); - undo_redo->add_undo_property(object, p_name, object->get(p_name)); + bool valid = false; + Variant value = object->get(p_name, &valid); + if (valid) { + undo_redo->add_undo_property(object, p_name, value); + } PropertyInfo prop_info; if (ClassDB::get_property_info(object->get_class_name(), p_name, &prop_info)) { for (const String &linked_prop : prop_info.linked_properties) { - undo_redo->add_undo_property(object, linked_prop, object->get(linked_prop)); + valid = false; + value = object->get(linked_prop, &valid); + if (valid) { + undo_redo->add_undo_property(object, linked_prop, value); + } } } @@ -3193,7 +3144,7 @@ void EditorInspector::_edit_set(const String &p_name, const Variant &p_value, bo if (editor_property_map.has(p_name)) { for (EditorProperty *E : editor_property_map[p_name]) { - E->update_reload_status(); + E->update_revert_and_pin_status(); } } } @@ -3292,7 +3243,7 @@ void EditorInspector::_property_checked(const String &p_path, bool p_checked) { if (editor_property_map.has(p_path)) { for (EditorProperty *E : editor_property_map[p_path]) { E->update_property(); - E->update_reload_status(); + E->update_revert_and_pin_status(); E->update_cache(); } } @@ -3302,6 +3253,35 @@ void EditorInspector::_property_checked(const String &p_path, bool p_checked) { } } +void EditorInspector::_property_pinned(const String &p_path, bool p_pinned) { + if (!object) { + return; + } + + Node *node = Object::cast_to<Node>(object); + ERR_FAIL_COND(!node); + + if (undo_redo) { + undo_redo->create_action(vformat(p_pinned ? TTR("Pinned %s") : TTR("Unpinned %s"), p_path)); + undo_redo->add_do_method(node, "_set_property_pinned", p_path, p_pinned); + undo_redo->add_undo_method(node, "_set_property_pinned", p_path, !p_pinned); + if (editor_property_map.has(p_path)) { + for (List<EditorProperty *>::Element *E = editor_property_map[p_path].front(); E; E = E->next()) { + undo_redo->add_do_method(E->get(), "_update_revert_and_pin_status"); + undo_redo->add_undo_method(E->get(), "_update_revert_and_pin_status"); + } + } + undo_redo->commit_action(); + } else { + node->set_property_pinned(p_path, p_pinned); + if (editor_property_map.has(p_path)) { + for (List<EditorProperty *>::Element *E = editor_property_map[p_path].front(); E; E = E->next()) { + E->get()->update_revert_and_pin_status(); + } + } + } +} + void EditorInspector::_property_selected(const String &p_path, int p_focusable) { property_selected = p_path; property_focusable = p_focusable; @@ -3372,7 +3352,7 @@ void EditorInspector::_notification(int p_what) { for (EditorProperty *E : F.value) { if (!E->is_cache_valid()) { E->update_property(); - E->update_reload_status(); + E->update_revert_and_pin_status(); E->update_cache(); } } @@ -3394,7 +3374,7 @@ void EditorInspector::_notification(int p_what) { if (editor_property_map.has(prop)) { for (EditorProperty *E : editor_property_map[prop]) { E->update_property(); - E->update_reload_status(); + E->update_revert_and_pin_status(); E->update_cache(); } } @@ -3487,7 +3467,7 @@ void EditorInspector::_update_script_class_properties(const Object &p_object, Li String path = s->get_path(); String name = EditorNode::get_editor_data().script_class_get_name(path); if (name.is_empty()) { - if (!path.is_empty() && path.find("::") == -1) { + if (!s->is_built_in()) { name = path.get_file(); } else { name = TTR("Built-in script"); @@ -3593,7 +3573,7 @@ EditorInspector::EditorInspector() { refresh_countdown = 0.33; } - ED_SHORTCUT("property_editor/copy_property", TTR("Copy Property"), KEY_MASK_CMD | KEY_C); - ED_SHORTCUT("property_editor/paste_property", TTR("Paste Property"), KEY_MASK_CMD | KEY_V); - ED_SHORTCUT("property_editor/copy_property_path", TTR("Copy Property Path"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_C); + ED_SHORTCUT("property_editor/copy_property", TTR("Copy Property"), KeyModifierMask::CMD | Key::C); + ED_SHORTCUT("property_editor/paste_property", TTR("Paste Property"), KeyModifierMask::CMD | Key::V); + ED_SHORTCUT("property_editor/copy_property_path", TTR("Copy Property Path"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::C); } diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index b71efe8f19..f2dfe32f82 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -43,7 +43,6 @@ class UndoRedo; class EditorPropertyRevert { public: - static bool may_node_be_in_instance(Node *p_node); static bool get_instantiated_node_original_property(Node *p_node, const StringName &p_prop, Variant &value, bool p_check_class_default = true); static bool is_node_property_different(Node *p_node, const Variant &p_current, const Variant &p_orig); static bool is_property_value_different(const Variant &p_a, const Variant &p_b); @@ -60,6 +59,7 @@ public: MENU_COPY_PROPERTY, MENU_PASTE_PROPERTY, MENU_COPY_PROPERTY_PATH, + MENU_PIN_VALUE, }; private: @@ -74,7 +74,7 @@ private: bool read_only; bool checkable; bool checked; - bool draw_red; + bool draw_warning; bool keying; bool deletable; @@ -91,13 +91,14 @@ private: bool delete_hover = false; bool can_revert; + bool can_pin; + bool pin_hidden; + bool pinned; bool use_folding; bool draw_top_bg; - void _ensure_popup(); - bool _is_property_different(const Variant &p_current, const Variant &p_orig); - bool _get_instantiated_node_original_property(const StringName &p_prop, Variant &value); + void _update_popup(); void _focusable_focused(int p_index); bool selectable; @@ -116,6 +117,8 @@ private: Map<StringName, Variant> cache; GDVIRTUAL0(_update_property) + void _update_pin_flags(); + protected: void _notification(int p_what); static void _bind_methods(); @@ -140,7 +143,7 @@ public: StringName get_edited_property(); virtual void update_property(); - void update_reload_status(); + void update_revert_and_pin_status(); virtual bool use_keying_next() const; @@ -150,8 +153,8 @@ public: void set_checked(bool p_checked); bool is_checked() const; - void set_draw_red(bool p_draw_red); - bool is_draw_red() const; + void set_draw_warning(bool p_draw_warning); + bool is_draw_warning() const; void set_keying(bool p_keying); bool is_keying() const; @@ -212,10 +215,11 @@ protected: static void _bind_methods(); GDVIRTUAL1RC(bool, _can_handle, Variant) - GDVIRTUAL0(_parse_begin) + GDVIRTUAL1(_parse_begin, Object *) GDVIRTUAL2(_parse_category, Object *, String) + GDVIRTUAL2(_parse_group, Object *, String) GDVIRTUAL7R(bool, _parse_property, Object *, int, String, int, String, int, bool) - GDVIRTUAL0(_parse_end) + GDVIRTUAL1(_parse_end, Object *) public: void add_custom_control(Control *control); @@ -224,9 +228,10 @@ public: virtual bool can_handle(Object *p_object); virtual void parse_begin(Object *p_object); - virtual void parse_category(Object *p_object, const String &p_parse_category); + virtual void parse_category(Object *p_object, const String &p_category); + virtual void parse_group(Object *p_object, const String &p_group); virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false); - virtual void parse_end(); + virtual void parse_end(Object *p_object); }; class EditorInspectorCategory : public Control { @@ -281,8 +286,6 @@ public: void unfold(); void fold(); - Object *get_edited_object(); - EditorInspectorSection(); ~EditorInspectorSection(); }; @@ -463,8 +466,8 @@ class EditorInspector : public ScrollContainer { void _property_keyed(const String &p_path, bool p_advance); void _property_keyed_with_value(const String &p_path, const Variant &p_value, bool p_advance); void _property_deleted(const String &p_path); - void _property_checked(const String &p_path, bool p_checked); + void _property_pinned(const String &p_path, bool p_pinned); void _resource_selected(const String &p_path, RES p_resource); void _property_selected(const String &p_path, int p_focusable); diff --git a/editor/editor_layouts_dialog.cpp b/editor/editor_layouts_dialog.cpp index b1f8ba5d20..4cdeeb2396 100644 --- a/editor/editor_layouts_dialog.cpp +++ b/editor/editor_layouts_dialog.cpp @@ -46,15 +46,15 @@ void EditorLayoutsDialog::_line_gui_input(const Ref<InputEvent> &p_event) { } switch (k->get_keycode()) { - case KEY_KP_ENTER: - case KEY_ENTER: { + case Key::KP_ENTER: + case Key::ENTER: { if (get_hide_on_ok()) { hide(); } ok_pressed(); set_input_as_handled(); } break; - case KEY_ESCAPE: { + case Key::ESCAPE: { hide(); set_input_as_handled(); } break; diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp index 346b93a87c..5ace9ae03e 100644 --- a/editor/editor_log.cpp +++ b/editor/editor_log.cpp @@ -37,7 +37,7 @@ #include "scene/gui/center_container.h" #include "scene/resources/font.h" -void EditorLog::_error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, ErrorHandlerType p_type) { +void EditorLog::_error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, bool p_editor_notify, ErrorHandlerType p_type) { EditorLog *self = (EditorLog *)p_self; if (self->current != Thread::get_caller_id()) { return; @@ -45,9 +45,13 @@ void EditorLog::_error_handler(void *p_self, const char *p_func, const char *p_f String err_str; if (p_errorexp && p_errorexp[0]) { - err_str = p_errorexp; + err_str = String::utf8(p_errorexp); } else { - err_str = String(p_file) + ":" + itos(p_line) + " - " + String(p_error); + err_str = String::utf8(p_file) + ":" + itos(p_line) + " - " + String::utf8(p_error); + } + + if (p_editor_notify) { + err_str += " (User)"; } if (p_type == ERR_HANDLER_WARNING) { @@ -362,7 +366,7 @@ EditorLog::EditorLog() { clear_button = memnew(Button); clear_button->set_flat(true); clear_button->set_focus_mode(FOCUS_NONE); - clear_button->set_shortcut(ED_SHORTCUT("editor/clear_output", TTR("Clear Output"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_K)); + clear_button->set_shortcut(ED_SHORTCUT("editor/clear_output", TTR("Clear Output"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::K)); clear_button->set_shortcut_context(this); clear_button->connect("pressed", callable_mp(this, &EditorLog::_clear_request)); hb_tools->add_child(clear_button); @@ -371,7 +375,7 @@ EditorLog::EditorLog() { copy_button = memnew(Button); copy_button->set_flat(true); copy_button->set_focus_mode(FOCUS_NONE); - copy_button->set_shortcut(ED_SHORTCUT("editor/copy_output", TTR("Copy Selection"), KEY_MASK_CMD | KEY_C)); + copy_button->set_shortcut(ED_SHORTCUT("editor/copy_output", TTR("Copy Selection"), KeyModifierMask::CMD | Key::C)); copy_button->set_shortcut_context(this); copy_button->connect("pressed", callable_mp(this, &EditorLog::_copy_request)); hb_tools->add_child(copy_button); @@ -397,7 +401,7 @@ EditorLog::EditorLog() { show_search_button->set_focus_mode(FOCUS_NONE); show_search_button->set_toggle_mode(true); show_search_button->set_pressed(true); - show_search_button->set_shortcut(ED_SHORTCUT("editor/open_search", TTR("Focus Search/Filter Bar"), KEY_MASK_CMD | KEY_F)); + show_search_button->set_shortcut(ED_SHORTCUT("editor/open_search", TTR("Focus Search/Filter Bar"), KeyModifierMask::CMD | Key::F)); show_search_button->set_shortcut_context(this); show_search_button->connect("toggled", callable_mp(this, &EditorLog::_set_search_visible)); hb_tools2->add_child(show_search_button); diff --git a/editor/editor_log.h b/editor/editor_log.h index 6cbf4bedee..43cc5680bd 100644 --- a/editor/editor_log.h +++ b/editor/editor_log.h @@ -136,7 +136,7 @@ private: bool is_loading_state = false; // Used to disable saving requests while loading (some signals from buttons will try trigger a save, which happens during loading). Timer *save_state_timer; - static void _error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, ErrorHandlerType p_type); + static void _error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, bool p_editor_notify, ErrorHandlerType p_type); ErrorHandlerList eh; diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 5fd0a41788..2cf4a3395f 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -59,8 +59,8 @@ #include "scene/gui/panel.h" #include "scene/gui/panel_container.h" #include "scene/gui/split_container.h" +#include "scene/gui/tab_bar.h" #include "scene/gui/tab_container.h" -#include "scene/gui/tabs.h" #include "scene/gui/texture_progress_bar.h" #include "scene/main/window.h" #include "scene/resources/packed_scene.h" @@ -95,6 +95,7 @@ #include "editor/editor_settings.h" #include "editor/editor_spin_slider.h" #include "editor/editor_themes.h" +#include "editor/editor_toaster.h" #include "editor/editor_translation_parser.h" #include "editor/export_template_manager.h" #include "editor/filesystem_dock.h" @@ -143,7 +144,6 @@ #include "editor/plugins/gpu_particles_collision_sdf_editor_plugin.h" #include "editor/plugins/gradient_editor_plugin.h" #include "editor/plugins/input_event_editor_plugin.h" -#include "editor/plugins/item_list_editor_plugin.h" #include "editor/plugins/light_occluder_2d_editor_plugin.h" #include "editor/plugins/lightmap_gi_editor_plugin.h" #include "editor/plugins/line_2d_editor_plugin.h" @@ -174,6 +174,7 @@ #include "editor/plugins/sprite_frames_editor_plugin.h" #include "editor/plugins/style_box_editor_plugin.h" #include "editor/plugins/sub_viewport_preview_editor_plugin.h" +#include "editor/plugins/text_control_editor_plugin.h" #include "editor/plugins/text_editor.h" #include "editor/plugins/texture_3d_editor_plugin.h" #include "editor/plugins/texture_editor_plugin.h" @@ -382,6 +383,9 @@ void EditorNode::_update_scene_tabs() { void EditorNode::_version_control_menu_option(int p_idx) { switch (vcs_actions_menu->get_item_id(p_idx)) { + case RUN_VCS_METADATA: { + VersionControlEditorPlugin::get_singleton()->popup_vcs_metadata_dialog(); + } break; case RUN_VCS_SETTINGS: { VersionControlEditorPlugin::get_singleton()->popup_vcs_set_up_dialog(gui_base); } break; @@ -561,9 +565,9 @@ void EditorNode::_notification(int p_what) { last_checked_version = editor_data.get_undo_redo().get_version(); } - // update the animation frame of the update spinner + // Update the animation frame of the update spinner. uint64_t frame = Engine::get_singleton()->get_frames_drawn(); - uint32_t tick = OS::get_singleton()->get_ticks_msec(); + uint64_t tick = OS::get_singleton()->get_ticks_msec(); if (frame != update_spinner_step_frame && (tick - update_spinner_step_msec) > (1000 / 8)) { update_spinner_step++; @@ -574,7 +578,7 @@ void EditorNode::_notification(int p_what) { update_spinner_step_msec = tick; update_spinner_step_frame = frame + 1; - // update the icon itself only when the spinner is visible + // Update the icon itself only when the spinner is visible. if (EditorSettings::get_singleton()->get("interface/editor/show_update_spinner")) { update_spinner->set_icon(gui_base->get_theme_icon("Progress" + itos(update_spinner_step + 1), SNAME("EditorIcons"))); } @@ -589,6 +593,11 @@ void EditorNode::_notification(int p_what) { settings_changed = false; emit_signal(SNAME("project_settings_changed")); } + + ResourceImporterTexture::get_singleton()->update_imports(); + + // if using a main thread only renderer, we need to update the resource previews + EditorResourcePreview::get_singleton()->update(); } break; case NOTIFICATION_ENTER_TREE: { @@ -615,6 +624,19 @@ void EditorNode::_notification(int p_what) { } break; case NOTIFICATION_READY: { + { + _initializing_addons = true; + Vector<String> addons; + if (ProjectSettings::get_singleton()->has_setting("editor_plugins/enabled")) { + addons = ProjectSettings::get_singleton()->get("editor_plugins/enabled"); + } + + for (int i = 0; i < addons.size(); i++) { + set_addon_plugin_enabled(addons[i], true); + } + _initializing_addons = false; + } + RenderingServer::get_singleton()->viewport_set_disable_2d(get_scene_root()->get_viewport_rid(), true); RenderingServer::get_singleton()->viewport_set_disable_environment(get_viewport()->get_viewport_rid(), true); @@ -657,7 +679,7 @@ void EditorNode::_notification(int p_what) { } break; case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - scene_tabs->set_tab_close_display_policy((bool(EDITOR_GET("interface/scene_tabs/always_show_close_button")) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY)); + scene_tabs->set_tab_close_display_policy((bool(EDITOR_GET("interface/scene_tabs/always_show_close_button")) ? TabBar::CLOSE_BUTTON_SHOW_ALWAYS : TabBar::CLOSE_BUTTON_SHOW_ACTIVE_ONLY)); theme = create_custom_theme(theme_base->get_theme()); theme_base->set_theme(theme); @@ -809,7 +831,7 @@ void EditorNode::_remove_plugin_from_enabled(const String &p_name) { PackedStringArray enabled_plugins = ps->get("editor_plugins/enabled"); for (int i = 0; i < enabled_plugins.size(); ++i) { if (enabled_plugins.get(i) == p_name) { - enabled_plugins.remove(i); + enabled_plugins.remove_at(i); break; } } @@ -837,7 +859,7 @@ void EditorNode::_resources_changed(const Vector<String> &p_resources) { } if (res->get_import_path() != String()) { - //this is an imported resource, will be reloaded if reimported via the _resources_reimported() callback + // this is an imported resource, will be reloaded if reimported via the _resources_reimported() callback continue; } @@ -941,21 +963,21 @@ void EditorNode::_fs_changed() { } void EditorNode::_resources_reimported(const Vector<String> &p_resources) { - List<String> scenes; //will load later + List<String> scenes; // will load later int current_tab = scene_tabs->get_current_tab(); for (int i = 0; i < p_resources.size(); i++) { String file_type = ResourceLoader::get_resource_type(p_resources[i]); if (file_type == "PackedScene") { scenes.push_back(p_resources[i]); - //reload later if needed, first go with normal resources + // reload later if needed, first go with normal resources continue; } if (!ResourceCache::has(p_resources[i])) { - continue; //not loaded, no need to reload + continue; // not loaded, no need to reload } - //reload normally + // reload normally Resource *resource = ResourceCache::get(p_resources[i]); if (resource) { resource->reload_from_file(); @@ -988,18 +1010,6 @@ void EditorNode::_sources_changed(bool p_exist) { load_scene(defer_load_scene); defer_load_scene = ""; } - - // Only enable addons once resources have been imported - _initializing_addons = true; - Vector<String> addons; - if (ProjectSettings::get_singleton()->has_setting("editor_plugins/enabled")) { - addons = ProjectSettings::get_singleton()->get("editor_plugins/enabled"); - } - - for (int i = 0; i < addons.size(); i++) { - set_addon_plugin_enabled(addons[i], true); - } - _initializing_addons = false; } } @@ -1139,7 +1149,7 @@ Error EditorNode::load_resource(const String &p_resource, bool p_ignore_broken_d ERR_FAIL_COND_V(!res.is_valid(), ERR_CANT_OPEN); if (!p_ignore_broken_deps && dependency_errors.has(p_resource)) { - //current_option = -1; + // current_option = -1; Vector<String> errors; for (Set<String>::Element *E = dependency_errors[p_resource].front(); E; E = E->next()) { errors.push_back(E->get()); @@ -1215,7 +1225,7 @@ void EditorNode::save_resource_as(const Ref<Resource> &p_resource, const String List<String> preferred; for (const String &E : extensions) { if (p_resource->is_class("Script") && (E == "tres" || E == "res")) { - //this serves no purpose and confused people + // this serves no purpose and confused people continue; } file->add_filter("*." + E + " ; " + E.to_upper()); @@ -1324,7 +1334,7 @@ void EditorNode::_get_scene_metadata(const String &p_file) { Error err = cf->load(path); if (err != OK || !cf->has_section("editor_states")) { - return; //must not exist + return; // must not exist } List<String> esl; @@ -1348,7 +1358,7 @@ void EditorNode::_set_scene_metadata(const String &p_file, int p_idx) { return; } - scene->set_meta("__editor_run_settings__", Variant()); //clear it (no point in keeping it) + scene->set_meta("__editor_run_settings__", Variant()); // clear it (no point in keeping it) scene->set_meta("__editor_plugin_states__", Variant()); String path = EditorSettings::get_singleton()->get_project_settings_dir().plus_file(p_file.get_file() + "-editstate-" + p_file.md5_text() + ".cfg"); @@ -1391,10 +1401,10 @@ bool EditorNode::_find_and_save_resource(RES p_res, Map<RES, bool> &processed, i if (p_res->get_path().is_resource_file()) { if (changed || subchanged) { - //save + // save ResourceSaver::save(p_res->get_path(), p_res, flags); } - processed[p_res] = false; //because it's a file + processed[p_res] = false; // because it's a file return false; } else { processed[p_res] = changed; @@ -1492,7 +1502,7 @@ void EditorNode::_save_scene_with_preview(String p_file, int p_idx) { _find_node_types(editor_data.get_edited_scene_root(), c2d, c3d); save.step(TTR("Creating Thumbnail"), 1); - //current view? + // current view? Ref<Image> img; // If neither 3D or 2D nodes are present, make a 1x1 black texture. @@ -1545,12 +1555,12 @@ void EditorNode::_save_scene_with_preview(String p_file, int p_idx) { } img->convert(Image::FORMAT_RGB8); - //save thumbnail directly, as thumbnailer may not update due to actual scene not changing md5 + // save thumbnail directly, as thumbnailer may not update due to actual scene not changing md5 String temp_path = EditorPaths::get_singleton()->get_cache_dir(); String cache_base = ProjectSettings::get_singleton()->globalize_path(p_file).md5_text(); cache_base = temp_path.plus_file("resthumb-" + cache_base); - //does not have it, try to load a cached thumbnail + // does not have it, try to load a cached thumbnail String file = cache_base + ".png"; @@ -1598,7 +1608,7 @@ static bool _find_edited_resources(const Ref<Resource> &p_resource, Set<Ref<Reso if (res.is_null()) { continue; } - if (res->get_path().is_resource_file()) { //not a subresource, continue + if (res->get_path().is_resource_file()) { // not a subresource, continue continue; } if (_find_edited_resources(res, edited_resources)) { @@ -1611,7 +1621,7 @@ static bool _find_edited_resources(const Ref<Resource> &p_resource, Set<Ref<Reso } int EditorNode::_save_external_resources() { - //save external resources and its subresources if any was modified + // save external resources and its subresources if any was modified int flg = 0; if (EditorSettings::get_singleton()->get("filesystem/on_save/compress_binary_resources")) { @@ -1627,7 +1637,7 @@ int EditorNode::_save_external_resources() { if (!res->get_path().is_resource_file()) { continue; } - //not only check if this resource is edited, check contained subresources too + // not only check if this resource is edited, check contained subresources too if (_find_edited_resources(res, edited_subresources)) { ResourceSaver::save(res->get_path(), res, flg); saved++; @@ -1711,8 +1721,10 @@ void EditorNode::_save_scene(String p_file, int idx) { err = ResourceSaver::save(p_file, sdata, flg); - _save_external_resources(); + // This needs to be emitted before saving external resources. + emit_signal(SNAME("scene_saved"), p_file); + _save_external_resources(); editor_data.save_editor_external_data(); for (Ref<AnimatedValuesBackup> &E : anim_backups) { @@ -1776,19 +1788,25 @@ void EditorNode::restart_editor() { } void EditorNode::_save_all_scenes() { + bool all_saved = true; for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { Node *scene = editor_data.get_edited_scene_root(i); - if (scene && scene->get_scene_file_path() != "" && DirAccess::exists(scene->get_scene_file_path().get_base_dir())) { - if (i != editor_data.get_edited_scene()) { - _save_scene(scene->get_scene_file_path(), i); - } else { - _save_scene_with_preview(scene->get_scene_file_path()); + if (scene) { + if (scene->get_scene_file_path() != "" && DirAccess::exists(scene->get_scene_file_path().get_base_dir())) { + if (i != editor_data.get_edited_scene()) { + _save_scene(scene->get_scene_file_path(), i); + } else { + _save_scene_with_preview(scene->get_scene_file_path()); + } + } else if (scene->get_scene_file_path() != "") { + all_saved = false; } - } else { - show_warning(TTR("Could not save one or more scenes!"), TTR("Save All Scenes")); } } + if (!all_saved) { + show_warning(TTR("Could not save one or more scenes!"), TTR("Save All Scenes")); + } _save_default_environment(); } @@ -1830,7 +1848,7 @@ void EditorNode::_dialog_action(String p_file) { case SETTINGS_PICK_MAIN_SCENE: { ProjectSettings::get_singleton()->set("application/run/main_scene", p_file); ProjectSettings::get_singleton()->save(); - //would be nice to show the project manager opened with the highlighted field.. + // would be nice to show the project manager opened with the highlighted field.. if (pick_main_scene->has_meta("from_native") && (bool)pick_main_scene->get_meta("from_native")) { run_native->resume_run_native(); @@ -1973,7 +1991,7 @@ void EditorNode::_dialog_action(String p_file) { } } break; - default: { //save scene? + default: { // save scene? if (file->get_file_mode() == EditorFileDialog::FILE_MODE_SAVE_FILE) { _save_scene_with_preview(p_file); @@ -2134,7 +2152,7 @@ void EditorNode::_edit_current() { bool is_resource = current_obj->is_class("Resource"); bool is_node = current_obj->is_class("Node"); - String editable_warning; //none by default + String editable_warning; // none by default if (is_resource) { Resource *current_res = Object::cast_to<Resource>(current_obj); @@ -2236,7 +2254,7 @@ void EditorNode::_edit_current() { for (; plugin_index < editor_table.size(); plugin_index++) { if (editor_table[plugin_index] == main_plugin) { if (!main_editor_buttons[plugin_index]->is_visible()) { - main_plugin = nullptr; //if button is not visible, then no plugin active + main_plugin = nullptr; // if button is not visible, then no plugin active } break; @@ -2245,7 +2263,8 @@ void EditorNode::_edit_current() { if (main_plugin) { // special case if use of external editor is true - if (main_plugin->get_name() == "Script" && current_obj->get_class_name() != StringName("VisualScript") && (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")) || overrides_external_editor(current_obj))) { + Resource *res = Object::cast_to<Resource>(current_obj); + if (main_plugin->get_name() == "Script" && current_obj->get_class_name() != StringName("VisualScript") && res && !res->is_built_in() && (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")) || overrides_external_editor(current_obj))) { if (!changing_scene) { main_plugin->edit(current_obj); } @@ -2296,8 +2315,6 @@ void EditorNode::_run(bool p_current, const String &p_custom) { play_custom_scene_button->set_icon(gui_base->get_theme_icon(SNAME("PlayCustom"), SNAME("EditorIcons"))); String run_filename; - String args; - bool skip_breakpoints; if (p_current || (editor_data.get_edited_scene_root() && p_custom != String() && p_custom == editor_data.get_edited_scene_root()->get_scene_file_path())) { Node *scene = editor_data.get_edited_scene_root(); @@ -2322,7 +2339,7 @@ void EditorNode::_run(bool p_current, const String &p_custom) { } if (run_filename == "") { - //evidently, run the scene + // evidently, run the scene if (!ensure_main_scene(false)) { return; } @@ -2352,17 +2369,11 @@ void EditorNode::_run(bool p_current, const String &p_custom) { make_bottom_panel_item_visible(log); } - List<String> breakpoints; - editor_data.get_editor_breakpoints(&breakpoints); - - args = ProjectSettings::get_singleton()->get("editor/run/main_run_args"); - skip_breakpoints = EditorDebuggerNode::get_singleton()->is_skip_breakpoints(); - EditorDebuggerNode::get_singleton()->start(); - Error error = editor_run.run(run_filename, args, breakpoints, skip_breakpoints); + Error error = editor_run.run(run_filename); if (error != OK) { EditorDebuggerNode::get_singleton()->stop(); - show_accept(TTR("Could not start subprocess!"), TTR("OK")); + show_accept(TTR("Could not start subprocess(es)!"), TTR("OK")); return; } @@ -2405,7 +2416,7 @@ void EditorNode::_android_build_source_selected(const String &p_file) { export_template_manager->install_android_template_from_file(p_file); } void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { - if (!p_confirmed) { //this may be a hack.. + if (!p_confirmed) { // this may be a hack.. current_option = (MenuOptions)p_option; } @@ -2631,7 +2642,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } break; case EDIT_UNDO: { - if (Input::get_singleton()->get_mouse_button_mask() & 0x7) { + if ((int)Input::get_singleton()->get_mouse_button_mask() & 0x7) { log->add_message(TTR("Can't undo while mouse buttons are pressed."), EditorLog::MSG_TYPE_EDITOR); } else { String action = editor_data.get_undo_redo().get_current_action_name(); @@ -2644,7 +2655,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } } break; case EDIT_REDO: { - if (Input::get_singleton()->get_mouse_button_mask() & 0x7) { + if ((int)Input::get_singleton()->get_mouse_button_mask() & 0x7) { log->add_message(TTR("Can't redo while mouse buttons are pressed."), EditorLog::MSG_TYPE_EDITOR); } else { if (!editor_data.get_undo_redo().redo()) { @@ -2897,8 +2908,13 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { OS::get_singleton()->shell_open("https://godotengine.org/donate"); } break; - case SET_VIDEO_DRIVER_SAVE_AND_RESTART: { - ProjectSettings::get_singleton()->set("rendering/driver/driver_name", video_driver_request); + // case SET_VIDEO_DRIVER_SAVE_AND_RESTART: { + // ProjectSettings::get_singleton()->set("rendering/driver/driver_name", video_driver_request); + // save_all_scenes(); + // restart_editor(); + // } break; + case SET_RENDERING_DRIVER_SAVE_AND_RESTART: { + ProjectSettings::get_singleton()->set("rendering/driver/driver_name", rendering_driver_request); ProjectSettings::get_singleton()->save(); save_all_scenes(); @@ -2974,7 +2990,7 @@ int EditorNode::_next_unsaved_scene(bool p_valid_filename, int p_start) { void EditorNode::_exit_editor() { exiting = true; - resource_preview->stop(); //stop early to avoid crashes + resource_preview->stop(); // stop early to avoid crashes _save_docks(); // Dim the editor window while it's quitting to make it clearer that it's busy @@ -3043,7 +3059,7 @@ void EditorNode::_discard_changes(const String &p_str) { args.push_back(exec.get_base_dir()); args.push_back("--project-manager"); - Error err = OS::get_singleton()->create_process(exec, args); + Error err = OS::get_singleton()->create_instance(args); ERR_FAIL_COND(err); } break; } @@ -3080,7 +3096,7 @@ void EditorNode::_editor_select(int p_which) { ERR_FAIL_INDEX(p_which, editor_table.size()); - if (!main_editor_buttons[p_which]->is_visible()) { //button hidden, no editor + if (!main_editor_buttons[p_which]->is_visible()) { // button hidden, no editor return; } @@ -3175,7 +3191,7 @@ void EditorNode::remove_editor_plugin(EditorPlugin *p_editor, bool p_config_chan } memdelete(singleton->main_editor_buttons[i]); - singleton->main_editor_buttons.remove(i); + singleton->main_editor_buttons.remove_at(i); break; } @@ -3222,7 +3238,7 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled, if (!p_enabled) { EditorPlugin *addon = plugin_addons[p_addon]; remove_editor_plugin(addon, p_config_changed); - memdelete(addon); //bye + memdelete(addon); // bye plugin_addons.erase(p_addon); _update_addon_config(); return; @@ -3314,10 +3330,10 @@ void EditorNode::_remove_edited_scene(bool p_change_tab) { void EditorNode::_remove_scene(int index, bool p_change_tab) { if (editor_data.get_edited_scene() == index) { - //Scene to remove is current scene + // Scene to remove is current scene _remove_edited_scene(p_change_tab); } else { - //Scene to remove is not active scene + // Scene to remove is not active scene editor_data.remove_scene(index); } } @@ -3331,7 +3347,7 @@ void EditorNode::set_edited_scene(Node *p_scene) { get_editor_data().set_edited_scene_root(p_scene); if (Object::cast_to<Popup>(p_scene)) { - Object::cast_to<Popup>(p_scene)->show(); //show popups + Object::cast_to<Popup>(p_scene)->show(); // show popups } scene_tree_dock->set_edited_scene(p_scene); if (get_tree()) { @@ -3340,7 +3356,7 @@ void EditorNode::set_edited_scene(Node *p_scene) { if (p_scene) { if (p_scene->get_parent() != scene_root) { - scene_root->add_child(p_scene); + scene_root->add_child(p_scene, true); } } } @@ -3367,7 +3383,7 @@ Dictionary EditorNode::_get_main_scene_state() { void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) { if (get_edited_scene() != p_for_scene && p_for_scene != nullptr) { - return; //not for this scene + return; // not for this scene } changing_scene = false; @@ -3382,7 +3398,7 @@ void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) { if (p_state.has("editor_index")) { int index = p_state["editor_index"]; - if (current < 2) { //if currently in spatial/2d, only switch to spatial/2d. if currently in script, stay there + if (current < 2) { // if currently in spatial/2d, only switch to spatial/2d. if currently in script, stay there if (index < 2 || !get_edited_scene()) { _editor_select(index); } @@ -3391,7 +3407,7 @@ void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) { if (get_edited_scene()) { if (current < 2) { - //use heuristic instead + // use heuristic instead int n2d = 0, n3d = 0; _find_node_types(get_edited_scene(), n2d, n3d); if (n2d > n3d) { @@ -3413,7 +3429,7 @@ void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) { scene_tree_dock->set_filter(p_state["node_filter"]); } - //this should only happen at the very end + // this should only happen at the very end EditorDebuggerNode::get_singleton()->update_live_edit_root(); ScriptEditor::get_singleton()->set_scene_root_script(editor_data.get_scene_root_script(editor_data.get_edited_scene())); @@ -3434,7 +3450,7 @@ void EditorNode::_clear_undo_history() { } void EditorNode::set_current_scene(int p_idx) { - //Save the folding in case the scene gets reloaded. + // Save the folding in case the scene gets reloaded. if (editor_data.get_scene_path(p_idx) != "" && editor_data.get_edited_scene_root(p_idx)) { editor_folding.save_scene_folding(editor_data.get_edited_scene_root(p_idx), editor_data.get_scene_path(p_idx)); } @@ -3462,7 +3478,7 @@ void EditorNode::set_current_scene(int p_idx) { Node *new_scene = editor_data.get_edited_scene_root(); if (Object::cast_to<Popup>(new_scene)) { - Object::cast_to<Popup>(new_scene)->show(); //show popups + Object::cast_to<Popup>(new_scene)->show(); // show popups } scene_tree_dock->set_edited_scene(new_scene); @@ -3472,7 +3488,7 @@ void EditorNode::set_current_scene(int p_idx) { if (new_scene) { if (new_scene->get_parent() != scene_root) { - scene_root->add_child(new_scene); + scene_root->add_child(new_scene, true); } } @@ -3481,7 +3497,7 @@ void EditorNode::set_current_scene(int p_idx) { _update_title(); - call_deferred(SNAME("_set_main_scene_state"), state, get_edited_scene()); //do after everything else is done setting up + call_deferred(SNAME("_set_main_scene_state"), state, get_edited_scene()); // do after everything else is done setting up } bool EditorNode::is_scene_open(const String &p_path) { @@ -3583,7 +3599,7 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b return ERR_FILE_MISSING_DEPENDENCIES; } - dependency_errors.erase(lpath); //at least not self path + dependency_errors.erase(lpath); // at least not self path for (KeyValue<String, Set<String>> &E : dependency_errors) { String txt = vformat(TTR("Scene '%s' has broken dependencies:"), E.key) + "\n"; @@ -3594,7 +3610,7 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b } if (ResourceCache::has(lpath)) { - //used from somewhere else? no problem! update state and replace sdata + // used from somewhere else? no problem! update state and replace sdata Ref<PackedScene> ps = Ref<PackedScene>(Object::cast_to<PackedScene>(ResourceCache::get(lpath))); if (ps.is_valid()) { ps->replace_state(sdata->get_state()); @@ -3603,10 +3619,10 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b } } else { - sdata->set_path(lpath, true); //take over path + sdata->set_path(lpath, true); // take over path } - Node *new_scene = sdata->instantiate(PackedScene::GEN_EDIT_STATE_MAIN); + Node *new_scene = sdata->instantiate(p_set_inherited ? PackedScene::GEN_EDIT_STATE_MAIN_INHERITED : PackedScene::GEN_EDIT_STATE_MAIN); if (!new_scene) { sdata.unref(); @@ -3734,7 +3750,7 @@ void EditorNode::_open_recent_scene(int p_idx) { ERR_FAIL_INDEX(p_idx, rc.size()); if (load_scene(rc[p_idx]) != OK) { - rc.remove(p_idx); + rc.remove_at(p_idx); EditorSettings::get_singleton()->set_project_metadata("recent_files", "scenes", rc); _update_recent_scenes(); } @@ -3842,7 +3858,8 @@ void EditorNode::register_editor_types() { GDREGISTER_VIRTUAL_CLASS(EditorInterface); GDREGISTER_CLASS(EditorExportPlugin); GDREGISTER_CLASS(EditorResourceConversionPlugin); - GDREGISTER_CLASS(EditorSceneImporter); + GDREGISTER_CLASS(EditorSceneFormatImporter); + GDREGISTER_CLASS(EditorScenePostImportPlugin); GDREGISTER_CLASS(EditorInspector); GDREGISTER_CLASS(EditorInspectorPlugin); GDREGISTER_CLASS(EditorProperty); @@ -4216,10 +4233,9 @@ void EditorNode::_dock_make_float() { ERR_FAIL_COND(!dock); const Size2i borders = Size2i(4, 4) * EDSCALE; - Size2 dock_size = dock->get_size() + borders * 2; //remember size + Size2 dock_size = dock->get_size() + borders * 2; // remember size Point2 dock_screen_pos = dock->get_global_position() + get_tree()->get_root()->get_position() - borders; - print_line("dock pos: " + dock->get_global_position() + " window pos: " + get_tree()->get_root()->get_position()); int dock_index = dock->get_index(); dock_slot[dock_popup_selected]->remove_child(dock); @@ -4304,7 +4320,7 @@ void EditorNode::_dock_select_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseButton> mb = me; - if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed() && dock_popup_selected != nrect) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed() && dock_popup_selected != nrect) { Control *dock = dock_slot[dock_popup_selected]->get_current_tab_control(); if (dock) { dock_slot[dock_popup_selected]->remove_child(dock); @@ -4456,7 +4472,7 @@ void EditorNode::_dock_select_draw() { void EditorNode::_save_docks() { if (waiting_for_first_scan) { - return; //scanning, do not touch docks + return; // scanning, do not touch docks } Ref<ConfigFile> config; config.instantiate(); @@ -4527,7 +4543,7 @@ void EditorNode::_load_docks() { config.instantiate(); Error err = config->load(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("editor_layout.cfg")); if (err != OK) { - //no config + // no config if (overridden_default_layout >= 0) { _layout_menu_option(overridden_default_layout); } @@ -4640,7 +4656,7 @@ void EditorNode::_load_docks_from_config(Ref<ConfigFile> p_layout, const String for (int j = 0; j < names.size(); j++) { String name = names[j]; - //find it, in a horribly inefficient way + // find it, in a horribly inefficient way int atidx = -1; Control *node = nullptr; for (int k = 0; k < DOCK_SLOT_MAX; k++) { @@ -4654,7 +4670,7 @@ void EditorNode::_load_docks_from_config(Ref<ConfigFile> p_layout, const String atidx = k; break; } - if (atidx == -1) { //well, it's not anywhere + if (atidx == -1) { // well, it's not anywhere continue; } @@ -4770,7 +4786,7 @@ bool EditorNode::has_scenes_in_session() { } bool EditorNode::ensure_main_scene(bool p_from_native) { - pick_main_scene->set_meta("from_native", p_from_native); //whether from play button or native run + pick_main_scene->set_meta("from_native", p_from_native); // whether from play button or native run String main_scene = GLOBAL_DEF("application/run/main_scene", ""); if (main_scene == "") { @@ -4881,7 +4897,7 @@ void EditorNode::_update_layouts_menu() { editor_layouts->clear(); overridden_default_layout = -1; - editor_layouts->set_size(Vector2()); + editor_layouts->reset_size(); editor_layouts->add_shortcut(ED_SHORTCUT("layout/save", TTR("Save Layout")), SETTINGS_LAYOUT_SAVE); editor_layouts->add_shortcut(ED_SHORTCUT("layout/delete", TTR("Delete Layout")), SETTINGS_LAYOUT_DELETE); editor_layouts->add_separator(); @@ -4891,7 +4907,7 @@ void EditorNode::_update_layouts_menu() { config.instantiate(); Error err = config->load(EditorSettings::get_singleton()->get_editor_layouts_config()); if (err != OK) { - return; //no config + return; // no config } List<String> layouts; @@ -4932,7 +4948,7 @@ void EditorNode::_layout_menu_option(int p_id) { config.instantiate(); Error err = config->load(EditorSettings::get_singleton()->get_editor_layouts_config()); if (err != OK) { - return; //no config + return; // no config } _load_docks_from_config(config, editor_layouts->get_item_text(p_id)); @@ -4957,9 +4973,9 @@ void EditorNode::_scene_tab_closed(int p_tab, int option) { return; } - bool unsaved = (p_tab == editor_data.get_edited_scene()) ? - saved_version != editor_data.get_undo_redo().get_version() : - editor_data.get_scene_version(p_tab) != 0; + bool unsaved = (p_tab == editor_data.get_edited_scene()) + ? saved_version != editor_data.get_undo_redo().get_version() + : editor_data.get_scene_version(p_tab) != 0; if (unsaved) { save_confirmation->get_ok_button()->set_text(TTR("Save & Close")); save_confirmation->set_text(vformat(TTR("Save changes to '%s' before closing?"), scene->get_scene_file_path() != "" ? scene->get_scene_file_path() : "unsaved scene")); @@ -4997,18 +5013,18 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) { if (mb.is_valid()) { if (scene_tabs->get_hovered_tab() >= 0) { - if (mb->get_button_index() == MOUSE_BUTTON_MIDDLE && mb->is_pressed()) { + if (mb->get_button_index() == MouseButton::MIDDLE && mb->is_pressed()) { _scene_tab_closed(scene_tabs->get_hovered_tab()); } } else { - if ((mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_double_click()) || (mb->get_button_index() == MOUSE_BUTTON_MIDDLE && mb->is_pressed())) { + if ((mb->get_button_index() == MouseButton::LEFT && mb->is_double_click()) || (mb->get_button_index() == MouseButton::MIDDLE && mb->is_pressed())) { _menu_option_confirm(FILE_NEW_SCENE, true); } } - if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { + if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) { // context menu scene_tabs_context_menu->clear(); - scene_tabs_context_menu->set_size(Size2(1, 1)); + scene_tabs_context_menu->reset_size(); scene_tabs_context_menu->add_shortcut(ED_GET_SHORTCUT("editor/new_scene"), FILE_NEW_SCENE); if (scene_tabs->get_hovered_tab() >= 0) { @@ -5038,12 +5054,12 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) { scene_tabs_context_menu->set_position(mb->get_global_position()); scene_tabs_context_menu->popup(); } - if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed()) { + if (mb->get_button_index() == MouseButton::WHEEL_UP && mb->is_pressed()) { int previous_tab = editor_data.get_edited_scene() - 1; previous_tab = previous_tab >= 0 ? previous_tab : editor_data.get_edited_scene_count() - 1; _scene_tab_changed(previous_tab); } - if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed()) { + if (mb->get_button_index() == MouseButton::WHEEL_DOWN && mb->is_pressed()) { int next_tab = editor_data.get_edited_scene() + 1; next_tab %= editor_data.get_edited_scene_count(); _scene_tab_changed(next_tab); @@ -5073,7 +5089,7 @@ void EditorNode::_scene_tab_changed(int p_tab) { bool unsaved = (saved_version != editor_data.get_undo_redo().get_version()); if (p_tab == editor_data.get_edited_scene()) { - return; //pointless + return; // pointless } uint64_t next_scene_version = editor_data.get_scene_version(p_tab); @@ -5152,7 +5168,7 @@ void EditorNode::remove_bottom_panel_item(Control *p_item) { bottom_panel_vb->remove_child(bottom_panel_items[i].control); bottom_panel_hb_editors->remove_child(bottom_panel_items[i].button); memdelete(bottom_panel_items[i].button); - bottom_panel_items.remove(i); + bottom_panel_items.remove_at(i); break; } } @@ -5276,11 +5292,11 @@ Variant EditorNode::drag_resource(const Ref<Resource> &p_res, Control *p_from) { Ref<Texture2D> preview; { - //todo make proper previews + // todo make proper previews Ref<ImageTexture> texture = gui_base->get_theme_icon(SNAME("FileBigThumb"), SNAME("EditorIcons")); Ref<Image> img = texture->get_image(); img = img->duplicate(); - img->resize(48, 48); //meh + img->resize(48, 48); // meh Ref<ImageTexture> resized_pic = Ref<ImageTexture>(memnew(ImageTexture)); resized_pic->create_from_image(img); preview = resized_pic; @@ -5298,7 +5314,7 @@ Variant EditorNode::drag_resource(const Ref<Resource> &p_res, Control *p_from) { drag_control->add_child(label); - p_from->set_drag_preview(drag_control); //wait until it enters scene + p_from->set_drag_preview(drag_control); // wait until it enters scene label->set_position(Point2((preview->get_width() - label->get_minimum_size().width) / 2, preview->get_height())); @@ -5352,7 +5368,7 @@ Variant EditorNode::drag_files_and_dirs(const Vector<String> &p_paths, Control * } vbox->add_child(label); } - p_from->set_drag_preview(vbox); //wait until it enters scene + p_from->set_drag_preview(vbox); // wait until it enters scene Dictionary drag_data; drag_data["type"] = has_folder ? "files_and_dirs" : "files"; @@ -5403,8 +5419,7 @@ void EditorNode::_global_menu_new_window(const Variant &p_tag) { if (OS::get_singleton()->get_main_loop()) { List<String> args; args.push_back("-p"); - String exec = OS::get_singleton()->get_executable_path(); - OS::get_singleton()->create_process(exec, args); + OS::get_singleton()->create_instance(args); } } @@ -5469,7 +5484,7 @@ void EditorNode::reload_scene(const String &p_path) { if (scene_idx == -1) { if (get_edited_scene()) { - //scene is not open, so at it might be instantiated. We'll refresh the whole scene later. + // scene is not open, so at it might be instantiated. We'll refresh the whole scene later. editor_data.get_undo_redo().clear_history(); } return; @@ -5480,17 +5495,17 @@ void EditorNode::reload_scene(const String &p_path) { _set_scene_metadata(p_path); } - //remove scene + // remove scene _remove_scene(scene_idx, false); - //reload scene + // reload scene load_scene(p_path, true, false, true, true); - //adjust index so tab is back a the previous position + // adjust index so tab is back a the previous position editor_data.move_edited_scene_to_index(scene_idx); get_undo_redo()->clear_history(); - //recover the tab + // recover the tab scene_tabs->set_current_tab(current_tab); } @@ -5578,28 +5593,27 @@ void EditorNode::_bottom_panel_raise_toggled(bool p_pressed) { top_split->set_visible(!p_pressed); } -void EditorNode::_update_video_driver_color() { - // TODO: Probably should de-hardcode this and add to editor settings. - if (video_driver->get_text() == "GLES2") { - video_driver->add_theme_color_override("font_color", Color::hex(0x5586a4ff)); - } else if (video_driver->get_text() == "Vulkan") { - video_driver->add_theme_color_override("font_color", theme_base->get_theme_color(SNAME("vulkan_color"), SNAME("Editor"))); +void EditorNode::_update_rendering_driver_color() { + if (rendering_driver->get_text() == "opengl3") { + rendering_driver->add_theme_color_override("font_color", Color::hex(0x5586a4ff)); + } else if (rendering_driver->get_text() == "vulkan") { + rendering_driver->add_theme_color_override("font_color", theme_base->get_theme_color("vulkan_color", "Editor")); } } -void EditorNode::_video_driver_selected(int p_which) { - String driver = video_driver->get_item_metadata(p_which); +void EditorNode::_rendering_driver_selected(int p_which) { + String driver = rendering_driver->get_item_metadata(p_which); - String current = ""; //OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver()); + String current = ""; // OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver()); if (driver == current) { return; } - video_driver_request = driver; + rendering_driver_request = driver; video_restart_dialog->popup_centered(); - video_driver->select(video_driver_current); - _update_video_driver_color(); + rendering_driver->select(rendering_driver_current); + _update_rendering_driver_color(); } void EditorNode::_resource_saved(RES p_resource, const String &p_path) { @@ -5695,6 +5709,7 @@ void EditorNode::_bind_methods() { ADD_SIGNAL(MethodInfo("request_help_search")); ADD_SIGNAL(MethodInfo("script_add_function_request", PropertyInfo(Variant::OBJECT, "obj"), PropertyInfo(Variant::STRING, "function"), PropertyInfo(Variant::PACKED_STRING_ARRAY, "args"))); ADD_SIGNAL(MethodInfo("resource_saved", PropertyInfo(Variant::OBJECT, "obj"))); + ADD_SIGNAL(MethodInfo("scene_saved", PropertyInfo(Variant::STRING, "path"))); ADD_SIGNAL(MethodInfo("project_settings_changed")); } @@ -5779,9 +5794,9 @@ EditorNode::EditorNode() { PhysicsServer2D::get_singleton()->set_active(false); // no physics by default if editor ScriptServer::set_scripting_enabled(false); // no scripting by default if editor - EditorHelp::generate_doc(); //before any editor classes are created + EditorHelp::generate_doc(); // before any editor classes are created SceneState::set_disable_placeholders(true); - ResourceLoader::clear_translation_remaps(); //no remaps using during editor + ResourceLoader::clear_translation_remaps(); // no remaps using during editor ResourceLoader::clear_path_remaps(); Input *id = Input::get_singleton(); @@ -5795,8 +5810,8 @@ EditorNode::EditorNode() { } if (!found_touchscreen && Input::get_singleton()) { - //only if no touchscreen ui hint, set emulation - id->set_emulate_touch_from_mouse(false); //just disable just in case + // only if no touchscreen ui hint, set emulation + id->set_emulate_touch_from_mouse(false); // just disable just in case } DisplayServer::get_singleton()->cursor_set_custom_image(RES()); } @@ -5863,7 +5878,7 @@ EditorNode::EditorNode() { ResourceLoader::set_error_notify_func(this, _load_error_notify); ResourceLoader::set_dependency_error_notify_func(this, _dependency_error_report); - { //register importers at the beginning, so dialogs are created with the right extensions + { // register importers at the beginning, so dialogs are created with the right extensions Ref<ResourceImporterTexture> import_texture; import_texture.instantiate(); ResourceFormatImporter::get_singleton()->add_importer(import_texture); @@ -5929,7 +5944,7 @@ EditorNode::EditorNode() { ResourceFormatImporter::get_singleton()->add_importer(import_scene); { - Ref<EditorSceneImporterCollada> import_collada; + Ref<EditorSceneFormatImporterCollada> import_collada; import_collada.instantiate(); import_scene->add_importer(import_collada); @@ -5937,7 +5952,7 @@ EditorNode::EditorNode() { import_obj2.instantiate(); import_scene->add_importer(import_obj2); - Ref<EditorSceneImporterESCN> import_escn; + Ref<EditorSceneFormatImporterESCN> import_escn; import_escn.instantiate(); import_scene->add_importer(import_escn); } @@ -5966,7 +5981,7 @@ EditorNode::EditorNode() { EditorFileSystem *efs = memnew(EditorFileSystem); add_child(efs); - //used for previews + // used for previews FileDialog::get_icon_func = _file_dialog_get_icon; FileDialog::register_func = _file_dialog_register; FileDialog::unregister_func = _file_dialog_unregister; @@ -5985,7 +6000,7 @@ EditorNode::EditorNode() { ClassDB::set_class_enabled("RootMotionView", true); - //defs here, use EDITOR_GET in logic + // defs here, use EDITOR_GET in logic EDITOR_DEF_RST("interface/scene_tabs/always_show_close_button", false); EDITOR_DEF_RST("interface/scene_tabs/resize_if_many_tabs", true); EDITOR_DEF_RST("interface/scene_tabs/minimum_width", 50); @@ -6209,18 +6224,18 @@ EditorNode::EditorNode() { tab_preview->set_position(Point2(2, 2) * EDSCALE); tab_preview_panel->add_child(tab_preview); - scene_tabs = memnew(Tabs); + scene_tabs = memnew(TabBar); scene_tabs->add_theme_style_override("tab_selected", gui_base->get_theme_stylebox(SNAME("SceneTabFG"), SNAME("EditorStyles"))); scene_tabs->add_theme_style_override("tab_unselected", gui_base->get_theme_stylebox(SNAME("SceneTabBG"), SNAME("EditorStyles"))); scene_tabs->set_select_with_rmb(true); scene_tabs->add_tab("unsaved"); - scene_tabs->set_tab_align(Tabs::ALIGN_LEFT); - scene_tabs->set_tab_close_display_policy((bool(EDITOR_DEF("interface/scene_tabs/always_show_close_button", false)) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY)); + scene_tabs->set_tab_align(TabBar::ALIGN_LEFT); + scene_tabs->set_tab_close_display_policy((bool(EDITOR_DEF("interface/scene_tabs/always_show_close_button", false)) ? TabBar::CLOSE_BUTTON_SHOW_ALWAYS : TabBar::CLOSE_BUTTON_SHOW_ACTIVE_ONLY)); scene_tabs->set_min_width(int(EDITOR_DEF("interface/scene_tabs/minimum_width", 50)) * EDSCALE); scene_tabs->set_drag_to_rearrange_enabled(true); scene_tabs->connect("tab_changed", callable_mp(this, &EditorNode::_scene_tab_changed)); scene_tabs->connect("tab_rmb_clicked", callable_mp(this, &EditorNode::_scene_tab_script_edited)); - scene_tabs->connect("tab_closed", callable_mp(this, &EditorNode::_scene_tab_closed), varray(SCENE_TAB_CLOSE)); + scene_tabs->connect("tab_close_pressed", callable_mp(this, &EditorNode::_scene_tab_closed), varray(SCENE_TAB_CLOSE)); scene_tabs->connect("tab_hovered", callable_mp(this, &EditorNode::_scene_tab_hovered)); scene_tabs->connect("mouse_exited", callable_mp(this, &EditorNode::_scene_tab_exit)); scene_tabs->connect("gui_input", callable_mp(this, &EditorNode::_scene_tab_input)); @@ -6238,8 +6253,8 @@ EditorNode::EditorNode() { tabbar_container->add_child(scene_tabs); distraction_free = memnew(Button); distraction_free->set_flat(true); - ED_SHORTCUT_AND_COMMAND("editor/distraction_free_mode", TTR("Distraction Free Mode"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F11); - ED_SHORTCUT_OVERRIDE("editor/distraction_free_mode", "macos", KEY_MASK_CMD | KEY_MASK_CTRL | KEY_D); + ED_SHORTCUT_AND_COMMAND("editor/distraction_free_mode", TTR("Distraction Free Mode"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F11); + ED_SHORTCUT_OVERRIDE("editor/distraction_free_mode", "macos", KeyModifierMask::CMD | KeyModifierMask::CTRL | Key::D); distraction_free->set_shortcut(ED_GET_SHORTCUT("editor/distraction_free_mode")); distraction_free->set_tooltip(TTR("Toggle distraction-free mode.")); distraction_free->connect("pressed", callable_mp(this, &EditorNode::_toggle_distraction_free_mode)); @@ -6337,9 +6352,9 @@ EditorNode::EditorNode() { gui_base->add_child(warning); warning->connect("custom_action", callable_mp(this, &EditorNode::_copy_warning)); - ED_SHORTCUT("editor/next_tab", TTR("Next Scene Tab"), KEY_MASK_CMD + KEY_TAB); - ED_SHORTCUT("editor/prev_tab", TTR("Previous Scene Tab"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_TAB); - ED_SHORTCUT("editor/filter_files", TTR("Focus FileSystem Filter"), KEY_MASK_CMD + KEY_MASK_ALT + KEY_P); + ED_SHORTCUT("editor/next_tab", TTR("Next Scene Tab"), KeyModifierMask::CMD + Key::TAB); + ED_SHORTCUT("editor/prev_tab", TTR("Previous Scene Tab"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::TAB); + ED_SHORTCUT("editor/filter_files", TTR("Focus FileSystem Filter"), KeyModifierMask::CMD + KeyModifierMask::ALT + Key::P); command_palette = EditorCommandPalette::get_singleton(); command_palette->set_title(TTR("Command Palette")); @@ -6351,22 +6366,22 @@ EditorNode::EditorNode() { p = file_menu->get_popup(); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_scene", TTR("New Scene"), KEY_MASK_CMD + KEY_N), FILE_NEW_SCENE); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_inherited_scene", TTR("New Inherited Scene..."), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_N), FILE_NEW_INHERITED_SCENE); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/open_scene", TTR("Open Scene..."), KEY_MASK_CMD + KEY_O), FILE_OPEN_SCENE); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/reopen_closed_scene", TTR("Reopen Closed Scene"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_T), FILE_OPEN_PREV); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_scene", TTR("New Scene"), KeyModifierMask::CMD + Key::N), FILE_NEW_SCENE); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_inherited_scene", TTR("New Inherited Scene..."), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::N), FILE_NEW_INHERITED_SCENE); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/open_scene", TTR("Open Scene..."), KeyModifierMask::CMD + Key::O), FILE_OPEN_SCENE); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/reopen_closed_scene", TTR("Reopen Closed Scene"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::T), FILE_OPEN_PREV); p->add_submenu_item(TTR("Open Recent"), "RecentScenes", FILE_OPEN_RECENT); p->add_separator(); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene", TTR("Save Scene"), KEY_MASK_CMD + KEY_S), FILE_SAVE_SCENE); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene_as", TTR("Save Scene As..."), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_S), FILE_SAVE_AS_SCENE); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_all_scenes", TTR("Save All Scenes"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_S), FILE_SAVE_ALL_SCENES); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene", TTR("Save Scene"), KeyModifierMask::CMD + Key::S), FILE_SAVE_SCENE); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene_as", TTR("Save Scene As..."), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::S), FILE_SAVE_AS_SCENE); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_all_scenes", TTR("Save All Scenes"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + KeyModifierMask::ALT + Key::S), FILE_SAVE_ALL_SCENES); p->add_separator(); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open", TTR("Quick Open..."), KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_O), FILE_QUICK_OPEN); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_scene", TTR("Quick Open Scene..."), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_O), FILE_QUICK_OPEN_SCENE); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_script", TTR("Quick Open Script..."), KEY_MASK_CMD + KEY_MASK_ALT + KEY_O), FILE_QUICK_OPEN_SCRIPT); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open", TTR("Quick Open..."), KeyModifierMask::SHIFT + KeyModifierMask::ALT + Key::O), FILE_QUICK_OPEN); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_scene", TTR("Quick Open Scene..."), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::O), FILE_QUICK_OPEN_SCENE); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_script", TTR("Quick Open Script..."), KeyModifierMask::CMD + KeyModifierMask::ALT + Key::O), FILE_QUICK_OPEN_SCRIPT); p->add_separator(); PopupMenu *pm_export = memnew(PopupMenu); @@ -6382,7 +6397,7 @@ EditorNode::EditorNode() { p->add_separator(); p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/reload_saved_scene", TTR("Reload Saved Scene")), EDIT_RELOAD_SAVED_SCENE); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/close_scene", TTR("Close Scene"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_W), FILE_CLOSE); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/close_scene", TTR("Close Scene"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::W), FILE_CLOSE); recent_scenes = memnew(PopupMenu); recent_scenes->set_name("RecentScenes"); @@ -6390,7 +6405,7 @@ EditorNode::EditorNode() { recent_scenes->connect("id_pressed", callable_mp(this, &EditorNode::_open_recent_scene)); p->add_separator(); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/file_quit", TTR("Quit"), KEY_MASK_CMD + KEY_Q), FILE_QUIT, true); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/file_quit", TTR("Quit"), KeyModifierMask::CMD + Key::Q), FILE_QUIT, true); project_menu = memnew(MenuButton); project_menu->set_flat(false); @@ -6402,7 +6417,7 @@ EditorNode::EditorNode() { p = project_menu->get_popup(); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/project_settings", TTR("Project Settings..."), KEY_NONE, TTR("Project Settings")), RUN_SETTINGS); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/project_settings", TTR("Project Settings..."), Key::NONE, TTR("Project Settings")), RUN_SETTINGS); p->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option)); vcs_actions_menu = VersionControlEditorPlugin::get_singleton()->get_version_control_actions_panel(); @@ -6411,11 +6426,12 @@ EditorNode::EditorNode() { p->add_separator(); p->add_child(vcs_actions_menu); p->add_submenu_item(TTR("Version Control"), "Version Control"); + vcs_actions_menu->add_item(TTR("Create Version Control Metadata"), RUN_VCS_METADATA); vcs_actions_menu->add_item(TTR("Set Up Version Control"), RUN_VCS_SETTINGS); vcs_actions_menu->add_item(TTR("Shut Down Version Control"), RUN_VCS_SHUT_DOWN); p->add_separator(); - p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/export", TTR("Export..."), KEY_NONE, TTR("Export")), FILE_EXPORT_PROJECT); + p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/export", TTR("Export..."), Key::NONE, TTR("Export")), FILE_EXPORT_PROJECT); p->add_item(TTR("Install Android Build Template..."), FILE_INSTALL_ANDROID_SOURCE); p->add_item(TTR("Open Project Data Folder"), RUN_PROJECT_DATA_FOLDER); @@ -6432,8 +6448,8 @@ EditorNode::EditorNode() { p->add_separator(); p->add_shortcut(ED_SHORTCUT("editor/reload_current_project", TTR("Reload Current Project")), RUN_RELOAD_CURRENT_PROJECT); - ED_SHORTCUT_AND_COMMAND("editor/quit_to_project_list", TTR("Quit to Project List"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_Q); - ED_SHORTCUT_OVERRIDE("editor/quit_to_project_list", "macos", KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_Q); + ED_SHORTCUT_AND_COMMAND("editor/quit_to_project_list", TTR("Quit to Project List"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::Q); + ED_SHORTCUT_OVERRIDE("editor/quit_to_project_list", "macos", KeyModifierMask::SHIFT + KeyModifierMask::ALT + Key::Q); p->add_shortcut(ED_GET_SHORTCUT("editor/quit_to_project_list"), RUN_PROJECT_MANAGER, true); menu_hb->add_spacer(); @@ -6461,9 +6477,9 @@ EditorNode::EditorNode() { p = settings_menu->get_popup(); ED_SHORTCUT_AND_COMMAND("editor/editor_settings", TTR("Editor Settings...")); - ED_SHORTCUT_OVERRIDE("editor/editor_settings", "macos", KEY_MASK_CMD + KEY_COMMA); + ED_SHORTCUT_OVERRIDE("editor/editor_settings", "macos", KeyModifierMask::CMD + Key::COMMA); p->add_shortcut(ED_GET_SHORTCUT("editor/editor_settings"), SETTINGS_PREFERENCES); - p->add_shortcut(ED_SHORTCUT("editor/command_palette", TTR("Command Palette..."), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_P), HELP_COMMAND_PALETTE); + p->add_shortcut(ED_SHORTCUT("editor/command_palette", TTR("Command Palette..."), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::P), HELP_COMMAND_PALETTE); p->add_separator(); editor_layouts = memnew(PopupMenu); @@ -6473,14 +6489,14 @@ EditorNode::EditorNode() { p->add_submenu_item(TTR("Editor Layout"), "Layouts"); p->add_separator(); - ED_SHORTCUT_AND_COMMAND("editor/take_screenshot", TTR("Take Screenshot"), KEY_MASK_CTRL | KEY_F12); - ED_SHORTCUT_OVERRIDE("editor/take_screenshot", "macos", KEY_MASK_CMD | KEY_F12); + ED_SHORTCUT_AND_COMMAND("editor/take_screenshot", TTR("Take Screenshot"), KeyModifierMask::CTRL | Key::F12); + ED_SHORTCUT_OVERRIDE("editor/take_screenshot", "macos", KeyModifierMask::CMD | Key::F12); p->add_shortcut(ED_GET_SHORTCUT("editor/take_screenshot"), EDITOR_SCREENSHOT); p->set_item_tooltip(p->get_item_count() - 1, TTR("Screenshots are stored in the Editor Data/Settings Folder.")); - ED_SHORTCUT_AND_COMMAND("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KEY_MASK_SHIFT | KEY_F11); - ED_SHORTCUT_OVERRIDE("editor/fullscreen_mode", "macos", KEY_MASK_CMD | KEY_MASK_CTRL | KEY_F); + ED_SHORTCUT_AND_COMMAND("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KeyModifierMask::SHIFT | Key::F11); + ED_SHORTCUT_OVERRIDE("editor/fullscreen_mode", "macos", KeyModifierMask::CMD | KeyModifierMask::CTRL | Key::F); p->add_shortcut(ED_GET_SHORTCUT("editor/fullscreen_mode"), SETTINGS_TOGGLE_FULLSCREEN); #if defined(WINDOWS_ENABLED) && defined(WINDOWS_SUBSYSTEM_CONSOLE) @@ -6514,8 +6530,8 @@ EditorNode::EditorNode() { p = help_menu->get_popup(); p->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option)); - ED_SHORTCUT_AND_COMMAND("editor/editor_help", TTR("Search Help"), KEY_F1); - ED_SHORTCUT_OVERRIDE("editor/editor_help", "macos", KEY_MASK_ALT | KEY_SPACE); + ED_SHORTCUT_AND_COMMAND("editor/editor_help", TTR("Search Help"), Key::F1); + ED_SHORTCUT_OVERRIDE("editor/editor_help", "macos", KeyModifierMask::ALT | Key::SPACE); p->add_icon_shortcut(gui_base->get_theme_icon(SNAME("HelpSearch"), SNAME("EditorIcons")), ED_GET_SHORTCUT("editor/editor_help"), HELP_SEARCH); p->add_separator(); p->add_icon_shortcut(gui_base->get_theme_icon(SNAME("Instance"), SNAME("EditorIcons")), ED_SHORTCUT_AND_COMMAND("editor/online_docs", TTR("Online Documentation")), HELP_DOCS); @@ -6540,8 +6556,8 @@ EditorNode::EditorNode() { play_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(RUN_PLAY)); play_button->set_tooltip(TTR("Play the project.")); - ED_SHORTCUT_AND_COMMAND("editor/play", TTR("Play"), KEY_F5); - ED_SHORTCUT_OVERRIDE("editor/play", "macos", KEY_MASK_CMD | KEY_B); + ED_SHORTCUT_AND_COMMAND("editor/play", TTR("Play"), Key::F5); + ED_SHORTCUT_OVERRIDE("editor/play", "macos", KeyModifierMask::CMD | Key::B); play_button->set_shortcut(ED_GET_SHORTCUT("editor/play")); pause_button = memnew(Button); @@ -6553,8 +6569,8 @@ EditorNode::EditorNode() { pause_button->set_disabled(true); play_hb->add_child(pause_button); - ED_SHORTCUT("editor/pause_scene", TTR("Pause Scene"), KEY_F7); - ED_SHORTCUT_OVERRIDE("editor/pause_scene", "macos", KEY_MASK_CMD | KEY_MASK_CTRL | KEY_Y); + ED_SHORTCUT("editor/pause_scene", TTR("Pause Scene"), Key::F7); + ED_SHORTCUT_OVERRIDE("editor/pause_scene", "macos", KeyModifierMask::CMD | KeyModifierMask::CTRL | Key::Y); pause_button->set_shortcut(ED_GET_SHORTCUT("editor/pause_scene")); stop_button = memnew(Button); @@ -6566,8 +6582,8 @@ EditorNode::EditorNode() { stop_button->set_tooltip(TTR("Stop the scene.")); stop_button->set_disabled(true); - ED_SHORTCUT("editor/stop", TTR("Stop"), KEY_F8); - ED_SHORTCUT_OVERRIDE("editor/stop", "macos", KEY_MASK_CMD | KEY_PERIOD); + ED_SHORTCUT("editor/stop", TTR("Stop"), Key::F8); + ED_SHORTCUT_OVERRIDE("editor/stop", "macos", KeyModifierMask::CMD | Key::PERIOD); stop_button->set_shortcut(ED_GET_SHORTCUT("editor/stop")); run_native = memnew(EditorRunNative); @@ -6583,8 +6599,8 @@ EditorNode::EditorNode() { play_scene_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(RUN_PLAY_SCENE)); play_scene_button->set_tooltip(TTR("Play the edited scene.")); - ED_SHORTCUT_AND_COMMAND("editor/play_scene", TTR("Play Scene"), KEY_F6); - ED_SHORTCUT_OVERRIDE("editor/play_scene", "macos", KEY_MASK_CMD | KEY_R); + ED_SHORTCUT_AND_COMMAND("editor/play_scene", TTR("Play Scene"), Key::F6); + ED_SHORTCUT_OVERRIDE("editor/play_scene", "macos", KeyModifierMask::CMD | Key::R); play_scene_button->set_shortcut(ED_GET_SHORTCUT("editor/play_scene")); play_custom_scene_button = memnew(Button); @@ -6596,47 +6612,57 @@ EditorNode::EditorNode() { play_custom_scene_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(RUN_PLAY_CUSTOM_SCENE)); play_custom_scene_button->set_tooltip(TTR("Play custom scene")); - ED_SHORTCUT_AND_COMMAND("editor/play_custom_scene", TTR("Play Custom Scene"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F5); - ED_SHORTCUT_OVERRIDE("editor/play_custom_scene", "macos", KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_R); + ED_SHORTCUT_AND_COMMAND("editor/play_custom_scene", TTR("Play Custom Scene"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F5); + ED_SHORTCUT_OVERRIDE("editor/play_custom_scene", "macos", KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::R); play_custom_scene_button->set_shortcut(ED_GET_SHORTCUT("editor/play_custom_scene")); HBoxContainer *right_menu_hb = memnew(HBoxContainer); menu_hb->add_child(right_menu_hb); - // Toggle for video driver - video_driver = memnew(OptionButton); - video_driver->set_focus_mode(Control::FOCUS_NONE); - video_driver->connect("item_selected", callable_mp(this, &EditorNode::_video_driver_selected)); - video_driver->add_theme_font_override("font", gui_base->get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); - video_driver->add_theme_font_size_override("font_size", gui_base->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts"))); - // TODO: Show again when OpenGL is ported. - video_driver->set_visible(false); - right_menu_hb->add_child(video_driver); - -#ifndef _MSC_VER -#warning needs to be reimplemented -#endif -#if 0 - String video_drivers = ProjectSettings::get_singleton()->get_custom_property_info()["rendering/driver/driver_name"].hint_string; - String current_video_driver = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver()); - video_driver_current = 0; - for (int i = 0; i < video_drivers.get_slice_count(","); i++) { - String driver = video_drivers.get_slice(",", i); - video_driver->add_item(driver); - video_driver->set_item_metadata(i, driver); + rendering_driver = memnew(OptionButton); + + // Hide the renderer selection dropdown until OpenGL support is more mature. + // The renderer can still be changed in the project settings or using `--rendering-driver opengl3`. + rendering_driver->set_visible(false); + + rendering_driver->set_flat(true); + rendering_driver->set_focus_mode(Control::FOCUS_NONE); + rendering_driver->connect("item_selected", callable_mp(this, &EditorNode::_rendering_driver_selected)); + rendering_driver->add_theme_font_override("font", gui_base->get_theme_font("bold", "EditorFonts")); + rendering_driver->add_theme_font_size_override("font_size", gui_base->get_theme_font_size("bold_size", "EditorFonts")); + + right_menu_hb->add_child(rendering_driver); + + // Only display the render drivers that are available for this display driver. + int display_driver_idx = OS::get_singleton()->get_display_driver_id(); + Vector<String> render_drivers = DisplayServer::get_create_function_rendering_drivers(display_driver_idx); + String current_rendering_driver = OS::get_singleton()->get_current_rendering_driver_name(); - if (current_video_driver == driver) { - video_driver->select(i); - video_driver_current = i; + // As we are doing string comparisons, keep in standard case to prevent problems with capitals + // "vulkan" in particular uses lowercase "v" in the code, and uppercase in the UI. + current_rendering_driver = current_rendering_driver.to_lower(); + + for (int i = 0; i < render_drivers.size(); i++) { + String driver = render_drivers[i]; + + // Add the driver to the UI. + rendering_driver->add_item(driver); + rendering_driver->set_item_metadata(i, driver); + + // Lowercase for standard comparison. + driver = driver.to_lower(); + + if (current_rendering_driver == driver) { + rendering_driver->select(i); + rendering_driver_current = i; } } + _update_rendering_driver_color(); - _update_video_driver_color(); -#endif video_restart_dialog = memnew(ConfirmationDialog); video_restart_dialog->set_text(TTR("Changing the video driver requires restarting the editor.")); video_restart_dialog->get_ok_button()->set_text(TTR("Save & Restart")); - video_restart_dialog->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(SET_VIDEO_DRIVER_SAVE_AND_RESTART)); + video_restart_dialog->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(SET_RENDERING_DRIVER_SAVE_AND_RESTART)); gui_base->add_child(video_restart_dialog); progress_hb = memnew(BackgroundProgress); @@ -6741,6 +6767,9 @@ EditorNode::EditorNode() { bottom_panel_hb_editors->set_h_size_flags(Control::SIZE_EXPAND_FILL); bottom_panel_hb->add_child(bottom_panel_hb_editors); + editor_toaster = memnew(EditorToaster); + bottom_panel_hb->add_child(editor_toaster); + VBoxContainer *version_info_vbc = memnew(VBoxContainer); bottom_panel_hb->add_child(version_info_vbc); @@ -6771,7 +6800,7 @@ EditorNode::EditorNode() { bottom_panel_raise->set_flat(true); bottom_panel_raise->set_icon(gui_base->get_theme_icon(SNAME("ExpandBottomDock"), SNAME("EditorIcons"))); - bottom_panel_raise->set_shortcut(ED_SHORTCUT_AND_COMMAND("editor/bottom_panel_expand", TTR("Expand Bottom Panel"), KEY_MASK_SHIFT | KEY_F12)); + bottom_panel_raise->set_shortcut(ED_SHORTCUT_AND_COMMAND("editor/bottom_panel_expand", TTR("Expand Bottom Panel"), KeyModifierMask::SHIFT | Key::F12)); bottom_panel_hb->add_child(bottom_panel_raise); bottom_panel_raise->hide(); @@ -6810,7 +6839,7 @@ EditorNode::EditorNode() { gui_base->add_child(custom_build_manage_templates); file_android_build_source = memnew(EditorFileDialog); - file_android_build_source->set_title(TTR("Select android sources file")); + file_android_build_source->set_title(TTR("Select Android sources file")); file_android_build_source->set_access(EditorFileDialog::ACCESS_FILESYSTEM); file_android_build_source->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); file_android_build_source->add_filter("*.zip"); @@ -6848,10 +6877,12 @@ EditorNode::EditorNode() { file_export_lib->connect("file_selected", callable_mp(this, &EditorNode::_dialog_action)); file_export_lib_merge = memnew(CheckBox); file_export_lib_merge->set_text(TTR("Merge With Existing")); + file_export_lib_merge->set_h_size_flags(Control::SIZE_SHRINK_CENTER); file_export_lib_merge->set_pressed(true); file_export_lib->get_vbox()->add_child(file_export_lib_merge); file_export_lib_apply_xforms = memnew(CheckBox); file_export_lib_apply_xforms->set_text(TTR("Apply MeshInstance Transforms")); + file_export_lib_apply_xforms->set_h_size_flags(Control::SIZE_SHRINK_CENTER); file_export_lib_apply_xforms->set_pressed(false); file_export_lib->get_vbox()->add_child(file_export_lib_apply_xforms); gui_base->add_child(file_export_lib); @@ -6913,7 +6944,7 @@ EditorNode::EditorNode() { EditorAudioBuses *audio_bus_editor = EditorAudioBuses::register_editor(); - ScriptTextEditor::register_editor(); //register one for text scripts + ScriptTextEditor::register_editor(); // register one for text scripts TextEditor::register_editor(); if (StreamPeerSSL::is_available()) { @@ -6922,12 +6953,12 @@ EditorNode::EditorNode() { WARN_PRINT("Asset Library not available, as it requires SSL to work."); } - //add interface before adding plugins + // add interface before adding plugins editor_interface = memnew(EditorInterface); add_child(editor_interface); - //more visually meaningful to have this later + // more visually meaningful to have this later raise_bottom_panel_item(AnimationPlayerEditor::get_singleton()); add_editor_plugin(VersionControlEditorPlugin::get_singleton()); @@ -6949,7 +6980,6 @@ EditorNode::EditorNode() { add_editor_plugin(memnew(CPUParticles2DEditorPlugin(this))); add_editor_plugin(memnew(CPUParticles3DEditorPlugin(this))); add_editor_plugin(memnew(ResourcePreloaderEditorPlugin(this))); - add_editor_plugin(memnew(ItemListEditorPlugin(this))); add_editor_plugin(memnew(Polygon3DEditorPlugin(this))); add_editor_plugin(memnew(CollisionPolygon2DEditorPlugin(this))); add_editor_plugin(memnew(TilesEditorPlugin(this))); @@ -6982,6 +7012,7 @@ EditorNode::EditorNode() { add_editor_plugin(memnew(GPUParticlesCollisionSDFEditorPlugin(this))); add_editor_plugin(memnew(InputEventEditorPlugin(this))); add_editor_plugin(memnew(SubViewportPreviewEditorPlugin(this))); + add_editor_plugin(memnew(TextControlEditorPlugin(this))); for (int i = 0; i < EditorPlugins::get_plugin_count(); i++) { add_editor_plugin(EditorPlugins::create(i, this)); @@ -7006,6 +7037,10 @@ EditorNode::EditorNode() { spatial_mat_convert.instantiate(); resource_conversion_plugins.push_back(spatial_mat_convert); + Ref<ORMMaterial3DConversionPlugin> orm_mat_convert; + orm_mat_convert.instantiate(); + resource_conversion_plugins.push_back(orm_mat_convert); + Ref<CanvasItemMaterialConversionPlugin> canvas_item_mat_convert; canvas_item_mat_convert.instantiate(); resource_conversion_plugins.push_back(canvas_item_mat_convert); @@ -7026,6 +7061,10 @@ EditorNode::EditorNode() { physical_sky_mat_convert.instantiate(); resource_conversion_plugins.push_back(physical_sky_mat_convert); + Ref<FogMaterialConversionPlugin> fog_mat_convert; + fog_mat_convert.instantiate(); + resource_conversion_plugins.push_back(fog_mat_convert); + Ref<VisualShaderConversionPlugin> vshader_convert; vshader_convert.instantiate(); resource_conversion_plugins.push_back(vshader_convert); @@ -7104,8 +7143,6 @@ EditorNode::EditorNode() { _build_icon_type_cache(); - Node::set_human_readable_collision_renaming(true); - pick_main_scene = memnew(ConfirmationDialog); gui_base->add_child(pick_main_scene); pick_main_scene->get_ok_button()->set_text(TTR("Select")); @@ -7135,15 +7172,15 @@ EditorNode::EditorNode() { ResourceLoader::set_load_callback(_resource_loaded); // Use the Ctrl modifier so F2 can be used to rename nodes in the scene tree dock. - ED_SHORTCUT_AND_COMMAND("editor/editor_2d", TTR("Open 2D Editor"), KEY_MASK_CTRL | KEY_F1); - ED_SHORTCUT_AND_COMMAND("editor/editor_3d", TTR("Open 3D Editor"), KEY_MASK_CTRL | KEY_F2); - ED_SHORTCUT_AND_COMMAND("editor/editor_script", TTR("Open Script Editor"), KEY_MASK_CTRL | KEY_F3); - ED_SHORTCUT_AND_COMMAND("editor/editor_assetlib", TTR("Open Asset Library"), KEY_MASK_CTRL | KEY_F4); - - ED_SHORTCUT_OVERRIDE("editor/editor_2d", "macos", KEY_MASK_ALT | KEY_1); - ED_SHORTCUT_OVERRIDE("editor/editor_3d", "macos", KEY_MASK_ALT | KEY_2); - ED_SHORTCUT_OVERRIDE("editor/editor_script", "macos", KEY_MASK_ALT | KEY_3); - ED_SHORTCUT_OVERRIDE("editor/editor_assetlib", "macos", KEY_MASK_ALT | KEY_4); + ED_SHORTCUT_AND_COMMAND("editor/editor_2d", TTR("Open 2D Editor"), KeyModifierMask::CTRL | Key::F1); + ED_SHORTCUT_AND_COMMAND("editor/editor_3d", TTR("Open 3D Editor"), KeyModifierMask::CTRL | Key::F2); + ED_SHORTCUT_AND_COMMAND("editor/editor_script", TTR("Open Script Editor"), KeyModifierMask::CTRL | Key::F3); + ED_SHORTCUT_AND_COMMAND("editor/editor_assetlib", TTR("Open Asset Library"), KeyModifierMask::CTRL | Key::F4); + + ED_SHORTCUT_OVERRIDE("editor/editor_2d", "macos", KeyModifierMask::ALT | Key::KEY_1); + ED_SHORTCUT_OVERRIDE("editor/editor_3d", "macos", KeyModifierMask::ALT | Key::KEY_2); + ED_SHORTCUT_OVERRIDE("editor/editor_script", "macos", KeyModifierMask::ALT | Key::KEY_3); + ED_SHORTCUT_OVERRIDE("editor/editor_assetlib", "macos", KeyModifierMask::ALT | Key::KEY_4); ED_SHORTCUT_AND_COMMAND("editor/editor_next", TTR("Open the next Editor")); ED_SHORTCUT_AND_COMMAND("editor/editor_prev", TTR("Open the previous Editor")); diff --git a/editor/editor_node.h b/editor/editor_node.h index 73feeecfee..d74ec33f25 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -37,6 +37,7 @@ #include "editor/editor_folding.h" #include "editor/editor_native_shader_source_visualizer.h" #include "editor/editor_run.h" +#include "editor/editor_toaster.h" #include "editor/inspector_dock.h" #include "editor/property_editor.h" #include "editor/scene_tree_dock.h" @@ -84,7 +85,7 @@ class ProjectSettingsEditor; class RunSettingsDialog; class ScriptCreateDialog; class TabContainer; -class Tabs; +class TabBar; class TextureProgressBar; class Button; class VSplitContainer; @@ -169,6 +170,7 @@ private: RUN_PROJECT_DATA_FOLDER, RUN_RELOAD_CURRENT_PROJECT, RUN_PROJECT_MANAGER, + RUN_VCS_METADATA, RUN_VCS_SETTINGS, RUN_VCS_SHUT_DOWN, SETTINGS_UPDATE_CONTINUOUSLY, @@ -205,7 +207,7 @@ private: HELP_ABOUT, HELP_SUPPORT_GODOT_DEVELOPMENT, - SET_VIDEO_DRIVER_SAVE_AND_RESTART, + SET_RENDERING_DRIVER_SAVE_AND_RESTART, GLOBAL_NEW_WINDOW, GLOBAL_SCENE, @@ -215,20 +217,20 @@ private: TOOL_MENU_BASE = 1000 }; - SubViewport *scene_root; //root of the scene being edited + SubViewport *scene_root; // root of the scene being edited PanelContainer *scene_root_parent; Control *theme_base; Control *gui_base; VBoxContainer *main_vbox; - OptionButton *video_driver; + OptionButton *rendering_driver; ConfirmationDialog *video_restart_dialog; - int video_driver_current; - String video_driver_request; - void _video_driver_selected(int); - void _update_video_driver_color(); + int rendering_driver_current; + String rendering_driver_request; + void _rendering_driver_selected(int); + void _update_rendering_driver_color(); // Split containers @@ -249,7 +251,7 @@ private: // Main tabs - Tabs *scene_tabs; + TabBar *scene_tabs; PopupMenu *scene_tabs_context_menu; Panel *tab_preview_panel; TextureRect *tab_preview; @@ -323,7 +325,7 @@ private: EditorSettingsDialog *settings_config_dialog; ProjectSettingsEditor *project_settings; - bool settings_changed = true; //make it update settings on first frame + bool settings_changed = true; // make it update settings on first frame void _update_from_settings(); PopupMenu *vcs_actions_menu; @@ -406,7 +408,7 @@ private: bool waiting_for_sources_changed; - uint32_t update_spinner_step_msec; + uint64_t update_spinner_step_msec; uint64_t update_spinner_step_frame; int update_spinner_step; @@ -438,6 +440,7 @@ private: HBoxContainer *bottom_panel_hb; HBoxContainer *bottom_panel_hb_editors; VBoxContainer *bottom_panel_vb; + EditorToaster *editor_toaster; LinkButton *version_btn; Button *bottom_panel_raise; @@ -518,9 +521,6 @@ private: void _run(bool p_current = false, const String &p_custom = ""); void _run_native(const Ref<EditorExportPreset> &p_preset); - void _save_optimized(); - void _import_action(const String &p_action); - void _import(const String &p_file); void _add_to_recent_scenes(const String &p_scene); void _update_recent_scenes(); void _open_recent_scene(int p_idx); @@ -558,7 +558,6 @@ private: static void _editor_file_dialog_register(EditorFileDialog *p_dialog); static void _editor_file_dialog_unregister(EditorFileDialog *p_dialog); - void _cleanup_scene(); void _remove_edited_scene(bool p_change_tab = true); void _remove_scene(int index, bool p_change_tab = true); bool _find_and_save_resource(RES p_res, Map<RES, bool> &processed, int32_t flags); @@ -656,8 +655,6 @@ private: static int build_callback_count; static EditorBuildCallback build_callbacks[MAX_BUILD_CALLBACKS]; - void _license_tree_selected(); - void _update_update_spinner(); Vector<Ref<EditorResourceConversionPlugin>> resource_conversion_plugins; @@ -773,10 +770,9 @@ public: Node *get_edited_scene() { return editor_data.get_edited_scene_root(); } - SubViewport *get_scene_root() { return scene_root; } //root of the scene being edited + SubViewport *get_scene_root() { return scene_root; } // root of the scene being edited void fix_dependencies(const String &p_for_file); - void clear_scene() { _cleanup_scene(); } int new_scene(); Error load_scene(const String &p_scene, bool p_ignore_broken_deps = false, bool p_set_inherited = false, bool p_clear_errors = true, bool p_force_open_imported = false, bool p_silent_change_tab = false); Error load_resource(const String &p_resource, bool p_ignore_broken_deps = false); @@ -849,8 +845,6 @@ public: bool is_scene_in_use(const String &p_path); - void scan_import_changes(); - void save_layout(); void open_export_template_manager(); @@ -892,7 +886,6 @@ public: EditorNode(); ~EditorNode(); - void get_singleton(const char *arg1, bool arg2); void add_resource_conversion_plugin(const Ref<EditorResourceConversionPlugin> &p_plugin); void remove_resource_conversion_plugin(const Ref<EditorResourceConversionPlugin> &p_plugin); diff --git a/editor/editor_path.h b/editor/editor_path.h index cabfa931d6..07f8b7244e 100644 --- a/editor/editor_path.h +++ b/editor/editor_path.h @@ -47,7 +47,6 @@ class EditorPath : public Button { PopupMenu *sub_objects_menu; Vector<ObjectID> objects; - EditorPath(); void _show_popup(); void _id_pressed(int p_idx); diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp index aee8322a97..61c01993ae 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -762,16 +762,23 @@ void EditorPlugin::remove_inspector_plugin(const Ref<EditorInspectorPlugin> &p_p EditorInspector::remove_inspector_plugin(p_plugin); } -void EditorPlugin::add_scene_import_plugin(const Ref<EditorSceneImporter> &p_importer) { +void EditorPlugin::add_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer) { ERR_FAIL_COND(!p_importer.is_valid()); ResourceImporterScene::get_singleton()->add_importer(p_importer); } -void EditorPlugin::remove_scene_import_plugin(const Ref<EditorSceneImporter> &p_importer) { +void EditorPlugin::remove_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer) { ERR_FAIL_COND(!p_importer.is_valid()); ResourceImporterScene::get_singleton()->remove_importer(p_importer); } +void EditorPlugin::add_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin) { + ResourceImporterScene::get_singleton()->add_post_importer_plugin(p_plugin); +} +void EditorPlugin::remove_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin) { + ResourceImporterScene::get_singleton()->remove_post_importer_plugin(p_plugin); +} + int find(const PackedStringArray &a, const String &v) { const String *r = a.ptr(); for (int j = 0; j < a.size(); ++j) { @@ -879,8 +886,10 @@ void EditorPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("remove_translation_parser_plugin", "parser"), &EditorPlugin::remove_translation_parser_plugin); ClassDB::bind_method(D_METHOD("add_import_plugin", "importer"), &EditorPlugin::add_import_plugin); ClassDB::bind_method(D_METHOD("remove_import_plugin", "importer"), &EditorPlugin::remove_import_plugin); - ClassDB::bind_method(D_METHOD("add_scene_import_plugin", "scene_importer"), &EditorPlugin::add_scene_import_plugin); - ClassDB::bind_method(D_METHOD("remove_scene_import_plugin", "scene_importer"), &EditorPlugin::remove_scene_import_plugin); + ClassDB::bind_method(D_METHOD("add_scene_format_importer_plugin", "scene_format_importer"), &EditorPlugin::add_scene_format_importer_plugin); + ClassDB::bind_method(D_METHOD("remove_scene_format_importer_plugin", "scene_format_importer"), &EditorPlugin::remove_scene_format_importer_plugin); + ClassDB::bind_method(D_METHOD("add_scene_post_import_plugin", "scene_import_plugin"), &EditorPlugin::add_scene_post_import_plugin); + ClassDB::bind_method(D_METHOD("remove_scene_post_import_plugin", "scene_import_plugin"), &EditorPlugin::remove_scene_post_import_plugin); ClassDB::bind_method(D_METHOD("add_export_plugin", "plugin"), &EditorPlugin::add_export_plugin); ClassDB::bind_method(D_METHOD("remove_export_plugin", "plugin"), &EditorPlugin::remove_export_plugin); ClassDB::bind_method(D_METHOD("add_spatial_gizmo_plugin", "plugin"), &EditorPlugin::add_spatial_gizmo_plugin); diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h index 57830df327..278059f8c4 100644 --- a/editor/editor_plugin.h +++ b/editor/editor_plugin.h @@ -288,8 +288,11 @@ public: void add_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin); void remove_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin); - void add_scene_import_plugin(const Ref<EditorSceneImporter> &p_importer); - void remove_scene_import_plugin(const Ref<EditorSceneImporter> &p_importer); + void add_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer); + void remove_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer); + + void add_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_importer); + void remove_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_importer); void add_autoload_singleton(const String &p_name, const String &p_path); void remove_autoload_singleton(const String &p_name); diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 2d4a3ac788..e48679cad7 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -35,6 +35,9 @@ #include "editor_node.h" #include "editor_properties_array_dict.h" #include "editor_scale.h" +#include "scene/2d/gpu_particles_2d.h" +#include "scene/3d/fog_volume.h" +#include "scene/3d/gpu_particles_3d.h" #include "scene/main/window.h" #include "scene/resources/font.h" @@ -815,7 +818,7 @@ public: } const Ref<InputEventMouseButton> mb = p_ev; - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) { if (hovered_index >= 0) { // Toggle the flag. // We base our choice on the hovered flag, so that it always matches the hovered flag. @@ -884,10 +887,11 @@ public: flag_rects.push_back(rect2); Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); + int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); Vector2 offset; offset.y = rect2.size.y * 0.75; - draw_string(font, rect2.position + offset, itos(layer_index + 1), HALIGN_CENTER, rect2.size.x, -1, on ? text_color_on : text_color); + draw_string(font, rect2.position + offset, itos(layer_index + 1), HALIGN_CENTER, rect2.size.x, font_size, on ? text_color_on : text_color); ofs.x += bsize + 1; @@ -1274,11 +1278,11 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) { } const Ref<InputEventMouseButton> mb = p_ev; if (mb.is_valid()) { - if (mb->is_double_click() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->is_double_click() && mb->get_button_index() == MouseButton::LEFT) { _setup_spin(); } - if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { + if (mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) { preset->set_position(easing_draw->get_screen_transform().xform(mb->get_position())); preset->popup(); @@ -1287,7 +1291,7 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) { easing_draw->update(); } - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { dragging = mb->is_pressed(); // Update to display the correct dragging color easing_draw->update(); @@ -1296,7 +1300,7 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) { const Ref<InputEventMouseMotion> mm = p_ev; - if (dragging && mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + if (dragging && mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { float rel = mm->get_relative().x; if (rel == 0) { return; @@ -2820,8 +2824,8 @@ void EditorPropertyResource::_set_read_only(bool p_read_only) { resource_picker->set_editable(!p_read_only); }; -void EditorPropertyResource::_resource_selected(const RES &p_resource) { - if (use_sub_inspector) { +void EditorPropertyResource::_resource_selected(const RES &p_resource, bool p_edit) { + if (!p_edit && use_sub_inspector) { bool unfold = !get_edited_object()->editor_is_section_unfolded(get_edited_property()); get_edited_object()->editor_set_section_unfold(get_edited_property(), unfold); update_property(); @@ -2968,6 +2972,35 @@ void EditorPropertyResource::_update_property_bg() { update(); } +void EditorPropertyResource::_update_preferred_shader() { + Node *parent = get_parent(); + EditorProperty *parent_property = nullptr; + + while (parent && !parent_property) { + parent_property = Object::cast_to<EditorProperty>(parent); + parent = parent->get_parent(); + } + + if (parent_property) { + EditorShaderPicker *shader_picker = Object::cast_to<EditorShaderPicker>(resource_picker); + Object *object = parent_property->get_edited_object(); + const StringName &property = parent_property->get_edited_property(); + + // Set preferred shader based on edited parent type. + if ((Object::cast_to<GPUParticles2D>(object) || Object::cast_to<GPUParticles3D>(object)) && property == SNAME("process_material")) { + shader_picker->set_preferred_mode(Shader::MODE_PARTICLES); + } else if (Object::cast_to<FogVolume>(object)) { + shader_picker->set_preferred_mode(Shader::MODE_FOG); + } else if (Object::cast_to<CanvasItem>(object)) { + shader_picker->set_preferred_mode(Shader::MODE_CANVAS_ITEM); + } else if (Object::cast_to<Node3D>(object)) { + shader_picker->set_preferred_mode(Shader::MODE_SPATIAL); + } else if (Object::cast_to<Sky>(object)) { + shader_picker->set_preferred_mode(Shader::MODE_SKY); + } + } +} + void EditorPropertyResource::_viewport_selected(const NodePath &p_path) { Node *to_node = get_node(p_path); if (!Object::cast_to<Viewport>(to_node)) { @@ -2999,6 +3032,7 @@ void EditorPropertyResource::setup(Object *p_object, const String &p_path, const EditorShaderPicker *shader_picker = memnew(EditorShaderPicker); shader_picker->set_edited_material(Object::cast_to<ShaderMaterial>(p_object)); resource_picker = shader_picker; + connect(SNAME("ready"), callable_mp(this, &EditorPropertyResource::_update_preferred_shader)); } else { resource_picker = memnew(EditorResourcePicker); } @@ -3136,11 +3170,7 @@ EditorPropertyResource::EditorPropertyResource() { ////////////// DEFAULT PLUGIN ////////////////////// bool EditorInspectorDefaultPlugin::can_handle(Object *p_object) { - return true; //can handle everything -} - -void EditorInspectorDefaultPlugin::parse_begin(Object *p_object) { - //do none + return true; // Can handle everything. } bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { @@ -3151,10 +3181,6 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, const Varian return false; } -void EditorInspectorDefaultPlugin::parse_end() { - //do none -} - struct EditorPropertyRangeHint { bool angle_in_degrees = false; bool greater = true; @@ -3236,11 +3262,11 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ return editor; } else if (p_hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || - p_hint == PROPERTY_HINT_LAYERS_2D_RENDER || - p_hint == PROPERTY_HINT_LAYERS_2D_NAVIGATION || - p_hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || - p_hint == PROPERTY_HINT_LAYERS_3D_RENDER || - p_hint == PROPERTY_HINT_LAYERS_3D_NAVIGATION) { + p_hint == PROPERTY_HINT_LAYERS_2D_RENDER || + p_hint == PROPERTY_HINT_LAYERS_2D_NAVIGATION || + p_hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || + p_hint == PROPERTY_HINT_LAYERS_3D_RENDER || + p_hint == PROPERTY_HINT_LAYERS_3D_NAVIGATION) { EditorPropertyLayers::LayerType lt = EditorPropertyLayers::LAYER_RENDER_2D; switch (p_hint) { case PROPERTY_HINT_LAYERS_2D_RENDER: @@ -3335,13 +3361,13 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ } return editor; } else if (p_hint == PROPERTY_HINT_METHOD_OF_VARIANT_TYPE || - p_hint == PROPERTY_HINT_METHOD_OF_BASE_TYPE || - p_hint == PROPERTY_HINT_METHOD_OF_INSTANCE || - p_hint == PROPERTY_HINT_METHOD_OF_SCRIPT || - p_hint == PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE || - p_hint == PROPERTY_HINT_PROPERTY_OF_BASE_TYPE || - p_hint == PROPERTY_HINT_PROPERTY_OF_INSTANCE || - p_hint == PROPERTY_HINT_PROPERTY_OF_SCRIPT) { + p_hint == PROPERTY_HINT_METHOD_OF_BASE_TYPE || + p_hint == PROPERTY_HINT_METHOD_OF_INSTANCE || + p_hint == PROPERTY_HINT_METHOD_OF_SCRIPT || + p_hint == PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE || + p_hint == PROPERTY_HINT_PROPERTY_OF_BASE_TYPE || + p_hint == PROPERTY_HINT_PROPERTY_OF_INSTANCE || + p_hint == PROPERTY_HINT_PROPERTY_OF_SCRIPT) { EditorPropertyMember *editor = memnew(EditorPropertyMember); EditorPropertyMember::Type type = EditorPropertyMember::MEMBER_METHOD_OF_BASE_TYPE; diff --git a/editor/editor_properties.h b/editor/editor_properties.h index 9a687f1a72..42ef650adc 100644 --- a/editor/editor_properties.h +++ b/editor/editor_properties.h @@ -657,7 +657,7 @@ class EditorPropertyResource : public EditorProperty { bool updating_theme = false; bool opened_editor = false; - void _resource_selected(const RES &p_resource); + void _resource_selected(const RES &p_resource, bool p_edit); void _resource_changed(const RES &p_resource); void _viewport_selected(const NodePath &p_path); @@ -669,6 +669,7 @@ class EditorPropertyResource : public EditorProperty { void _open_editor_pressed(); void _fold_other_editors(Object *p_self); void _update_property_bg(); + void _update_preferred_shader(); protected: virtual void _set_read_only(bool p_read_only) override; @@ -695,9 +696,7 @@ class EditorInspectorDefaultPlugin : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object) override; - virtual void parse_begin(Object *p_object) override; virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; - virtual void parse_end() override; static EditorProperty *get_editor_for_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false); }; diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index 9b5dc8851c..0f59c8281f 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -413,7 +413,7 @@ void EditorPropertyArray::update_property() { void EditorPropertyArray::_remove_pressed(int p_index) { Variant array = object->get_array(); - array.call("remove", p_index); + array.call("remove_at", p_index); emit_changed(get_edited_property(), array, "", false); update_property(); @@ -855,6 +855,7 @@ void EditorPropertyDictionary::update_property() { object->set_dict(dict); VBoxContainer *add_vbox = nullptr; + double default_float_step = EDITOR_GET("interface/inspector/default_float_step"); for (int i = 0; i < amount + 2; i++) { String prop_name; @@ -894,7 +895,7 @@ void EditorPropertyDictionary::update_property() { } break; case Variant::FLOAT: { EditorPropertyFloat *editor = memnew(EditorPropertyFloat); - editor->setup(-100000, 100000, 0.001, true, false, true, true); + editor->setup(-100000, 100000, default_float_step, true, false, true, true); prop = editor; } break; case Variant::STRING: { @@ -905,7 +906,7 @@ void EditorPropertyDictionary::update_property() { // Math types. case Variant::VECTOR2: { EditorPropertyVector2 *editor = memnew(EditorPropertyVector2); - editor->setup(-100000, 100000, 0.001, true); + editor->setup(-100000, 100000, default_float_step, true); prop = editor; } break; @@ -917,7 +918,7 @@ void EditorPropertyDictionary::update_property() { } break; case Variant::RECT2: { EditorPropertyRect2 *editor = memnew(EditorPropertyRect2); - editor->setup(-100000, 100000, 0.001, true); + editor->setup(-100000, 100000, default_float_step, true); prop = editor; } break; @@ -929,7 +930,7 @@ void EditorPropertyDictionary::update_property() { } break; case Variant::VECTOR3: { EditorPropertyVector3 *editor = memnew(EditorPropertyVector3); - editor->setup(-100000, 100000, 0.001, true); + editor->setup(-100000, 100000, default_float_step, true); prop = editor; } break; @@ -941,37 +942,37 @@ void EditorPropertyDictionary::update_property() { } break; case Variant::TRANSFORM2D: { EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D); - editor->setup(-100000, 100000, 0.001, true); + editor->setup(-100000, 100000, default_float_step, true); prop = editor; } break; case Variant::PLANE: { EditorPropertyPlane *editor = memnew(EditorPropertyPlane); - editor->setup(-100000, 100000, 0.001, true); + editor->setup(-100000, 100000, default_float_step, true); prop = editor; } break; case Variant::QUATERNION: { EditorPropertyQuaternion *editor = memnew(EditorPropertyQuaternion); - editor->setup(-100000, 100000, 0.001, true); + editor->setup(-100000, 100000, default_float_step, true); prop = editor; } break; case Variant::AABB: { EditorPropertyAABB *editor = memnew(EditorPropertyAABB); - editor->setup(-100000, 100000, 0.001, true); + editor->setup(-100000, 100000, default_float_step, true); prop = editor; } break; case Variant::BASIS: { EditorPropertyBasis *editor = memnew(EditorPropertyBasis); - editor->setup(-100000, 100000, 0.001, true); + editor->setup(-100000, 100000, default_float_step, true); prop = editor; } break; case Variant::TRANSFORM3D: { EditorPropertyTransform3D *editor = memnew(EditorPropertyTransform3D); - editor->setup(-100000, 100000, 0.001, true); + editor->setup(-100000, 100000, default_float_step, true); prop = editor; } break; diff --git a/editor/editor_resource_picker.cpp b/editor/editor_resource_picker.cpp index 9dbf69a779..0703677dc8 100644 --- a/editor/editor_resource_picker.cpp +++ b/editor/editor_resource_picker.cpp @@ -84,7 +84,7 @@ void EditorResourcePicker::_update_resource_preview(const String &p_path, const if (p_preview.is_valid()) { preview_rect->set_offset(SIDE_LEFT, assign_button->get_icon()->get_width() + assign_button->get_theme_stylebox(SNAME("normal"))->get_default_margin(SIDE_LEFT) + get_theme_constant(SNAME("hseparation"), SNAME("Button"))); - if (type == "GradientTexture") { + if (type == "GradientTexture1D") { preview_rect->set_stretch_mode(TextureRect::STRETCH_SCALE); assign_button->set_custom_minimum_size(Size2(1, 1)); } else { @@ -106,7 +106,7 @@ void EditorResourcePicker::_resource_selected() { return; } - emit_signal(SNAME("resource_selected"), edited_resource); + emit_signal(SNAME("resource_selected"), edited_resource, false); } void EditorResourcePicker::_file_selected(const String &p_path) { @@ -266,7 +266,7 @@ void EditorResourcePicker::_edit_menu_cbk(int p_which) { case OBJ_MENU_EDIT: { if (edited_resource.is_valid()) { - emit_signal(SNAME("resource_selected"), edited_resource); + emit_signal(SNAME("resource_selected"), edited_resource, true); } } break; @@ -464,7 +464,7 @@ void EditorResourcePicker::_button_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { + if (mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) { _update_menu_items(); Vector2 pos = get_screen_position() + mb->get_position(); @@ -690,7 +690,7 @@ void EditorResourcePicker::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editable"), "set_editable", "is_editable"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "toggle_mode"), "set_toggle_mode", "is_toggle_mode"); - ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::OBJECT, "resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource"))); + ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::OBJECT, "resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource"), PropertyInfo(Variant::BOOL, "edit"))); ADD_SIGNAL(MethodInfo("resource_changed", PropertyInfo(Variant::OBJECT, "resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource"))); } @@ -934,7 +934,7 @@ bool EditorShaderPicker::handle_menu_selected(int p_which) { switch (p_which) { case OBJ_MENU_NEW_SHADER: { if (material.is_valid()) { - EditorNode::get_singleton()->get_scene_tree_dock()->open_shader_dialog(material); + EditorNode::get_singleton()->get_scene_tree_dock()->open_shader_dialog(material, preferred_mode); return true; } } break; @@ -952,5 +952,9 @@ ShaderMaterial *EditorShaderPicker::get_edited_material() const { return edited_material; } +void EditorShaderPicker::set_preferred_mode(int p_mode) { + preferred_mode = p_mode; +} + EditorShaderPicker::EditorShaderPicker() { } diff --git a/editor/editor_resource_picker.h b/editor/editor_resource_picker.h index d0dad0287b..f55c6f47f3 100644 --- a/editor/editor_resource_picker.h +++ b/editor/editor_resource_picker.h @@ -156,6 +156,7 @@ class EditorShaderPicker : public EditorResourcePicker { }; ShaderMaterial *edited_material = nullptr; + int preferred_mode = -1; public: virtual void set_create_options(Object *p_menu_node) override; @@ -163,6 +164,7 @@ public: void set_edited_material(ShaderMaterial *p_material); ShaderMaterial *get_edited_material() const; + void set_preferred_mode(int p_preferred_mode); EditorShaderPicker(); }; diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp index 8783fe4fc0..e9c0b40268 100644 --- a/editor/editor_resource_preview.cpp +++ b/editor/editor_resource_preview.cpp @@ -210,126 +210,130 @@ void EditorResourcePreview::_generate_preview(Ref<ImageTexture> &r_texture, Ref< } } -void EditorResourcePreview::_thread() { - exited.clear(); - while (!exit.is_set()) { - preview_sem.wait(); - preview_mutex.lock(); - - if (queue.size()) { - QueueItem item = queue.front()->get(); - queue.pop_front(); - - if (cache.has(item.path)) { - //already has it because someone loaded it, just let it know it's ready - String path = item.path; - if (item.resource.is_valid()) { - path += ":" + itos(cache[item.path].last_hash); //keep last hash (see description of what this is in condition below) - } - - _preview_ready(path, cache[item.path].preview, cache[item.path].small_preview, item.id, item.function, item.userdata); - - preview_mutex.unlock(); - } else { - preview_mutex.unlock(); +void EditorResourcePreview::_iterate() { + preview_mutex.lock(); + + if (queue.size()) { + QueueItem item = queue.front()->get(); + queue.pop_front(); + + if (cache.has(item.path)) { + //already has it because someone loaded it, just let it know it's ready + String path = item.path; + if (item.resource.is_valid()) { + path += ":" + itos(cache[item.path].last_hash); //keep last hash (see description of what this is in condition below) + } - Ref<ImageTexture> texture; - Ref<ImageTexture> small_texture; + _preview_ready(path, cache[item.path].preview, cache[item.path].small_preview, item.id, item.function, item.userdata); - int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size"); - thumbnail_size *= EDSCALE; + preview_mutex.unlock(); + } else { + preview_mutex.unlock(); - if (item.resource.is_valid()) { - _generate_preview(texture, small_texture, item, String()); + Ref<ImageTexture> texture; + Ref<ImageTexture> small_texture; - //adding hash to the end of path (should be ID:<objid>:<hash>) because of 5 argument limit to call_deferred - _preview_ready(item.path + ":" + itos(item.resource->hash_edited_version()), texture, small_texture, item.id, item.function, item.userdata); + int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size"); + thumbnail_size *= EDSCALE; - } else { - String temp_path = EditorPaths::get_singleton()->get_cache_dir(); - String cache_base = ProjectSettings::get_singleton()->globalize_path(item.path).md5_text(); - cache_base = temp_path.plus_file("resthumb-" + cache_base); + if (item.resource.is_valid()) { + _generate_preview(texture, small_texture, item, String()); - //does not have it, try to load a cached thumbnail + //adding hash to the end of path (should be ID:<objid>:<hash>) because of 5 argument limit to call_deferred + _preview_ready(item.path + ":" + itos(item.resource->hash_edited_version()), texture, small_texture, item.id, item.function, item.userdata); - String file = cache_base + ".txt"; - FileAccess *f = FileAccess::open(file, FileAccess::READ); - if (!f) { - // No cache found, generate - _generate_preview(texture, small_texture, item, cache_base); - } else { - uint64_t modtime = FileAccess::get_modified_time(item.path); - int tsize = f->get_line().to_int(); - bool has_small_texture = f->get_line().to_int(); - uint64_t last_modtime = f->get_line().to_int(); + } else { + String temp_path = EditorPaths::get_singleton()->get_cache_dir(); + String cache_base = ProjectSettings::get_singleton()->globalize_path(item.path).md5_text(); + cache_base = temp_path.plus_file("resthumb-" + cache_base); - bool cache_valid = true; + //does not have it, try to load a cached thumbnail - if (tsize != thumbnail_size) { + String file = cache_base + ".txt"; + FileAccess *f = FileAccess::open(file, FileAccess::READ); + if (!f) { + // No cache found, generate + _generate_preview(texture, small_texture, item, cache_base); + } else { + uint64_t modtime = FileAccess::get_modified_time(item.path); + int tsize = f->get_line().to_int(); + bool has_small_texture = f->get_line().to_int(); + uint64_t last_modtime = f->get_line().to_int(); + + bool cache_valid = true; + + if (tsize != thumbnail_size) { + cache_valid = false; + memdelete(f); + } else if (last_modtime != modtime) { + String last_md5 = f->get_line(); + String md5 = FileAccess::get_md5(item.path); + memdelete(f); + + if (last_md5 != md5) { cache_valid = false; - memdelete(f); - } else if (last_modtime != modtime) { - String last_md5 = f->get_line(); - String md5 = FileAccess::get_md5(item.path); - memdelete(f); - if (last_md5 != md5) { - cache_valid = false; + } else { + //update modified time + f = FileAccess::open(file, FileAccess::WRITE); + if (!f) { + // Not returning as this would leave the thread hanging and would require + // some proper cleanup/disabling of resource preview generation. + ERR_PRINT("Cannot create file '" + file + "'. Check user write permissions."); } else { - //update modified time - - f = FileAccess::open(file, FileAccess::WRITE); - if (!f) { - // Not returning as this would leave the thread hanging and would require - // some proper cleanup/disabling of resource preview generation. - ERR_PRINT("Cannot create file '" + file + "'. Check user write permissions."); - } else { - f->store_line(itos(thumbnail_size)); - f->store_line(itos(has_small_texture)); - f->store_line(itos(modtime)); - f->store_line(md5); - memdelete(f); - } + f->store_line(itos(thumbnail_size)); + f->store_line(itos(has_small_texture)); + f->store_line(itos(modtime)); + f->store_line(md5); + memdelete(f); } - } else { - memdelete(f); } + } else { + memdelete(f); + } - if (cache_valid) { - Ref<Image> img; - img.instantiate(); - Ref<Image> small_img; - small_img.instantiate(); + if (cache_valid) { + Ref<Image> img; + img.instantiate(); + Ref<Image> small_img; + small_img.instantiate(); - if (img->load(cache_base + ".png") != OK) { - cache_valid = false; - } else { - texture.instantiate(); - texture->create_from_image(img); - - if (has_small_texture) { - if (small_img->load(cache_base + "_small.png") != OK) { - cache_valid = false; - } else { - small_texture.instantiate(); - small_texture->create_from_image(small_img); - } + if (img->load(cache_base + ".png") != OK) { + cache_valid = false; + } else { + texture.instantiate(); + texture->create_from_image(img); + + if (has_small_texture) { + if (small_img->load(cache_base + "_small.png") != OK) { + cache_valid = false; + } else { + small_texture.instantiate(); + small_texture->create_from_image(small_img); } } } + } - if (!cache_valid) { - _generate_preview(texture, small_texture, item, cache_base); - } + if (!cache_valid) { + _generate_preview(texture, small_texture, item, cache_base); } - _preview_ready(item.path, texture, small_texture, item.id, item.function, item.userdata); } + _preview_ready(item.path, texture, small_texture, item.id, item.function, item.userdata); } - - } else { - preview_mutex.unlock(); } + + } else { + preview_mutex.unlock(); + } +} + +void EditorResourcePreview::_thread() { + exited.clear(); + while (!exit.is_set()) { + preview_sem.wait(); + _iterate(); } exited.set(); } @@ -429,8 +433,12 @@ void EditorResourcePreview::check_for_invalidation(const String &p_path) { } void EditorResourcePreview::start() { - ERR_FAIL_COND_MSG(thread.is_started(), "Thread already started."); - thread.start(_thread_func, this); + if (OS::get_singleton()->get_render_main_thread_mode() == OS::RENDER_ANY_THREAD) { + ERR_FAIL_COND_MSG(thread.is_started(), "Thread already started."); + thread.start(_thread_func, this); + } else { + _mainthread_only = true; + } } void EditorResourcePreview::stop() { @@ -453,3 +461,18 @@ EditorResourcePreview::EditorResourcePreview() { EditorResourcePreview::~EditorResourcePreview() { stop(); } + +void EditorResourcePreview::update() { + if (!_mainthread_only) { + return; + } + + if (!exit.is_set()) { + // no need to even lock the mutex if the size is zero + // there is no problem if queue.size() is wrong, even if + // there was a race condition. + if (queue.size()) { + _iterate(); + } + } +} diff --git a/editor/editor_resource_preview.h b/editor/editor_resource_preview.h index ea16c8fde0..9d1f269661 100644 --- a/editor/editor_resource_preview.h +++ b/editor/editor_resource_preview.h @@ -81,6 +81,11 @@ class EditorResourcePreview : public Node { SafeFlag exit; SafeFlag exited; + // when running from GLES, we want to run the previews + // in the main thread using an update, rather than create + // a separate thread + bool _mainthread_only = false; + struct Item { Ref<Texture2D> preview; Ref<Texture2D> small_preview; @@ -98,6 +103,7 @@ class EditorResourcePreview : public Node { static void _thread_func(void *ud); void _thread(); + void _iterate(); Vector<Ref<EditorResourcePreviewGenerator>> preview_generators; @@ -119,6 +125,9 @@ public: void start(); void stop(); + // for single threaded mode + void update(); + EditorResourcePreview(); ~EditorResourcePreview(); }; diff --git a/editor/editor_run.cpp b/editor/editor_run.cpp index 8a7ec9aa82..3f4418d5f2 100644 --- a/editor/editor_run.cpp +++ b/editor/editor_run.cpp @@ -31,6 +31,7 @@ #include "editor_run.h" #include "core/config/project_settings.h" +#include "editor/editor_node.h" #include "editor_settings.h" #include "servers/display_server.h" @@ -42,20 +43,17 @@ String EditorRun::get_running_scene() const { return running_scene; } -Error EditorRun::run(const String &p_scene, const String &p_custom_args, const List<String> &p_breakpoints, const bool &p_skip_breakpoints) { +Error EditorRun::run(const String &p_scene) { List<String> args; String resource_path = ProjectSettings::get_singleton()->get_resource_path(); - String remote_host = EditorSettings::get_singleton()->get("network/debug/remote_host"); - int remote_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port"); - - if (resource_path != "") { + if (!resource_path.is_empty()) { args.push_back("--path"); args.push_back(resource_path.replace(" ", "%20")); } args.push_back("--remote-debug"); - args.push_back("tcp://" + remote_host + ":" + String::num(remote_port)); + args.push_back(EditorDebuggerNode::get_singleton()->get_server_uri()); args.push_back("--allow_focus_steal_pid"); args.push_back(itos(OS::get_singleton()->get_process_id())); @@ -162,10 +160,13 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L } break; } - if (p_breakpoints.size()) { + List<String> breakpoints; + EditorNode::get_editor_data().get_editor_breakpoints(&breakpoints); + + if (!breakpoints.is_empty()) { args.push_back("--breakpoints"); String bpoints; - for (const List<String>::Element *E = p_breakpoints.front(); E; E = E->next()) { + for (const List<String>::Element *E = breakpoints.front(); E; E = E->next()) { bpoints += E->get().replace(" ", "%20"); if (E->next()) { bpoints += ","; @@ -175,7 +176,7 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L args.push_back(bpoints); } - if (p_skip_breakpoints) { + if (EditorDebuggerNode::get_singleton()->is_skip_breakpoints()) { args.push_back("--skip-breakpoints"); } @@ -185,23 +186,24 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L String exec = OS::get_singleton()->get_executable_path(); - if (p_custom_args != "") { + const String raw_custom_args = ProjectSettings::get_singleton()->get("editor/run/main_run_args"); + if (!raw_custom_args.is_empty()) { // Allow the user to specify a command to run, similar to Steam's launch options. // In this case, Godot will no longer be run directly; it's up to the underlying command // to run it. For instance, this can be used on Linux to force a running project // to use Optimus using `prime-run` or similar. // Example: `prime-run %command% --time-scale 0.5` - const int placeholder_pos = p_custom_args.find("%command%"); + const int placeholder_pos = raw_custom_args.find("%command%"); Vector<String> custom_args; if (placeholder_pos != -1) { // Prepend executable-specific custom arguments. // If nothing is placed before `%command%`, behave as if no placeholder was specified. - Vector<String> exec_args = p_custom_args.substr(0, placeholder_pos).split(" ", false); + Vector<String> exec_args = raw_custom_args.substr(0, placeholder_pos).split(" ", false); if (exec_args.size() >= 1) { exec = exec_args[0]; - exec_args.remove(0); + exec_args.remove_at(0); // Append the Godot executable name before we append executable arguments // (since the order is reversed when using `push_front()`). @@ -214,13 +216,13 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L } // Append Godot-specific custom arguments. - custom_args = p_custom_args.substr(placeholder_pos + String("%command%").size()).split(" ", false); + custom_args = raw_custom_args.substr(placeholder_pos + String("%command%").size()).split(" ", false); for (int i = 0; i < custom_args.size(); i++) { args.push_back(custom_args[i].replace(" ", "%20")); } } else { // Append Godot-specific custom arguments. - custom_args = p_custom_args.split(" ", false); + custom_args = raw_custom_args.split(" ", false); for (int i = 0; i < custom_args.size(); i++) { args.push_back(custom_args[i].replace(" ", "%20")); } @@ -236,7 +238,7 @@ Error EditorRun::run(const String &p_scene, const String &p_custom_args, const L int instances = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_instances", 1); for (int i = 0; i < instances; i++) { OS::ProcessID pid = 0; - Error err = OS::get_singleton()->create_process(exec, args, &pid); + Error err = OS::get_singleton()->create_instance(args, &pid); ERR_FAIL_COND_V(err, err); pids.push_back(pid); } diff --git a/editor/editor_run.h b/editor/editor_run.h index d6cf3fed71..3bfe28e1ad 100644 --- a/editor/editor_run.h +++ b/editor/editor_run.h @@ -50,7 +50,7 @@ private: public: Status get_status() const; String get_running_scene() const; - Error run(const String &p_scene, const String &p_custom_args, const List<String> &p_breakpoints, const bool &p_skip_breakpoints = false); + Error run(const String &p_scene); void run_native_notify() { status = STATUS_PLAY; } void stop(); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 43d458c58e..613e0ba7a0 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -140,32 +140,37 @@ bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const { if (p_name == "shortcuts") { Array save_array; + const OrderedHashMap<String, List<Ref<InputEvent>>> &builtin_list = InputMap::get_singleton()->get_builtins(); for (const KeyValue<String, Ref<Shortcut>> &shortcut_definition : shortcuts) { Ref<Shortcut> sc = shortcut_definition.value; - if (builtin_action_overrides.has(shortcut_definition.key)) { + if (builtin_list.has(shortcut_definition.key)) { // This shortcut was auto-generated from built in actions: don't save. + // If the builtin is overriden, it will be saved in the "builtin_action_overrides" section below. continue; } - if (optimize_save) { - if (!sc->has_meta("original")) { - continue; //this came from settings but is not any longer used - } + Array shortcut_events = sc->get_events(); + + Dictionary dict; + dict["name"] = shortcut_definition.key; + dict["shortcuts"] = shortcut_events; + + if (!sc->has_meta("original")) { + // Getting the meta when it doesn't exist will return an empty array. If the 'shortcut_events' have been cleared, + // we still want save the shortcut in this case so that shortcuts that the user has customised are not reset, + // even if the 'original' has not been populated yet. This can happen when calling save() from the Project Manager. + save_array.push_back(dict); + continue; } Array original_events = sc->get_meta("original"); - Array shortcut_events = sc->get_events(); bool is_same = Shortcut::is_event_array_equal(original_events, shortcut_events); if (is_same) { continue; // Not changed from default; don't save. } - Dictionary dict; - dict["name"] = shortcut_definition.key; - dict["shortcuts"] = shortcut_events; - save_array.push_back(dict); } r_ret = save_array; @@ -288,8 +293,8 @@ void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(pi); } - p_list->push_back(PropertyInfo(Variant::ARRAY, "shortcuts", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL)); //do not edit - p_list->push_back(PropertyInfo(Variant::ARRAY, "builtin_action_overrides", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL)); + p_list->push_back(PropertyInfo(Variant::ARRAY, "shortcuts", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL)); //do not edit + p_list->push_back(PropertyInfo(Variant::ARRAY, "builtin_action_overrides", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL)); } void EditorSettings::_add_property_info_bind(const Dictionary &p_info) { @@ -437,6 +442,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _initial_set("interface/editor/hide_console_window", false); _initial_set("interface/editor/mouse_extra_buttons_navigate_history", true); _initial_set("interface/editor/save_each_scene_on_quit", true); // Regression + EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/show_internal_errors_in_toast_notifications", 0, "Auto,Enabled,Disabled") // Inspector EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "interface/inspector/max_array_dictionary_items_per_page", 20, "10,100,1") @@ -1476,7 +1482,7 @@ void ED_SHORTCUT_OVERRIDE(const String &p_path, const String &p_feature, Key p_k ERR_FAIL_COND_MSG(!sc.is_valid(), "Used ED_SHORTCUT_OVERRIDE with invalid shortcut: " + p_path + "."); PackedInt32Array arr; - arr.push_back(p_keycode); + arr.push_back((int32_t)p_keycode); ED_SHORTCUT_OVERRIDE_ARRAY(p_path, p_feature, arr); } @@ -1497,13 +1503,12 @@ void ED_SHORTCUT_OVERRIDE_ARRAY(const String &p_path, const String &p_feature, c #ifdef OSX_ENABLED // Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS - if (keycode == KEY_DELETE) { - keycode = KEY_MASK_CMD | KEY_BACKSPACE; + if (keycode == Key::KEY_DELETE) { + keycode = KeyModifierMask::CMD | Key::BACKSPACE; } #endif - Ref<InputEventKey> ie; - if (keycode) { + if (keycode != Key::NONE) { ie = InputEventKey::create_reference(keycode); events.push_back(ie); } @@ -1511,12 +1516,12 @@ void ED_SHORTCUT_OVERRIDE_ARRAY(const String &p_path, const String &p_feature, c // Directly override the existing shortcut. sc->set_events(events); - sc->set_meta("original", events); + sc->set_meta("original", events.duplicate(true)); } Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, Key p_keycode) { PackedInt32Array arr; - arr.push_back(p_keycode); + arr.push_back((int32_t)p_keycode); return ED_SHORTCUT_ARRAY(p_path, p_name, arr); } @@ -1528,13 +1533,13 @@ Ref<Shortcut> ED_SHORTCUT_ARRAY(const String &p_path, const String &p_name, cons #ifdef OSX_ENABLED // Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS - if (keycode == KEY_DELETE) { - keycode = KEY_MASK_CMD | KEY_BACKSPACE; + if (keycode == Key::KEY_DELETE) { + keycode = KeyModifierMask::CMD | Key::BACKSPACE; } #endif Ref<InputEventKey> ie; - if (keycode) { + if (keycode != Key::NONE) { ie = InputEventKey::create_reference(keycode); events.push_back(ie); } @@ -1545,21 +1550,21 @@ Ref<Shortcut> ED_SHORTCUT_ARRAY(const String &p_path, const String &p_name, cons sc.instantiate(); sc->set_name(p_name); sc->set_events(events); - sc->set_meta("original", events); + sc->set_meta("original", events.duplicate(true)); return sc; } Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(p_path); if (sc.is_valid()) { sc->set_name(p_name); //keep name (the ones that come from disk have no name) - sc->set_meta("original", events); //to compare against changes + sc->set_meta("original", events.duplicate(true)); //to compare against changes return sc; } sc.instantiate(); sc->set_name(p_name); sc->set_events(events); - sc->set_meta("original", events); //to compare against changes + sc->set_meta("original", events.duplicate(true)); //to compare against changes EditorSettings::get_singleton()->add_shortcut(p_path, sc); return sc; diff --git a/editor/editor_settings.h b/editor/editor_settings.h index 04e227bc5c..cb23ed3d19 100644 --- a/editor/editor_settings.h +++ b/editor/editor_settings.h @@ -200,9 +200,9 @@ Variant _EDITOR_DEF(const String &p_setting, const Variant &p_default, bool p_re Variant _EDITOR_GET(const String &p_setting); #define ED_IS_SHORTCUT(p_name, p_ev) (EditorSettings::get_singleton()->is_shortcut(p_name, p_ev)) -Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, Key p_keycode = KEY_NONE); +Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, Key p_keycode = Key::NONE); Ref<Shortcut> ED_SHORTCUT_ARRAY(const String &p_path, const String &p_name, const PackedInt32Array &p_keycodes); -void ED_SHORTCUT_OVERRIDE(const String &p_path, const String &p_feature, Key p_keycode = KEY_NONE); +void ED_SHORTCUT_OVERRIDE(const String &p_path, const String &p_feature, Key p_keycode = Key::NONE); void ED_SHORTCUT_OVERRIDE_ARRAY(const String &p_path, const String &p_feature, const PackedInt32Array &p_keycodes); Ref<Shortcut> ED_GET_SHORTCUT(const String &p_path); diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index ec90af1bcc..f07a5ab523 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -39,9 +39,9 @@ String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const { if (grabber->is_visible()) { #ifdef OSX_ENABLED - const int key = KEY_META; + Key key = Key::META; #else - const int key = KEY_CTRL; + Key key = Key::CTRL; #endif return TS->format_number(rtos(get_value())) + "\n\n" + vformat(TTR("Hold %s to round to integers. Hold Shift for more precise changes."), find_keycode_name(key)); } @@ -61,7 +61,7 @@ void EditorSpinSlider::gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { if (updown_offset != -1 && mb->get_position().x > updown_offset) { //there is an updown, so use it. @@ -92,7 +92,7 @@ void EditorSpinSlider::gui_input(const Ref<InputEvent> &p_event) { grabbing_spinner_attempt = false; } } - } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP || mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { + } else if (mb->get_button_index() == MouseButton::WHEEL_UP || mb->get_button_index() == MouseButton::WHEEL_DOWN) { if (grabber->is_visible()) { call_deferred(SNAME("update")); } @@ -154,17 +154,17 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) { if (grabbing_grabber) { if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { + if (mb->get_button_index() == MouseButton::WHEEL_UP) { set_value(get_value() + get_step()); mousewheel_over_grabber = true; - } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { + } else if (mb->get_button_index() == MouseButton::WHEEL_DOWN) { set_value(get_value() - get_step()); mousewheel_over_grabber = true; } } } - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { grabbing_grabber = true; if (!mousewheel_over_grabber) { @@ -212,9 +212,9 @@ void EditorSpinSlider::_value_input_gui_input(const Ref<InputEvent> &p_event) { step *= 0.1; } - uint32_t code = k->get_keycode(); + Key code = k->get_keycode(); switch (code) { - case KEY_UP: { + case Key::UP: { _evaluate_input_text(); double last_value = get_value(); @@ -225,9 +225,10 @@ void EditorSpinSlider::_value_input_gui_input(const Ref<InputEvent> &p_event) { set_value(last_value + real_step); } - value_input->set_text(get_text_value()); + value_input_dirty = true; + set_process_internal(true); } break; - case KEY_DOWN: { + case Key::DOWN: { _evaluate_input_text(); double last_value = get_value(); @@ -238,8 +239,11 @@ void EditorSpinSlider::_value_input_gui_input(const Ref<InputEvent> &p_event) { set_value(last_value - real_step); } - value_input->set_text(get_text_value()); + value_input_dirty = true; + set_process_internal(true); } break; + default: + break; } } } @@ -405,7 +409,7 @@ void EditorSpinSlider::_draw_spin_slider() { Vector2 scale = get_global_transform_with_canvas().get_scale(); grabber->set_scale(scale); - grabber->set_size(Size2(0, 0)); + grabber->reset_size(); grabber->set_position(get_global_position() + (grabber_rect.get_center() - grabber->get_size() * 0.5) * scale); if (mousewheel_over_grabber) { @@ -424,6 +428,14 @@ void EditorSpinSlider::_notification(int p_what) { _update_value_input_stylebox(); break; + case NOTIFICATION_INTERNAL_PROCESS: + if (value_input_dirty) { + value_input_dirty = false; + value_input->set_text(get_text_value()); + } + set_process_internal(false); + break; + case NOTIFICATION_DRAW: _draw_spin_slider(); break; diff --git a/editor/editor_spin_slider.h b/editor/editor_spin_slider.h index 7e10764491..68448b3240 100644 --- a/editor/editor_spin_slider.h +++ b/editor/editor_spin_slider.h @@ -66,6 +66,7 @@ class EditorSpinSlider : public Range { Popup *value_input_popup = nullptr; LineEdit *value_input = nullptr; bool value_input_just_closed = false; + bool value_input_dirty = false; void _grabber_gui_input(const Ref<InputEvent> &p_event); void _value_input_closed(); diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 2d4db48f2a..637394d136 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -36,7 +36,7 @@ #include "editor_scale.h" #include "editor_settings.h" -#include "modules/modules_enabled.gen.h" +#include "modules/modules_enabled.gen.h" // For svg. #ifdef MODULE_SVG_ENABLED #include "modules/svg/image_loader_svg.h" #endif @@ -384,6 +384,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color font_color = mono_color.lerp(base_color, 0.25); const Color font_hover_color = mono_color.lerp(base_color, 0.125); + const Color font_focus_color = mono_color.lerp(base_color, 0.125); const Color font_disabled_color = Color(mono_color.r, mono_color.g, mono_color.b, 0.3); const Color font_readonly_color = Color(mono_color.r, mono_color.g, mono_color.b, 0.65); const Color selection_color = accent_color * Color(1, 1, 1, 0.4); @@ -392,6 +393,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { Color icon_hover_color = Color(1, 1, 1) * (dark_theme ? 1.15 : 1.45); icon_hover_color.a = 1.0; + Color icon_focus_color = icon_hover_color; // Make the pressed icon color overbright because icons are not completely white on a dark theme. // On a light theme, icons are dark, so we need to modulate them with an even brighter color. Color icon_pressed_color = accent_color * (dark_theme ? 1.15 : 3.5); @@ -403,7 +405,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { float prev_icon_saturation = theme->has_color("icon_saturation", "Editor") ? theme->get_color("icon_saturation", "Editor").r : 1.0; - theme->set_color("icon_saturation", "Editor", Color(icon_saturation, icon_saturation, icon_saturation)); //can't save single float in theme, so using color + theme->set_color("icon_saturation", "Editor", Color(icon_saturation, icon_saturation, icon_saturation)); // can't save single float in theme, so using color theme->set_color("accent_color", "Editor", accent_color); theme->set_color("highlight_color", "Editor", highlight_color); theme->set_color("disabled_highlight_color", "Editor", disabled_highlight_color); @@ -431,7 +433,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { Color error_color = Color(1, 0.47, 0.42); Color property_color = font_color.lerp(Color(0.5, 0.5, 0.5), 0.5); Color readonly_color = property_color.lerp(dark_theme ? Color(0, 0, 0) : Color(1, 1, 1), 0.5); - Color readonly_error_color = error_color.lerp(dark_theme ? Color(0, 0, 0) : Color(1, 1, 1), 0.5); + Color readonly_warning_color = error_color.lerp(dark_theme ? Color(0, 0, 0) : Color(1, 1, 1), 0.5); if (!dark_theme) { // Darken some colors to be readable on a light background @@ -445,7 +447,6 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("error_color", "Editor", error_color); theme->set_color("property_color", "Editor", property_color); theme->set_color("readonly_color", "Editor", readonly_color); - theme->set_color("readonly_error_color", "EditorProperty", readonly_error_color); if (!dark_theme) { theme->set_color("vulkan_color", "Editor", Color::hex(0xad1128ff)); @@ -549,7 +550,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { Ref<StyleBoxEmpty> style_empty = make_empty_stylebox(default_margin_size, default_margin_size, default_margin_size, default_margin_size); - // Tabs + // TabBar Ref<StyleBoxFlat> style_tab_selected = style_widget->duplicate(); @@ -626,6 +627,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("font_color", "MenuButton", font_color); theme->set_color("font_hover_color", "MenuButton", font_hover_color); + theme->set_color("font_focus_color", "MenuButton", font_focus_color); theme->set_stylebox("MenuHover", "EditorStyles", style_widget_hover); @@ -638,9 +640,11 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("font_color", "Button", font_color); theme->set_color("font_hover_color", "Button", font_hover_color); + theme->set_color("font_focus_color", "Button", font_focus_color); theme->set_color("font_pressed_color", "Button", accent_color); theme->set_color("font_disabled_color", "Button", font_disabled_color); theme->set_color("icon_hover_color", "Button", icon_hover_color); + theme->set_color("icon_focus_color", "Button", icon_focus_color); theme->set_color("icon_pressed_color", "Button", icon_pressed_color); // OptionButton @@ -658,9 +662,11 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("font_color", "OptionButton", font_color); theme->set_color("font_hover_color", "OptionButton", font_hover_color); + theme->set_color("font_focus_color", "OptionButton", font_focus_color); theme->set_color("font_pressed_color", "OptionButton", accent_color); theme->set_color("font_disabled_color", "OptionButton", font_disabled_color); theme->set_color("icon_hover_color", "OptionButton", icon_hover_color); + theme->set_color("icon_focus_color", "OptionButton", icon_focus_color); theme->set_icon("arrow", "OptionButton", theme->get_icon("GuiOptionArrow", "EditorIcons")); theme->set_constant("arrow_margin", "OptionButton", widget_default_margin.x - 2 * EDSCALE); theme->set_constant("modulate_arrow", "OptionButton", true); @@ -684,9 +690,11 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("font_color", "CheckButton", font_color); theme->set_color("font_hover_color", "CheckButton", font_hover_color); + theme->set_color("font_focus_color", "CheckButton", font_focus_color); theme->set_color("font_pressed_color", "CheckButton", accent_color); theme->set_color("font_disabled_color", "CheckButton", font_disabled_color); theme->set_color("icon_hover_color", "CheckButton", icon_hover_color); + theme->set_color("icon_focus_color", "CheckButton", icon_focus_color); theme->set_constant("hseparation", "CheckButton", 8 * EDSCALE); theme->set_constant("check_vadjust", "CheckButton", 0 * EDSCALE); @@ -713,9 +721,11 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("font_color", "CheckBox", font_color); theme->set_color("font_hover_color", "CheckBox", font_hover_color); + theme->set_color("font_focus_color", "CheckBox", font_focus_color); theme->set_color("font_pressed_color", "CheckBox", accent_color); theme->set_color("font_disabled_color", "CheckBox", font_disabled_color); theme->set_color("icon_hover_color", "CheckBox", icon_hover_color); + theme->set_color("icon_focus_color", "CheckBox", icon_focus_color); theme->set_constant("hseparation", "CheckBox", 8 * EDSCALE); theme->set_constant("check_vadjust", "CheckBox", 0 * EDSCALE); @@ -819,10 +829,10 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("bg_selected", "EditorProperty", style_property_bg); theme->set_stylebox("bg", "EditorProperty", Ref<StyleBoxEmpty>(memnew(StyleBoxEmpty))); theme->set_constant("vseparation", "EditorProperty", (extra_spacing + default_margin_size) * EDSCALE); - theme->set_color("error_color", "EditorProperty", error_color); + theme->set_color("warning_color", "EditorProperty", warning_color); theme->set_color("property_color", "EditorProperty", property_color); theme->set_color("readonly_color", "EditorProperty", readonly_color); - theme->set_color("readonly_error_color", "EditorProperty", readonly_error_color); + theme->set_color("readonly_warning_color", "EditorProperty", readonly_warning_color); Color inspector_section_color = font_color.lerp(Color(0.5, 0.5, 0.5), 0.35); theme->set_color("font_color", "EditorInspectorSection", inspector_section_color); @@ -950,33 +960,33 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_constant("icon_margin", "ItemList", 6 * EDSCALE); theme->set_constant("line_separation", "ItemList", 3 * EDSCALE); - // Tabs & TabContainer + // TabBar & TabContainer theme->set_stylebox("tab_selected", "TabContainer", style_tab_selected); theme->set_stylebox("tab_unselected", "TabContainer", style_tab_unselected); theme->set_stylebox("tab_disabled", "TabContainer", style_tab_disabled); - theme->set_stylebox("tab_selected", "Tabs", style_tab_selected); - theme->set_stylebox("tab_unselected", "Tabs", style_tab_unselected); - theme->set_stylebox("tab_disabled", "Tabs", style_tab_disabled); + theme->set_stylebox("tab_selected", "TabBar", style_tab_selected); + theme->set_stylebox("tab_unselected", "TabBar", style_tab_unselected); + theme->set_stylebox("tab_disabled", "TabBar", style_tab_disabled); theme->set_color("font_selected_color", "TabContainer", font_color); theme->set_color("font_unselected_color", "TabContainer", font_disabled_color); - theme->set_color("font_selected_color", "Tabs", font_color); - theme->set_color("font_unselected_color", "Tabs", font_disabled_color); + theme->set_color("font_selected_color", "TabBar", font_color); + theme->set_color("font_unselected_color", "TabBar", font_disabled_color); theme->set_icon("menu", "TabContainer", theme->get_icon("GuiTabMenu", "EditorIcons")); theme->set_icon("menu_highlight", "TabContainer", theme->get_icon("GuiTabMenuHl", "EditorIcons")); theme->set_stylebox("SceneTabFG", "EditorStyles", style_tab_selected); theme->set_stylebox("SceneTabBG", "EditorStyles", style_tab_unselected); - theme->set_icon("close", "Tabs", theme->get_icon("GuiClose", "EditorIcons")); - theme->set_stylebox("close_bg_pressed", "Tabs", style_menu); - theme->set_stylebox("close_bg_highlight", "Tabs", style_menu); + theme->set_icon("close", "TabBar", theme->get_icon("GuiClose", "EditorIcons")); + theme->set_stylebox("close_bg_pressed", "TabBar", style_menu); + theme->set_stylebox("close_bg_highlight", "TabBar", style_menu); theme->set_icon("increment", "TabContainer", theme->get_icon("GuiScrollArrowRight", "EditorIcons")); theme->set_icon("decrement", "TabContainer", theme->get_icon("GuiScrollArrowLeft", "EditorIcons")); - theme->set_icon("increment", "Tabs", theme->get_icon("GuiScrollArrowRight", "EditorIcons")); - theme->set_icon("decrement", "Tabs", theme->get_icon("GuiScrollArrowLeft", "EditorIcons")); - theme->set_icon("increment_highlight", "Tabs", theme->get_icon("GuiScrollArrowRightHl", "EditorIcons")); - theme->set_icon("decrement_highlight", "Tabs", theme->get_icon("GuiScrollArrowLeftHl", "EditorIcons")); + theme->set_icon("increment", "TabBar", theme->get_icon("GuiScrollArrowRight", "EditorIcons")); + theme->set_icon("decrement", "TabBar", theme->get_icon("GuiScrollArrowLeft", "EditorIcons")); + theme->set_icon("increment_highlight", "TabBar", theme->get_icon("GuiScrollArrowRightHl", "EditorIcons")); + theme->set_icon("decrement_highlight", "TabBar", theme->get_icon("GuiScrollArrowLeftHl", "EditorIcons")); theme->set_icon("increment_highlight", "TabContainer", theme->get_icon("GuiScrollArrowRightHl", "EditorIcons")); theme->set_icon("decrement_highlight", "TabContainer", theme->get_icon("GuiScrollArrowLeftHl", "EditorIcons")); - theme->set_constant("hseparation", "Tabs", 4 * EDSCALE); + theme->set_constant("hseparation", "TabBar", 4 * EDSCALE); // Content of each tab Ref<StyleBoxFlat> style_content_panel = style_default->duplicate(); @@ -1197,7 +1207,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("font_shadow_color", "RichTextLabel", Color(0, 0, 0, 0)); theme->set_constant("shadow_offset_x", "RichTextLabel", 1 * EDSCALE); theme->set_constant("shadow_offset_y", "RichTextLabel", 1 * EDSCALE); - theme->set_constant("shadow_as_outline", "RichTextLabel", 0 * EDSCALE); + theme->set_constant("shadow_outline_size", "RichTextLabel", 1 * EDSCALE); theme->set_stylebox("focus", "RichTextLabel", make_empty_stylebox()); theme->set_stylebox("normal", "RichTextLabel", style_tree_bg); @@ -1213,13 +1223,14 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("font_shadow_color", "Label", Color(0, 0, 0, 0)); theme->set_constant("shadow_offset_x", "Label", 1 * EDSCALE); theme->set_constant("shadow_offset_y", "Label", 1 * EDSCALE); - theme->set_constant("shadow_as_outline", "Label", 0 * EDSCALE); + theme->set_constant("shadow_outline_size", "Label", 1 * EDSCALE); theme->set_constant("line_spacing", "Label", 3 * EDSCALE); // LinkButton theme->set_stylebox("focus", "LinkButton", style_empty); theme->set_color("font_color", "LinkButton", font_color); theme->set_color("font_hover_color", "LinkButton", font_hover_color); + theme->set_color("font_focus_color", "LinkButton", font_focus_color); theme->set_color("font_pressed_color", "LinkButton", accent_color); theme->set_color("font_disabled_color", "LinkButton", font_disabled_color); diff --git a/editor/editor_toaster.cpp b/editor/editor_toaster.cpp new file mode 100644 index 0000000000..0d9a546b8e --- /dev/null +++ b/editor/editor_toaster.cpp @@ -0,0 +1,514 @@ +/*************************************************************************/ +/* editor_toaster.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "scene/gui/label.h" +#include "scene/gui/panel_container.h" + +#include "editor_toaster.h" + +EditorToaster *EditorToaster::singleton = nullptr; + +void EditorToaster::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_INTERNAL_PROCESS: { + double delta = get_process_delta_time(); + + // Check if one element is hovered, if so, don't elapse time. + bool hovered = false; + for (const KeyValue<Control *, Toast> &element : toasts) { + if (Rect2(Vector2(), element.key->get_size()).has_point(element.key->get_local_mouse_position())) { + hovered = true; + break; + } + } + + // Elapses the time and remove toasts if needed. + if (!hovered) { + for (const KeyValue<Control *, Toast> &element : toasts) { + if (!element.value.popped || element.value.duration <= 0) { + continue; + } + toasts[element.key].remaining_time -= delta; + if (toasts[element.key].remaining_time < 0) { + close(element.key); + } + element.key->update(); + } + } else { + // Reset the timers when hovered. + for (const KeyValue<Control *, Toast> &element : toasts) { + if (!element.value.popped || element.value.duration <= 0) { + continue; + } + toasts[element.key].remaining_time = element.value.duration; + element.key->update(); + } + } + + // Change alpha over time. + bool needs_update = false; + for (const KeyValue<Control *, Toast> &element : toasts) { + Color modulate = element.key->get_modulate(); + + // Change alpha over time. + if (element.value.popped && modulate.a < 1.0) { + modulate.a += delta * 3; + element.key->set_modulate(modulate); + } else if (!element.value.popped && modulate.a > 0.0) { + modulate.a -= delta * 2; + element.key->set_modulate(modulate); + } + + // Hide element if it is not visible anymore. + if (modulate.a <= 0) { + if (element.key->is_visible()) { + element.key->hide(); + needs_update = true; + } + } + } + + if (needs_update) { + _update_vbox_position(); + _update_disable_notifications_button(); + main_button->update(); + } + } break; + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + if (vbox_container->is_visible()) { + main_button->set_icon(get_theme_icon(SNAME("Notification"), SNAME("EditorIcons"))); + } else { + main_button->set_icon(get_theme_icon(SNAME("NotificationDisabled"), SNAME("EditorIcons"))); + } + disable_notifications_button->set_icon(get_theme_icon(SNAME("NotificationDisabled"), SNAME("EditorIcons"))); + + // Styleboxes background. + info_panel_style_background->set_bg_color(get_theme_color("base_color", "Editor")); + + warning_panel_style_background->set_bg_color(get_theme_color("base_color", "Editor")); + warning_panel_style_background->set_border_color(get_theme_color("warning_color", "Editor")); + + error_panel_style_background->set_bg_color(get_theme_color("base_color", "Editor")); + error_panel_style_background->set_border_color(get_theme_color("error_color", "Editor")); + + // Styleboxes progress. + info_panel_style_progress->set_bg_color(get_theme_color("base_color", "Editor").lightened(0.03)); + + warning_panel_style_progress->set_bg_color(get_theme_color("base_color", "Editor").lightened(0.03)); + warning_panel_style_progress->set_border_color(get_theme_color("warning_color", "Editor")); + + error_panel_style_progress->set_bg_color(get_theme_color("base_color", "Editor").lightened(0.03)); + error_panel_style_progress->set_border_color(get_theme_color("error_color", "Editor")); + + main_button->update(); + disable_notifications_button->update(); + } break; + case NOTIFICATION_TRANSFORM_CHANGED: { + _update_vbox_position(); + _update_disable_notifications_button(); + } break; + default: + break; + } +} + +void EditorToaster::_error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, bool p_editor_notify, ErrorHandlerType p_type) { + if (!EditorToaster::get_singleton() || !EditorToaster::get_singleton()->is_inside_tree()) { + return; + } + +#ifdef DEV_ENABLED + bool in_dev = true; +#else + bool in_dev = false; +#endif + + int show_all_setting = EDITOR_GET("interface/editor/show_internal_errors_in_toast_notifications"); + + if (p_editor_notify || (show_all_setting == 0 && in_dev) || show_all_setting == 1) { + String err_str; + if (p_errorexp && p_errorexp[0]) { + err_str = String::utf8(p_errorexp); + } else { + err_str = String::utf8(p_error); + } + String tooltip_str = String::utf8(p_file) + ":" + itos(p_line); + + if (!p_editor_notify) { + if (p_type == ERR_HANDLER_WARNING) { + err_str = "INTERNAL WARNING: " + err_str; + } else { + err_str = "INTERNAL ERROR: " + err_str; + } + } + + Severity severity = (p_type == ERR_HANDLER_WARNING) ? SEVERITY_WARNING : SEVERITY_ERROR; + if (Thread::get_caller_id() != Thread::get_main_id()) { + EditorToaster::get_singleton()->call_deferred(SNAME("popup_str"), err_str, severity, tooltip_str); + } else { + EditorToaster::get_singleton()->popup_str(err_str, severity, tooltip_str); + } + } +} + +void EditorToaster::_update_vbox_position() { + // This is kind of a workaround because it's hard to keep the VBox anchroed to the bottom. + vbox_container->set_size(Vector2()); + vbox_container->set_position(get_global_position() - vbox_container->get_size() + Vector2(get_size().x, -5 * EDSCALE)); +} + +void EditorToaster::_update_disable_notifications_button() { + bool any_visible = false; + for (KeyValue<Control *, Toast> element : toasts) { + if (element.key->is_visible()) { + any_visible = true; + break; + } + } + + if (!any_visible || !vbox_container->is_visible()) { + disable_notifications_panel->hide(); + } else { + disable_notifications_panel->show(); + disable_notifications_panel->set_position(get_global_position() + Vector2(5 * EDSCALE, -disable_notifications_panel->get_minimum_size().y) + Vector2(get_size().x, -5 * EDSCALE)); + } +} + +void EditorToaster::_auto_hide_or_free_toasts() { + // Hide or free old temporary items. + int visible_temporary = 0; + int temporary = 0; + LocalVector<Control *> to_delete; + for (int i = vbox_container->get_child_count() - 1; i >= 0; i--) { + Control *control = Object::cast_to<Control>(vbox_container->get_child(i)); + if (toasts[control].duration <= 0) { + continue; // Ignore non-temporary toasts. + } + + temporary++; + if (control->is_visible()) { + visible_temporary++; + } + + // Hide + if (visible_temporary > max_temporary_count) { + close(control); + } + + // Free + if (temporary > max_temporary_count * 2) { + to_delete.push_back(control); + } + } + + // Delete the control right away (removed as child) as it might cause issues otherwise when iterative over the vbox_container children. + for (unsigned int i = 0; i < to_delete.size(); i++) { + vbox_container->remove_child(to_delete[i]); + to_delete[i]->queue_delete(); + toasts.erase(to_delete[i]); + } +} + +void EditorToaster::_draw_button() { + bool has_one = false; + Severity highest_severity = SEVERITY_INFO; + for (const KeyValue<Control *, Toast> &element : toasts) { + if (!element.key->is_visible()) { + continue; + } + has_one = true; + if (element.value.severity > highest_severity) { + highest_severity = element.value.severity; + } + } + + if (!has_one) { + return; + } + + Color color; + real_t button_radius = main_button->get_size().x / 8; + switch (highest_severity) { + case SEVERITY_INFO: + color = get_theme_color("accent_color", "Editor"); + break; + case SEVERITY_WARNING: + color = get_theme_color("warning_color", "Editor"); + break; + case SEVERITY_ERROR: + color = get_theme_color("error_color", "Editor"); + break; + default: + break; + } + main_button->draw_circle(Vector2(button_radius * 2, button_radius * 2), button_radius, color); +} + +void EditorToaster::_draw_progress(Control *panel) { + if (toasts.has(panel) && toasts[panel].remaining_time > 0 && toasts[panel].duration > 0) { + Size2 size = panel->get_size(); + size.x *= MIN(1, Math::range_lerp(toasts[panel].remaining_time, 0, toasts[panel].duration, 0, 2)); + + Ref<StyleBoxFlat> stylebox; + switch (toasts[panel].severity) { + case SEVERITY_INFO: + stylebox = info_panel_style_progress; + break; + case SEVERITY_WARNING: + stylebox = warning_panel_style_progress; + break; + case SEVERITY_ERROR: + stylebox = error_panel_style_progress; + break; + default: + break; + } + panel->draw_style_box(stylebox, Rect2(Vector2(), size)); + } +} + +void EditorToaster::_set_notifications_enabled(bool p_enabled) { + vbox_container->set_visible(p_enabled); + if (p_enabled) { + main_button->set_icon(get_theme_icon(SNAME("Notification"), SNAME("EditorIcons"))); + } else { + main_button->set_icon(get_theme_icon(SNAME("NotificationDisabled"), SNAME("EditorIcons"))); + } + _update_disable_notifications_button(); +} + +void EditorToaster::_repop_old() { + // Repop olds, up to max_temporary_count + bool needs_update = false; + int visible = 0; + for (int i = vbox_container->get_child_count() - 1; i >= 0; i--) { + Control *control = Object::cast_to<Control>(vbox_container->get_child(i)); + if (!control->is_visible()) { + control->show(); + toasts[control].remaining_time = toasts[control].duration; + toasts[control].popped = true; + needs_update = true; + } + visible++; + if (visible >= max_temporary_count) { + break; + } + } + if (needs_update) { + _update_vbox_position(); + _update_disable_notifications_button(); + main_button->update(); + } +} + +Control *EditorToaster::popup(Control *p_control, Severity p_severity, double p_time, String p_tooltip) { + // Create the panel according to the severity. + PanelContainer *panel = memnew(PanelContainer); + panel->set_tooltip(p_tooltip); + switch (p_severity) { + case SEVERITY_INFO: + panel->add_theme_style_override("panel", info_panel_style_background); + break; + case SEVERITY_WARNING: + panel->add_theme_style_override("panel", warning_panel_style_background); + break; + case SEVERITY_ERROR: + panel->add_theme_style_override("panel", error_panel_style_background); + break; + default: + break; + } + panel->set_modulate(Color(1, 1, 1, 0)); + panel->connect("draw", callable_bind(callable_mp(this, &EditorToaster::_draw_progress), panel)); + + // Horizontal container. + HBoxContainer *hbox_container = memnew(HBoxContainer); + hbox_container->set_h_size_flags(SIZE_EXPAND_FILL); + panel->add_child(hbox_container); + + // Content control. + p_control->set_h_size_flags(SIZE_EXPAND_FILL); + hbox_container->add_child(p_control); + + // Close button. + if (p_time > 0.0) { + Button *close_button = memnew(Button); + close_button->set_flat(true); + close_button->set_icon(get_theme_icon("Close", "EditorIcons")); + close_button->connect("pressed", callable_bind(callable_mp(this, &EditorToaster::close), panel)); + hbox_container->add_child(close_button); + } + + toasts[panel].severity = p_severity; + if (p_time > 0.0) { + toasts[panel].duration = p_time; + toasts[panel].remaining_time = p_time; + } else { + toasts[panel].duration = -1.0; + } + toasts[panel].popped = true; + vbox_container->add_child(panel); + _auto_hide_or_free_toasts(); + _update_vbox_position(); + _update_disable_notifications_button(); + main_button->update(); + + return panel; +} + +void EditorToaster::popup_str(String p_message, Severity p_severity, String p_tooltip) { + // Check if we already have a popup with the given message. + Control *control = nullptr; + for (KeyValue<Control *, Toast> element : toasts) { + if (element.value.message == p_message && element.value.severity == p_severity && element.value.tooltip == p_tooltip) { + control = element.key; + break; + } + } + + // Create a new message if needed. + if (control == nullptr) { + Label *label = memnew(Label); + + control = popup(label, p_severity, default_message_duration, p_tooltip); + toasts[control].message = p_message; + toasts[control].tooltip = p_tooltip; + toasts[control].count = 1; + } else { + if (toasts[control].popped) { + toasts[control].count += 1; + } else { + toasts[control].count = 1; + } + toasts[control].remaining_time = toasts[control].duration; + toasts[control].popped = true; + control->show(); + vbox_container->move_child(control, vbox_container->get_child_count()); + _auto_hide_or_free_toasts(); + _update_vbox_position(); + _update_disable_notifications_button(); + main_button->update(); + } + + // Retrieve the label back then update the text. + Label *label = Object::cast_to<Label>(control->get_child(0)->get_child(0)); + ERR_FAIL_COND(!label); + if (toasts[control].count == 1) { + label->set_text(p_message); + } else { + label->set_text(vformat("%s (%d)", p_message, toasts[control].count)); + } +} + +void EditorToaster::close(Control *p_control) { + ERR_FAIL_COND(!toasts.has(p_control)); + toasts[p_control].remaining_time = -1.0; + toasts[p_control].popped = false; +} + +EditorToaster *EditorToaster::get_singleton() { + return singleton; +} + +EditorToaster::EditorToaster() { + set_notify_transform(true); + set_process_internal(true); + + // VBox. + vbox_container = memnew(VBoxContainer); + vbox_container->set_as_top_level(true); + vbox_container->connect("resized", callable_mp(this, &EditorToaster::_update_vbox_position)); + add_child(vbox_container); + + // Theming (background). + info_panel_style_background.instantiate(); + info_panel_style_background->set_corner_radius_all(stylebox_radius * EDSCALE); + + warning_panel_style_background.instantiate(); + warning_panel_style_background->set_border_width(SIDE_LEFT, stylebox_radius * EDSCALE); + warning_panel_style_background->set_corner_radius_all(stylebox_radius * EDSCALE); + + error_panel_style_background.instantiate(); + error_panel_style_background->set_border_width(SIDE_LEFT, stylebox_radius * EDSCALE); + error_panel_style_background->set_corner_radius_all(stylebox_radius * EDSCALE); + + Ref<StyleBoxFlat> boxes[] = { info_panel_style_background, warning_panel_style_background, error_panel_style_background }; + for (int i = 0; i < 3; i++) { + boxes[i]->set_default_margin(SIDE_LEFT, int(stylebox_radius * 2.5)); + boxes[i]->set_default_margin(SIDE_RIGHT, int(stylebox_radius * 2.5)); + boxes[i]->set_default_margin(SIDE_TOP, 3); + boxes[i]->set_default_margin(SIDE_BOTTOM, 3); + } + + // Theming (progress). + info_panel_style_progress.instantiate(); + info_panel_style_progress->set_corner_radius_all(stylebox_radius * EDSCALE); + + warning_panel_style_progress.instantiate(); + warning_panel_style_progress->set_border_width(SIDE_LEFT, stylebox_radius * EDSCALE); + warning_panel_style_progress->set_corner_radius_all(stylebox_radius * EDSCALE); + + error_panel_style_progress.instantiate(); + error_panel_style_progress->set_border_width(SIDE_LEFT, stylebox_radius * EDSCALE); + error_panel_style_progress->set_corner_radius_all(stylebox_radius * EDSCALE); + + // Main button. + main_button = memnew(Button); + main_button->set_flat(true); + main_button->connect("pressed", callable_mp(this, &EditorToaster::_set_notifications_enabled), varray(true)); + main_button->connect("pressed", callable_mp(this, &EditorToaster::_repop_old)); + main_button->connect("draw", callable_mp(this, &EditorToaster::_draw_button)); + add_child(main_button); + + // Disable notification button. + disable_notifications_panel = memnew(PanelContainer); + disable_notifications_panel->set_as_top_level(true); + disable_notifications_panel->add_theme_style_override("panel", info_panel_style_background); + add_child(disable_notifications_panel); + + disable_notifications_button = memnew(Button); + disable_notifications_button->set_flat(true); + disable_notifications_button->connect("pressed", callable_mp(this, &EditorToaster::_set_notifications_enabled), varray(false)); + disable_notifications_panel->add_child(disable_notifications_button); + + // Other + singleton = this; + + eh.errfunc = _error_handler; + add_error_handler(&eh); +}; + +EditorToaster::~EditorToaster() { + singleton = nullptr; + remove_error_handler(&eh); +} diff --git a/editor/editor_toaster.h b/editor/editor_toaster.h new file mode 100644 index 0000000000..aac80d8fb1 --- /dev/null +++ b/editor/editor_toaster.h @@ -0,0 +1,116 @@ +/*************************************************************************/ +/* editor_toaster.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef EDITOR_TOASTER_H +#define EDITOR_TOASTER_H + +#include "scene/gui/box_container.h" +#include "scene/gui/button.h" +#include "scene/gui/popup.h" + +#include "core/string/ustring.h" +#include "core/templates/local_vector.h" + +class EditorToaster : public HBoxContainer { + GDCLASS(EditorToaster, HBoxContainer); + +public: + enum Severity { + SEVERITY_INFO = 0, + SEVERITY_WARNING, + SEVERITY_ERROR, + }; + +private: + ErrorHandlerList eh; + + const int stylebox_radius = 3; + + Ref<StyleBoxFlat> info_panel_style_background; + Ref<StyleBoxFlat> warning_panel_style_background; + Ref<StyleBoxFlat> error_panel_style_background; + + Ref<StyleBoxFlat> info_panel_style_progress; + Ref<StyleBoxFlat> warning_panel_style_progress; + Ref<StyleBoxFlat> error_panel_style_progress; + + Button *main_button; + PanelContainer *disable_notifications_panel; + Button *disable_notifications_button; + + VBoxContainer *vbox_container; + const int max_temporary_count = 5; + struct Toast { + Severity severity = SEVERITY_INFO; + + // Timing. + real_t duration = -1.0; + real_t remaining_time = 0.0; + bool popped = false; + + // Messages + String message; + String tooltip; + int count = 0; + }; + Map<Control *, Toast> toasts; + + const double default_message_duration = 5.0; + + static void _error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, bool p_editor_notify, ErrorHandlerType p_type); + void _update_vbox_position(); + void _update_disable_notifications_button(); + void _auto_hide_or_free_toasts(); + + void _draw_button(); + void _draw_progress(Control *panel); + + void _set_notifications_enabled(bool p_enabled); + void _repop_old(); + +protected: + static EditorToaster *singleton; + + void _notification(int p_what); + +public: + static EditorToaster *get_singleton(); + + Control *popup(Control *p_control, Severity p_severity = SEVERITY_INFO, double p_time = 0.0, String p_tooltip = String()); + void popup_str(String p_message, Severity p_severity = SEVERITY_INFO, String p_tooltip = String()); + void close(Control *p_control); + + EditorToaster(); + ~EditorToaster(); +}; + +VARIANT_ENUM_CAST(EditorToaster::Severity); + +#endif // EDITOR_TOASTER_H diff --git a/editor/editor_vcs_interface.cpp b/editor/editor_vcs_interface.cpp index eaa8f891ec..b4b740d7c6 100644 --- a/editor/editor_vcs_interface.cpp +++ b/editor/editor_vcs_interface.cpp @@ -166,3 +166,24 @@ EditorVCSInterface *EditorVCSInterface::get_singleton() { void EditorVCSInterface::set_singleton(EditorVCSInterface *p_singleton) { singleton = p_singleton; } + +void EditorVCSInterface::create_vcs_metadata_files(VCSMetadata p_vcs_metadata_type, String &p_dir) { + if (p_vcs_metadata_type == VCSMetadata::GIT) { + FileAccess *f = FileAccess::open(p_dir.plus_file(".gitignore"), FileAccess::WRITE); + if (!f) { + ERR_FAIL_MSG(TTR("Couldn't create .gitignore in project path.")); + } else { + f->store_line("# Godot 4+ specific ignores"); + f->store_line(".godot/"); + memdelete(f); + } + f = FileAccess::open(p_dir.plus_file(".gitattributes"), FileAccess::WRITE); + if (!f) { + ERR_FAIL_MSG(TTR("Couldn't create .gitattributes in project path.")); + } else { + f->store_line("# Normalize EOL for all files that Git considers text files."); + f->store_line("* text=auto eol=lf"); + memdelete(f); + } + } +} diff --git a/editor/editor_vcs_interface.h b/editor/editor_vcs_interface.h index 52ab6d68ee..1a2adeb148 100644 --- a/editor/editor_vcs_interface.h +++ b/editor/editor_vcs_interface.h @@ -61,6 +61,12 @@ public: static EditorVCSInterface *get_singleton(); static void set_singleton(EditorVCSInterface *p_singleton); + enum class VCSMetadata { + NONE, + GIT, + }; + static void create_vcs_metadata_files(VCSMetadata p_vcs_metadata_type, String &p_dir); + bool is_addon_ready(); // Proxy functions to the editor for use diff --git a/editor/editor_zoom_widget.cpp b/editor/editor_zoom_widget.cpp index 420aeb03fe..a998ec7e5b 100644 --- a/editor/editor_zoom_widget.cpp +++ b/editor/editor_zoom_widget.cpp @@ -51,7 +51,7 @@ void EditorZoomWidget::_update_zoom_label() { } void EditorZoomWidget::_button_zoom_minus() { - set_zoom_by_increments(-6, Input::get_singleton()->is_key_pressed(KEY_ALT)); + set_zoom_by_increments(-6, Input::get_singleton()->is_key_pressed(Key::ALT)); emit_signal(SNAME("zoom_changed"), zoom); } @@ -61,7 +61,7 @@ void EditorZoomWidget::_button_zoom_reset() { } void EditorZoomWidget::_button_zoom_plus() { - set_zoom_by_increments(6, Input::get_singleton()->is_key_pressed(KEY_ALT)); + set_zoom_by_increments(6, Input::get_singleton()->is_key_pressed(Key::ALT)); emit_signal(SNAME("zoom_changed"), zoom); } @@ -169,7 +169,7 @@ EditorZoomWidget::EditorZoomWidget() { zoom_minus->set_flat(true); add_child(zoom_minus); zoom_minus->connect("pressed", callable_mp(this, &EditorZoomWidget::_button_zoom_minus)); - zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom Out"), KEY_MASK_CMD | KEY_MINUS)); + zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom Out"), KeyModifierMask::CMD | Key::MINUS)); zoom_minus->set_shortcut_context(this); zoom_minus->set_focus_mode(FOCUS_NONE); @@ -180,7 +180,7 @@ EditorZoomWidget::EditorZoomWidget() { zoom_reset->add_theme_color_override("font_outline_color", Color(0, 0, 0)); zoom_reset->add_theme_color_override("font_color", Color(1, 1, 1)); zoom_reset->connect("pressed", callable_mp(this, &EditorZoomWidget::_button_zoom_reset)); - zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom Reset"), KEY_MASK_CMD | KEY_0)); + zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom Reset"), KeyModifierMask::CMD | Key::KEY_0)); zoom_reset->set_shortcut_context(this); zoom_reset->set_focus_mode(FOCUS_NONE); zoom_reset->set_text_align(Button::TextAlign::ALIGN_CENTER); @@ -191,7 +191,7 @@ EditorZoomWidget::EditorZoomWidget() { zoom_plus->set_flat(true); add_child(zoom_plus); zoom_plus->connect("pressed", callable_mp(this, &EditorZoomWidget::_button_zoom_plus)); - zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom In"), KEY_MASK_CMD | KEY_EQUAL)); // Usually direct access key for PLUS + zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom In"), KeyModifierMask::CMD | Key::EQUAL)); // Usually direct access key for PLUS zoom_plus->set_shortcut_context(this); zoom_plus->set_focus_mode(FOCUS_NONE); diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 1d1976d7e5..abe20c693b 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -46,6 +46,7 @@ #include "scene/main/window.h" #include "scene/resources/packed_scene.h" #include "servers/display_server.h" +#include "shader_create_dialog.h" Ref<Texture2D> FileSystemDock::_get_tree_item_icon(bool p_is_valid, String p_file_type) { Ref<Texture2D> file_icon; @@ -197,7 +198,7 @@ Vector<String> FileSystemDock::_compute_uncollapsed_paths() { child = child->get_next(); } } - needs_check.remove(0); + needs_check.remove_at(0); } } } @@ -688,9 +689,11 @@ void FileSystemDock::_sort_file_info_list(List<FileSystemDock::FileInfo> &r_file r_file_list.reverse(); break; case FILE_SORT_NAME_REVERSE: + r_file_list.sort(); r_file_list.reverse(); break; default: // FILE_SORT_NAME + r_file_list.sort(); break; } } @@ -1091,7 +1094,7 @@ void FileSystemDock::_push_to_history() { history_pos++; if (history.size() > history_max_size) { - history.remove(0); + history.remove_at(0); history_pos = history_max_size - 1; } } @@ -1369,7 +1372,7 @@ void FileSystemDock::_make_dir_confirm() { EditorNode::get_singleton()->show_warning(TTR("No name provided.")); return; } else if (dir_name.find("/") != -1 || dir_name.find("\\") != -1 || dir_name.find(":") != -1 || dir_name.find("*") != -1 || - dir_name.find("|") != -1 || dir_name.find(">") != -1 || dir_name.ends_with(".") || dir_name.ends_with(" ")) { + dir_name.find("|") != -1 || dir_name.find(">") != -1 || dir_name.ends_with(".") || dir_name.ends_with(" ")) { EditorNode::get_singleton()->show_warning(TTR("Provided name contains invalid characters.")); return; } @@ -1668,7 +1671,7 @@ Vector<String> FileSystemDock::_remove_self_included_paths(Vector<String> select String last_path = ""; for (int i = 0; i < selected_strings.size(); i++) { if (last_path != "" && selected_strings[i].begins_with(last_path)) { - selected_strings.remove(i); + selected_strings.remove_at(i); i--; } if (selected_strings[i].ends_with("/")) { @@ -1702,7 +1705,7 @@ void FileSystemDock::_tree_rmb_option(int p_option) { child = child->get_next(); } - needs_check.remove(0); + needs_check.remove_at(0); } } } break; @@ -1965,6 +1968,22 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected } void FileSystemDock::_resource_created() { + String fpath = path; + if (!fpath.ends_with("/")) { + fpath = fpath.get_base_dir(); + } + + String type_name = new_resource_dialog->get_selected_type(); + if (type_name == "Shader") { + make_shader_dialog->config(fpath.plus_file("new_shader"), false, false, 0); + make_shader_dialog->popup_centered(); + return; + } else if (type_name == "VisualShader") { + make_shader_dialog->config(fpath.plus_file("new_shader"), false, false, 1); + make_shader_dialog->popup_centered(); + return; + } + Variant c = new_resource_dialog->instance_selected(); ERR_FAIL_COND(!c); @@ -1980,12 +1999,6 @@ void FileSystemDock::_resource_created() { } editor->push_item(r); - - String fpath = path; - if (!fpath.ends_with("/")) { - fpath = fpath.get_base_dir(); - } - editor->save_resource_as(RES(r), fpath); } @@ -2227,7 +2240,7 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data, drop_position -= offset; to_remove.sort(); for (int i = 0; i < to_remove.size(); i++) { - dirs.remove(to_remove[i] - i); + dirs.remove_at(to_remove[i] - i); } // Re-add them at the right position. @@ -2271,7 +2284,7 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data, } } if (!to_move.is_empty()) { - if (Input::get_singleton()->is_key_pressed(KEY_CTRL)) { + if (Input::get_singleton()->is_key_pressed(Key::CTRL)) { for (int i = 0; i < to_move.size(); i++) { String new_path; String new_path_base; @@ -2505,7 +2518,7 @@ void FileSystemDock::_tree_rmb_select(const Vector2 &p_pos) { // Popup. if (!paths.is_empty()) { - tree_popup->set_size(Size2(1, 1)); + tree_popup->reset_size(); _file_and_folders_fill_popup(tree_popup, paths); tree_popup->set_position(tree->get_screen_position() + p_pos); tree_popup->popup(); @@ -2516,7 +2529,7 @@ void FileSystemDock::_tree_rmb_empty(const Vector2 &p_pos) { // Right click is pressed in the empty space of the tree. path = "res://"; tree_popup->clear(); - tree_popup->set_size(Size2(1, 1)); + tree_popup->reset_size(); tree_popup->add_icon_item(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons")), TTR("New Folder..."), FILE_NEW_FOLDER); tree_popup->add_icon_item(get_theme_icon(SNAME("PackedScene"), SNAME("EditorIcons")), TTR("New Scene..."), FILE_NEW_SCENE); tree_popup->add_icon_item(get_theme_icon(SNAME("Script"), SNAME("EditorIcons")), TTR("New Script..."), FILE_NEW_SCRIPT); @@ -2547,7 +2560,7 @@ void FileSystemDock::_file_list_rmb_select(int p_item, const Vector2 &p_pos) { // Popup. if (!paths.is_empty()) { file_list_popup->clear(); - file_list_popup->set_size(Size2(1, 1)); + file_list_popup->reset_size(); _file_and_folders_fill_popup(file_list_popup, paths, searched_string.length() == 0); file_list_popup->set_position(files->get_global_position() + p_pos); file_list_popup->popup(); @@ -2561,7 +2574,7 @@ void FileSystemDock::_file_list_rmb_pressed(const Vector2 &p_pos) { } file_list_popup->clear(); - file_list_popup->set_size(Size2(1, 1)); + file_list_popup->reset_size(); file_list_popup->add_icon_item(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons")), TTR("New Folder..."), FILE_NEW_FOLDER); file_list_popup->add_icon_item(get_theme_icon(SNAME("PackedScene"), SNAME("EditorIcons")), TTR("New Scene..."), FILE_NEW_SCENE); @@ -2792,11 +2805,12 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { editor = p_editor; path = "res://"; - // `KEY_MASK_CMD | KEY_C` conflicts with other editor shortcuts. - ED_SHORTCUT("filesystem_dock/copy_path", TTR("Copy Path"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_C); - ED_SHORTCUT("filesystem_dock/duplicate", TTR("Duplicate..."), KEY_MASK_CMD | KEY_D); - ED_SHORTCUT("filesystem_dock/delete", TTR("Delete"), KEY_DELETE); - ED_SHORTCUT("filesystem_dock/rename", TTR("Rename..."), KEY_F2); + // `KeyModifierMask::CMD | Key::C` conflicts with other editor shortcuts. + ED_SHORTCUT("filesystem_dock/copy_path", TTR("Copy Path"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::C); + ED_SHORTCUT("filesystem_dock/duplicate", TTR("Duplicate..."), KeyModifierMask::CMD | Key::D); + ED_SHORTCUT("filesystem_dock/delete", TTR("Delete"), Key::KEY_DELETE); + ED_SHORTCUT("filesystem_dock/rename", TTR("Rename..."), Key::F2); + ED_SHORTCUT_OVERRIDE("filesystem_dock/rename", "macos", Key::ENTER); VBoxContainer *top_vbc = memnew(VBoxContainer); add_child(top_vbc); @@ -2994,6 +3008,9 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { make_script_dialog->set_title(TTR("Create Script")); add_child(make_script_dialog); + make_shader_dialog = memnew(ShaderCreateDialog); + add_child(make_shader_dialog); + new_resource_dialog = memnew(CreateDialog); add_child(new_resource_dialog); new_resource_dialog->set_base_type("Resource"); diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index 73bdd685b7..34b445f1b3 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -54,6 +54,7 @@ #include "script_create_dialog.h" class EditorNode; +class ShaderCreateDialog; class FileSystemDock : public VBoxContainer { GDCLASS(FileSystemDock, VBoxContainer); @@ -158,6 +159,7 @@ private: LineEdit *make_scene_dialog_text; ConfirmationDialog *overwrite_dialog; ScriptCreateDialog *make_script_dialog; + ShaderCreateDialog *make_shader_dialog; CreateDialog *new_resource_dialog; bool always_show_folders; @@ -205,8 +207,6 @@ private: void _set_file_display(bool p_active); void _fs_changed(); - void _tree_toggle_collapsed(); - void _select_file(const String &p_path, bool p_select_in_favorites = false); void _tree_activate_file(); void _file_list_activate_file(int p_idx); @@ -228,8 +228,6 @@ private: void _file_removed(String p_file); void _folder_removed(String p_folder); - void _files_moved(String p_old_file, String p_new_file); - void _folder_moved(String p_old_folder, String p_new_folder); void _resource_created(); void _make_dir_confirm(); diff --git a/editor/find_in_files.cpp b/editor/find_in_files.cpp index b61f6e12eb..56356ff25b 100644 --- a/editor/find_in_files.cpp +++ b/editor/find_in_files.cpp @@ -47,13 +47,13 @@ const char *FindInFiles::SIGNAL_RESULT_FOUND = "result_found"; const char *FindInFiles::SIGNAL_FINISHED = "finished"; -// TODO Would be nice in Vector and Vectors +// TODO: Would be nice in Vector and Vectors. template <typename T> inline void pop_back(T &container) { container.resize(container.size() - 1); } -// TODO Copied from TextEdit private, would be nice to extract it in a single place +// TODO: Copied from TextEdit private, would be nice to extract it in a single place. static bool is_text_char(char32_t c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'; } @@ -125,7 +125,7 @@ void FindInFiles::start() { return; } - // Init search + // Init search. _current_dir = ""; PackedStringArray init_folder; init_folder.push_back(_root_dir); @@ -145,14 +145,14 @@ void FindInFiles::stop() { } void FindInFiles::_process() { - // This part can be moved to a thread if needed + // This part can be moved to a thread if needed. OS &os = *OS::get_singleton(); - float time_before = os.get_ticks_msec(); + uint64_t time_before = os.get_ticks_msec(); while (is_processing()) { _iterate(); - float elapsed = (os.get_ticks_msec() - time_before); - if (elapsed > 1000.0 / 120.0) { + uint64_t elapsed = (os.get_ticks_msec() - time_before); + if (elapsed > 8) { // Process again after waiting 8 ticks. break; } } @@ -160,12 +160,12 @@ void FindInFiles::_process() { void FindInFiles::_iterate() { if (_folders_stack.size() != 0) { - // Scan folders first so we can build a list of files and have progress info later + // Scan folders first so we can build a list of files and have progress info later. PackedStringArray &folders_to_scan = _folders_stack.write[_folders_stack.size() - 1]; if (folders_to_scan.size() != 0) { - // Scan one folder below + // Scan one folder below. String folder_name = folders_to_scan[folders_to_scan.size() - 1]; pop_back(folders_to_scan); @@ -178,19 +178,19 @@ void FindInFiles::_iterate() { _folders_stack.push_back(sub_dirs); } else { - // Go back one level + // Go back one level. pop_back(_folders_stack); _current_dir = _current_dir.get_base_dir(); if (_folders_stack.size() == 0) { - // All folders scanned + // All folders scanned. _initial_files_count = _files_to_scan.size(); } } } else if (_files_to_scan.size() != 0) { - // Then scan files + // Then scan files. String fpath = _files_to_scan[_files_to_scan.size() - 1]; pop_back(_files_to_scan); @@ -228,14 +228,14 @@ void FindInFiles::_scan_dir(String path, PackedStringArray &out_folders) { break; } - // If there is a .gdignore file in the directory, don't bother searching it + // If there is a .gdignore file in the directory, skip searching the directory. if (file == ".gdignore") { break; } - // Ignore special dirs (such as .git and project data directory) + // Ignore special directories (such as those beginning with . and the project data directory). String project_data_dir_name = ProjectSettings::get_singleton()->get_project_data_dir_name(); - if (file.begins_with(".") || file.begins_with(project_data_dir_name)) { + if (file.begins_with(".") || file == project_data_dir_name) { continue; } if (dir->current_is_hidden()) { @@ -264,7 +264,7 @@ void FindInFiles::_scan_file(String fpath) { int line_number = 0; while (!f->eof_reached()) { - // line number starts at 1 + // Line number starts at 1. ++line_number; int begin = 0; @@ -331,7 +331,7 @@ FindInFilesDialog::FindInFilesDialog() { _replace_text_line_edit->hide(); gc->add_child(_replace_text_line_edit); - gc->add_child(memnew(Control)); // Space to maintain the grid aligned. + gc->add_child(memnew(Control)); // Space to maintain the grid alignment. { HBoxContainer *hbc = memnew(HBoxContainer); @@ -421,7 +421,7 @@ void FindInFilesDialog::set_find_in_files_mode(FindInFilesMode p_mode) { _replace_text_line_edit->show(); } - // After hiding some child controls, let's recalculate proper Dialog size + // Recalculate the dialog size after hiding child controls. set_size(Size2(get_size().x, 0)); } @@ -448,7 +448,7 @@ String FindInFilesDialog::get_folder() const { } Set<String> FindInFilesDialog::get_filter() const { - // could check the _filters_preferences but it might not have been generated yet. + // Could check the _filters_preferences but it might not have been generated yet. Set<String> filters; for (int i = 0; i < _filters_container->get_child_count(); ++i) { CheckBox *cb = (CheckBox *)_filters_container->get_child(i); @@ -492,6 +492,7 @@ void FindInFilesDialog::custom_action(const String &p_action) { CheckBox *cb = (CheckBox *)_filters_container->get_child(i); _filters_preferences[cb->get_text()] = cb->is_pressed(); } + if (p_action == "find") { emit_signal(SNAME(SIGNAL_FIND_REQUESTED)); hide(); @@ -510,7 +511,7 @@ void FindInFilesDialog::_on_search_text_modified(String text) { } void FindInFilesDialog::_on_search_text_submitted(String text) { - // This allows to trigger a global search without leaving the keyboard + // This allows to trigger a global search without leaving the keyboard. if (!_find_button->is_disabled()) { if (_mode == SEARCH_MODE) { custom_action("find"); @@ -525,7 +526,7 @@ void FindInFilesDialog::_on_search_text_submitted(String text) { } void FindInFilesDialog::_on_replace_text_submitted(String text) { - // This allows to trigger a global search without leaving the keyboard + // This allows to trigger a global search without leaving the keyboard. if (!_replace_button->is_disabled()) { if (_mode == REPLACE_MODE) { custom_action("replace"); @@ -641,13 +642,12 @@ void FindInFilesPanel::set_with_replace(bool with_replace) { _replace_container->set_visible(with_replace); if (with_replace) { - // Results show checkboxes on their left so they can be opted out + // Results show checkboxes on their left so they can be opted out. _results_display->set_columns(2); _results_display->set_column_expand(0, false); _results_display->set_column_custom_minimum_width(0, 48 * EDSCALE); - } else { - // Results are single-cell items + // Results are single-cell items. _results_display->set_column_expand(0, true); _results_display->set_columns(1); } @@ -708,12 +708,12 @@ void FindInFilesPanel::_on_result_found(String fpath, int line_number, int begin file_item->set_text(0, fpath); file_item->set_metadata(0, fpath); - // The width of this column is restrained to checkboxes, but that doesn't make sense for the parent items, - // so we override their width so they can expand to full width + // The width of this column is restrained to checkboxes, + // but that doesn't make sense for the parent items, + // so we override their width so they can expand to full width. file_item->set_expand_right(0, true); _file_items[fpath] = file_item; - } else { file_item = E->value(); } @@ -725,7 +725,7 @@ void FindInFilesPanel::_on_result_found(String fpath, int line_number, int begin // Do this first because it resets properties of the cell... item->set_cell_mode(text_index, TreeItem::CELL_MODE_CUSTOM); - // Trim result item line + // Trim result item line. int old_text_size = text.size(); text = text.strip_edges(true, false); int chars_removed = old_text_size - text.size(); @@ -780,9 +780,8 @@ void FindInFilesPanel::_on_item_edited() { if (item->is_checked(0)) { item->set_custom_color(1, _results_display->get_theme_color(SNAME("font_color"))); - } else { - // Grey out + // Grey out. Color color = _results_display->get_theme_color(SNAME("font_color")); color.a /= 2.0; item->set_custom_color(1, color); @@ -857,19 +856,19 @@ void FindInFilesPanel::_on_replace_all_clicked() { } if (locations.size() != 0) { - // Results are sorted by file, so we can batch replaces + // Results are sorted by file, so we can batch replaces. apply_replaces_in_file(fpath, locations, replace_text); modified_files.push_back(fpath); } } - // Hide replace bar so we can't trigger the action twice without doing a new search + // Hide replace bar so we can't trigger the action twice without doing a new search. _replace_container->hide(); emit_signal(SNAME(SIGNAL_FILES_MODIFIED), modified_files); } -// Same as get_line, but preserves line ending characters +// Same as get_line, but preserves line ending characters. class ConservativeGetLine { public: String get_line(FileAccess *f) { @@ -941,7 +940,7 @@ void FindInFilesPanel::apply_replaces_in_file(String fpath, const Vector<Result> } line = line.left(repl_begin) + new_text + line.substr(repl_end); - // keep an offset in case there are successive replaces in the same line + // Keep an offset in case there are successive replaces in the same line. offset += new_text.length() - (repl_end - repl_begin); } @@ -951,7 +950,7 @@ void FindInFilesPanel::apply_replaces_in_file(String fpath, const Vector<Result> buffer += conservative.get_line(f); } - // Now the modified contents are in the buffer, rewrite the file with our changes + // Now the modified contents are in the buffer, rewrite the file with our changes. Error err = f->reopen(fpath, FileAccess::WRITE); ERR_FAIL_COND_MSG(err != OK, "Cannot create file in path '" + fpath + "'."); diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp index 113306fc8a..f01c7f50f7 100644 --- a/editor/groups_editor.cpp +++ b/editor/groups_editor.cpp @@ -204,7 +204,8 @@ void GroupDialog::_add_group(String p_name) { TreeItem *new_group = groups->create_item(groups_root); new_group->set_text(0, name); - new_group->add_button(0, groups->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), 0); + new_group->add_button(0, groups->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), DELETE_GROUP); + new_group->add_button(0, groups->get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons")), COPY_GROUP); new_group->set_editable(0, true); new_group->select(0); groups->ensure_cursor_is_visible(); @@ -297,43 +298,50 @@ void GroupDialog::_load_groups(Node *p_current) { } } -void GroupDialog::_delete_group_pressed(Object *p_item, int p_column, int p_id) { +void GroupDialog::_modify_group_pressed(Object *p_item, int p_column, int p_id) { TreeItem *ti = Object::cast_to<TreeItem>(p_item); if (!ti) { return; } - String name = ti->get_text(0); + switch (p_id) { + case DELETE_GROUP: { + String name = ti->get_text(0); - undo_redo->create_action(TTR("Delete Group")); + undo_redo->create_action(TTR("Delete Group")); - List<Node *> nodes; - scene_tree->get_nodes_in_group(name, &nodes); - bool removed_all = true; - for (Node *E : nodes) { - if (_can_edit(E, name)) { - undo_redo->add_do_method(E, "remove_from_group", name); - undo_redo->add_undo_method(E, "add_to_group", name, true); - } else { - removed_all = false; - } - } + List<Node *> nodes; + scene_tree->get_nodes_in_group(name, &nodes); + bool removed_all = true; + for (Node *E : nodes) { + if (_can_edit(E, name)) { + undo_redo->add_do_method(E, "remove_from_group", name); + undo_redo->add_undo_method(E, "add_to_group", name, true); + } else { + removed_all = false; + } + } - if (removed_all) { - undo_redo->add_do_method(this, "_delete_group_item", name); - undo_redo->add_undo_method(this, "_add_group", name); - } + if (removed_all) { + undo_redo->add_do_method(this, "_delete_group_item", name); + undo_redo->add_undo_method(this, "_add_group", name); + } - undo_redo->add_do_method(this, "_group_selected"); - undo_redo->add_undo_method(this, "_group_selected"); - undo_redo->add_do_method(this, "emit_signal", "group_edited"); - undo_redo->add_undo_method(this, "emit_signal", "group_edited"); + undo_redo->add_do_method(this, "_group_selected"); + undo_redo->add_undo_method(this, "_group_selected"); + undo_redo->add_do_method(this, "emit_signal", "group_edited"); + undo_redo->add_undo_method(this, "emit_signal", "group_edited"); - // To force redraw of scene tree. - undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); - undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); + // To force redraw of scene tree. + undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); + undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); - undo_redo->commit_action(); + undo_redo->commit_action(); + } break; + case COPY_GROUP: { + DisplayServer::get_singleton()->clipboard_set(ti->get_text(p_column)); + } break; + } } void GroupDialog::_delete_group_item(const String &p_name) { @@ -437,7 +445,7 @@ GroupDialog::GroupDialog() { groups->set_v_size_flags(Control::SIZE_EXPAND_FILL); groups->add_theme_constant_override("draw_guides", 1); groups->connect("item_selected", callable_mp(this, &GroupDialog::_group_selected)); - groups->connect("button_pressed", callable_mp(this, &GroupDialog::_delete_group_pressed)); + groups->connect("button_pressed", callable_mp(this, &GroupDialog::_modify_group_pressed)); groups->connect("item_edited", callable_mp(this, &GroupDialog::_group_renamed)); HBoxContainer *chbc = memnew(HBoxContainer); @@ -582,7 +590,7 @@ void GroupsEditor::_add_group(const String &p_group) { group_name->clear(); } -void GroupsEditor::_remove_group(Object *p_item, int p_column, int p_id) { +void GroupsEditor::_modify_group(Object *p_item, int p_column, int p_id) { if (!node) { return; } @@ -591,21 +599,26 @@ void GroupsEditor::_remove_group(Object *p_item, int p_column, int p_id) { if (!ti) { return; } + switch (p_id) { + case DELETE_GROUP: { + String name = ti->get_text(0); + undo_redo->create_action(TTR("Remove from Group")); - String name = ti->get_text(0); - - undo_redo->create_action(TTR("Remove from Group")); - - undo_redo->add_do_method(node, "remove_from_group", name); - undo_redo->add_undo_method(node, "add_to_group", name, true); - undo_redo->add_do_method(this, "update_tree"); - undo_redo->add_undo_method(this, "update_tree"); + undo_redo->add_do_method(node, "remove_from_group", name); + undo_redo->add_undo_method(node, "add_to_group", name, true); + undo_redo->add_do_method(this, "update_tree"); + undo_redo->add_undo_method(this, "update_tree"); - // To force redraw of scene tree. - undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); - undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); + // To force redraw of scene tree. + undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); + undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); - undo_redo->commit_action(); + undo_redo->commit_action(); + } break; + case COPY_GROUP: { + DisplayServer::get_singleton()->clipboard_set(ti->get_text(p_column)); + } break; + } } struct _GroupInfoComparator { @@ -653,7 +666,8 @@ void GroupsEditor::update_tree() { TreeItem *item = tree->create_item(root); item->set_text(0, gi.name); if (can_be_deleted) { - item->add_button(0, get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), 0); + item->add_button(0, get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), DELETE_GROUP); + item->add_button(0, get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons")), COPY_GROUP); } else { item->set_selectable(0, false); } @@ -706,7 +720,7 @@ GroupsEditor::GroupsEditor() { tree->set_hide_root(true); tree->set_v_size_flags(Control::SIZE_EXPAND_FILL); vbc->add_child(tree); - tree->connect("button_pressed", callable_mp(this, &GroupsEditor::_remove_group)); + tree->connect("button_pressed", callable_mp(this, &GroupsEditor::_modify_group)); tree->add_theme_constant_override("draw_guides", 1); add_theme_constant_override("separation", 3 * EDSCALE); } diff --git a/editor/groups_editor.h b/editor/groups_editor.h index 69f746801f..f0a5b4a794 100644 --- a/editor/groups_editor.h +++ b/editor/groups_editor.h @@ -82,7 +82,7 @@ class GroupDialog : public AcceptDialog { void _rename_group_item(const String &p_old_name, const String &p_new_name); void _add_group(String p_name); - void _delete_group_pressed(Object *p_item, int p_column, int p_id); + void _modify_group_pressed(Object *p_item, int p_column, int p_id); void _delete_group_item(const String &p_name); bool _can_edit(Node *p_node, String p_group); @@ -95,6 +95,11 @@ protected: static void _bind_methods(); public: + enum ModifyButton { + DELETE_GROUP, + COPY_GROUP, + }; + void edit(); void set_undo_redo(UndoRedo *p_undoredo) { undo_redo = p_undoredo; } @@ -116,8 +121,7 @@ class GroupsEditor : public VBoxContainer { void update_tree(); void _add_group(const String &p_group = ""); - void _remove_group(Object *p_item, int p_column, int p_id); - void _close(); + void _modify_group(Object *p_item, int p_column, int p_id); void _show_group_dialog(); @@ -125,6 +129,11 @@ protected: static void _bind_methods(); public: + enum ModifyButton { + DELETE_GROUP, + COPY_GROUP, + }; + void set_undo_redo(UndoRedo *p_undoredo) { undo_redo = p_undoredo; } void set_current(Node *p_node); diff --git a/editor/icons/FogMaterial.svg b/editor/icons/FogMaterial.svg new file mode 100644 index 0000000000..5db7dea374 --- /dev/null +++ b/editor/icons/FogMaterial.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.5 9.0000002c-.2761429-.0000014-.5000014.2238571-.5.5-.0000014.2761429.2238571.5000008.5.4999998l8-.0000002c.276143.0000012.500001-.2238569.5-.4999998.000001-.2761429-.223857-.5000014-.5-.5z" fill="#45d7ff"/><path d="m3.5 11c-.2761429-.000001-.5000014.223857-.5.5-.0000014.276143.2238571.500001.5.5h5c.2761429.000001.500001-.223857.5-.5.000001-.276143-.2238571-.500001-.5-.5z" fill="#8045ff"/><path d="m5.5 13c-.2761424 0-.5.223858-.5.5s.2238576.5.5.5h5c.276142 0 .5-.223858.5-.5s-.223858-.5-.5-.5z" fill="#ff4596"/><path d="m15 7h-13.936663c.2611574 1 1.436663 1 1.436663 1h11.5s1 0 1-1z" fill="#45ffa2"/><path d="m13.857422 5h-10.857422s-2 0-2 1.5c0 .216176.0100075.3416435.063337.5h13.936663c0-1-1.5-1-1.5-1s.23811-.4733054.357422-1z" fill="#80ff45"/><path d="m11.152344 3h1.847656c-.730134-.4197888-1.344054-.2676656-1.847656 0z" fill="#ff4545"/><path d="m9.7089844 3h-6.2714844c-.4375 1-.4375 2-.4375 2h10.857422c.149158-.6584498.108902-1.4444139-.857422-2h-1.847656c-.696054.3699541-1.152344 1-1.152344 1s-.161454-.5556722-.2910156-1z" fill="#ffe345"/><path d="m6.5 1c-1.75 0-2.625 1-3.0625 2h6.2714844c-.2591912-.8888889-.8754469-2-3.2089844-2z" fill="#ff4545"/><path d="m10.5 11c-.276143-.000001-.500001.223857-.5.5-.000001.276143.223857.500001.5.5h2.5c.276143.000001.500001-.223857.5-.5.000001-.276143-.223857-.500001-.5-.5z" fill="#8045ff"/></svg> diff --git a/editor/icons/FogVolume.svg b/editor/icons/FogVolume.svg new file mode 100644 index 0000000000..b0a18eb29d --- /dev/null +++ b/editor/icons/FogVolume.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#fc7f7f"><g fill-opacity=".996078"><path d="m4.5 9.0000002c-.2761429-.0000014-.5000014.2238571-.5.5-.0000014.2761429.2238571.5000008.5.4999998l8-.0000002c.276143.0000012.500001-.2238569.5-.4999998.000001-.2761429-.223857-.5000014-.5-.5z"/><path d="m3.5 11c-.2761429-.000001-.5000014.223857-.5.5-.0000014.276143.2238571.500001.5.5h5c.2761429.000001.500001-.223857.5-.5.000001-.276143-.2238571-.500001-.5-.5z"/><path d="m5.5 13c-.2761424 0-.5.223858-.5.5s.2238576.5.5.5h5c.276142 0 .5-.223858.5-.5s-.223858-.5-.5-.5z"/></g><path d="m2.5 8s-1.5 0-1.5-1.5 2-1.5 2-1.5 0-4 3.5-4 3.5 3 3.5 3 1.260711-2 3-1 .5 3 .5 3 1.5 0 1.5 1-1 1-1 1z" fill-opacity=".99608"/><path d="m10.5 11c-.276143-.000001-.500001.223857-.5.5-.000001.276143.223857.500001.5.5h2.5c.276143.000001.500001-.223857.5-.5.000001-.276143-.223857-.500001-.5-.5z" fill-opacity=".996078"/></g></svg> diff --git a/editor/icons/GradientTexture.svg b/editor/icons/GradientTexture1D.svg index fa03e69805..fa03e69805 100644 --- a/editor/icons/GradientTexture.svg +++ b/editor/icons/GradientTexture1D.svg diff --git a/editor/icons/GradientTexture2D.svg b/editor/icons/GradientTexture2D.svg new file mode 100644 index 0000000000..ef40323b8c --- /dev/null +++ b/editor/icons/GradientTexture2D.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g fill="#e0e0e0"> <path d="M 2,1 C 1.447715,1 1,1.4477153 1,2 v 12.000001 c 0,0.552285 0.447715,1 1,1 h 11.999999 c 0.552285,0 1,-0.447715 1,-1 V 2 c 0,-0.5522847 -0.447715,-1 -1,-1 z m 1,2.0000001 h 9.999999 V 11.000001 H 3 Z" fill-opacity="0.99608"/> <path d="m 5.5,3.5 v 1 h 1 v -1 z m 1,1 v 1 h 1 v -1 z m 1,0 h 1 v 1 h -1 v 1 h 1 v 1 h 1 v 1 h 1 v -1 h 1 v 1 h 1 v -1 -1 -1 -1 -1 h -1 -1 -1 -1 -1 z m 4,4 h -1 v 1 h 1 z m 0,1 v 1 h 1 v -1 z m -1,0 h -1 v 1 h 1 z m -1,0 v -1 h -1 v 1 z m -1,-1 v -1 h -1 v 1 z m -1,0 h -1 v 1 h 1 z m 0,-1 v -1 h -1 v 1 z m -1,-1 v -1 h -1 v 1 z" /> </g> </svg> diff --git a/editor/icons/InterpCubic.svg b/editor/icons/InterpCubic.svg index ad2ed51ee1..b542986ea6 100644 --- a/editor/icons/InterpCubic.svg +++ b/editor/icons/InterpCubic.svg @@ -1 +1 @@ -<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c3 0 3-4 6-4s3 4 6 4" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg> +<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4c5 0 3-4 6-4s1 4 6 4" fill="none" stroke="#5fb2ff" stroke-linecap="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg> diff --git a/editor/icons/InterpLinear.svg b/editor/icons/InterpLinear.svg index 241a82fc8f..966ddfdc31 100644 --- a/editor/icons/InterpLinear.svg +++ b/editor/icons/InterpLinear.svg @@ -1 +1 @@ -<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4 6-4 6 4" fill="none" stroke="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg> +<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1050.4 6-4 6 4" fill="none" stroke="#ffca5f" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" transform="translate(0 -1044.4)"/></svg> diff --git a/editor/icons/InterpWrapClamp.svg b/editor/icons/InterpWrapClamp.svg index 6ba8e78500..b589542019 100644 --- a/editor/icons/InterpWrapClamp.svg +++ b/editor/icons/InterpWrapClamp.svg @@ -1 +1 @@ -<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v6h2v-2.9863-3.0137zm2 3.0137a1.0001 1.0001 0 0 0 .29297.69336l2 2a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-.29297-.29297h3.1719l-.29297.29297a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 .29297-.72266 1.0001 1.0001 0 0 0 -.29297-.69141l-2-2a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l.29297.29297h-3.1719l.29297-.29297a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102l-2 2a1.0001 1.0001 0 0 0 -.29297.7207zm10-.029297v3.0156h2v-6h-2z" fill="#e0e0e0"/></svg> +<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v6h2v-2.9863-3.0137zm2 3.0137a1.0001 1.0001 0 0 0 .29297.69336l2 2a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141l-.29297-.29297h3.1719l-.29297.29297a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 .29297-.72266 1.0001 1.0001 0 0 0 -.29297-.69141l-2-2a1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102 1 1 0 0 0 0 1.4141l.29297.29297h-3.1719l.29297-.29297a1 1 0 0 0 0-1.4141 1 1 0 0 0 -.7207-.29102 1 1 0 0 0 -.69336.29102l-2 2a1.0001 1.0001 0 0 0 -.29297.7207zm10-.029297v3.0156h2v-6h-2z" fill="#fc7f7f"/></svg> diff --git a/editor/icons/InterpWrapLoop.svg b/editor/icons/InterpWrapLoop.svg index 57670f97ce..4faf7805f8 100644 --- a/editor/icons/InterpWrapLoop.svg +++ b/editor/icons/InterpWrapLoop.svg @@ -1 +1 @@ -<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 0-3 2 3 2v-1h3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1v2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3h-3zm-5 1a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h3v1l3-2-3-2v1h-3a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#e0e0e0"/></svg> +<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m9 0-3 2 3 2v-1h3a1 1 0 0 1 1 1 1 1 0 0 1 -1 1v2a3 3 0 0 0 3-3 3 3 0 0 0 -3-3h-3zm-5 1a3 3 0 0 0 -3 3 3 3 0 0 0 3 3h3v1l3-2-3-2v1h-3a1 1 0 0 1 -1-1 1 1 0 0 1 1-1z" fill="#c38ef1"/></svg> diff --git a/editor/icons/KeyBlendShape.svg b/editor/icons/KeyBlendShape.svg new file mode 100644 index 0000000000..42f7341942 --- /dev/null +++ b/editor/icons/KeyBlendShape.svg @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="10" + viewBox="0 0 10 10" + width="10" + version="1.1" + id="svg80" + sodipodi:docname="KeyBlendShape.svg" + inkscape:version="1.1 (1:1.1+202106031931+af4d65493e)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs84" /> + <sodipodi:namedview + id="namedview82" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="84.4" + inkscape:cx="2.6599526" + inkscape:cy="5.0059242" + inkscape:window-width="1848" + inkscape:window-height="1016" + inkscape:window-x="72" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg80" /> + <rect + fill="#3cf34e" + height="6.1027" + ry=".76286" + transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" + width="6.1027" + x="-740.13947" + y="741.10779" + id="rect78" + style="fill:#5ad5c4;fill-opacity:1" /> +</svg> diff --git a/editor/icons/KeyEasedSelected.svg b/editor/icons/KeyEasedSelected.svg new file mode 100644 index 0000000000..c06d94c553 --- /dev/null +++ b/editor/icons/KeyEasedSelected.svg @@ -0,0 +1 @@ +<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#5fb2ff" height="9.999999" rx=".948002" stroke-width="1.2427" width="9.999999" x=".000001" y=".000035"/><rect fill="#003e7a" height="5.628136" rx=".533549" stroke-width=".699406" transform="matrix(.99989481 .01450427 .01450427 .99989481 0 0)" width="5.628136" x="2.115027" y="2.114924"/></svg> diff --git a/editor/icons/KeyTrackBlendShape.svg b/editor/icons/KeyTrackBlendShape.svg new file mode 100644 index 0000000000..e82f0d6a6f --- /dev/null +++ b/editor/icons/KeyTrackBlendShape.svg @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="10" + viewBox="0 0 10 10" + width="10" + version="1.1" + id="svg12" + sodipodi:docname="KeyTrackBlendShape.svg" + inkscape:version="1.1 (1:1.1+202106031931+af4d65493e)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs16" /> + <sodipodi:namedview + id="namedview14" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="29.839906" + inkscape:cx="-3.5690461" + inkscape:cy="9.0985541" + inkscape:window-width="1848" + inkscape:window-height="1016" + inkscape:window-x="72" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg12" /> + <ellipse + style="fill:none;fill-opacity:0.401212;stroke:none;stroke-width:4.7811;stroke-linejoin:round" + id="path921" + cx="-0.88986981" + cy="6.0959954" + rx="1.2495773" + ry="1.0867468" /> + <path + id="path1910" + style="color:#000000;fill:#5ad5c4;stroke-linejoin:round;-inkscape-stroke:none" + d="m 4.5230825,1.1341567 c -2.1310744,0.017055 -3.86718737,1.7635044 -3.86718737,3.8984375 0,1.8778511 1.34348597,3.4523891 3.11718737,3.8164061 L 3.95277,7.5794693 C 2.7929991,7.3095662 1.9351921,6.2780435 1.9351921,5.0325942 c 0,-1.4262775 1.123493,-2.5732858 2.5390622,-2.6152344 v 0.017578 h 0.2011719 l 0.1796875,-1.28125 H 4.5230825 v -0.011719 c 0,-0.00263 -2.64e-5,-0.00518 0,-0.00781 z m 1.6816406,0.019531 -0.1796875,1.28125 h 1.3085937 c 0.078866,0 0.1230469,0.044181 0.1230469,0.1230469 v 4.9882815 c 0,0.07887 -0.044181,0.121093 -0.1230469,0.121094 H 5.2887075 L 5.10902,8.9486103 h 2.2246093 c 0.7663818,0 1.4042969,-0.635962 1.4042969,-1.402344 V 2.5579848 c 0,-0.7663818 -0.637915,-1.4042969 -1.4042969,-1.4042969 z" /> +</svg> diff --git a/editor/icons/KeyTrackPosition.svg b/editor/icons/KeyTrackPosition.svg new file mode 100644 index 0000000000..05c6e88841 --- /dev/null +++ b/editor/icons/KeyTrackPosition.svg @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="10" + viewBox="0 0 10 10" + width="10" + version="1.1" + id="svg12" + sodipodi:docname="KeyTrackPosition.svg" + inkscape:version="1.1 (1:1.1+202106031931+af4d65493e)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs16" /> + <sodipodi:namedview + id="namedview14" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="42.2" + inkscape:cx="12.78436" + inkscape:cy="6.1729858" + inkscape:window-width="1848" + inkscape:window-height="1016" + inkscape:window-x="72" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg12" /> + <ellipse + style="fill:none;fill-opacity:0.401212;stroke:none;stroke-width:4.7811;stroke-linejoin:round" + id="path921" + cx="-0.88986981" + cy="6.0959954" + rx="1.2495773" + ry="1.0867468" /> + <path + d="M 4.949661,0.60426977 A 0.6444116,0.6444116 0 0 0 4.504153,0.79178767 L 3.215459,2.0804819 4.12663,2.9916532 4.95977,2.1585124 5.792911,2.9916532 6.704083,2.0804819 5.415388,0.79178767 A 0.6444116,0.6444116 0 0 0 4.949744,0.60426977 Z M 1.926771,3.3691634 0.638077,4.6578577 a 0.6444116,0.6444116 0 0 0 0,0.9111713 L 1.926771,6.8577233 2.837942,5.946552 2.004801,5.1134111 2.837942,4.2802702 1.926771,3.3690989 Z m 6.065948,0 -0.911171,0.9111713 0.83314,0.8331409 -0.83314,0.8331408 0.911171,0.9111714 1.288694,-1.2886944 a 0.6444116,0.6444116 0 0 0 0,-0.9111713 L 7.992719,3.3692278 Z M 4.959777,3.8247361 A 1.2886943,1.2886943 0 0 0 3.671083,5.1134305 1.2886943,1.2886943 0 0 0 4.959777,6.4021248 1.2886943,1.2886943 0 0 0 6.248471,5.1134305 1.2886943,1.2886943 0 0 0 4.959777,3.8247361 Z m -0.83314,3.4105296 -0.911172,0.9111715 1.288694,1.288694 a 0.6444116,0.6444116 0 0 0 0.911171,0 L 6.704025,8.1464372 5.792853,7.2352657 4.959712,8.0684062 4.126572,7.2352657 Z" + fill="#e0e0e0" + fill-opacity="0.99608" + id="path1400" + style="fill:#ea7940;fill-opacity:1;stroke-width:0.644347" /> +</svg> diff --git a/editor/icons/KeyTrackRotation.svg b/editor/icons/KeyTrackRotation.svg new file mode 100644 index 0000000000..d05e381eb2 --- /dev/null +++ b/editor/icons/KeyTrackRotation.svg @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="10" + viewBox="0 0 10 10" + width="10" + version="1.1" + id="svg12" + sodipodi:docname="KeyTrackRotation.svg" + inkscape:version="1.1 (1:1.1+202106031931+af4d65493e)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs16" /> + <sodipodi:namedview + id="namedview14" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="42.2" + inkscape:cx="1.9075829" + inkscape:cy="5.8175355" + inkscape:window-width="1848" + inkscape:window-height="1016" + inkscape:window-x="72" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg12" /> + <ellipse + style="fill:none;fill-opacity:0.401212;stroke:none;stroke-width:4.7811;stroke-linejoin:round" + id="path921" + cx="-0.88986981" + cy="6.0959954" + rx="1.2495773" + ry="1.0867468" /> + <path + d="m 5.0711986,0.88214062 a 4.1086779,4.1086779 0 0 0 -0.178839,0.00115 4.1086779,4.1086779 0 0 0 -0.409265,0.033245 A 4.1086779,4.1086779 0 0 0 0.99001362,4.1883346 4.1086779,4.1086779 0 0 0 2.1467236,7.9244144 h -0.648877 v 1.1739077 h 2.347816 a 0.58701268,0.58701268 0 0 0 0.569756,-0.729119 l -0.586953,-2.3478164 -1.139514,0.2854534 0.165082,0.6580347 a 2.9347699,2.9347699 0 0 1 -0.769204,-1.9752178 2.9347699,2.9347699 0 0 1 2.93477,-2.93477 2.9347699,2.9347699 0 0 1 2.93477,2.93477 2.9347699,2.9347699 0 0 1 -0.860944,2.0738257 l 0.831127,0.8311266 A 4.1086779,4.1086779 0 0 0 8.7040866,3.1726236 4.1086779,4.1086779 0 0 0 5.0711336,0.88215292 Z m -0.05159,2.93359608 a 1.173908,1.173908 0 0 0 -1.173907,1.173908 1.173908,1.173908 0 0 0 1.173907,1.173908 1.173908,1.173908 0 0 0 1.173909,-1.173908 1.173908,1.173908 0 0 0 -1.173909,-1.173908 z" + fill="#e0e0e0" + fill-opacity="0.99608" + id="path1165" + style="fill:#ff2b88;fill-opacity:1;stroke-width:0.586954" /> +</svg> diff --git a/editor/icons/KeyTrackScale.svg b/editor/icons/KeyTrackScale.svg new file mode 100644 index 0000000000..9269ccbca2 --- /dev/null +++ b/editor/icons/KeyTrackScale.svg @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="10" + viewBox="0 0 10 10" + width="10" + version="1.1" + id="svg12" + sodipodi:docname="KeyTrackScale.svg" + inkscape:version="1.1 (1:1.1+202106031931+af4d65493e)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs16" /> + <sodipodi:namedview + id="namedview14" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="42.2" + inkscape:cx="1.9075829" + inkscape:cy="5.8175355" + inkscape:window-width="1848" + inkscape:window-height="1016" + inkscape:window-x="72" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg12" /> + <ellipse + style="fill:none;fill-opacity:0.401212;stroke:none;stroke-width:4.7811;stroke-linejoin:round" + id="path921" + cx="-0.88986981" + cy="6.0959954" + rx="1.2495773" + ry="1.0867468" /> + <path + d="M 5.5742494,0.94786723 A 0.58774585,0.58774585 0 0 0 4.9865036,1.535613 0.58774585,0.58774585 0 0 0 5.5742494,2.1233589 h 1.519852 L 6.334146,2.8833142 7.1652774,3.7144456 7.9252328,2.9544903 V 4.4743422 A 0.58774585,0.58774585 0 0 0 8.5129787,5.0620881 0.58774585,0.58774585 0 0 0 9.1007245,4.4743422 V 1.535613 A 0.58780462,0.58780462 0 0 0 8.5129787,0.94786723 Z M 4.9865036,3.8865964 A 1.1754917,1.1754917 0 0 0 3.8110119,5.0620881 1.1754917,1.1754917 0 0 0 4.9865036,6.2375798 1.1754917,1.1754917 0 0 0 6.1619953,5.0620881 1.1754917,1.1754917 0 0 0 4.9865036,3.8865964 Z M 1.4600285,5.0620881 A 0.58774585,0.58774585 0 0 0 0.8722826,5.6498339 V 8.5885638 A 0.58780462,0.58780462 0 0 0 1.4600285,9.1763092 H 4.3987577 A 0.58774585,0.58774585 0 0 0 4.9865036,8.5885638 0.58774585,0.58774585 0 0 0 4.3987577,8.0008173 H 2.8789057 L 3.6388611,7.2408619 2.8077297,6.4097305 2.0477743,7.1696859 V 5.6498339 A 0.58774585,0.58774585 0 0 0 1.4600285,5.0620881 Z" + fill="#e0e0e0" + fill-opacity="0.99608" + id="path7" + style="fill:#eac840;fill-opacity:1;stroke-width:0.587745" /> +</svg> diff --git a/editor/icons/KeyValueEased.svg b/editor/icons/KeyValueEased.svg new file mode 100644 index 0000000000..4e4a33c006 --- /dev/null +++ b/editor/icons/KeyValueEased.svg @@ -0,0 +1 @@ +<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><rect fill="#e0e0e0" height="8.000001" rx="1.000032" ry="1.00003" stroke-width="1.3109" transform="rotate(-90)" width="8.000016" x="-9.000016" y=".999999"/></svg> diff --git a/editor/icons/KeyXPosition.svg b/editor/icons/KeyXPosition.svg new file mode 100644 index 0000000000..5816a241c9 --- /dev/null +++ b/editor/icons/KeyXPosition.svg @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="10" + viewBox="0 0 10 10" + width="10" + version="1.1" + id="svg1678" + sodipodi:docname="KeyXPosition.svg" + inkscape:version="1.1 (1:1.1+202106031931+af4d65493e)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs1682" /> + <sodipodi:namedview + id="namedview1680" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="84.4" + inkscape:cx="4.9940758" + inkscape:cy="5.0059242" + inkscape:window-width="1848" + inkscape:window-height="1016" + inkscape:window-x="72" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg1678" /> + <rect + fill="#ea7940" + height="6.1027" + ry=".76286" + transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 -1042.4)" + width="6.1027" + x="-740.13947" + y="741.10779" + id="rect1676" /> +</svg> diff --git a/editor/icons/KeyXRotation.svg b/editor/icons/KeyXRotation.svg new file mode 100644 index 0000000000..6cd5a67ac0 --- /dev/null +++ b/editor/icons/KeyXRotation.svg @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="10" + viewBox="0 0 10 10" + width="10" + version="1.1" + id="svg1678" + sodipodi:docname="KeyXRotation.svg" + inkscape:version="1.1 (1:1.1+202106031931+af4d65493e)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs1682" /> + <sodipodi:namedview + id="namedview1680" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="84.4" + inkscape:cx="0.32582938" + inkscape:cy="5.0059242" + inkscape:window-width="1848" + inkscape:window-height="1016" + inkscape:window-x="72" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg1678" /> + <rect + fill="#ea7940" + height="6.1027002" + ry="0.76286" + transform="rotate(-45,-1258.2881,-521.2)" + width="6.1030002" + x="-740.13947" + y="741.10779" + id="rect1676" + style="fill:#ee3c94;fill-opacity:1" /> +</svg> diff --git a/editor/icons/KeyXScale.svg b/editor/icons/KeyXScale.svg new file mode 100644 index 0000000000..588fa5d2f3 --- /dev/null +++ b/editor/icons/KeyXScale.svg @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="10" + viewBox="0 0 10 10" + width="10" + version="1.1" + id="svg1678" + sodipodi:docname="KeyXScale.svg" + inkscape:version="1.1 (1:1.1+202106031931+af4d65493e)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs1682" /> + <sodipodi:namedview + id="namedview1680" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="84.4" + inkscape:cx="2.6658768" + inkscape:cy="5.0059242" + inkscape:window-width="1473" + inkscape:window-height="752" + inkscape:window-x="122" + inkscape:window-y="114" + inkscape:window-maximized="0" + inkscape:current-layer="svg1678" /> + <rect + fill="#ea7940" + height="6.1027002" + ry="0.76286" + transform="rotate(-45,-1258.2881,-521.2)" + width="6.1030002" + x="-740.13947" + y="741.10779" + id="rect1676" + style="fill:#dbbf4f;fill-opacity:1" /> +</svg> diff --git a/editor/icons/MirrorX.svg b/editor/icons/MirrorX.svg new file mode 100644 index 0000000000..fa668986ac --- /dev/null +++ b/editor/icons/MirrorX.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#e0e0e0" stroke-opacity=".99608" stroke-width="2" transform="translate(0 -1036.4)"><path d="m4 1042.4-2 2 2 2" stroke-linecap="round" stroke-linejoin="round"/><path d="m2 1044.4h11"/><path d="m12 1042.4 2 2-2 2" stroke-linecap="round" stroke-linejoin="round"/></g></svg> diff --git a/editor/icons/MirrorY.svg b/editor/icons/MirrorY.svg new file mode 100644 index 0000000000..bb4e4d3543 --- /dev/null +++ b/editor/icons/MirrorY.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11.012 1048.4a1.0001 1.0001 0 0 0 -1.7168-.6973l-.29297.293v-7.1719l.29297.293a1.0001 1.0001 0 0 0 1.7148-.7266 1.0001 1.0001 0 0 0 -.30078-.6875l-2-2a1.0001 1.0001 0 0 0 -1.4141 0l-2 2a1.0001 1.0001 0 1 0 1.4141 1.4141l.29297-.293v7.1719l-.29297-.293a1.0001 1.0001 0 1 0 -1.4141 1.4141l2 2a1.0001 1.0001 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 .30273-.7168z" fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"/></svg> diff --git a/editor/icons/NewKey.svg b/editor/icons/NewKey.svg new file mode 100644 index 0000000000..fc8507e6c4 --- /dev/null +++ b/editor/icons/NewKey.svg @@ -0,0 +1 @@ +<svg enable-background="new 0 0 16 16" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".9961"><path d="m13 9h-2v2h-2v2h2v2h2v-2h2v-2h-2z"/><path d="m10 9.723c-.596-.347-1-.985-1-1.723 0-1.104.896-2 2-2s2 .896 2 2h1v2h.445c.344-.591.555-1.268.555-2 0-2.209-1.791-4-4-4-1.822.002-3.414 1.235-3.869 3h-6.131v2h1v2h3v-2h2.133c.16.62.466 1.169.867 1.627v-.627h2z"/></g></svg> diff --git a/editor/icons/Notification.svg b/editor/icons/Notification.svg new file mode 100644 index 0000000000..1f1f9c3e15 --- /dev/null +++ b/editor/icons/Notification.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m12.089506 1.2353795c-.498141-.2384823-1.095292-.027987-1.333775.4701537-.01372.028981-.02341.059557-.03428.089693-.01467.023016-.02777.046925-.04071.071459-.04899-.00527-.09728-.00862-.146087-.011473-1.4730257-.6255101-3.1777024.0153376-3.8738627 1.4563251l-1.7272425 3.6078572s-.3364181.7034345-.8079671 1.1268133c-.00105.0009371-.00239.00174-.00344.00268-.2721193.1337295-.5707545.185826-.8605632.0470816-.4981411-.2384824-1.0952924-.0279876-1.3337749.4701537-.01605.033526-.029907.066894-.041944.1011828-.018769.030371-.036749.06319-.052515.096122-.2384825.4981412-.027988 1.0952923.4701537 1.3337751l9.0196437 4.318106c.498141.238482 1.095292.02799 1.333775-.470154.01577-.03293.0301-.0675.04191-.1012.0192-.03086.0365-.06257.05255-.0961.238483-.498141.02799-1.095292-.470153-1.333775-.901965-.43181-.03834-2.235739-.03834-2.235739l1.727237-3.6078618c.715447-1.4944233.08396-3.2858776-1.410461-4.0013247.238482-.4981411.02799-1.0952926-.470154-1.333775zm-5.5145786 11.3714015c-.322341.673306-.037829 1.480435.6354753 1.802775.6733031.32234 1.4804334.03783 1.8027749-.635476z" fill="#e6e6e6"/></svg> diff --git a/editor/icons/NotificationDisabled.svg b/editor/icons/NotificationDisabled.svg new file mode 100644 index 0000000000..0e4465bee8 --- /dev/null +++ b/editor/icons/NotificationDisabled.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11.705078 1.1386719c-.389281-.0180576-.770356.1928007-.949219.5664062-.01372.028981-.024286.0597078-.035156.0898438-.01467.023016-.026122.0477316-.039062.0722656-.04899-.00527-.097678-.0088657-.146485-.0117187-1.4730253-.6255102-3.1788394.0160437-3.8749998 1.4570312l-1.7265624 3.6074219s-.3370448.7035743-.8085938 1.1269531l-.0019531.0019531c-.2721193.1337295-.5715196.1856194-.8613281.046875-.4981413-.2384824-1.0955019-.0274382-1.3339844.4707031-.01605.0335262-.0289787.0672737-.0410156.1015626-.0187691.0303709-.0369684.0627711-.0527344.0957031-.2384825.4981412-.0293917 1.0955019.46875 1.3339841l.3398437.16211 10.8984379-6.9394535c-.263272-.3070418-.592225-.5660832-.980469-.7519531.238482-.4981411.027441-1.0935489-.470703-1.3320313-.124536-.0596206-.255006-.091637-.384766-.0976562zm2.435547 2.8652343a.94188849 1 0 0 0 -.566406.1386719l-12.1171878 7.7148439a.94188849 1 0 0 0 -.3222656 1.373047.94188849 1 0 0 0 1.2910156.341797l12.1171878-7.7148441a.94188849 1 0 0 0 .322265-1.3710938.94188849 1 0 0 0 -.724609-.4824219zm-.509766 3.2753907-7.3867184 4.7050781 5.0781254 2.431641c.498141.238482 1.095501.027442 1.333984-.470704.01577-.03293.031159-.067862.042969-.101562.0192-.03086.036684-.062173.052734-.095703.238483-.498141.02744-1.095501-.470703-1.333985-.901965-.431809-.039063-2.236328-.039062-2.236328zm-7.0566402 5.3281251c-.322341.673306-.0365856 1.480394.6367187 1.802734.6733031.32234 1.4803929.036588 1.8027344-.636718z" fill="#e6e6e6"/></svg> diff --git a/editor/icons/OverbrightIndicator.svg b/editor/icons/OverbrightIndicator.svg index 70894361ce..f618980d51 100644 --- a/editor/icons/OverbrightIndicator.svg +++ b/editor/icons/OverbrightIndicator.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m0 0v10l10-10z" fill="#fff"/><path d="m0 12 12-12h-2l-10 10z" fill="#000003"/></svg> +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m.5.5v10l10-10z" fill="#fff" stroke="#000"/><path d="m0 12 12-12h-1.714286l-10.285714 10.285714z" fill="#000003" stroke-width="2"/></svg> diff --git a/editor/icons/PingPongLoop.svg b/editor/icons/PingPongLoop.svg new file mode 100644 index 0000000000..c44f889b49 --- /dev/null +++ b/editor/icons/PingPongLoop.svg @@ -0,0 +1 @@ +<svg enable-background="new 0 0 16 16" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".9961"><path d="m10 7h-4v-2l-4 3 4 3v-2h4v2l4-3-4-3z"/><path d="m0 1v14h2v-7-7z"/><path d="m14 1v7 7h2v-14z"/></g></svg> diff --git a/editor/icons/ReverseGradient.svg b/editor/icons/ReverseGradient.svg new file mode 100644 index 0000000000..12f80d12dd --- /dev/null +++ b/editor/icons/ReverseGradient.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><linearGradient id="b" x1=".26458" x2="3.9688" y1=".79375" y2=".79375" gradientTransform="scale(3.7795)" gradientUnits="userSpaceOnUse"><stop stop-color="#ccc" offset="0"/><stop stop-color="#ccc" stop-opacity="0" offset="1"/></linearGradient><linearGradient id="a" x1=".26458" x2="3.9688" y1="3.4396" y2="3.4396" gradientTransform="matrix(3.7795 0 0 3.7795 -16 -1.1865e-7)" gradientUnits="userSpaceOnUse"><stop stop-color="#ccc" offset="0"/><stop stop-color="#ccc" stop-opacity="0" offset="1"/></linearGradient></defs><g><rect x="1" y="1" width="14" height="4" ry="1" fill="url(#b)"/><rect transform="scale(-1,1)" x="-15" y="11" width="14" height="4" ry="1" fill="url(#a)" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.7795"/><path d="m6 6 2 4 2-4z" fill="#ccc"/></g></svg> diff --git a/editor/icons/RotateLeft.svg b/editor/icons/RotateLeft.svg new file mode 100644 index 0000000000..1200df1dde --- /dev/null +++ b/editor/icons/RotateLeft.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/></g></svg> diff --git a/editor/icons/RotateRight.svg b/editor/icons/RotateRight.svg new file mode 100644 index 0000000000..d69e6a7705 --- /dev/null +++ b/editor/icons/RotateRight.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="matrix(-1 0 0 1 16.026308 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/></g></svg> diff --git a/editor/icons/ShapeCast2D.svg b/editor/icons/ShapeCast2D.svg new file mode 100644 index 0000000000..dcdba92f45 --- /dev/null +++ b/editor/icons/ShapeCast2D.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#a5b7f3"><path d="m7 1v9h-3l4 5 4-5h-3v-9z"/><circle cx="7.990566" cy="4.8202" r="4.009434"/></g></svg> diff --git a/editor/icons/Tabs.svg b/editor/icons/TabBar.svg index e20a1a0131..e20a1a0131 100644 --- a/editor/icons/Tabs.svg +++ b/editor/icons/TabBar.svg diff --git a/editor/icons/TrackCapture.svg b/editor/icons/TrackCapture.svg index aaa4a20e4a..b3d5f09eff 100644 --- a/editor/icons/TrackCapture.svg +++ b/editor/icons/TrackCapture.svg @@ -1 +1 @@ -<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m2.1665128.99764963c-.422625 0-.763672.34104737-.763672.76367187v4.5742187c0 .4226242.341047.7617192.763672.7617192h4.472656c.422625 0 .763672-.339095.763672-.7617192v-.9882812h-3.300781c-.1662 0-.298828-.3390943-.298828-.7617188v-1.2246094c0-.4226244.132628-.7636718.298828-.7636718h3.300781v-.8359375c0-.4226245-.341047-.76367187-.763672-.76367187z"/><path d="m9.1827441 4.7953408c.5166221-1.0415625 1.0955249-2.2117429 1.2864509-2.600401l.347137-.7066511.679654.00665.679654.00665.956945 2.3125c.526319 1.271875 1.007254 2.4334375 1.068744 2.5812497l.1118.26875h-.597215-.597214l-.332849-.6437497-.332849-.64375h-1.133826-1.133825l-.3786749.6561133-.3786747.6561134-.5922856.000137-.592285.000136zm3.1779349-.369483c.0042-.00346-.233487-.4884588-.528245-1.0777779l-.535922-1.0714891-.03691.0875c-.0203.048125-.183516.425-.362699.8375-.179182.4125-.355738.85125-.392346.975-.03661.12375-.07127.2390723-.07703.2562715-.0083.024853.188215.027989.957503.015278.532385-.0088.971429-.018823.975651-.022283z" stroke="#e0e0e0" stroke-width=".803"/></g></svg> +<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e1da5b"><path d="m2.1665128.99764963c-.422625 0-.763672.34104737-.763672.76367187v4.5742187c0 .4226242.341047.7617192.763672.7617192h4.472656c.422625 0 .763672-.339095.763672-.7617192v-.9882812h-3.300781c-.1662 0-.298828-.3390943-.298828-.7617188v-1.2246094c0-.4226244.132628-.7636718.298828-.7636718h3.300781v-.8359375c0-.4226245-.341047-.76367187-.763672-.76367187z"/><path d="m9.1827441 4.7953408c.5166221-1.0415625 1.0955249-2.2117429 1.2864509-2.600401l.347137-.7066511.679654.00665.679654.00665.956945 2.3125c.526319 1.271875 1.007254 2.4334375 1.068744 2.5812497l.1118.26875h-.597215-.597214l-.332849-.6437497-.332849-.64375h-1.133826-1.133825l-.3786749.6561133-.3786747.6561134-.5922856.000137-.592285.000136zm3.1779349-.369483c.0042-.00346-.233487-.4884588-.528245-1.0777779l-.535922-1.0714891-.03691.0875c-.0203.048125-.183516.425-.362699.8375-.179182.4125-.355738.85125-.392346.975-.03661.12375-.07127.2390723-.07703.2562715-.0083.024853.188215.027989.957503.015278.532385-.0088.971429-.018823.975651-.022283z" stroke="#e1da5b" stroke-width=".803"/></g></svg> diff --git a/editor/icons/TrackDiscrete.svg b/editor/icons/TrackDiscrete.svg index d1df4b1667..6498742233 100644 --- a/editor/icons/TrackDiscrete.svg +++ b/editor/icons/TrackDiscrete.svg @@ -1 +1 @@ -<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-6 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-6 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg> +<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 1a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-6 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-6 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#b9ec41"/></svg> diff --git a/editor/icons/TrackTrigger.svg b/editor/icons/TrackTrigger.svg index 6e46a74121..c403fba59a 100644 --- a/editor/icons/TrackTrigger.svg +++ b/editor/icons/TrackTrigger.svg @@ -1 +1 @@ -<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v4h2v-4h2v-2zm13 0a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-3 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-3 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg> +<svg height="8" viewBox="0 0 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v2h2v4h2v-4h2v-2zm13 0a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-3 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1zm-3 2a1 1 0 0 0 -1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0 -1-1z" fill="#f68f45"/></svg> diff --git a/editor/import/collada.cpp b/editor/import/collada.cpp index 4cd9066350..c34379f1ec 100644 --- a/editor/import/collada.cpp +++ b/editor/import/collada.cpp @@ -541,7 +541,10 @@ void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String & COLLADA_PRINT("node name: " + parser.get_node_name()); - if (!parser.is_empty() && (parser.get_node_name() == "profile_COMMON" || parser.get_node_name() == "technique" || parser.get_node_name() == "extra")) { + if (!parser.is_empty() && + (parser.get_node_name() == "profile_COMMON" || + parser.get_node_name() == "technique" || + parser.get_node_name() == "extra")) { _parse_effect_material(parser, effect, id); // try again } else if (parser.get_node_name() == "newparam") { @@ -551,9 +554,9 @@ void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String & COLLADA_PRINT("param: " + name + " value:" + String(value)); } else if (parser.get_node_name() == "constant" || - parser.get_node_name() == "lambert" || - parser.get_node_name() == "phong" || - parser.get_node_name() == "blinn") { + parser.get_node_name() == "lambert" || + parser.get_node_name() == "phong" || + parser.get_node_name() == "blinn") { COLLADA_PRINT("shade model: " + parser.get_node_name()); while (parser.read() == OK) { if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { @@ -627,10 +630,11 @@ void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String & } else if (what == "shininess") { effect.shininess = _parse_param(parser); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && (parser.get_node_name() == "constant" || - parser.get_node_name() == "lambert" || - parser.get_node_name() == "phong" || - parser.get_node_name() == "blinn")) { + } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && + (parser.get_node_name() == "constant" || + parser.get_node_name() == "lambert" || + parser.get_node_name() == "phong" || + parser.get_node_name() == "blinn")) { break; } } @@ -681,10 +685,10 @@ void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String & parser.skip_section(); } } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && - (parser.get_node_name() == "effect" || - parser.get_node_name() == "profile_COMMON" || - parser.get_node_name() == "technique" || - parser.get_node_name() == "extra")) { + (parser.get_node_name() == "effect" || + parser.get_node_name() == "profile_COMMON" || + parser.get_node_name() == "technique" || + parser.get_node_name() == "extra")) { break; } } @@ -2020,7 +2024,7 @@ void Collada::_create_skeletons(Collada::Node **p_node, NodeSkeleton *p_skeleton bool Collada::_remove_node(Node *p_parent, Node *p_node) { for (int i = 0; i < p_parent->children.size(); i++) { if (p_parent->children[i] == p_node) { - p_parent->children.remove(i); + p_parent->children.remove_at(i); return true; } if (_remove_node(p_parent->children[i], p_node)) { @@ -2034,7 +2038,7 @@ bool Collada::_remove_node(Node *p_parent, Node *p_node) { void Collada::_remove_node(VisualScene *p_vscene, Node *p_node) { for (int i = 0; i < p_vscene->root_nodes.size(); i++) { if (p_vscene->root_nodes[i] == p_node) { - p_vscene->root_nodes.remove(i); + p_vscene->root_nodes.remove_at(i); return; } if (_remove_node(p_vscene->root_nodes[i], p_node)) { @@ -2267,7 +2271,7 @@ bool Collada::_move_geometry_to_skeletons(VisualScene *p_vscene, Node *p_node, L for (int i = 0; i < p_node->children.size(); i++) { if (_move_geometry_to_skeletons(p_vscene, p_node->children[i], p_mgeom)) { - p_node->children.remove(i); + p_node->children.remove_at(i); i--; } } @@ -2321,7 +2325,7 @@ void Collada::_optimize() { for (int i = 0; i < vs.root_nodes.size(); i++) { List<Node *> mgeom; if (_move_geometry_to_skeletons(&vs, vs.root_nodes[i], &mgeom)) { - vs.root_nodes.remove(i); + vs.root_nodes.remove_at(i); i--; } diff --git a/editor/import/dynamicfont_import_settings.cpp b/editor/import/dynamicfont_import_settings.cpp index 474c9d5296..45937e20bc 100644 --- a/editor/import/dynamicfont_import_settings.cpp +++ b/editor/import/dynamicfont_import_settings.cpp @@ -1160,7 +1160,7 @@ void DynamicFontImportSettings::_range_update(int32_t p_start, int32_t p_end) { void DynamicFontImportSettings::_lang_add() { menu_langs->set_position(lang_list->get_screen_transform().xform(lang_list->get_local_mouse_position())); - menu_langs->set_size(Vector2(1, 1)); + menu_langs->reset_size(); menu_langs->popup(); } @@ -1187,7 +1187,7 @@ void DynamicFontImportSettings::_lang_remove(Object *p_item, int p_column, int p void DynamicFontImportSettings::_script_add() { menu_scripts->set_position(script_list->get_screen_transform().xform(script_list->get_local_mouse_position())); - menu_scripts->set_size(Vector2(1, 1)); + menu_scripts->reset_size(); menu_scripts->popup(); } diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp index 4b01595028..076c0cc62b 100644 --- a/editor/import/editor_import_collada.cpp +++ b/editor/import/editor_import_collada.cpp @@ -91,8 +91,8 @@ struct ColladaImport { Error _create_mesh_surfaces(bool p_optimize, Ref<ImporterMesh> &p_mesh, const Map<String, Collada::NodeGeometry::Material> &p_material_map, const Collada::MeshData &meshdata, const Transform3D &p_local_xform, const Vector<int> &bone_remap, const Collada::SkinControllerData *p_skin_controller, const Collada::MorphControllerData *p_morph_data, Vector<Ref<ImporterMesh>> p_morph_meshes = Vector<Ref<ImporterMesh>>(), bool p_use_compression = false, bool p_use_mesh_material = false); Error load(const String &p_path, int p_flags, bool p_force_make_tangents = false, bool p_use_compression = false); void _fix_param_animation_tracks(); - void create_animation(int p_clip, bool p_make_tracks_in_all_bones, bool p_import_value_tracks); - void create_animations(bool p_make_tracks_in_all_bones, bool p_import_value_tracks); + void create_animation(int p_clip, bool p_import_value_tracks); + void create_animations(bool p_import_value_tracks); Set<String> tracks_in_clips; Vector<String> missing_textures; @@ -120,6 +120,15 @@ Error ColladaImport::_populate_skeleton(Skeleton3D *p_skeleton, Collada::Node *p skeleton_bone_map[p_skeleton][joint->sid] = r_bone; + { + Transform3D xform = joint->compute_transform(collada); + xform = collada.fix_transform(xform) * joint->post_transform; + + p_skeleton->set_bone_pose_position(r_bone, xform.origin); + p_skeleton->set_bone_pose_rotation(r_bone, xform.basis.get_rotation_quaternion()); + p_skeleton->set_bone_pose_scale(r_bone, xform.basis.get_scale()); + } + if (collada.state.bone_rest_map.has(joint->sid)) { p_skeleton->set_bone_rest(r_bone, collada.fix_transform(collada.state.bone_rest_map[joint->sid])); //should map this bone to something for animation? @@ -305,7 +314,7 @@ Error ColladaImport::_create_scene(Collada::Node *p_node, Node3D *p_parent) { xf = collada.fix_transform(xf) * p_node->post_transform; node->set_transform(xf); - p_parent->add_child(node); + p_parent->add_child(node, true); node->set_owner(scene); if (p_node->empty_draw_type != "") { @@ -1384,7 +1393,7 @@ void ColladaImport::_fix_param_animation_tracks() { } } -void ColladaImport::create_animations(bool p_make_tracks_in_all_bones, bool p_import_value_tracks) { +void ColladaImport::create_animations(bool p_import_value_tracks) { _fix_param_animation_tracks(); for (int i = 0; i < collada.state.animation_clips.size(); i++) { for (int j = 0; j < collada.state.animation_clips[i].tracks.size(); j++) { @@ -1417,13 +1426,13 @@ void ColladaImport::create_animations(bool p_make_tracks_in_all_bones, bool p_im } } - create_animation(-1, p_make_tracks_in_all_bones, p_import_value_tracks); + create_animation(-1, p_import_value_tracks); for (int i = 0; i < collada.state.animation_clips.size(); i++) { - create_animation(i, p_make_tracks_in_all_bones, p_import_value_tracks); + create_animation(i, p_import_value_tracks); } } -void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones, bool p_import_value_tracks) { +void ColladaImport::create_animation(int p_clip, bool p_import_value_tracks) { Ref<Animation> animation = Ref<Animation>(memnew(Animation)); if (p_clip == -1) { @@ -1522,10 +1531,55 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones continue; } - animation->add_track(Animation::TYPE_TRANSFORM3D); - int track = animation->get_track_count() - 1; - animation->track_set_path(track, path); - animation->track_set_imported(track, true); //helps merging later + bool has_position = false; + bool has_rotation = false; + bool has_scale = false; + + for (int i = 0; cn->xform_list.size(); i++) { + switch (cn->xform_list[i].op) { + case Collada::Node::XForm::OP_ROTATE: { + has_rotation = true; + } break; + case Collada::Node::XForm::OP_SCALE: { + has_scale = true; + } break; + case Collada::Node::XForm::OP_TRANSLATE: { + has_position = true; + } break; + case Collada::Node::XForm::OP_MATRIX: { + has_position = true; + has_rotation = true; + has_scale = true; + } break; + case Collada::Node::XForm::OP_VISIBILITY: { + } break; + } + } + + int base_track = animation->get_track_count(); + int position_idx = -1; + if (has_position) { + position_idx = animation->get_track_count(); + animation->add_track(Animation::TYPE_POSITION_3D); + animation->track_set_path(position_idx, path); + animation->track_set_imported(position_idx, true); //helps merging later + } + + int rotation_idx = -1; + if (has_rotation) { + rotation_idx = animation->get_track_count(); + animation->add_track(Animation::TYPE_ROTATION_3D); + animation->track_set_path(rotation_idx, path); + animation->track_set_imported(rotation_idx, true); //helps merging later + } + + int scale_idx = -1; + if (has_scale) { + scale_idx = animation->get_track_count(); + animation->add_track(Animation::TYPE_SCALE_3D); + animation->track_set_path(scale_idx, path); + animation->track_set_imported(scale_idx, true); //helps merging later + } Vector<real_t> snapshots = base_snapshots; @@ -1594,22 +1648,20 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones Transform3D xform = cn->compute_transform(collada); xform = collada.fix_transform(xform) * cn->post_transform; - if (nm.bone >= 0) { - //make bone transform relative to rest (in case of skeleton) - Skeleton3D *sk = Object::cast_to<Skeleton3D>(nm.node); - if (sk) { - xform = sk->get_bone_rest(nm.bone).affine_inverse() * xform; - } else { - ERR_PRINT("Collada: Invalid skeleton"); - } - } - Vector3 s = xform.basis.get_scale(); bool singular_matrix = Math::is_zero_approx(s.x) || Math::is_zero_approx(s.y) || Math::is_zero_approx(s.z); Quaternion q = singular_matrix ? Quaternion() : xform.basis.get_rotation_quaternion(); Vector3 l = xform.origin; - animation->transform_track_insert_key(track, snapshots[i], l, q, s); + if (position_idx >= 0) { + animation->position_track_insert_key(position_idx, snapshots[i], l); + } + if (rotation_idx >= 0) { + animation->rotation_track_insert_key(rotation_idx, snapshots[i], q); + } + if (scale_idx >= 0) { + animation->scale_track_insert_key(scale_idx, snapshots[i], s); + } } if (nm.bone >= 0) { @@ -1621,48 +1673,15 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones if (found_anim) { tracks_found = true; } else { - animation->remove_track(track); - } - } - - if (p_make_tracks_in_all_bones) { - //some bones may lack animation, but since we don't store pose as a property, we must add keyframes! - for (const KeyValue<String, bool> &E : bones_with_animation) { - if (E.value) { - continue; + if (position_idx >= 0) { + animation->remove_track(base_track); } - - NodeMap &nm = node_map[E.key]; - String path = scene->get_path_to(nm.node); - ERR_CONTINUE(nm.bone < 0); - Skeleton3D *sk = static_cast<Skeleton3D *>(nm.node); - String name = sk->get_bone_name(nm.bone); - path = path + ":" + name; - - Collada::Node *cn = collada.state.scene_map[E.key]; - if (cn->ignore_anim) { - WARN_PRINT("Collada: Ignoring animation on node: " + path); - continue; + if (rotation_idx >= 0) { + animation->remove_track(base_track); + } + if (scale_idx >= 0) { + animation->remove_track(base_track); } - - animation->add_track(Animation::TYPE_TRANSFORM3D); - int track = animation->get_track_count() - 1; - animation->track_set_path(track, path); - animation->track_set_imported(track, true); //helps merging later - - Transform3D xform = cn->compute_transform(collada); - xform = collada.fix_transform(xform) * cn->post_transform; - - xform = sk->get_bone_rest(nm.bone).affine_inverse() * xform; - - Vector3 s = xform.basis.get_scale(); - bool singular_matrix = Math::is_zero_approx(s.x) || Math::is_zero_approx(s.y) || Math::is_zero_approx(s.z); - Quaternion q = singular_matrix ? Quaternion() : xform.basis.get_rotation_quaternion(); - Vector3 l = xform.origin; - - animation->transform_track_insert_key(track, 0, l, q, s); - - tracks_found = true; } } @@ -1690,7 +1709,7 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones NodeMap &nm = node_map[at.target]; String path = scene->get_path_to(nm.node); - animation->add_track(Animation::TYPE_VALUE); + animation->add_track(Animation::TYPE_BLEND_SHAPE); int track = animation->get_track_count() - 1; path = path + ":" + at.param; @@ -1712,7 +1731,7 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones WARN_PRINT("Collada: Unexpected amount of value keys: " + itos(data.size())); } - animation->track_insert_key(track, time, value); + animation->blend_shape_track_insert_key(track, time, value); } tracks_found = true; @@ -1728,15 +1747,15 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones /*************************************** SCENE ***********************************/ /*********************************************************************************/ -uint32_t EditorSceneImporterCollada::get_import_flags() const { +uint32_t EditorSceneFormatImporterCollada::get_import_flags() const { return IMPORT_SCENE | IMPORT_ANIMATION; } -void EditorSceneImporterCollada::get_extensions(List<String> *r_extensions) const { +void EditorSceneFormatImporterCollada::get_extensions(List<String> *r_extensions) const { r_extensions->push_back("dae"); } -Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) { +Node *EditorSceneFormatImporterCollada::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) { if (r_err) { *r_err = OK; } @@ -1749,7 +1768,7 @@ Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_ state.use_mesh_builtin_materials = true; state.bake_fps = p_bake_fps; - Error err = state.load(p_path, flags, p_flags & EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS, false); + Error err = state.load(p_path, flags, p_flags & EditorSceneFormatImporter::IMPORT_GENERATE_TANGENT_ARRAYS, false); if (r_err) { *r_err = err; @@ -1773,7 +1792,7 @@ Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_ } if (p_flags & IMPORT_ANIMATION) { - state.create_animations(true, true); + state.create_animations(true); AnimationPlayer *ap = memnew(AnimationPlayer); for (int i = 0; i < state.animations.size(); i++) { String name; @@ -1785,22 +1804,22 @@ Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_ ap->add_animation(name, state.animations[i]); } - state.scene->add_child(ap); + state.scene->add_child(ap, true); ap->set_owner(state.scene); } return state.scene; } -Ref<Animation> EditorSceneImporterCollada::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) { +Ref<Animation> EditorSceneFormatImporterCollada::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) { ColladaImport state; state.use_mesh_builtin_materials = false; - Error err = state.load(p_path, Collada::IMPORT_FLAG_ANIMATION, p_flags & EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS); + Error err = state.load(p_path, Collada::IMPORT_FLAG_ANIMATION, p_flags & EditorSceneFormatImporter::IMPORT_GENERATE_TANGENT_ARRAYS); ERR_FAIL_COND_V_MSG(err != OK, RES(), "Cannot load animation from file '" + p_path + "'."); - state.create_animations(true, true); + state.create_animations(true); if (state.scene) { memdelete(state.scene); } @@ -1813,5 +1832,5 @@ Ref<Animation> EditorSceneImporterCollada::import_animation(const String &p_path return anim; } -EditorSceneImporterCollada::EditorSceneImporterCollada() { +EditorSceneFormatImporterCollada::EditorSceneFormatImporterCollada() { } diff --git a/editor/import/editor_import_collada.h b/editor/import/editor_import_collada.h index bf45322765..055a6fe178 100644 --- a/editor/import/editor_import_collada.h +++ b/editor/import/editor_import_collada.h @@ -33,8 +33,8 @@ #include "editor/import/resource_importer_scene.h" -class EditorSceneImporterCollada : public EditorSceneImporter { - GDCLASS(EditorSceneImporterCollada, EditorSceneImporter); +class EditorSceneFormatImporterCollada : public EditorSceneFormatImporter { + GDCLASS(EditorSceneFormatImporterCollada, EditorSceneFormatImporter); public: virtual uint32_t get_import_flags() const override; @@ -42,7 +42,7 @@ public: virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps = nullptr, Error *r_err = nullptr) override; virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) override; - EditorSceneImporterCollada(); + EditorSceneFormatImporterCollada(); }; #endif diff --git a/editor/import/editor_import_plugin.cpp b/editor/import/editor_import_plugin.cpp index d219f6e325..1a002569c5 100644 --- a/editor/import/editor_import_plugin.cpp +++ b/editor/import/editor_import_plugin.cpp @@ -57,6 +57,7 @@ void EditorImportPlugin::get_recognized_extensions(List<String> *p_extensions) c for (int i = 0; i < extensions.size(); i++) { p_extensions->push_back(extensions[i]); } + return; } ERR_FAIL_MSG("Unimplemented _get_recognized_extensions in add-on."); } @@ -109,12 +110,12 @@ int EditorImportPlugin::get_import_order() const { ERR_FAIL_V_MSG(-1, "Unimplemented _get_import_order in add-on."); } -void EditorImportPlugin::get_import_options(List<ResourceImporter::ImportOption> *r_options, int p_preset) const { +void EditorImportPlugin::get_import_options(const String &p_path, List<ResourceImporter::ImportOption> *r_options, int p_preset) const { Array needed; needed.push_back("name"); needed.push_back("default_value"); Array options; - if (GDVIRTUAL_CALL(_get_import_options, p_preset, options)) { + if (GDVIRTUAL_CALL(_get_import_options, p_path, p_preset, options)) { for (int i = 0; i < options.size(); i++) { Dictionary d = options[i]; ERR_FAIL_COND(!d.has_all(needed)); @@ -139,12 +140,13 @@ void EditorImportPlugin::get_import_options(List<ResourceImporter::ImportOption> ImportOption option(PropertyInfo(default_value.get_type(), name, hint, hint_string, usage), default_value); r_options->push_back(option); } + return; } ERR_FAIL_MSG("Unimplemented _get_import_options in add-on."); } -bool EditorImportPlugin::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool EditorImportPlugin::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { Dictionary d; Map<StringName, Variant>::Element *E = p_options.front(); while (E) { @@ -152,7 +154,7 @@ bool EditorImportPlugin::get_option_visibility(const String &p_option, const Map E = E->next(); } bool visible; - if (GDVIRTUAL_CALL(_get_option_visibility, p_option, d, visible)) { + if (GDVIRTUAL_CALL(_get_option_visibility, p_path, p_option, d, visible)) { return visible; } @@ -190,11 +192,11 @@ void EditorImportPlugin::_bind_methods() { GDVIRTUAL_BIND(_get_preset_count) GDVIRTUAL_BIND(_get_preset_name, "preset_index") GDVIRTUAL_BIND(_get_recognized_extensions) - GDVIRTUAL_BIND(_get_import_options, "preset_index") + GDVIRTUAL_BIND(_get_import_options, "path", "preset_index") GDVIRTUAL_BIND(_get_save_extension) GDVIRTUAL_BIND(_get_resource_type) GDVIRTUAL_BIND(_get_priority) GDVIRTUAL_BIND(_get_import_order) - GDVIRTUAL_BIND(_get_option_visibility, "option_name", "options") + GDVIRTUAL_BIND(_get_option_visibility, "path", "option_name", "options") GDVIRTUAL_BIND(_import, "source_file", "save_path", "options", "platform_variants", "gen_files"); } diff --git a/editor/import/editor_import_plugin.h b/editor/import/editor_import_plugin.h index 49c959ab44..6c5f4f6005 100644 --- a/editor/import/editor_import_plugin.h +++ b/editor/import/editor_import_plugin.h @@ -44,12 +44,12 @@ protected: GDVIRTUAL0RC(int, _get_preset_count) GDVIRTUAL1RC(String, _get_preset_name, int) GDVIRTUAL0RC(Vector<String>, _get_recognized_extensions) - GDVIRTUAL1RC(Array, _get_import_options, int) + GDVIRTUAL2RC(Array, _get_import_options, String, int) GDVIRTUAL0RC(String, _get_save_extension) GDVIRTUAL0RC(String, _get_resource_type) GDVIRTUAL0RC(float, _get_priority) GDVIRTUAL0RC(int, _get_import_order) - GDVIRTUAL2RC(bool, _get_option_visibility, StringName, Dictionary) + GDVIRTUAL3RC(bool, _get_option_visibility, String, StringName, Dictionary) GDVIRTUAL5RC(int, _import, String, String, Dictionary, Array, Array) public: @@ -63,8 +63,8 @@ public: virtual String get_resource_type() const override; virtual float get_priority() const override; virtual int get_import_order() const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata = nullptr) override; }; diff --git a/editor/import/editor_importer_bake_reset.cpp b/editor/import/editor_importer_bake_reset.cpp deleted file mode 100644 index 451a07351c..0000000000 --- a/editor/import/editor_importer_bake_reset.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/*************************************************************************/ -/* editor_importer_bake_reset.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#include "editor/import/editor_importer_bake_reset.h" - -#include "core/error/error_list.h" -#include "core/error/error_macros.h" -#include "core/math/transform_3d.h" -#include "resource_importer_scene.h" -#include "scene/3d/importer_mesh_instance_3d.h" -#include "scene/3d/mesh_instance_3d.h" -#include "scene/3d/node_3d.h" -#include "scene/3d/skeleton_3d.h" -#include "scene/animation/animation_player.h" - -// Given that an engineering team has made a reference character, one wants ten animators to create animations. -// Currently, a tech artist needs to combine the ten files into one exported gltf2 to import into Godot Engine. -// We bake the RESET animation and then set it to identity, -// so that rigs with corresponding RESET animation can have their animations transferred with ease. -// -// The original algorithm for the code was used to change skeleton bone rolls to be parent to child. -// -// Reference https://github.com/godotengine/godot-proposals/issues/2961 -void BakeReset::_bake_animation_pose(Node *scene, const String &p_bake_anim) { - Map<StringName, BakeResetRestBone> r_rest_bones; - Vector<Node3D *> r_meshes; - List<Node *> queue; - queue.push_back(scene); - while (!queue.is_empty()) { - List<Node *>::Element *E = queue.front(); - Node *node = E->get(); - AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(node); - // Step 1: import scene with animations into the rest bones data structure. - _fetch_reset_animation(ap, r_rest_bones, p_bake_anim); - - int child_count = node->get_child_count(); - for (int i = 0; i < child_count; i++) { - queue.push_back(node->get_child(i)); - } - queue.pop_front(); - } - - queue.push_back(scene); - while (!queue.is_empty()) { - List<Node *>::Element *E = queue.front(); - Node *node = E->get(); - ImporterMeshInstance3D *editor_mesh_3d = scene->cast_to<ImporterMeshInstance3D>(node); - MeshInstance3D *mesh_3d = scene->cast_to<MeshInstance3D>(node); - if (scene->cast_to<Skeleton3D>(node)) { - Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(node); - - // Step 2: Bake the RESET animation from the RestBone to the skeleton. - _fix_skeleton(skeleton, r_rest_bones); - } - if (editor_mesh_3d) { - NodePath path = editor_mesh_3d->get_skeleton_path(); - if (!path.is_empty() && editor_mesh_3d->get_node_or_null(path) && Object::cast_to<Skeleton3D>(editor_mesh_3d->get_node_or_null(path))) { - r_meshes.push_back(editor_mesh_3d); - } - } else if (mesh_3d) { - NodePath path = mesh_3d->get_skeleton_path(); - if (!path.is_empty() && mesh_3d->get_node_or_null(path) && Object::cast_to<Skeleton3D>(mesh_3d->get_node_or_null(path))) { - r_meshes.push_back(mesh_3d); - } - } - int child_count = node->get_child_count(); - for (int i = 0; i < child_count; i++) { - queue.push_back(node->get_child(i)); - } - queue.pop_front(); - } - - queue.push_back(scene); - while (!queue.is_empty()) { - List<Node *>::Element *E = queue.front(); - Node *node = E->get(); - AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(node); - if (ap) { - // Step 3: Key all RESET animation frames to identity. - _align_animations(ap, r_rest_bones); - } - - int child_count = node->get_child_count(); - for (int i = 0; i < child_count; i++) { - queue.push_back(node->get_child(i)); - } - queue.pop_front(); - } -} - -void BakeReset::_align_animations(AnimationPlayer *p_ap, const Map<StringName, BakeResetRestBone> &r_rest_bones) { - ERR_FAIL_NULL(p_ap); - List<StringName> anim_names; - p_ap->get_animation_list(&anim_names); - for (List<StringName>::Element *anim_i = anim_names.front(); anim_i; anim_i = anim_i->next()) { - Ref<Animation> a = p_ap->get_animation(anim_i->get()); - ERR_CONTINUE(a.is_null()); - for (const KeyValue<StringName, BakeResetRestBone> &rest_bone_i : r_rest_bones) { - int track = a->find_track(NodePath(rest_bone_i.key)); - if (track == -1) { - continue; - } - int new_track = a->add_track(Animation::TYPE_TRANSFORM3D); - NodePath new_path = NodePath(rest_bone_i.key); - const BakeResetRestBone rest_bone = rest_bone_i.value; - a->track_set_path(new_track, new_path); - for (int key_i = 0; key_i < a->track_get_key_count(track); key_i++) { - Vector3 loc; - Quaternion rot; - Vector3 scale; - Error err = a->transform_track_get_key(track, key_i, &loc, &rot, &scale); - ERR_CONTINUE(err); - real_t time = a->track_get_key_time(track, key_i); - rot.normalize(); - loc = loc - rest_bone.loc; - rot = rest_bone.rest_delta.get_rotation_quaternion().inverse() * rot; - rot.normalize(); - scale = Vector3(1, 1, 1) - (rest_bone.rest_delta.get_scale() - scale); - // Apply the reverse of the rest changes to make the key be close to identity transform. - a->transform_track_insert_key(new_track, time, loc, rot, scale); - } - a->remove_track(track); - } - } -} - -void BakeReset::_fetch_reset_animation(AnimationPlayer *p_ap, Map<StringName, BakeResetRestBone> &r_rest_bones, const String &p_bake_anim) { - if (!p_ap) { - return; - } - List<StringName> anim_names; - p_ap->get_animation_list(&anim_names); - Node *root = p_ap->get_owner(); - ERR_FAIL_NULL(root); - if (!p_ap->has_animation(p_bake_anim)) { - return; - } - Ref<Animation> a = p_ap->get_animation(p_bake_anim); - if (a.is_null()) { - return; - } - for (int32_t track = 0; track < a->get_track_count(); track++) { - NodePath path = a->track_get_path(track); - String string_path = path; - Skeleton3D *skeleton = root->cast_to<Skeleton3D>(root->get_node(string_path.get_slice(":", 0))); - if (!skeleton) { - continue; - } - String bone_name = string_path.get_slice(":", 1); - for (int key_i = 0; key_i < a->track_get_key_count(track); key_i++) { - Vector3 loc; - Quaternion rot; - Vector3 scale; - Error err = a->transform_track_get_key(track, key_i, &loc, &rot, &scale); - if (err != OK) { - ERR_PRINT_ONCE("Reset animation baker can't get key."); - continue; - } - rot.normalize(); - Basis rot_basis = Basis(rot, scale); - BakeResetRestBone rest_bone; - rest_bone.rest_delta = rot_basis; - rest_bone.loc = loc; - // Store the animation into the RestBone. - r_rest_bones[StringName(String(skeleton->get_owner()->get_path_to(skeleton)) + ":" + bone_name)] = rest_bone; - break; - } - } -} - -void BakeReset::_fix_skeleton(Skeleton3D *p_skeleton, Map<StringName, BakeReset::BakeResetRestBone> &r_rest_bones) { - int bone_count = p_skeleton->get_bone_count(); - - // First iterate through all the bones and update the RestBone. - for (int j = 0; j < bone_count; j++) { - StringName final_path = String(p_skeleton->get_owner()->get_path_to(p_skeleton)) + String(":") + p_skeleton->get_bone_name(j); - BakeResetRestBone &rest_bone = r_rest_bones[final_path]; - rest_bone.rest_local = p_skeleton->get_bone_rest(j); - } - for (int i = 0; i < bone_count; i++) { - int parent_bone = p_skeleton->get_bone_parent(i); - String path = p_skeleton->get_owner()->get_path_to(p_skeleton); - StringName final_path = String(path) + String(":") + p_skeleton->get_bone_name(parent_bone); - if (parent_bone >= 0) { - r_rest_bones[path].children.push_back(i); - } - } - - // When we apply transform to a bone, we also have to move all of its children in the opposite direction. - for (int i = 0; i < bone_count; i++) { - StringName final_path = String(p_skeleton->get_owner()->get_path_to(p_skeleton)) + String(":") + p_skeleton->get_bone_name(i); - r_rest_bones[final_path].rest_local = r_rest_bones[final_path].rest_local * Transform3D(r_rest_bones[final_path].rest_delta, r_rest_bones[final_path].loc); - // Iterate through the children and move in the opposite direction. - for (int j = 0; j < r_rest_bones[final_path].children.size(); j++) { - int child_index = r_rest_bones[final_path].children[j]; - StringName children_path = String(p_skeleton->get_name()) + String(":") + p_skeleton->get_bone_name(child_index); - r_rest_bones[children_path].rest_local = Transform3D(r_rest_bones[final_path].rest_delta, r_rest_bones[final_path].loc).affine_inverse() * r_rest_bones[children_path].rest_local; - } - } - - for (int i = 0; i < bone_count; i++) { - StringName final_path = String(p_skeleton->get_owner()->get_path_to(p_skeleton)) + String(":") + p_skeleton->get_bone_name(i); - ERR_CONTINUE(!r_rest_bones.has(final_path)); - Transform3D rest_transform = r_rest_bones[final_path].rest_local; - p_skeleton->set_bone_rest(i, rest_transform); - } -} diff --git a/editor/import/editor_importer_bake_reset.h b/editor/import/editor_importer_bake_reset.h deleted file mode 100644 index e36ae86181..0000000000 --- a/editor/import/editor_importer_bake_reset.h +++ /dev/null @@ -1,54 +0,0 @@ -/*************************************************************************/ -/* editor_importer_bake_reset.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef RESOURCE_IMPORTER_BAKE_RESET_H -#define RESOURCE_IMPORTER_BAKE_RESET_H - -#include "scene/main/node.h" - -class Skeleton3D; -class AnimationPlayer; -class BakeReset { - struct BakeResetRestBone { - Transform3D rest_local; - Basis rest_delta; - Vector3 loc; - Vector<int> children; - }; - -public: - void _bake_animation_pose(Node *scene, const String &p_bake_anim); - -private: - void _fix_skeleton(Skeleton3D *p_skeleton, Map<StringName, BakeReset::BakeResetRestBone> &r_rest_bones); - void _align_animations(AnimationPlayer *p_ap, const Map<StringName, BakeResetRestBone> &r_rest_bones); - void _fetch_reset_animation(AnimationPlayer *p_ap, Map<StringName, BakeResetRestBone> &r_rest_bones, const String &p_bake_anim); -}; -#endif diff --git a/editor/import/resource_importer_bitmask.cpp b/editor/import/resource_importer_bitmask.cpp index 7fd9230284..c43052593d 100644 --- a/editor/import/resource_importer_bitmask.cpp +++ b/editor/import/resource_importer_bitmask.cpp @@ -57,7 +57,7 @@ String ResourceImporterBitMap::get_resource_type() const { return "BitMap"; } -bool ResourceImporterBitMap::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterBitMap::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { return true; } @@ -69,7 +69,7 @@ String ResourceImporterBitMap::get_preset_name(int p_idx) const { return String(); } -void ResourceImporterBitMap::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterBitMap::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "create_from", PROPERTY_HINT_ENUM, "Black & White,Alpha"), 0)); r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "threshold", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.5)); } diff --git a/editor/import/resource_importer_bitmask.h b/editor/import/resource_importer_bitmask.h index d68693c54a..f3da5f9a31 100644 --- a/editor/import/resource_importer_bitmask.h +++ b/editor/import/resource_importer_bitmask.h @@ -49,8 +49,8 @@ public: virtual int get_preset_count() const override; virtual String get_preset_name(int p_idx) const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; ResourceImporterBitMap(); diff --git a/editor/import/resource_importer_bmfont.cpp b/editor/import/resource_importer_bmfont.cpp index 2e7ef1402b..f54065416e 100644 --- a/editor/import/resource_importer_bmfont.cpp +++ b/editor/import/resource_importer_bmfont.cpp @@ -56,11 +56,11 @@ String ResourceImporterBMFont::get_resource_type() const { return "FontData"; } -bool ResourceImporterBMFont::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterBMFont::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { return true; } -void ResourceImporterBMFont::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterBMFont::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "compress"), true)); } @@ -359,6 +359,8 @@ Error ResourceImporterBMFont::import(const String &p_source_file, const String & int height = 0; int ascent = 0; int outline = 0; + uint32_t st_flags = 0; + String font_name; bool packed = false; uint8_t ch[4] = { 0, 0, 0, 0 }; // RGBA @@ -382,13 +384,23 @@ Error ResourceImporterBMFont::import(const String &p_source_file, const String & base_size = f->get_16(); uint8_t flags = f->get_8(); ERR_FAIL_COND_V_MSG(flags & 0x02, ERR_CANT_CREATE, TTR("Non-unicode version of BMFont is not supported.")); + if (flags & (1 << 3)) { + st_flags |= TextServer::FONT_BOLD; + } + if (flags & (1 << 2)) { + st_flags |= TextServer::FONT_ITALIC; + } f->get_8(); // non-unicode charset, skip f->get_16(); // stretch_h, skip f->get_8(); // aa, skip f->get_32(); // padding, skip f->get_16(); // spacing, skip outline = f->get_8(); - // font name, skip + // font name + PackedByteArray name_data; + name_data.resize(block_size - 14); + f->get_buffer(name_data.ptrw(), block_size - 14); + font_name = String::utf8((const char *)name_data.ptr(), block_size - 14); font->set_fixed_size(base_size); } break; case 2: /* common */ { @@ -601,6 +613,19 @@ Error ResourceImporterBMFont::import(const String &p_source_file, const String & if (keys.has("outline")) { outline = keys["outline"].to_int(); } + if (keys.has("bold")) { + if (keys["bold"].to_int()) { + st_flags |= TextServer::FONT_BOLD; + } + } + if (keys.has("italic")) { + if (keys["italic"].to_int()) { + st_flags |= TextServer::FONT_ITALIC; + } + } + if (keys.has("face")) { + font_name = keys["face"]; + } ERR_FAIL_COND_V_MSG((!keys.has("unicode") || keys["unicode"].to_int() != 1), ERR_CANT_CREATE, TTR("Non-unicode version of BMFont is not supported.")); } else if (type == "common") { if (keys.has("lineHeight")) { @@ -778,6 +803,8 @@ Error ResourceImporterBMFont::import(const String &p_source_file, const String & } } + font->set_font_name(font_name); + font->set_font_style(st_flags); font->set_ascent(0, base_size, ascent); font->set_descent(0, base_size, height - ascent); diff --git a/editor/import/resource_importer_bmfont.h b/editor/import/resource_importer_bmfont.h index 065703132a..64d536535c 100644 --- a/editor/import/resource_importer_bmfont.h +++ b/editor/import/resource_importer_bmfont.h @@ -45,8 +45,8 @@ public: virtual String get_save_extension() const override; virtual String get_resource_type() const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; diff --git a/editor/import/resource_importer_csv_translation.cpp b/editor/import/resource_importer_csv_translation.cpp index 07647d8b6a..7948d9e577 100644 --- a/editor/import/resource_importer_csv_translation.cpp +++ b/editor/import/resource_importer_csv_translation.cpp @@ -55,7 +55,7 @@ String ResourceImporterCSVTranslation::get_resource_type() const { return "Translation"; } -bool ResourceImporterCSVTranslation::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterCSVTranslation::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { return true; } @@ -67,7 +67,7 @@ String ResourceImporterCSVTranslation::get_preset_name(int p_idx) const { return ""; } -void ResourceImporterCSVTranslation::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterCSVTranslation::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "compress"), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "delimiter", PROPERTY_HINT_ENUM, "Comma,Semicolon,Tab"), 0)); } diff --git a/editor/import/resource_importer_csv_translation.h b/editor/import/resource_importer_csv_translation.h index d53e91e38b..de7ba3e3a0 100644 --- a/editor/import/resource_importer_csv_translation.h +++ b/editor/import/resource_importer_csv_translation.h @@ -46,8 +46,8 @@ public: virtual int get_preset_count() const override; virtual String get_preset_name(int p_idx) const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; diff --git a/editor/import/resource_importer_dynamicfont.cpp b/editor/import/resource_importer_dynamicfont.cpp index 8e01adbd56..f7363a565d 100644 --- a/editor/import/resource_importer_dynamicfont.cpp +++ b/editor/import/resource_importer_dynamicfont.cpp @@ -30,12 +30,12 @@ #include "resource_importer_dynamicfont.h" -#include "dynamicfont_import_settings.h" - #include "core/io/file_access.h" #include "core/io/resource_saver.h" +#include "dynamicfont_import_settings.h" #include "editor/editor_node.h" -#include "modules/modules_enabled.gen.h" + +#include "modules/modules_enabled.gen.h" // For freetype. String ResourceImporterDynamicFont::get_importer_name() const { return "font_data_dynamic"; @@ -66,7 +66,7 @@ String ResourceImporterDynamicFont::get_resource_type() const { return "FontData"; } -bool ResourceImporterDynamicFont::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterDynamicFont::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { if (p_option == "msdf_pixel_range" && !bool(p_options["multichannel_signed_distance_field"])) { return false; } @@ -94,7 +94,7 @@ String ResourceImporterDynamicFont::get_preset_name(int p_idx) const { } } -void ResourceImporterDynamicFont::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterDynamicFont::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { bool msdf = p_preset == PRESET_MSDF; r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "antialiased"), true)); diff --git a/editor/import/resource_importer_dynamicfont.h b/editor/import/resource_importer_dynamicfont.h index 52f256ab96..cb5294b9dd 100644 --- a/editor/import/resource_importer_dynamicfont.h +++ b/editor/import/resource_importer_dynamicfont.h @@ -57,8 +57,8 @@ public: virtual int get_preset_count() const override; virtual String get_preset_name(int p_idx) const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; bool has_advanced_options() const override; void show_advanced_options(const String &p_path) override; diff --git a/editor/import/resource_importer_image.cpp b/editor/import/resource_importer_image.cpp index 2dea359188..45cb5e2f9d 100644 --- a/editor/import/resource_importer_image.cpp +++ b/editor/import/resource_importer_image.cpp @@ -55,7 +55,7 @@ String ResourceImporterImage::get_resource_type() const { return "Image"; } -bool ResourceImporterImage::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterImage::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { return true; } @@ -67,7 +67,7 @@ String ResourceImporterImage::get_preset_name(int p_idx) const { return String(); } -void ResourceImporterImage::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterImage::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { } Error ResourceImporterImage::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) { diff --git a/editor/import/resource_importer_image.h b/editor/import/resource_importer_image.h index 7c8d5e228e..b7131ec850 100644 --- a/editor/import/resource_importer_image.h +++ b/editor/import/resource_importer_image.h @@ -47,8 +47,8 @@ public: virtual int get_preset_count() const override; virtual String get_preset_name(int p_idx) const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; diff --git a/editor/import/resource_importer_imagefont.cpp b/editor/import/resource_importer_imagefont.cpp index 997280d1dd..04a68e4a53 100644 --- a/editor/import/resource_importer_imagefont.cpp +++ b/editor/import/resource_importer_imagefont.cpp @@ -55,11 +55,11 @@ String ResourceImporterImageFont::get_resource_type() const { return "FontData"; } -bool ResourceImporterImageFont::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterImageFont::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { return true; } -void ResourceImporterImageFont::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterImageFont::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { r_options->push_back(ImportOption(PropertyInfo(Variant::PACKED_STRING_ARRAY, "character_ranges"), Vector<String>())); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "columns"), 1)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "rows"), 1)); diff --git a/editor/import/resource_importer_imagefont.h b/editor/import/resource_importer_imagefont.h index 9b2b38596f..d600c35e1c 100644 --- a/editor/import/resource_importer_imagefont.h +++ b/editor/import/resource_importer_imagefont.h @@ -47,8 +47,8 @@ public: virtual String get_save_extension() const override; virtual String get_resource_type() const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; diff --git a/editor/import/resource_importer_layered_texture.cpp b/editor/import/resource_importer_layered_texture.cpp index d5bb21443c..89c62ab5cb 100644 --- a/editor/import/resource_importer_layered_texture.cpp +++ b/editor/import/resource_importer_layered_texture.cpp @@ -118,7 +118,7 @@ String ResourceImporterLayeredTexture::get_resource_type() const { ERR_FAIL_V(String()); } -bool ResourceImporterLayeredTexture::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterLayeredTexture::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { if (p_option == "compress/lossy_quality" && p_options.has("compress/mode")) { return int(p_options["compress/mode"]) == COMPRESS_LOSSY; } @@ -133,7 +133,7 @@ String ResourceImporterLayeredTexture::get_preset_name(int p_idx) const { return ""; } -void ResourceImporterLayeredTexture::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterLayeredTexture::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/mode", PROPERTY_HINT_ENUM, "Lossless (PNG),Lossy (WebP),Video RAM (S3TC/ETC/BPTC),Uncompressed,Basis Universal", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 1)); r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "compress/lossy_quality", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.7)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/hdr_compression", PROPERTY_HINT_ENUM, "Disabled,Opaque Only,Always"), 1)); diff --git a/editor/import/resource_importer_layered_texture.h b/editor/import/resource_importer_layered_texture.h index 86e9c5bde8..29dfe7263a 100644 --- a/editor/import/resource_importer_layered_texture.h +++ b/editor/import/resource_importer_layered_texture.h @@ -84,15 +84,13 @@ public: virtual int get_preset_count() const override; virtual String get_preset_name(int p_idx) const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; void _save_tex(Vector<Ref<Image>> p_images, const String &p_to_path, int p_compress_mode, float p_lossy, Image::CompressMode p_vram_compression, Image::CompressSource p_csource, Image::UsedChannels used_channels, bool p_mipmaps, bool p_force_po2); virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; - void update_imports(); - virtual bool are_import_settings_valid(const String &p_path) const override; virtual String get_import_settings_string() const override; diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp index 4f75faedcb..bb68de99b1 100644 --- a/editor/import/resource_importer_obj.cpp +++ b/editor/import/resource_importer_obj.cpp @@ -405,11 +405,11 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh>> &r_meshes, bool p_ current_material_library = l.replace("mtllib", "").strip_edges(); if (!material_map.has(current_material_library)) { Map<String, Ref<StandardMaterial3D>> lib; - Error err = _parse_material_library(current_material_library, lib, r_missing_deps); - if (err == ERR_CANT_OPEN) { - String dir = p_path.get_base_dir(); - err = _parse_material_library(dir.plus_file(current_material_library), lib, r_missing_deps); + String lib_path = current_material_library; + if (lib_path.is_relative_path()) { + lib_path = p_path.get_base_dir().plus_file(current_material_library); } + Error err = _parse_material_library(lib_path, lib, r_missing_deps); if (err == OK) { material_map[current_material_library] = lib; } @@ -448,7 +448,7 @@ Node *EditorOBJImporter::import_scene(const String &p_path, uint32_t p_flags, in ImporterMeshInstance3D *mi = memnew(ImporterMeshInstance3D); mi->set_mesh(mesh); mi->set_name(m->get_name()); - scene->add_child(mi); + scene->add_child(mi, true); mi->set_owner(scene); } @@ -504,14 +504,14 @@ String ResourceImporterOBJ::get_preset_name(int p_idx) const { return ""; } -void ResourceImporterOBJ::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterOBJ::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "generate_tangents"), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::VECTOR3, "scale_mesh"), Vector3(1, 1, 1))); r_options->push_back(ImportOption(PropertyInfo(Variant::VECTOR3, "offset_mesh"), Vector3(0, 0, 0))); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "optimize_mesh"), true)); } -bool ResourceImporterOBJ::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterOBJ::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { return true; } diff --git a/editor/import/resource_importer_obj.h b/editor/import/resource_importer_obj.h index 1bb5ef33ce..c3e46b6eb5 100644 --- a/editor/import/resource_importer_obj.h +++ b/editor/import/resource_importer_obj.h @@ -33,8 +33,8 @@ #include "resource_importer_scene.h" -class EditorOBJImporter : public EditorSceneImporter { - GDCLASS(EditorOBJImporter, EditorSceneImporter); +class EditorOBJImporter : public EditorSceneFormatImporter { + GDCLASS(EditorOBJImporter, EditorSceneFormatImporter); public: virtual uint32_t get_import_flags() const override; @@ -59,8 +59,8 @@ public: virtual int get_preset_count() const override; virtual String get_preset_name(int p_idx) const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index 1e93113488..a25b694a60 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -32,7 +32,7 @@ #include "core/io/resource_saver.h" #include "editor/editor_node.h" -#include "editor/import/editor_importer_bake_reset.h" + #include "editor/import/scene_import_settings.h" #include "scene/3d/area_3d.h" #include "scene/3d/collision_shape_3d.h" @@ -52,7 +52,7 @@ #include "scene/resources/surface_tool.h" #include "scene/resources/world_boundary_shape_3d.h" -uint32_t EditorSceneImporter::get_import_flags() const { +uint32_t EditorSceneFormatImporter::get_import_flags() const { int ret; if (GDVIRTUAL_CALL(_get_import_flags, ret)) { return ret; @@ -61,7 +61,7 @@ uint32_t EditorSceneImporter::get_import_flags() const { ERR_FAIL_V(0); } -void EditorSceneImporter::get_extensions(List<String> *r_extensions) const { +void EditorSceneFormatImporter::get_extensions(List<String> *r_extensions) const { Vector<String> arr; if (GDVIRTUAL_CALL(_get_extensions, arr)) { for (int i = 0; i < arr.size(); i++) { @@ -73,7 +73,7 @@ void EditorSceneImporter::get_extensions(List<String> *r_extensions) const { ERR_FAIL(); } -Node *EditorSceneImporter::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) { +Node *EditorSceneFormatImporter::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) { Object *ret; if (GDVIRTUAL_CALL(_import_scene, p_path, p_flags, p_bake_fps, ret)) { return Object::cast_to<Node>(ret); @@ -82,7 +82,7 @@ Node *EditorSceneImporter::import_scene(const String &p_path, uint32_t p_flags, ERR_FAIL_V(nullptr); } -Ref<Animation> EditorSceneImporter::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) { +Ref<Animation> EditorSceneFormatImporter::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) { Ref<Animation> ret; if (GDVIRTUAL_CALL(_import_animation, p_path, p_flags, p_bake_fps, ret)) { return ret; @@ -91,25 +91,37 @@ Ref<Animation> EditorSceneImporter::import_animation(const String &p_path, uint3 ERR_FAIL_V(nullptr); } +void EditorSceneFormatImporter::get_import_options(const String &p_path, List<ResourceImporter::ImportOption> *r_options) { + GDVIRTUAL_CALL(_get_import_options, p_path); +} + +Variant EditorSceneFormatImporter::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) { + Variant ret; + GDVIRTUAL_CALL(_get_option_visibility, p_path, p_option, ret); + return ret; +} + //for documenters, these functions are useful when an importer calls an external conversion helper (like, fbx2gltf), //and you want to load the resulting file -Node *EditorSceneImporter::import_scene_from_other_importer(const String &p_path, uint32_t p_flags, int p_bake_fps) { +Node *EditorSceneFormatImporter::import_scene_from_other_importer(const String &p_path, uint32_t p_flags, int p_bake_fps) { return ResourceImporterScene::get_singleton()->import_scene_from_other_importer(this, p_path, p_flags, p_bake_fps); } -Ref<Animation> EditorSceneImporter::import_animation_from_other_importer(const String &p_path, uint32_t p_flags, int p_bake_fps) { +Ref<Animation> EditorSceneFormatImporter::import_animation_from_other_importer(const String &p_path, uint32_t p_flags, int p_bake_fps) { return ResourceImporterScene::get_singleton()->import_animation_from_other_importer(this, p_path, p_flags, p_bake_fps); } -void EditorSceneImporter::_bind_methods() { - ClassDB::bind_method(D_METHOD("import_scene_from_other_importer", "path", "flags", "bake_fps"), &EditorSceneImporter::import_scene_from_other_importer); - ClassDB::bind_method(D_METHOD("import_animation_from_other_importer", "path", "flags", "bake_fps"), &EditorSceneImporter::import_animation_from_other_importer); +void EditorSceneFormatImporter::_bind_methods() { + ClassDB::bind_method(D_METHOD("import_scene_from_other_importer", "path", "flags", "bake_fps"), &EditorSceneFormatImporter::import_scene_from_other_importer); + ClassDB::bind_method(D_METHOD("import_animation_from_other_importer", "path", "flags", "bake_fps"), &EditorSceneFormatImporter::import_animation_from_other_importer); GDVIRTUAL_BIND(_get_import_flags); GDVIRTUAL_BIND(_get_extensions); GDVIRTUAL_BIND(_import_scene, "path", "flags", "bake_fps"); GDVIRTUAL_BIND(_import_animation, "path", "flags", "bake_fps"); + GDVIRTUAL_BIND(_get_import_options, "path"); + GDVIRTUAL_BIND(_get_option_visibility, "path", "option"); BIND_CONSTANT(IMPORT_SCENE); BIND_CONSTANT(IMPORT_ANIMATION); @@ -144,6 +156,105 @@ void EditorScenePostImport::init(const String &p_source_file) { EditorScenePostImport::EditorScenePostImport() { } +/////////////////////////////////////////////////////// + +Variant EditorScenePostImportPlugin::get_option_value(const StringName &p_name) const { + ERR_FAIL_COND_V_MSG(current_options == nullptr && current_options_dict == nullptr, Variant(), "get_option_value called from a function where option values are not available."); + ERR_FAIL_COND_V_MSG(current_options && !current_options->has(p_name), Variant(), "get_option_value called with unexisting option argument: " + String(p_name)); + ERR_FAIL_COND_V_MSG(current_options_dict && !current_options_dict->has(p_name), Variant(), "get_option_value called with unexisting option argument: " + String(p_name)); + if (current_options) { + (*current_options)[p_name]; + } + if (current_options_dict) { + (*current_options_dict)[p_name]; + } + return Variant(); +} +void EditorScenePostImportPlugin::add_import_option(const String &p_name, Variant p_default_value) { + ERR_FAIL_COND_MSG(current_option_list == nullptr, "add_import_option() can only be called from get_import_options()"); + add_import_option_advanced(p_default_value.get_type(), p_name, p_default_value); +} +void EditorScenePostImportPlugin::add_import_option_advanced(Variant::Type p_type, const String &p_name, Variant p_default_value, PropertyHint p_hint, const String &p_hint_string, int p_usage_flags) { + ERR_FAIL_COND_MSG(current_option_list == nullptr, "add_import_option_advanced() can only be called from get_import_options()"); + current_option_list->push_back(ResourceImporter::ImportOption(PropertyInfo(p_type, p_name, p_hint, p_hint_string, p_usage_flags), p_default_value)); +} + +void EditorScenePostImportPlugin::get_internal_import_options(InternalImportCategory p_category, List<ResourceImporter::ImportOption> *r_options) { + current_option_list = r_options; + GDVIRTUAL_CALL(_get_internal_import_options, p_category); + current_option_list = nullptr; +} +Variant EditorScenePostImportPlugin::get_internal_option_visibility(InternalImportCategory p_category, const String &p_option, const Map<StringName, Variant> &p_options) const { + current_options = &p_options; + Variant ret; + GDVIRTUAL_CALL(_get_internal_option_visibility, p_category, p_option, ret); + current_options = nullptr; + return ret; +} +Variant EditorScenePostImportPlugin::get_internal_option_update_view_required(InternalImportCategory p_category, const String &p_option, const Map<StringName, Variant> &p_options) const { + current_options = &p_options; + Variant ret; + GDVIRTUAL_CALL(_get_internal_option_update_view_required, p_category, p_option, ret); + current_options = nullptr; + return ret; +} + +void EditorScenePostImportPlugin::internal_process(InternalImportCategory p_category, Node *p_base_scene, Node *p_node, RES p_resource, const Dictionary &p_options) { + current_options_dict = &p_options; + GDVIRTUAL_CALL(_internal_process, p_category, p_base_scene, p_node, p_resource); + current_options_dict = nullptr; +} + +void EditorScenePostImportPlugin::get_import_options(const String &p_path, List<ResourceImporter::ImportOption> *r_options) { + current_option_list = r_options; + GDVIRTUAL_CALL(_get_import_options, p_path); + current_option_list = nullptr; +} +Variant EditorScenePostImportPlugin::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { + current_options = &p_options; + Variant ret; + GDVIRTUAL_CALL(_get_option_visibility, p_path, p_option, ret); + current_options = nullptr; + return ret; +} + +void EditorScenePostImportPlugin::pre_process(Node *p_scene, const Map<StringName, Variant> &p_options) { + current_options = &p_options; + GDVIRTUAL_CALL(_pre_process, p_scene); + current_options = nullptr; +} +void EditorScenePostImportPlugin::post_process(Node *p_scene, const Map<StringName, Variant> &p_options) { + current_options = &p_options; + GDVIRTUAL_CALL(_post_process, p_scene); + current_options = nullptr; +} + +void EditorScenePostImportPlugin::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_option_value", "name"), &EditorScenePostImportPlugin::get_option_value); + + ClassDB::bind_method(D_METHOD("add_import_option", "name", "value"), &EditorScenePostImportPlugin::add_import_option); + ClassDB::bind_method(D_METHOD("add_import_option_advanced", "type", "name", "default_value", "hint", "hint_string", "usage_flags"), &EditorScenePostImportPlugin::add_import_option_advanced, DEFVAL(PROPERTY_HINT_NONE), DEFVAL(""), DEFVAL(PROPERTY_USAGE_DEFAULT)); + + GDVIRTUAL_BIND(_get_internal_import_options, "category"); + GDVIRTUAL_BIND(_get_internal_option_visibility, "category", "option"); + GDVIRTUAL_BIND(_get_internal_option_update_view_required, "category", "option"); + GDVIRTUAL_BIND(_internal_process, "category", "base_node", "node", "resource"); + GDVIRTUAL_BIND(_get_import_options, "path"); + GDVIRTUAL_BIND(_get_option_visibility, "path", "option"); + GDVIRTUAL_BIND(_pre_process, "scene"); + GDVIRTUAL_BIND(_post_process, "scene"); + + BIND_ENUM_CONSTANT(INTERNAL_IMPORT_CATEGORY_NODE); + BIND_ENUM_CONSTANT(INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE); + BIND_ENUM_CONSTANT(INTERNAL_IMPORT_CATEGORY_MESH); + BIND_ENUM_CONSTANT(INTERNAL_IMPORT_CATEGORY_MATERIAL); + BIND_ENUM_CONSTANT(INTERNAL_IMPORT_CATEGORY_ANIMATION); + BIND_ENUM_CONSTANT(INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE); + BIND_ENUM_CONSTANT(INTERNAL_IMPORT_CATEGORY_MAX); +} + +///////////////////////////////////////////////////////// + String ResourceImporterScene::get_importer_name() const { return "scene"; } @@ -153,7 +264,7 @@ String ResourceImporterScene::get_visible_name() const { } void ResourceImporterScene::get_recognized_extensions(List<String> *p_extensions) const { - for (Set<Ref<EditorSceneImporter>>::Element *E = importers.front(); E; E = E->next()) { + for (Set<Ref<EditorSceneFormatImporter>>::Element *E = importers.front(); E; E = E->next()) { E->get()->get_extensions(p_extensions); } } @@ -170,7 +281,7 @@ int ResourceImporterScene::get_format_version() const { return 1; } -bool ResourceImporterScene::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterScene::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { if (p_option.begins_with("animation/")) { if (p_option != "animation/import" && !bool(p_options["animation/import"])) { return false; @@ -181,6 +292,20 @@ bool ResourceImporterScene::get_option_visibility(const String &p_option, const return false; } + for (int i = 0; i < post_importer_plugins.size(); i++) { + Variant ret = post_importer_plugins.write[i]->get_option_visibility(p_path, p_option, p_options); + if (ret.get_type() == Variant::BOOL) { + return ret; + } + } + + for (Ref<EditorSceneFormatImporter> importer : importers) { + Variant ret = importer->get_option_visibility(p_path, p_option, p_options); + if (ret.get_type() == Variant::BOOL) { + return ret; + } + } + return true; } @@ -236,6 +361,7 @@ static String _fixstr(const String &p_what, const String &p_str) { static void _pre_gen_shape_list(Ref<ImporterMesh> &mesh, Vector<Ref<Shape3D>> &r_shape_list, bool p_convex) { ERR_FAIL_NULL_MSG(mesh, "Cannot generate shape list with null mesh value"); + ERR_FAIL_NULL_MSG(mesh->get_mesh(), "Cannot generate shape list with null mesh value"); if (!p_convex) { Ref<Shape3D> shape = mesh->create_trimesh_shape(); r_shape_list.push_back(shape); @@ -317,10 +443,10 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<I String animname = E; const int loop_string_count = 3; - static const char *loop_strings[loop_string_count] = { "loops", "loop", "cycle" }; + static const char *loop_strings[loop_string_count] = { "loop_mode", "loop", "cycle" }; for (int i = 0; i < loop_string_count; i++) { if (_teststr(animname, loop_strings[i])) { - anim->set_loop(true); + anim->set_loop_mode(Animation::LoopMode::LOOP_LINEAR); animname = _fixstr(animname, loop_strings[i]); ap->rename_animation(E, animname); } @@ -395,7 +521,7 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<I sphereShape->set_radius(1); colshape->set_shape(sphereShape); } - sb->add_child(colshape); + sb->add_child(colshape, true); colshape->set_owner(sb->get_owner()); } @@ -421,7 +547,7 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<I rigid_body->set_transform(mi->get_transform()); p_node = rigid_body; mi->set_transform(Transform3D()); - rigid_body->add_child(mi); + rigid_body->add_child(mi, true); mi->set_owner(rigid_body->get_owner()); _add_shapes(rigid_body, shapes); @@ -459,7 +585,7 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<I if (shapes.size()) { StaticBody3D *col = memnew(StaticBody3D); - mi->add_child(col); + mi->add_child(col, true); col->set_owner(mi->get_owner()); _add_shapes(col, shapes); @@ -507,7 +633,7 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<I if (shapes.size()) { StaticBody3D *col = memnew(StaticBody3D); - p_node->add_child(col); + p_node->add_child(col, true); col->set_owner(p_node->get_owner()); _add_shapes(col, shapes); @@ -547,6 +673,26 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< return nullptr; } + { + ObjectID node_id = p_node->get_instance_id(); + for (int i = 0; i < post_importer_plugins.size(); i++) { + post_importer_plugins.write[i]->internal_process(EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_NODE, p_root, p_node, RES(), node_settings); + if (ObjectDB::get_instance(node_id) == nullptr) { //may have been erased, so do not continue + break; + } + } + } + + if (Object::cast_to<ImporterMeshInstance3D>(p_node)) { + ObjectID node_id = p_node->get_instance_id(); + for (int i = 0; i < post_importer_plugins.size(); i++) { + post_importer_plugins.write[i]->internal_process(EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE, p_root, p_node, RES(), node_settings); + if (ObjectDB::get_instance(node_id) == nullptr) { //may have been erased, so do not continue + break; + } + } + } + if (Object::cast_to<ImporterMeshInstance3D>(p_node)) { ImporterMeshInstance3D *mi = Object::cast_to<ImporterMeshInstance3D>(p_node); @@ -566,6 +712,11 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< if (mat_id != String() && p_material_data.has(mat_id)) { Dictionary matdata = p_material_data[mat_id]; + + for (int j = 0; j < post_importer_plugins.size(); j++) { + post_importer_plugins.write[j]->internal_process(EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_MATERIAL, p_root, p_node, mat, matdata); + } + if (matdata.has("use_external/enabled") && bool(matdata["use_external/enabled"]) && matdata.has("use_external/path")) { String path = matdata["use_external/path"]; Ref<Material> external_mat = ResourceLoader::load(path); @@ -617,7 +768,7 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< switch (mesh_physics_mode) { case MESH_PHYSICS_MESH_AND_STATIC_COLLIDER: { StaticBody3D *col = memnew(StaticBody3D); - p_node->add_child(col); + p_node->add_child(col, true); col->set_owner(p_node->get_owner()); col->set_transform(get_collision_shapes_transform(node_settings)); base = col; @@ -629,7 +780,7 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< rigid_body->set_transform(mi->get_transform() * get_collision_shapes_transform(node_settings)); p_node = rigid_body; mi->set_transform(Transform3D()); - rigid_body->add_child(mi); + rigid_body->add_child(mi, true); mi->set_owner(rigid_body->get_owner()); base = rigid_body; } break; @@ -658,7 +809,7 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< for (const Ref<Shape3D> &E : shapes) { CollisionShape3D *cshape = memnew(CollisionShape3D); cshape->set_shape(E); - base->add_child(cshape); + base->add_child(cshape, true); cshape->set_owner(base->get_owner()); idx++; @@ -691,7 +842,7 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< memdelete(p_node); p_node = nmi; } else { - mi->add_child(nmi); + mi->add_child(nmi, true); nmi->set_owner(mi->get_owner()); } } @@ -715,6 +866,10 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< } } + for (int i = 0; i < post_importer_plugins.size(); i++) { + post_importer_plugins.write[i]->internal_process(EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE, p_root, p_node, RES(), node_settings); + } + bool use_optimizer = node_settings["optimizer/enabled"]; float anim_optimizer_linerr = node_settings["optimizer/max_linear_error"]; float anim_optimizer_angerr = node_settings["optimizer/max_angular_error"]; @@ -732,7 +887,7 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< String name = node_settings["clip_" + itos(i + 1) + "/name"]; int from_frame = node_settings["clip_" + itos(i + 1) + "/start_frame"]; int end_frame = node_settings["clip_" + itos(i + 1) + "/end_frame"]; - bool loop = node_settings["clip_" + itos(i + 1) + "/loops"]; + Animation::LoopMode loop_mode = static_cast<Animation::LoopMode>((int)node_settings["clip_" + itos(i + 1) + "/loop_mode"]); bool save_to_file = node_settings["clip_" + itos(i + 1) + "/save_to_file/enabled"]; bool save_to_path = node_settings["clip_" + itos(i + 1) + "/save_to_file/path"]; bool save_to_file_keep_custom = node_settings["clip_" + itos(i + 1) + "/save_to_file/keep_custom_tracks"]; @@ -740,7 +895,7 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< animation_clips.push_back(name); animation_clips.push_back(from_frame / p_animation_fps); animation_clips.push_back(end_frame / p_animation_fps); - animation_clips.push_back(loop); + animation_clips.push_back(loop_mode); animation_clips.push_back(save_to_file); animation_clips.push_back(save_to_path); animation_clips.push_back(save_to_file_keep_custom); @@ -767,7 +922,7 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< } } - anim->set_loop(anim_settings["settings/loops"]); + anim->set_loop_mode(static_cast<Animation::LoopMode>((int)anim_settings["settings/loop_mode"])); bool save = anim_settings["save_to_file/enabled"]; String path = anim_settings["save_to_file/path"]; bool keep_custom = anim_settings["save_to_file/keep_custom_tracks"]; @@ -779,6 +934,48 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< } } } + + AnimationImportTracks import_tracks_mode[TRACK_CHANNEL_MAX] = { + AnimationImportTracks(int(node_settings["import_tracks/position"])), + AnimationImportTracks(int(node_settings["import_tracks/rotation"])), + AnimationImportTracks(int(node_settings["import_tracks/scale"])) + }; + + if (anims.size() > 1 && (import_tracks_mode[0] != ANIMATION_IMPORT_TRACKS_IF_PRESENT || import_tracks_mode[1] != ANIMATION_IMPORT_TRACKS_IF_PRESENT || import_tracks_mode[2] != ANIMATION_IMPORT_TRACKS_IF_PRESENT)) { + _optimize_track_usage(ap, import_tracks_mode); + } + } + + if (post_importer_plugins.size()) { + List<StringName> anims; + ap->get_animation_list(&anims); + for (const StringName &name : anims) { + if (p_animation_data.has(name)) { + Ref<Animation> anim = ap->get_animation(name); + Dictionary anim_settings = p_animation_data[name]; + { + //fill with default values + List<ImportOption> iopts; + get_internal_import_options(INTERNAL_IMPORT_CATEGORY_ANIMATION, &iopts); + for (const ImportOption &F : iopts) { + if (!anim_settings.has(F.option.name)) { + anim_settings[F.option.name] = F.default_value; + } + } + } + + for (int i = 0; i < post_importer_plugins.size(); i++) { + post_importer_plugins.write[i]->internal_process(EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_ANIMATION, p_root, p_node, anim, node_settings); + } + } + } + } + + bool use_compression = node_settings["compression/enabled"]; + int anim_compression_page_size = node_settings["compression/page_size"]; + + if (use_compression) { + _compress_animations(ap, anim_compression_page_size); } } @@ -799,7 +996,7 @@ Ref<Animation> ResourceImporterScene::_save_animation_to_file(Ref<Animation> ani old_anim->copy_track(i, anim); } } - anim->set_loop(old_anim->has_loop()); + anim->set_loop_mode(old_anim->get_loop_mode()); } } @@ -827,7 +1024,7 @@ void ResourceImporterScene::_create_clips(AnimationPlayer *anim, const Array &p_ String name = p_clips[i]; float from = p_clips[i + 1]; float to = p_clips[i + 2]; - bool loop = p_clips[i + 3]; + Animation::LoopMode loop_mode = static_cast<Animation::LoopMode>((int)p_clips[i + 3]); bool save_to_file = p_clips[i + 4]; String save_to_path = p_clips[i + 5]; bool keep_current = p_clips[i + 6]; @@ -851,44 +1048,71 @@ void ResourceImporterScene::_create_clips(AnimationPlayer *anim, const Array &p_ new_anim->track_set_path(dtrack, default_anim->track_get_path(j)); if (kt > (from + 0.01) && k > 0) { - if (default_anim->track_get_type(j) == Animation::TYPE_TRANSFORM3D) { - Quaternion q; + if (default_anim->track_get_type(j) == Animation::TYPE_POSITION_3D) { Vector3 p; + default_anim->position_track_interpolate(j, from, &p); + new_anim->position_track_insert_key(dtrack, 0, p); + } else if (default_anim->track_get_type(j) == Animation::TYPE_ROTATION_3D) { + Quaternion r; + default_anim->rotation_track_interpolate(j, from, &r); + new_anim->rotation_track_insert_key(dtrack, 0, r); + } else if (default_anim->track_get_type(j) == Animation::TYPE_SCALE_3D) { Vector3 s; - default_anim->transform_track_interpolate(j, from, &p, &q, &s); - new_anim->transform_track_insert_key(dtrack, 0, p, q, s); - } - if (default_anim->track_get_type(j) == Animation::TYPE_VALUE) { + default_anim->scale_track_interpolate(j, from, &s); + new_anim->scale_track_insert_key(dtrack, 0, s); + } else if (default_anim->track_get_type(j) == Animation::TYPE_VALUE) { Variant var = default_anim->value_track_interpolate(j, from); new_anim->track_insert_key(dtrack, 0, var); + } else if (default_anim->track_get_type(j) == Animation::TYPE_BLEND_SHAPE) { + float interp; + default_anim->blend_shape_track_interpolate(j, from, &interp); + new_anim->blend_shape_track_insert_key(dtrack, 0, interp); } } } - if (default_anim->track_get_type(j) == Animation::TYPE_TRANSFORM3D) { - Quaternion q; + if (default_anim->track_get_type(j) == Animation::TYPE_POSITION_3D) { Vector3 p; + default_anim->position_track_get_key(j, k, &p); + new_anim->position_track_insert_key(dtrack, kt - from, p); + } else if (default_anim->track_get_type(j) == Animation::TYPE_ROTATION_3D) { + Quaternion r; + default_anim->rotation_track_get_key(j, k, &r); + new_anim->rotation_track_insert_key(dtrack, kt - from, r); + } else if (default_anim->track_get_type(j) == Animation::TYPE_SCALE_3D) { Vector3 s; - default_anim->transform_track_get_key(j, k, &p, &q, &s); - new_anim->transform_track_insert_key(dtrack, kt - from, p, q, s); - } - if (default_anim->track_get_type(j) == Animation::TYPE_VALUE) { + default_anim->scale_track_get_key(j, k, &s); + new_anim->scale_track_insert_key(dtrack, kt - from, s); + } else if (default_anim->track_get_type(j) == Animation::TYPE_VALUE) { Variant var = default_anim->track_get_key_value(j, k); new_anim->track_insert_key(dtrack, kt - from, var); + } else if (default_anim->track_get_type(j) == Animation::TYPE_BLEND_SHAPE) { + float interp; + default_anim->blend_shape_track_get_key(j, k, &interp); + new_anim->blend_shape_track_insert_key(dtrack, kt - from, interp); } } if (dtrack != -1 && kt >= to) { - if (default_anim->track_get_type(j) == Animation::TYPE_TRANSFORM3D) { - Quaternion q; + if (default_anim->track_get_type(j) == Animation::TYPE_POSITION_3D) { Vector3 p; + default_anim->position_track_interpolate(j, to, &p); + new_anim->position_track_insert_key(dtrack, to - from, p); + } else if (default_anim->track_get_type(j) == Animation::TYPE_ROTATION_3D) { + Quaternion r; + default_anim->rotation_track_interpolate(j, to, &r); + new_anim->rotation_track_insert_key(dtrack, to - from, r); + } else if (default_anim->track_get_type(j) == Animation::TYPE_SCALE_3D) { Vector3 s; - default_anim->transform_track_interpolate(j, to, &p, &q, &s); - new_anim->transform_track_insert_key(dtrack, to - from, p, q, s); - } - if (default_anim->track_get_type(j) == Animation::TYPE_VALUE) { + default_anim->scale_track_interpolate(j, to, &s); + new_anim->scale_track_insert_key(dtrack, to - from, s); + } else if (default_anim->track_get_type(j) == Animation::TYPE_VALUE) { Variant var = default_anim->value_track_interpolate(j, to); new_anim->track_insert_key(dtrack, to - from, var); + } else if (default_anim->track_get_type(j) == Animation::TYPE_BLEND_SHAPE) { + float interp; + default_anim->blend_shape_track_interpolate(j, to, &interp); + new_anim->blend_shape_track_insert_key(dtrack, to - from, interp); } } } @@ -897,25 +1121,40 @@ void ResourceImporterScene::_create_clips(AnimationPlayer *anim, const Array &p_ new_anim->add_track(default_anim->track_get_type(j)); dtrack = new_anim->get_track_count() - 1; new_anim->track_set_path(dtrack, default_anim->track_get_path(j)); - if (default_anim->track_get_type(j) == Animation::TYPE_TRANSFORM3D) { - Quaternion q; + if (default_anim->track_get_type(j) == Animation::TYPE_POSITION_3D) { Vector3 p; + default_anim->position_track_interpolate(j, from, &p); + new_anim->position_track_insert_key(dtrack, 0, p); + default_anim->position_track_interpolate(j, to, &p); + new_anim->position_track_insert_key(dtrack, to - from, p); + } else if (default_anim->track_get_type(j) == Animation::TYPE_ROTATION_3D) { + Quaternion r; + default_anim->rotation_track_interpolate(j, from, &r); + new_anim->rotation_track_insert_key(dtrack, 0, r); + default_anim->rotation_track_interpolate(j, to, &r); + new_anim->rotation_track_insert_key(dtrack, to - from, r); + } else if (default_anim->track_get_type(j) == Animation::TYPE_SCALE_3D) { Vector3 s; - default_anim->transform_track_interpolate(j, from, &p, &q, &s); - new_anim->transform_track_insert_key(dtrack, 0, p, q, s); - default_anim->transform_track_interpolate(j, to, &p, &q, &s); - new_anim->transform_track_insert_key(dtrack, to - from, p, q, s); - } - if (default_anim->track_get_type(j) == Animation::TYPE_VALUE) { + default_anim->scale_track_interpolate(j, from, &s); + new_anim->scale_track_insert_key(dtrack, 0, s); + default_anim->scale_track_interpolate(j, to, &s); + new_anim->scale_track_insert_key(dtrack, to - from, s); + } else if (default_anim->track_get_type(j) == Animation::TYPE_VALUE) { Variant var = default_anim->value_track_interpolate(j, from); new_anim->track_insert_key(dtrack, 0, var); Variant to_var = default_anim->value_track_interpolate(j, to); new_anim->track_insert_key(dtrack, to - from, to_var); + } else if (default_anim->track_get_type(j) == Animation::TYPE_BLEND_SHAPE) { + float interp; + default_anim->blend_shape_track_interpolate(j, from, &interp); + new_anim->blend_shape_track_insert_key(dtrack, 0, interp); + default_anim->blend_shape_track_interpolate(j, to, &interp); + new_anim->blend_shape_track_insert_key(dtrack, to - from, interp); } } } - new_anim->set_loop(loop); + new_anim->set_loop_mode(loop_mode); new_anim->set_length(to - from); anim->add_animation(name, new_anim); @@ -937,6 +1176,15 @@ void ResourceImporterScene::_optimize_animations(AnimationPlayer *anim, float p_ } } +void ResourceImporterScene::_compress_animations(AnimationPlayer *anim, int p_page_size_kb) { + List<StringName> anim_names; + anim->get_animation_list(&anim_names); + for (const StringName &E : anim_names) { + Ref<Animation> a = anim->get_animation(E); + a->compress(p_page_size_kb * 1024); + } +} + void ResourceImporterScene::get_internal_import_options(InternalImportCategory p_category, List<ImportOption> *r_options) const { switch (p_category) { case INTERNAL_IMPORT_CATEGORY_NODE: { @@ -989,7 +1237,7 @@ void ResourceImporterScene::get_internal_import_options(InternalImportCategory p r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "use_external/path", PROPERTY_HINT_FILE, "*.material,*.res,*.tres"), "")); } break; case INTERNAL_IMPORT_CATEGORY_ANIMATION: { - r_options->push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "settings/loops"), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "settings/loop_mode", PROPERTY_HINT_ENUM, "None,Linear,Pingpong"), 0)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "save_to_file/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "save_to_file/path", PROPERTY_HINT_SAVE_FILE, "*.res,*.tres"), "")); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "save_to_file/keep_custom_tracks"), "")); @@ -1000,13 +1248,18 @@ void ResourceImporterScene::get_internal_import_options(InternalImportCategory p r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "optimizer/max_linear_error"), 0.05)); r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "optimizer/max_angular_error"), 0.01)); r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "optimizer/max_angle"), 22)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "compression/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compression/page_size", PROPERTY_HINT_RANGE, "4,512,1,suffix:kb"), 8)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "import_tracks/position", PROPERTY_HINT_ENUM, "IfPresent,IfPresentForAll,Never"), 1)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "import_tracks/rotation", PROPERTY_HINT_ENUM, "IfPresent,IfPresentForAll,Never"), 1)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "import_tracks/scale", PROPERTY_HINT_ENUM, "IfPresent,IfPresentForAll,Never"), 1)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slices/amount", PROPERTY_HINT_RANGE, "0,256,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0)); for (int i = 0; i < 256; i++) { r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "slice_" + itos(i + 1) + "/name"), "")); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slice_" + itos(i + 1) + "/start_frame"), 0)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slice_" + itos(i + 1) + "/end_frame"), 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "slice_" + itos(i + 1) + "/loops"), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slice_" + itos(i + 1) + "/loop_mode", PROPERTY_HINT_ENUM, "None,Linear,Pingpong"), 0)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "slice_" + itos(i + 1) + "/save_to_file/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "slice_" + itos(i + 1) + "/save_to_file/path", PROPERTY_HINT_SAVE_FILE, ".res,*.tres"), "")); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "slice_" + itos(i + 1) + "/save_to_file/keep_custom_tracks"), false)); @@ -1015,6 +1268,10 @@ void ResourceImporterScene::get_internal_import_options(InternalImportCategory p default: { } } + + for (int i = 0; i < post_importer_plugins.size(); i++) { + post_importer_plugins.write[i]->get_internal_import_options(EditorScenePostImportPlugin::InternalImportCategory(p_category), r_options); + } } bool ResourceImporterScene::get_internal_option_visibility(InternalImportCategory p_category, const String &p_option, const Map<StringName, Variant> &p_options) const { @@ -1062,27 +1319,28 @@ bool ResourceImporterScene::get_internal_option_visibility(InternalImportCategor if (p_option == "primitive/position" || p_option == "primitive/rotation") { const ShapeType physics_shape = (ShapeType)p_options["physics/shape_type"].operator int(); return generate_physics && - physics_shape >= SHAPE_TYPE_BOX; + physics_shape >= SHAPE_TYPE_BOX; } if (p_option == "primitive/size") { const ShapeType physics_shape = (ShapeType)p_options["physics/shape_type"].operator int(); return generate_physics && - physics_shape == SHAPE_TYPE_BOX; + physics_shape == SHAPE_TYPE_BOX; } if (p_option == "primitive/radius") { const ShapeType physics_shape = (ShapeType)p_options["physics/shape_type"].operator int(); - return generate_physics && (physics_shape == SHAPE_TYPE_SPHERE || - physics_shape == SHAPE_TYPE_CYLINDER || - physics_shape == SHAPE_TYPE_CAPSULE); + return generate_physics && + (physics_shape == SHAPE_TYPE_SPHERE || + physics_shape == SHAPE_TYPE_CYLINDER || + physics_shape == SHAPE_TYPE_CAPSULE); } if (p_option == "primitive/height") { const ShapeType physics_shape = (ShapeType)p_options["physics/shape_type"].operator int(); return generate_physics && - (physics_shape == SHAPE_TYPE_CYLINDER || - physics_shape == SHAPE_TYPE_CAPSULE); + (physics_shape == SHAPE_TYPE_CYLINDER || + physics_shape == SHAPE_TYPE_CAPSULE); } } break; case INTERNAL_IMPORT_CATEGORY_MESH: { @@ -1101,13 +1359,16 @@ bool ResourceImporterScene::get_internal_option_visibility(InternalImportCategor } } break; case INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE: { - if (p_option.begins_with("animation/optimizer/") && p_option != "animation/optimizer/enabled" && !bool(p_options["animation/optimizer/enabled"])) { + if (p_option.begins_with("optimizer/") && p_option != "optimizer/enabled" && !bool(p_options["optimizer/enabled"])) { + return false; + } + if (p_option.begins_with("compression/") && p_option != "compression/enabled" && !bool(p_options["compression/enabled"])) { return false; } - if (p_option.begins_with("animation/slice_")) { - int max_slice = p_options["animation/slices/amount"]; - int slice = p_option.get_slice("/", 1).get_slice("_", 1).to_int() - 1; + if (p_option.begins_with("slice_")) { + int max_slice = p_options["slices/amount"]; + int slice = p_option.get_slice("_", 1).to_int() - 1; if (slice >= max_slice) { return false; } @@ -1117,6 +1378,13 @@ bool ResourceImporterScene::get_internal_option_visibility(InternalImportCategor } } + for (int i = 0; i < post_importer_plugins.size(); i++) { + Variant ret = post_importer_plugins.write[i]->get_internal_option_visibility(EditorScenePostImportPlugin::InternalImportCategory(p_category), p_option, p_options); + if (ret.get_type() == Variant::BOOL) { + return ret; + } + } + return true; } @@ -1144,10 +1412,18 @@ bool ResourceImporterScene::get_internal_option_update_view_required(InternalImp default: { } } + + for (int i = 0; i < post_importer_plugins.size(); i++) { + Variant ret = post_importer_plugins.write[i]->get_internal_option_update_view_required(EditorScenePostImportPlugin::InternalImportCategory(p_category), p_option, p_options); + if (ret.get_type() == Variant::BOOL) { + return ret; + } + } + return false; } -void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterScene::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "nodes/root_type", PROPERTY_HINT_TYPE_STRING, "Node"), "Node3D")); r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "nodes/root_name"), "Scene Root")); @@ -1171,11 +1447,18 @@ void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, in r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "meshes/lightmap_texel_size", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 0.1)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "skins/use_named_skins"), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/import"), true)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/bake_reset_animation"), true)); - r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/fps", PROPERTY_HINT_RANGE, "1,120,1"), 15)); + r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/fps", PROPERTY_HINT_RANGE, "1,120,1"), 30)); r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "import_script/path", PROPERTY_HINT_FILE, script_ext_hint), "")); - r_options->push_back(ImportOption(PropertyInfo(Variant::DICTIONARY, "_subresources", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), Dictionary())); + r_options->push_back(ImportOption(PropertyInfo(Variant::DICTIONARY, "_subresources", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), Dictionary())); + + for (int i = 0; i < post_importer_plugins.size(); i++) { + post_importer_plugins.write[i]->get_import_options(p_path, r_options); + } + + for (Ref<EditorSceneFormatImporter> importer : importers) { + importer->get_import_options(p_path, r_options); + } } void ResourceImporterScene::_replace_owner(Node *p_node, Node *p_scene, Node *p_new_owner) { @@ -1189,11 +1472,11 @@ void ResourceImporterScene::_replace_owner(Node *p_node, Node *p_scene, Node *p_ } } -Node *ResourceImporterScene::import_scene_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps) { - Ref<EditorSceneImporter> importer; +Node *ResourceImporterScene::import_scene_from_other_importer(EditorSceneFormatImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps) { + Ref<EditorSceneFormatImporter> importer; String ext = p_path.get_extension().to_lower(); - for (Set<Ref<EditorSceneImporter>>::Element *E = importers.front(); E; E = E->next()) { + for (Set<Ref<EditorSceneFormatImporter>>::Element *E = importers.front(); E; E = E->next()) { if (E->get().ptr() == p_exception) { continue; } @@ -1202,7 +1485,7 @@ Node *ResourceImporterScene::import_scene_from_other_importer(EditorSceneImporte for (const String &F : extensions) { if (F.to_lower() == ext) { - importer = E; + importer = E->get(); break; } } @@ -1219,11 +1502,11 @@ Node *ResourceImporterScene::import_scene_from_other_importer(EditorSceneImporte return importer->import_scene(p_path, p_flags, p_bake_fps, &missing, &err); } -Ref<Animation> ResourceImporterScene::import_animation_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps) { - Ref<EditorSceneImporter> importer; +Ref<Animation> ResourceImporterScene::import_animation_from_other_importer(EditorSceneFormatImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps) { + Ref<EditorSceneFormatImporter> importer; String ext = p_path.get_extension().to_lower(); - for (Set<Ref<EditorSceneImporter>>::Element *E = importers.front(); E; E = E->next()) { + for (Set<Ref<EditorSceneFormatImporter>>::Element *E = importers.front(); E; E = E->next()) { if (E->get().ptr() == p_exception) { continue; } @@ -1232,7 +1515,7 @@ Ref<Animation> ResourceImporterScene::import_animation_from_other_importer(Edito for (const String &F : extensions) { if (F.to_lower() == ext) { - importer = E; + importer = E->get(); break; } } @@ -1320,6 +1603,10 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, const Dictionary &p_m save_to_file = ""; } } + + for (int i = 0; i < post_importer_plugins.size(); i++) { + post_importer_plugins.write[i]->internal_process(EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_MESH, nullptr, src_mesh_node, src_mesh_node->get_mesh(), mesh_settings); + } } if (generate_lods) { @@ -1416,20 +1703,170 @@ void ResourceImporterScene::_add_shapes(Node *p_node, const Vector<Ref<Shape3D>> for (const Ref<Shape3D> &E : p_shapes) { CollisionShape3D *cshape = memnew(CollisionShape3D); cshape->set_shape(E); - p_node->add_child(cshape); + p_node->add_child(cshape, true); cshape->set_owner(p_node->get_owner()); } } +void ResourceImporterScene::_optimize_track_usage(AnimationPlayer *p_player, AnimationImportTracks *p_track_actions) { + List<StringName> anims; + p_player->get_animation_list(&anims); + Node *parent = p_player->get_parent(); + ERR_FAIL_COND(parent == nullptr); + OrderedHashMap<NodePath, uint32_t> used_tracks[TRACK_CHANNEL_MAX]; + bool tracks_to_add = false; + static const Animation::TrackType track_types[TRACK_CHANNEL_MAX] = { Animation::TYPE_POSITION_3D, Animation::TYPE_ROTATION_3D, Animation::TYPE_SCALE_3D, Animation::TYPE_BLEND_SHAPE }; + for (const StringName &I : anims) { + Ref<Animation> anim = p_player->get_animation(I); + for (int i = 0; i < anim->get_track_count(); i++) { + for (int j = 0; j < TRACK_CHANNEL_MAX; j++) { + if (anim->track_get_type(i) != track_types[j]) { + continue; + } + switch (p_track_actions[j]) { + case ANIMATION_IMPORT_TRACKS_IF_PRESENT: { + // Do Nothing. + } break; + case ANIMATION_IMPORT_TRACKS_IF_PRESENT_FOR_ALL: { + used_tracks[j].insert(anim->track_get_path(i), 0); + tracks_to_add = true; + } break; + case ANIMATION_IMPORT_TRACKS_NEVER: { + anim->remove_track(i); + i--; + } break; + } + } + } + } + + if (!tracks_to_add) { + return; + } + + uint32_t pass = 0; + for (const StringName &I : anims) { + Ref<Animation> anim = p_player->get_animation(I); + for (int j = 0; j < TRACK_CHANNEL_MAX; j++) { + if (p_track_actions[j] != ANIMATION_IMPORT_TRACKS_IF_PRESENT_FOR_ALL) { + continue; + } + + pass++; + + for (int i = 0; i < anim->get_track_count(); i++) { + if (anim->track_get_type(i) != track_types[j]) { + continue; + } + + NodePath path = anim->track_get_path(i); + + ERR_CONTINUE(!used_tracks[j].has(path)); // Should never happen. + + used_tracks[j][path] = pass; + } + + for (OrderedHashMap<NodePath, uint32_t>::Element J = used_tracks[j].front(); J; J = J.next()) { + if (J.get() == pass) { + continue; + } + + NodePath path = J.key(); + Node *n = parent->get_node(path); + + if (j == TRACK_CHANNEL_BLEND_SHAPE) { + MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(n); + if (mi && path.get_subname_count() > 0) { + StringName bs = path.get_subname(0); + bool valid; + float value = mi->get(bs, &valid); + if (valid) { + int track_idx = anim->add_track(track_types[j]); + anim->track_set_path(track_idx, path); + anim->track_set_imported(track_idx, true); + anim->blend_shape_track_insert_key(track_idx, 0, value); + } + } + + } else { + Skeleton3D *skel = Object::cast_to<Skeleton3D>(n); + Node3D *n3d = Object::cast_to<Node3D>(n); + Vector3 loc; + Quaternion rot; + Vector3 scale; + if (skel && path.get_subname_count() > 0) { + StringName bone = path.get_subname(0); + int bone_idx = skel->find_bone(bone); + if (bone_idx == -1) { + continue; + } + skel->get_bone_pose(bone_idx); + loc = skel->get_bone_pose_position(bone_idx); + rot = skel->get_bone_pose_rotation(bone_idx); + scale = skel->get_bone_pose_scale(bone_idx); + } else if (n3d) { + loc = n3d->get_position(); + rot = n3d->get_transform().basis.get_rotation_quaternion(); + scale = n3d->get_scale(); + } else { + continue; + } + + // Ensure insertion keeps tracks together and ordered by type (loc/rot/scale) + int insert_at_pos = -1; + for (int k = 0; k < anim->get_track_count(); k++) { + NodePath tpath = anim->track_get_path(k); + + if (path == tpath) { + Animation::TrackType ttype = anim->track_get_type(k); + if (insert_at_pos == -1) { + // First insert, determine whether replacing or kicking back + if (track_types[j] < ttype) { + insert_at_pos = k; + break; // No point in continuing. + } else { + insert_at_pos = k + 1; + } + } else if (ttype < track_types[j]) { + // Kick back. + insert_at_pos = k + 1; + } + } else if (insert_at_pos >= 0) { + break; + } + } + int track_idx = anim->add_track(track_types[j], insert_at_pos); + + anim->track_set_path(track_idx, path); + anim->track_set_imported(track_idx, true); + switch (j) { + case TRACK_CHANNEL_POSITION: { + anim->position_track_insert_key(track_idx, 0, loc); + } break; + case TRACK_CHANNEL_ROTATION: { + anim->rotation_track_insert_key(track_idx, 0, rot); + } break; + case TRACK_CHANNEL_SCALE: { + anim->scale_track_insert_key(track_idx, 0, scale); + } break; + default: { + } + } + } + } + } + } +} + Node *ResourceImporterScene::pre_import(const String &p_source_file) { - Ref<EditorSceneImporter> importer; + Ref<EditorSceneFormatImporter> importer; String ext = p_source_file.get_extension().to_lower(); EditorProgress progress("pre-import", TTR("Pre-Import Scene"), 0); progress.step(TTR("Importing Scene..."), 0); - for (Set<Ref<EditorSceneImporter>>::Element *E = importers.front(); E; E = E->next()) { + for (Set<Ref<EditorSceneFormatImporter>>::Element *E = importers.front(); E; E = E->next()) { List<String> extensions; E->get()->get_extensions(&extensions); @@ -1448,7 +1885,7 @@ Node *ResourceImporterScene::pre_import(const String &p_source_file) { ERR_FAIL_COND_V(!importer.is_valid(), nullptr); Error err = OK; - Node *scene = importer->import_scene(p_source_file, EditorSceneImporter::IMPORT_ANIMATION | EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS, 15, nullptr, &err); + Node *scene = importer->import_scene(p_source_file, EditorSceneFormatImporter::IMPORT_ANIMATION | EditorSceneFormatImporter::IMPORT_GENERATE_TANGENT_ARRAYS, 15, nullptr, &err); if (!scene || err != OK) { return nullptr; } @@ -1463,13 +1900,13 @@ Node *ResourceImporterScene::pre_import(const String &p_source_file) { Error ResourceImporterScene::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) { const String &src_path = p_source_file; - Ref<EditorSceneImporter> importer; + Ref<EditorSceneFormatImporter> importer; String ext = src_path.get_extension().to_lower(); EditorProgress progress("import", TTR("Import Scene"), 104); progress.step(TTR("Importing Scene..."), 0); - for (Set<Ref<EditorSceneImporter>>::Element *E = importers.front(); E; E = E->next()) { + for (Set<Ref<EditorSceneFormatImporter>>::Element *E = importers.front(); E; E = E->next()) { List<String> extensions; E->get()->get_extensions(&extensions); @@ -1492,16 +1929,16 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p int import_flags = 0; if (bool(p_options["animation/import"])) { - import_flags |= EditorSceneImporter::IMPORT_ANIMATION; + import_flags |= EditorSceneFormatImporter::IMPORT_ANIMATION; } if (bool(p_options["skins/use_named_skins"])) { - import_flags |= EditorSceneImporter::IMPORT_USE_NAMED_SKIN_BINDS; + import_flags |= EditorSceneFormatImporter::IMPORT_USE_NAMED_SKIN_BINDS; } bool ensure_tangents = p_options["meshes/ensure_tangents"]; if (ensure_tangents) { - import_flags |= EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS; + import_flags |= EditorSceneFormatImporter::IMPORT_GENERATE_TANGENT_ARRAYS; } Error err = OK; @@ -1532,13 +1969,13 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p Map<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> collision_map; _pre_fix_node(scene, scene, collision_map); - _post_fix_node(scene, scene, collision_map, scanned_meshes, node_data, material_data, animation_data, fps); - bool use_bake_reset_animation = p_options["animation/bake_reset_animation"]; - if (use_bake_reset_animation) { - BakeReset bake_reset; - bake_reset._bake_animation_pose(scene, "RESET"); + + for (int i = 0; i < post_importer_plugins.size(); i++) { + post_importer_plugins.write[i]->pre_process(scene, p_options); } + _post_fix_node(scene, scene, collision_map, scanned_meshes, node_data, material_data, animation_data, fps); + String root_type = p_options["nodes/root_type"]; root_type = root_type.split(" ")[0]; // full root_type is "ClassName (filename.gd)" for a script global class. @@ -1640,6 +2077,10 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p } } + for (int i = 0; i < post_importer_plugins.size(); i++) { + post_importer_plugins.write[i]->post_process(scene, p_options); + } + progress.step(TTR("Saving..."), 104); Ref<PackedScene> packer = memnew(PackedScene); @@ -1671,15 +2112,15 @@ ResourceImporterScene::ResourceImporterScene() { /////////////////////////////////////// -uint32_t EditorSceneImporterESCN::get_import_flags() const { +uint32_t EditorSceneFormatImporterESCN::get_import_flags() const { return IMPORT_SCENE; } -void EditorSceneImporterESCN::get_extensions(List<String> *r_extensions) const { +void EditorSceneFormatImporterESCN::get_extensions(List<String> *r_extensions) const { r_extensions->push_back("escn"); } -Node *EditorSceneImporterESCN::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) { +Node *EditorSceneFormatImporterESCN::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) { Error error; Ref<PackedScene> ps = ResourceFormatLoaderText::singleton->load(p_path, p_path, &error); ERR_FAIL_COND_V_MSG(!ps.is_valid(), nullptr, "Cannot load scene as text resource from path '" + p_path + "'."); @@ -1690,6 +2131,6 @@ Node *EditorSceneImporterESCN::import_scene(const String &p_path, uint32_t p_fla return scene; } -Ref<Animation> EditorSceneImporterESCN::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) { +Ref<Animation> EditorSceneFormatImporterESCN::import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps) { ERR_FAIL_V(Ref<Animation>()); } diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h index 2a67fa9aae..5437ecd159 100644 --- a/editor/import/resource_importer_scene.h +++ b/editor/import/resource_importer_scene.h @@ -42,8 +42,8 @@ class Material; class AnimationPlayer; class ImporterMesh; -class EditorSceneImporter : public RefCounted { - GDCLASS(EditorSceneImporter, RefCounted); +class EditorSceneFormatImporter : public RefCounted { + GDCLASS(EditorSceneFormatImporter, RefCounted); protected: static void _bind_methods(); @@ -55,6 +55,8 @@ protected: GDVIRTUAL0RC(Vector<String>, _get_extensions) GDVIRTUAL3R(Object *, _import_scene, String, uint32_t, uint32_t) GDVIRTUAL3R(Ref<Animation>, _import_animation, String, uint32_t, uint32_t) + GDVIRTUAL1(_get_import_options, String) + GDVIRTUAL2RC(Variant, _get_option_visibility, String, String) public: enum ImportFlags { @@ -69,8 +71,10 @@ public: virtual void get_extensions(List<String> *r_extensions) const; virtual Node *import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err = nullptr); virtual Ref<Animation> import_animation(const String &p_path, uint32_t p_flags, int p_bake_fps); + virtual void get_import_options(const String &p_path, List<ResourceImporter::ImportOption> *r_options); + virtual Variant get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options); - EditorSceneImporter() {} + EditorSceneFormatImporter() {} }; class EditorScenePostImport : public RefCounted { @@ -90,10 +94,64 @@ public: EditorScenePostImport(); }; +class EditorScenePostImportPlugin : public RefCounted { + GDCLASS(EditorScenePostImportPlugin, RefCounted); + +public: + enum InternalImportCategory { + INTERNAL_IMPORT_CATEGORY_NODE, + INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE, + INTERNAL_IMPORT_CATEGORY_MESH, + INTERNAL_IMPORT_CATEGORY_MATERIAL, + INTERNAL_IMPORT_CATEGORY_ANIMATION, + INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE, + INTERNAL_IMPORT_CATEGORY_MAX + }; + +private: + mutable const Map<StringName, Variant> *current_options = nullptr; + mutable const Dictionary *current_options_dict = nullptr; + List<ResourceImporter::ImportOption> *current_option_list = nullptr; + InternalImportCategory current_category = INTERNAL_IMPORT_CATEGORY_MAX; + +protected: + GDVIRTUAL1(_get_internal_import_options, int) + GDVIRTUAL2RC(Variant, _get_internal_option_visibility, int, String) + GDVIRTUAL2RC(Variant, _get_internal_option_update_view_required, int, String) + GDVIRTUAL4(_internal_process, int, Node *, Node *, RES) + GDVIRTUAL1(_get_import_options, String) + GDVIRTUAL2RC(Variant, _get_option_visibility, String, String) + GDVIRTUAL1(_pre_process, Node *) + GDVIRTUAL1(_post_process, Node *) + + static void _bind_methods(); + +public: + Variant get_option_value(const StringName &p_name) const; + void add_import_option(const String &p_name, Variant p_default_value); + void add_import_option_advanced(Variant::Type p_type, const String &p_name, Variant p_default_value, PropertyHint p_hint = PROPERTY_HINT_NONE, const String &p_hint_string = String(), int p_usage_flags = PROPERTY_USAGE_DEFAULT); + + virtual void get_internal_import_options(InternalImportCategory p_category, List<ResourceImporter::ImportOption> *r_options); + virtual Variant get_internal_option_visibility(InternalImportCategory p_category, const String &p_option, const Map<StringName, Variant> &p_options) const; + virtual Variant get_internal_option_update_view_required(InternalImportCategory p_category, const String &p_option, const Map<StringName, Variant> &p_options) const; + + virtual void internal_process(InternalImportCategory p_category, Node *p_base_scene, Node *p_node, RES p_resource, const Dictionary &p_options); + + virtual void get_import_options(const String &p_path, List<ResourceImporter::ImportOption> *r_options); + virtual Variant get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const; + + virtual void pre_process(Node *p_scene, const Map<StringName, Variant> &p_options); + virtual void post_process(Node *p_scene, const Map<StringName, Variant> &p_options); + + EditorScenePostImportPlugin() {} +}; + +VARIANT_ENUM_CAST(EditorScenePostImportPlugin::InternalImportCategory) + class ResourceImporterScene : public ResourceImporter { GDCLASS(ResourceImporterScene, ResourceImporter); - Set<Ref<EditorSceneImporter>> importers; + Set<Ref<EditorSceneFormatImporter>> importers; static ResourceImporterScene *singleton; @@ -144,13 +202,33 @@ class ResourceImporterScene : public ResourceImporter { void _generate_meshes(Node *p_node, const Dictionary &p_mesh_data, bool p_generate_lods, bool p_create_shadow_meshes, LightBakeMode p_light_bake_mode, float p_lightmap_texel_size, const Vector<uint8_t> &p_src_lightmap_cache, Vector<Vector<uint8_t>> &r_lightmap_caches); void _add_shapes(Node *p_node, const Vector<Ref<Shape3D>> &p_shapes); + enum AnimationImportTracks { + ANIMATION_IMPORT_TRACKS_IF_PRESENT, + ANIMATION_IMPORT_TRACKS_IF_PRESENT_FOR_ALL, + ANIMATION_IMPORT_TRACKS_NEVER, + }; + enum TrackChannel { + TRACK_CHANNEL_POSITION, + TRACK_CHANNEL_ROTATION, + TRACK_CHANNEL_SCALE, + TRACK_CHANNEL_BLEND_SHAPE, + TRACK_CHANNEL_MAX + }; + + void _optimize_track_usage(AnimationPlayer *p_player, AnimationImportTracks *p_track_actions); + + mutable Vector<Ref<EditorScenePostImportPlugin>> post_importer_plugins; + public: static ResourceImporterScene *get_singleton() { return singleton; } - const Set<Ref<EditorSceneImporter>> &get_importers() const { return importers; } + void add_post_importer_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin) { post_importer_plugins.push_back(p_plugin); } + void remove_post_importer_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin) { post_importer_plugins.erase(p_plugin); } + + const Set<Ref<EditorSceneFormatImporter>> &get_importers() const { return importers; } - void add_importer(Ref<EditorSceneImporter> p_importer) { importers.insert(p_importer); } - void remove_importer(Ref<EditorSceneImporter> p_importer) { importers.erase(p_importer); } + void add_importer(Ref<EditorSceneFormatImporter> p_importer) { importers.insert(p_importer); } + void remove_importer(Ref<EditorSceneFormatImporter> p_importer) { importers.erase(p_importer); } virtual String get_importer_name() const override; virtual String get_visible_name() const override; @@ -163,21 +241,21 @@ public: virtual String get_preset_name(int p_idx) const override; enum InternalImportCategory { - INTERNAL_IMPORT_CATEGORY_NODE, - INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE, - INTERNAL_IMPORT_CATEGORY_MESH, - INTERNAL_IMPORT_CATEGORY_MATERIAL, - INTERNAL_IMPORT_CATEGORY_ANIMATION, - INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE, - INTERNAL_IMPORT_CATEGORY_MAX + INTERNAL_IMPORT_CATEGORY_NODE = EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_NODE, + INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE = EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE, + INTERNAL_IMPORT_CATEGORY_MESH = EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_MESH, + INTERNAL_IMPORT_CATEGORY_MATERIAL = EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_MATERIAL, + INTERNAL_IMPORT_CATEGORY_ANIMATION = EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_ANIMATION, + INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE = EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE, + INTERNAL_IMPORT_CATEGORY_MAX = EditorScenePostImportPlugin::INTERNAL_IMPORT_CATEGORY_MAX }; void get_internal_import_options(InternalImportCategory p_category, List<ImportOption> *r_options) const; bool get_internal_option_visibility(InternalImportCategory p_category, const String &p_option, const Map<StringName, Variant> &p_options) const; bool get_internal_option_update_view_required(InternalImportCategory p_category, const String &p_option, const Map<StringName, Variant> &p_options) const; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; // Import scenes *after* everything else (such as textures). virtual int get_import_order() const override { return ResourceImporter::IMPORT_ORDER_SCENE; } @@ -187,12 +265,13 @@ public: Ref<Animation> _save_animation_to_file(Ref<Animation> anim, bool p_save_to_file, String p_save_to_path, bool p_keep_custom_tracks); void _create_clips(AnimationPlayer *anim, const Array &p_clips, bool p_bake_all); void _optimize_animations(AnimationPlayer *anim, float p_max_lin_error, float p_max_ang_error, float p_max_angle); + void _compress_animations(AnimationPlayer *anim, int p_page_size_kb); Node *pre_import(const String &p_source_file); virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; - Node *import_scene_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps); - Ref<Animation> import_animation_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps); + Node *import_scene_from_other_importer(EditorSceneFormatImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps); + Ref<Animation> import_animation_from_other_importer(EditorSceneFormatImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps); virtual bool has_advanced_options() const override; virtual void show_advanced_options(const String &p_path) override; @@ -208,8 +287,8 @@ public: static Transform3D get_collision_shapes_transform(const M &p_options); }; -class EditorSceneImporterESCN : public EditorSceneImporter { - GDCLASS(EditorSceneImporterESCN, EditorSceneImporter); +class EditorSceneFormatImporterESCN : public EditorSceneFormatImporter { + GDCLASS(EditorSceneFormatImporterESCN, EditorSceneFormatImporter); public: virtual uint32_t get_import_flags() const override; diff --git a/editor/import/resource_importer_shader_file.cpp b/editor/import/resource_importer_shader_file.cpp index c01d8068da..797e11f5ea 100644 --- a/editor/import/resource_importer_shader_file.cpp +++ b/editor/import/resource_importer_shader_file.cpp @@ -65,10 +65,10 @@ String ResourceImporterShaderFile::get_preset_name(int p_idx) const { return String(); } -void ResourceImporterShaderFile::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterShaderFile::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { } -bool ResourceImporterShaderFile::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterShaderFile::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { return true; } diff --git a/editor/import/resource_importer_shader_file.h b/editor/import/resource_importer_shader_file.h index c421132ec2..3ed489e9fb 100644 --- a/editor/import/resource_importer_shader_file.h +++ b/editor/import/resource_importer_shader_file.h @@ -46,8 +46,8 @@ public: virtual int get_preset_count() const override; virtual String get_preset_name(int p_idx) const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp index 96a53b3257..b1fa2eda28 100644 --- a/editor/import/resource_importer_texture.cpp +++ b/editor/import/resource_importer_texture.cpp @@ -153,7 +153,7 @@ String ResourceImporterTexture::get_resource_type() const { return "StreamTexture2D"; } -bool ResourceImporterTexture::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterTexture::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { if (p_option == "compress/lossy_quality") { int compress_mode = int(p_options["compress/mode"]); if (compress_mode != COMPRESS_LOSSY && compress_mode != COMPRESS_VRAM_COMPRESSED) { @@ -194,7 +194,7 @@ String ResourceImporterTexture::get_preset_name(int p_idx) const { return preset_names[p_idx]; } -void ResourceImporterTexture::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterTexture::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/mode", PROPERTY_HINT_ENUM, "Lossless,Lossy,VRAM Compressed,VRAM Uncompressed,Basis Universal", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), p_preset == PRESET_3D ? 2 : 0)); r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "compress/lossy_quality", PROPERTY_HINT_RANGE, "0,1,0.01"), 0.7)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/hdr_compression", PROPERTY_HINT_ENUM, "Disabled,Opaque Only,Always"), 1)); @@ -218,7 +218,8 @@ void ResourceImporterTexture::get_import_options(List<ImportOption> *r_options, void ResourceImporterTexture::save_to_stex_format(FileAccess *f, const Ref<Image> &p_image, CompressMode p_compress_mode, Image::UsedChannels p_channels, Image::CompressMode p_compress_format, float p_lossy_quality) { switch (p_compress_mode) { case COMPRESS_LOSSLESS: { - bool lossless_force_png = ProjectSettings::get_singleton()->get("rendering/textures/lossless_compression/force_png"); + bool lossless_force_png = ProjectSettings::get_singleton()->get("rendering/textures/lossless_compression/force_png") || + !Image::_webp_mem_loader_func; // WebP module disabled. bool use_webp = !lossless_force_png && p_image->get_width() <= 16383 && p_image->get_height() <= 16383; // WebP has a size limit f->store_32(use_webp ? StreamTexture2D::DATA_FORMAT_WEBP : StreamTexture2D::DATA_FORMAT_PNG); f->store_16(p_image->get_width()); diff --git a/editor/import/resource_importer_texture.h b/editor/import/resource_importer_texture.h index 41220009cd..cb9d1b08cd 100644 --- a/editor/import/resource_importer_texture.h +++ b/editor/import/resource_importer_texture.h @@ -95,8 +95,8 @@ public: virtual int get_preset_count() const override; virtual String get_preset_name(int p_idx) const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; diff --git a/editor/import/resource_importer_texture_atlas.cpp b/editor/import/resource_importer_texture_atlas.cpp index cf699599ae..048d84d1f9 100644 --- a/editor/import/resource_importer_texture_atlas.cpp +++ b/editor/import/resource_importer_texture_atlas.cpp @@ -59,7 +59,7 @@ String ResourceImporterTextureAtlas::get_resource_type() const { return "Texture2D"; } -bool ResourceImporterTextureAtlas::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterTextureAtlas::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { return true; } @@ -71,7 +71,7 @@ String ResourceImporterTextureAtlas::get_preset_name(int p_idx) const { return String(); } -void ResourceImporterTextureAtlas::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterTextureAtlas::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "atlas_file", PROPERTY_HINT_SAVE_FILE, "*.png"), "")); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "import_mode", PROPERTY_HINT_ENUM, "Region,Mesh2D"), 0)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "crop_to_region"), false)); @@ -134,7 +134,7 @@ static void _plot_triangle(Vector2i *vertices, const Vector2i &p_offset, bool p_ int max_y = MIN(y[2], height - p_offset.y - 1); for (int yi = y[0]; yi < max_y; yi++) { if (yi >= 0) { - for (int xi = (xf > 0 ? int(xf) : 0); xi < (xt < width ? xt : width - 1); xi++) { + for (int xi = (xf > 0 ? int(xf) : 0); xi < (xt <= src_width ? xt : src_width); xi++) { int px = xi, py = yi; int sx = px, sy = py; sx = CLAMP(sx, 0, src_width - 1); @@ -156,7 +156,7 @@ static void _plot_triangle(Vector2i *vertices, const Vector2i &p_offset, bool p_ p_image->set_pixel(px, py, color); } - for (int xi = (xf < width ? int(xf) : width - 1); xi >= (xt > 0 ? xt : 0); xi--) { + for (int xi = (xf < src_width ? int(xf) : src_width - 1); xi >= (xt > 0 ? xt : 0); xi--) { int px = xi, py = yi; int sx = px, sy = py; sx = CLAMP(sx, 0, src_width - 1); diff --git a/editor/import/resource_importer_texture_atlas.h b/editor/import/resource_importer_texture_atlas.h index d518a120bf..177ef949ac 100644 --- a/editor/import/resource_importer_texture_atlas.h +++ b/editor/import/resource_importer_texture_atlas.h @@ -60,8 +60,8 @@ public: virtual int get_preset_count() const override; virtual String get_preset_name(int p_idx) const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual String get_option_group_file() const override; virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; diff --git a/editor/import/resource_importer_wav.cpp b/editor/import/resource_importer_wav.cpp index 2db1db9e51..820eba951f 100644 --- a/editor/import/resource_importer_wav.cpp +++ b/editor/import/resource_importer_wav.cpp @@ -58,7 +58,7 @@ String ResourceImporterWAV::get_resource_type() const { return "AudioStreamSample"; } -bool ResourceImporterWAV::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { +bool ResourceImporterWAV::get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const { if (p_option == "force/max_rate_hz" && !bool(p_options["force/max_rate"])) { return false; } @@ -74,7 +74,7 @@ String ResourceImporterWAV::get_preset_name(int p_idx) const { return String(); } -void ResourceImporterWAV::get_import_options(List<ImportOption> *r_options, int p_preset) const { +void ResourceImporterWAV::get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset) const { r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force/8_bit"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force/mono"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force/max_rate", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); @@ -252,13 +252,13 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s //loop point info! /** - * Consider exploring next document: - * http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Docs/RIFFNEW.pdf - * Especially on page: - * 16 - 17 - * Timestamp: - * 22:38 06.07.2017 GMT - **/ + * Consider exploring next document: + * http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Docs/RIFFNEW.pdf + * Especially on page: + * 16 - 17 + * Timestamp: + * 22:38 06.07.2017 GMT + **/ for (int i = 0; i < 10; i++) { file->get_32(); // i wish to know why should i do this... no doc! @@ -272,7 +272,7 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s if (loop_type == 0x00) { loop = AudioStreamSample::LOOP_FORWARD; } else if (loop_type == 0x01) { - loop = AudioStreamSample::LOOP_PING_PONG; + loop = AudioStreamSample::LOOP_PINGPONG; } else if (loop_type == 0x02) { loop = AudioStreamSample::LOOP_BACKWARD; } diff --git a/editor/import/resource_importer_wav.h b/editor/import/resource_importer_wav.h index 7413dbd11c..e3e605aeb2 100644 --- a/editor/import/resource_importer_wav.h +++ b/editor/import/resource_importer_wav.h @@ -46,8 +46,8 @@ public: virtual int get_preset_count() const override; virtual String get_preset_name(int p_idx) const override; - virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; - virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; + virtual void get_import_options(const String &p_path, List<ImportOption> *r_options, int p_preset = 0) const override; + virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; static void _compress_ima_adpcm(const Vector<float> &p_data, Vector<uint8_t> &dst_data) { /*p_sample_data->data = (void*)malloc(len); diff --git a/editor/import/scene_import_settings.cpp b/editor/import/scene_import_settings.cpp index 95a96f9e26..5690d49a55 100644 --- a/editor/import/scene_import_settings.cpp +++ b/editor/import/scene_import_settings.cpp @@ -327,7 +327,7 @@ void SceneImportSettings::_fill_scene(Node *p_node, TreeItem *p_parent_item) { MeshInstance3D *collider_view = memnew(MeshInstance3D); collider_view->set_name("collider_view"); collider_view->set_visible(false); - mesh_node->add_child(collider_view); + mesh_node->add_child(collider_view, true); collider_view->set_owner(mesh_node); Transform3D accum_xform; @@ -664,7 +664,7 @@ void SceneImportSettings::_select(Tree *p_from, String p_type, String p_id) { List<ResourceImporter::ImportOption> options; if (scene_import_settings_data->category == ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MAX) { - ResourceImporterScene::get_singleton()->get_import_options(&options); + ResourceImporterScene::get_singleton()->get_import_options(base_path, &options); } else { ResourceImporterScene::get_singleton()->get_internal_import_options(scene_import_settings_data->category, &options); } @@ -737,21 +737,21 @@ void SceneImportSettings::_viewport_input(const Ref<InputEvent> &p_input) { zoom = &md.cam_zoom; } Ref<InputEventMouseMotion> mm = p_input; - if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { (*rot_x) -= mm->get_relative().y * 0.01 * EDSCALE; (*rot_y) -= mm->get_relative().x * 0.01 * EDSCALE; (*rot_x) = CLAMP((*rot_x), -Math_PI / 2, Math_PI / 2); _update_camera(); } Ref<InputEventMouseButton> mb = p_input; - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::WHEEL_DOWN) { (*zoom) *= 1.1; if ((*zoom) > 10.0) { (*zoom) = 10.0; } _update_camera(); } - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::WHEEL_UP) { (*zoom) /= 1.1; if ((*zoom) < 0.1) { (*zoom) = 0.1; diff --git a/editor/import_defaults_editor.cpp b/editor/import_defaults_editor.cpp index 8300dcf555..4b69810861 100644 --- a/editor/import_defaults_editor.cpp +++ b/editor/import_defaults_editor.cpp @@ -62,7 +62,7 @@ protected: return; } for (const PropertyInfo &E : properties) { - if (importer->get_option_visibility(E.name, values)) { + if (importer->get_option_visibility("", E.name, values)) { p_list->push_back(E); } } @@ -119,7 +119,7 @@ void ImportDefaultsEditor::_update_importer() { if (importer.is_valid()) { List<ResourceImporter::ImportOption> options; - importer->get_import_options(&options); + importer->get_import_options("", &options); Dictionary d; if (ProjectSettings::get_singleton()->has_setting("importer_defaults/" + importer->get_importer_name())) { d = ProjectSettings::get_singleton()->get("importer_defaults/" + importer->get_importer_name()); diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp index a6e1e1d094..cc6b4e66e4 100644 --- a/editor/import_dock.cpp +++ b/editor/import_dock.cpp @@ -42,6 +42,7 @@ public: Vector<String> paths; Set<StringName> checked; bool checking; + String base_options_path; bool _set(const StringName &p_name, const Variant &p_value) { if (values.has(p_name)) { @@ -66,7 +67,7 @@ public: } void _get_property_list(List<PropertyInfo> *p_list) const { for (const PropertyInfo &E : properties) { - if (!importer->get_option_visibility(E.name, values)) { + if (!importer->get_option_visibility(base_options_path, E.name, values)) { continue; } PropertyInfo pi = E; @@ -104,8 +105,9 @@ void ImportDock::set_edit_path(const String &p_path) { params->paths.clear(); params->paths.push_back(p_path); + params->base_options_path = p_path; - _update_options(config); + _update_options(p_path, config); List<Ref<ResourceImporter>> importers; ResourceFormatImporter::get_singleton()->get_importers_for_extension(p_path.get_extension(), &importers); @@ -146,17 +148,18 @@ void ImportDock::_add_keep_import_option(const String &p_importer_name) { } } -void ImportDock::_update_options(const Ref<ConfigFile> &p_config) { +void ImportDock::_update_options(const String &p_path, const Ref<ConfigFile> &p_config) { List<ResourceImporter::ImportOption> options; if (params->importer.is_valid()) { - params->importer->get_import_options(&options); + params->importer->get_import_options(p_path, &options); } params->properties.clear(); params->values.clear(); params->checking = params->paths.size() > 1; params->checked.clear(); + params->base_options_path = p_path; for (const ResourceImporter::ImportOption &E : options) { params->properties.push_back(E.option); @@ -184,10 +187,12 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) { // Use the value that is repeated the most. Map<String, Dictionary> value_frequency; + Set<String> extensions; for (int i = 0; i < p_paths.size(); i++) { Ref<ConfigFile> config; config.instantiate(); + extensions.insert(p_paths[i].get_extension()); Error err = config->load(p_paths[i] + ".import"); ERR_CONTINUE(err != OK); @@ -223,13 +228,18 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) { ERR_FAIL_COND(params->importer.is_null()); + String base_path; + if (extensions.size() == 1 && p_paths.size() > 0) { + base_path = p_paths[0]; + } List<ResourceImporter::ImportOption> options; - params->importer->get_import_options(&options); + params->importer->get_import_options(base_path, &options); params->properties.clear(); params->values.clear(); params->checking = true; params->checked.clear(); + params->base_options_path = base_path; for (const ResourceImporter::ImportOption &E : options) { params->properties.push_back(E.option); @@ -327,22 +337,22 @@ void ImportDock::_importer_selected(int i_idx) { String name = import_as->get_selected_metadata(); if (name == "keep") { params->importer.unref(); - _update_options(Ref<ConfigFile>()); + _update_options(params->base_options_path, Ref<ConfigFile>()); } else { Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(name); ERR_FAIL_COND(importer.is_null()); params->importer = importer; - Ref<ConfigFile> config; if (params->paths.size()) { + String path = params->paths[0]; config.instantiate(); - Error err = config->load(params->paths[0] + ".import"); + Error err = config->load(path + ".import"); if (err != OK) { config.unref(); } } - _update_options(config); + _update_options(params->base_options_path, config); } } @@ -387,7 +397,7 @@ void ImportDock::_preset_selected(int p_idx) { default: { List<ResourceImporter::ImportOption> options; - params->importer->get_import_options(&options, p_idx); + params->importer->get_import_options(params->base_options_path, &options, p_idx); if (params->checking) { params->checked.clear(); diff --git a/editor/import_dock.h b/editor/import_dock.h index 150c44576d..ac73f3e3c0 100644 --- a/editor/import_dock.h +++ b/editor/import_dock.h @@ -64,7 +64,7 @@ class ImportDock : public VBoxContainer { void _preset_selected(int p_idx); void _importer_selected(int i_idx); - void _update_options(const Ref<ConfigFile> &p_config = Ref<ConfigFile>()); + void _update_options(const String &p_path, const Ref<ConfigFile> &p_config = Ref<ConfigFile>()); void _update_preset_menu(); void _add_keep_import_option(const String &p_importer_name); diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp index 59d0b92ba0..5622d0b145 100644 --- a/editor/inspector_dock.cpp +++ b/editor/inspector_dock.cpp @@ -391,7 +391,9 @@ void InspectorDock::_transform_keyed(Object *sp, const String &p_sub, const Tran if (!s) { return; } - AnimationPlayerEditor::get_singleton()->get_track_editor()->insert_transform_key(s, p_sub, p_key); + AnimationPlayerEditor::get_singleton()->get_track_editor()->insert_transform_key(s, p_sub, Animation::TYPE_POSITION_3D, p_key.origin); + AnimationPlayerEditor::get_singleton()->get_track_editor()->insert_transform_key(s, p_sub, Animation::TYPE_ROTATION_3D, p_key.basis.get_rotation_quaternion()); + AnimationPlayerEditor::get_singleton()->get_track_editor()->insert_transform_key(s, p_sub, Animation::TYPE_SCALE_3D, p_key.basis.get_scale()); } void InspectorDock::_warning_pressed() { diff --git a/editor/localization_editor.cpp b/editor/localization_editor.cpp index 3fe1aa557d..7458f617c3 100644 --- a/editor/localization_editor.cpp +++ b/editor/localization_editor.cpp @@ -98,7 +98,7 @@ void LocalizationEditor::_translation_delete(Object *p_item, int p_column, int p ERR_FAIL_INDEX(idx, translations.size()); - translations.remove(idx); + translations.remove_at(idx); undo_redo->create_action(TTR("Remove Translation")); undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translations", translations); @@ -276,7 +276,7 @@ void LocalizationEditor::_translation_res_option_delete(Object *p_item, int p_co ERR_FAIL_COND(!remaps.has(key)); PackedStringArray r = remaps[key]; ERR_FAIL_INDEX(idx, r.size()); - r.remove(idx); + r.remove_at(idx); remaps[key] = r; undo_redo->create_action(TTR("Remove Resource Remap Option")); @@ -321,7 +321,7 @@ void LocalizationEditor::_translation_filter_option_changed() { } } else { if (l_idx != -1) { - f_locales.remove(l_idx); + f_locales.remove_at(l_idx); } } @@ -397,7 +397,7 @@ void LocalizationEditor::_pot_delete(Object *p_item, int p_column, int p_button) ERR_FAIL_INDEX(idx, pot_translations.size()); - pot_translations.remove(idx); + pot_translations.remove_at(idx); undo_redo->create_action(TTR("Remove file from POT generation")); undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translations_pot_files", pot_translations); @@ -497,7 +497,7 @@ void LocalizationEditor::update_translations() { TreeItem *t = translation_filter->create_item(root); t->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); - t->set_text(0, n); + t->set_text(0, vformat("[%s] %s", l, n)); t->set_editable(0, true); t->set_tooltip(0, l); t->set_checked(0, is_checked); @@ -537,7 +537,7 @@ void LocalizationEditor::update_translations() { if (langnames.length() > 0) { langnames += ","; } - langnames += names[i]; + langnames += vformat("[%s] %s", langs[i], names[i]); translation_locales_idxs_remap.write[l_idx] = i; l_idx++; } @@ -546,7 +546,7 @@ void LocalizationEditor::update_translations() { if (i > 0) { langnames += ","; } - langnames += names[i]; + langnames += vformat("[%s] %s", langs[i], names[i]); } } diff --git a/editor/plugin_config_dialog.cpp b/editor/plugin_config_dialog.cpp index a3ff312497..c99b34e0c2 100644 --- a/editor/plugin_config_dialog.cpp +++ b/editor/plugin_config_dialog.cpp @@ -38,7 +38,7 @@ #include "editor/project_settings_editor.h" #include "scene/gui/grid_container.h" -#include "modules/modules_enabled.gen.h" +#include "modules/modules_enabled.gen.h" // For gdscript. #ifdef MODULE_GDSCRIPT_ENABLED #include "modules/gdscript/gdscript.h" #endif @@ -124,6 +124,10 @@ void PluginConfigDialog::_on_cancelled() { _clear_fields(); } +void PluginConfigDialog::_on_language_changed(const int) { + _on_required_text_changed(String()); +} + void PluginConfigDialog::_on_required_text_changed(const String &) { int lang_idx = script_option_edit->get_selected(); String ext = ScriptServer::get_language(lang_idx)->get_extension(); @@ -161,6 +165,9 @@ void PluginConfigDialog::_on_required_text_changed(const String &) { is_valid = false; subfolder_validation->set_texture(invalid_icon); subfolder_validation->set_tooltip(TTR("Subfolder cannot be blank.")); + } else if (!subfolder_edit->get_text().is_valid_filename()) { + subfolder_validation->set_texture(invalid_icon); + subfolder_validation->set_tooltip(TTR("Subfolder name is not a valid folder name.")); } else { DirAccessRef dir = DirAccess::create(DirAccess::ACCESS_RESOURCES); String path = "res://addons/" + subfolder_edit->get_text(); @@ -330,6 +337,7 @@ PluginConfigDialog::PluginConfigDialog() { } script_option_edit->select(default_lang); grid->add_child(script_option_edit); + script_option_edit->connect("item_selected", callable_mp(this, &PluginConfigDialog::_on_language_changed)); // Plugin Script Name Label *script_lb = memnew(Label); diff --git a/editor/plugin_config_dialog.h b/editor/plugin_config_dialog.h index ad5b96735f..45fcdb6b6e 100644 --- a/editor/plugin_config_dialog.h +++ b/editor/plugin_config_dialog.h @@ -59,6 +59,7 @@ class PluginConfigDialog : public ConfirmationDialog { void _clear_fields(); void _on_confirmed(); void _on_cancelled(); + void _on_language_changed(const int p_language); void _on_required_text_changed(const String &p_text); static String _to_absolute_plugin_path(const String &p_plugin_name); diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp index 36a814c30a..58f92a98a6 100644 --- a/editor/plugins/abstract_polygon_2d_editor.cpp +++ b/editor/plugins/abstract_polygon_2d_editor.cpp @@ -245,11 +245,11 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) Ref<InputEventMouseButton> mb = p_event; if (!_has_resource()) { - if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed()) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) { create_resource->set_text(String("No polygon resource on this node.\nCreate and assign one?")); create_resource->popup_centered(); } - return (mb.is_valid() && mb->get_button_index() == 1); + return (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT); } CanvasItemEditor::Tool tool = CanvasItemEditor::get_singleton()->get_current_tool(); @@ -264,7 +264,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) Vector2 cpoint = _get_node()->to_local(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position()))); if (mode == MODE_EDIT || (_is_line() && mode == MODE_CREATE)) { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { if (mb->is_ctrl_pressed() || mb->is_shift_pressed() || mb->is_alt_pressed()) { return false; @@ -326,7 +326,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) return true; } } - } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && !edited_point.valid()) { + } else if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed() && !edited_point.valid()) { const PosVertex closest = closest_point(gpoint); if (closest.valid()) { @@ -335,7 +335,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) } } } else if (mode == MODE_DELETE) { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) { + if (mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) { const PosVertex closest = closest_point(gpoint); if (closest.valid()) { @@ -346,7 +346,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) } if (mode == MODE_CREATE) { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) { + if (mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) { if (_is_line()) { // for lines, we don't have a wip mode, and we can undo each single add point. Vector<Vector2> vertices = _get_polygon(0); @@ -384,7 +384,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) return true; } } - } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && wip_active) { + } else if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed() && wip_active) { _wip_cancel(); } } @@ -395,7 +395,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) if (mm.is_valid()) { Vector2 gpoint = mm->get_position(); - if (edited_point.valid() && (wip_active || (mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT))) { + if (edited_point.valid() && (wip_active || (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE)) { Vector2 cpoint = _get_node()->to_local(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint))); //Move the point in a single axis. Should only work when editing a polygon and while holding shift. @@ -443,10 +443,10 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) Ref<InputEventKey> k = p_event; if (k.is_valid() && k->is_pressed()) { - if (k->get_keycode() == KEY_DELETE || k->get_keycode() == KEY_BACKSPACE) { + if (k->get_keycode() == Key::KEY_DELETE || k->get_keycode() == Key::BACKSPACE) { if (wip_active && selected_point.polygon == -1) { if (wip.size() > selected_point.vertex) { - wip.remove(selected_point.vertex); + wip.remove_at(selected_point.vertex); _wip_changed(); selected_point = wip.size() - 1; canvas_item_editor->update_viewport(); @@ -460,9 +460,9 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) return true; } } - } else if (wip_active && k->get_keycode() == KEY_ENTER) { + } else if (wip_active && k->get_keycode() == Key::ENTER) { _wip_close(); - } else if (wip_active && k->get_keycode() == KEY_ESCAPE) { + } else if (wip_active && k->get_keycode() == Key::ESCAPE) { _wip_cancel(); } } @@ -599,7 +599,7 @@ void AbstractPolygon2DEditor::remove_point(const Vertex &p_vertex) { Vector<Vector2> vertices = _get_polygon(p_vertex.polygon); if (vertices.size() > (_is_line() ? 2 : 3)) { - vertices.remove(p_vertex.vertex); + vertices.remove_at(p_vertex.vertex); undo_redo->create_action(TTR("Edit Polygon (Remove Point)")); _action_set_polygon(p_vertex.polygon, vertices); diff --git a/editor/plugins/abstract_polygon_2d_editor.h b/editor/plugins/abstract_polygon_2d_editor.h index 4f9adfff25..5fea8b75d6 100644 --- a/editor/plugins/abstract_polygon_2d_editor.h +++ b/editor/plugins/abstract_polygon_2d_editor.h @@ -106,7 +106,6 @@ protected: void _wip_changed(); void _wip_close(); void _wip_cancel(); - bool _delete_point(const Vector2 &p_gpoint); void _notification(int p_what); void _node_removed(Node *p_node); diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp index ad2d9866fa..cfb7217baa 100644 --- a/editor/plugins/animation_blend_space_1d_editor.cpp +++ b/editor/plugins/animation_blend_space_1d_editor.cpp @@ -42,7 +42,7 @@ StringName AnimationNodeBlendSpace1DEditor::get_blend_position_path() const { void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventKey> k = p_event; - if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_DELETE && !k->is_echo()) { + if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == Key::KEY_DELETE && !k->is_echo()) { if (selected_point != -1) { _erase_selected(); accept_event(); @@ -51,7 +51,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) || (mb->get_button_index() == MOUSE_BUTTON_LEFT && tool_create->is_pressed()))) { + if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) || (mb->get_button_index() == MouseButton::LEFT && tool_create->is_pressed()))) { menu->clear(); animations_menu->clear(); animations_to_add.clear(); @@ -110,7 +110,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven } } - if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { blend_space_draw->update(); // why not // try to see if a point can be selected @@ -132,7 +132,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven } } - if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MouseButton::LEFT) { if (dragging_selected) { // move float point = blend_space->get_blend_point_position(selected_point); @@ -161,7 +161,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven } // *set* the blend - if (mb.is_valid() && !mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { float blend_pos = mb->get_position().x / blend_space_draw->get_size().x; blend_pos *= blend_space->get_max_space() - blend_space->get_min_space(); blend_pos += blend_space->get_min_space(); @@ -184,7 +184,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven _update_edited_point_pos(); } - if (mm.is_valid() && tool_blend->is_pressed() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + if (mm.is_valid() && tool_blend->is_pressed() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { float blend_pos = mm->get_position().x / blend_space_draw->get_size().x; blend_pos *= blend_space->get_max_space() - blend_space->get_min_space(); blend_pos += blend_space->get_min_space(); diff --git a/editor/plugins/animation_blend_space_1d_editor.h b/editor/plugins/animation_blend_space_1d_editor.h index fe98a91ab3..503e066894 100644 --- a/editor/plugins/animation_blend_space_1d_editor.h +++ b/editor/plugins/animation_blend_space_1d_editor.h @@ -109,8 +109,6 @@ class AnimationNodeBlendSpace1DEditor : public AnimationTreeNodeEditorPlugin { void _edit_point_pos(double); void _open_editor(); - void _goto_parent(); - EditorFileDialog *open_file; Ref<AnimationNode> file_loaded; void _file_opened(const String &p_file); diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp index 686a35e442..9af060ed84 100644 --- a/editor/plugins/animation_blend_space_2d_editor.cpp +++ b/editor/plugins/animation_blend_space_2d_editor.cpp @@ -70,7 +70,7 @@ StringName AnimationNodeBlendSpace2DEditor::get_blend_position_path() const { void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventKey> k = p_event; - if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_DELETE && !k->is_echo()) { + if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == Key::KEY_DELETE && !k->is_echo()) { if (selected_point != -1 || selected_triangle != -1) { _erase_selected(); accept_event(); @@ -79,7 +79,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) || (mb->get_button_index() == MOUSE_BUTTON_LEFT && tool_create->is_pressed()))) { + if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) || (mb->get_button_index() == MouseButton::LEFT && tool_create->is_pressed()))) { menu->clear(); animations_menu->clear(); animations_to_add.clear(); @@ -133,7 +133,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven } } - if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { blend_space_draw->update(); //update anyway //try to see if a point can be selected selected_point = -1; @@ -173,7 +173,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven } } - if (mb.is_valid() && mb->is_pressed() && tool_triangle->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_triangle->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { blend_space_draw->update(); //update anyway //try to see if a point can be selected selected_point = -1; @@ -208,7 +208,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven } } - if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MouseButton::LEFT) { if (dragging_selected) { //move Vector2 point = blend_space->get_blend_point_position(selected_point); @@ -234,7 +234,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven blend_space_draw->update(); } - if (mb.is_valid() && mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { Vector2 blend_pos = (mb->get_position() / blend_space_draw->get_size()); blend_pos.y = 1.0 - blend_pos.y; blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space()); @@ -268,7 +268,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven blend_space_draw->update(); } - if (mm.is_valid() && tool_blend->is_pressed() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + if (mm.is_valid() && tool_blend->is_pressed() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { Vector2 blend_pos = (mm->get_position() / blend_space_draw->get_size()); blend_pos.y = 1.0 - blend_pos.y; blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space()); diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp index 55ffbf9477..c4a938f91d 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.cpp +++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -58,7 +58,7 @@ void AnimationNodeBlendTreeEditor::add_custom_type(const String &p_name, const R void AnimationNodeBlendTreeEditor::remove_custom_type(const Ref<Script> &p_script) { for (int i = 0; i < add_options.size(); i++) { if (add_options[i].script == p_script) { - add_options.remove(i); + add_options.remove_at(i); return; } } @@ -68,7 +68,7 @@ void AnimationNodeBlendTreeEditor::remove_custom_type(const Ref<Script> &p_scrip void AnimationNodeBlendTreeEditor::_update_options_menu(bool p_has_input_ports) { add_node->get_popup()->clear(); - add_node->get_popup()->set_size(Size2i(-1, -1)); + add_node->get_popup()->reset_size(); for (int i = 0; i < add_options.size(); i++) { if (p_has_input_ports && add_options[i].input_port_count == 0) { continue; @@ -945,7 +945,7 @@ AnimationNodeBlendTreeEditor::AnimationNodeBlendTreeEditor() { add_node->set_text(TTR("Add Node...")); graph->get_zoom_hbox()->move_child(add_node, 0); add_node->get_popup()->connect("id_pressed", callable_mp(this, &AnimationNodeBlendTreeEditor::_add_node)); - add_node->connect("about_to_popup", callable_mp(this, &AnimationNodeBlendTreeEditor::_update_options_menu)); + add_node->connect("about_to_popup", callable_mp(this, &AnimationNodeBlendTreeEditor::_update_options_menu), varray(false)); add_options.push_back(AddOption("Animation", "AnimationNodeAnimation")); add_options.push_back(AddOption("OneShot", "AnimationNodeOneShot", 2)); diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index ea025dad3e..f936871bce 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -41,6 +41,8 @@ #include "editor/plugins/canvas_item_editor_plugin.h" // For onion skinning. #include "editor/plugins/node_3d_editor_plugin.h" // For onion skinning. #include "scene/main/window.h" +#include "scene/resources/animation.h" +#include "scene/scene_string_names.h" #include "servers/rendering_server.h" void AnimationPlayerEditor::_node_removed(Node *p_node) { @@ -72,7 +74,7 @@ void AnimationPlayerEditor::_notification(int p_what) { if (player->has_animation(animname)) { Ref<Animation> anim = player->get_animation(animname); if (!anim.is_null()) { - frame->set_max(anim->get_length()); + frame->set_max((double)anim->get_length()); } } } @@ -289,7 +291,7 @@ void AnimationPlayerEditor::_animation_selected(int p_which) { track_editor->set_root(root); } } - frame->set_max(anim->get_length()); + frame->set_max((double)anim->get_length()); } else { track_editor->set_animation(Ref<Animation>()); @@ -474,7 +476,7 @@ double AnimationPlayerEditor::_get_editor_step() const { ERR_FAIL_COND_V(!anim.is_valid(), 0.0); // Use more precise snapping when holding Shift - return Input::get_singleton()->is_key_pressed(KEY_SHIFT) ? anim->get_step() * 0.25 : anim->get_step(); + return Input::get_singleton()->is_key_pressed(Key::SHIFT) ? anim->get_step() * 0.25 : anim->get_step(); } return 0.0; @@ -835,12 +837,12 @@ void AnimationPlayerEditor::_update_player() { for (const StringName &E : animlist) { Ref<Texture2D> icon; if (E == player->get_autoplay()) { - if (E == "RESET") { + if (E == SceneStringNames::get_singleton()->RESET) { icon = autoplay_reset_icon; } else { icon = autoplay_icon; } - } else if (E == "RESET") { + } else if (E == SceneStringNames::get_singleton()->RESET) { icon = reset_icon; } animation->add_icon_item(icon, E); @@ -1014,7 +1016,7 @@ void AnimationPlayerEditor::_seek_value_changed(float p_value, bool p_set, bool Ref<Animation> anim; anim = player->get_animation(current); - float pos = CLAMP(anim->get_length() * (p_value / frame->get_max()), 0, anim->get_length()); + float pos = CLAMP((double)anim->get_length() * (p_value / frame->get_max()), 0, (double)anim->get_length()); if (track_editor->is_snap_enabled()) { pos = Math::snapped(pos, _get_editor_step()); } @@ -1228,7 +1230,7 @@ void AnimationPlayerEditor::unhandled_key_input(const Ref<InputEvent> &p_ev) { Ref<InputEventKey> k = p_ev; if (is_visible_in_tree() && k.is_valid() && k->is_pressed() && !k->is_echo() && !k->is_alt_pressed() && !k->is_ctrl_pressed() && !k->is_meta_pressed()) { switch (k->get_keycode()) { - case KEY_A: { + case Key::A: { if (!k->is_shift_pressed()) { _play_bw_from_pressed(); } else { @@ -1236,11 +1238,11 @@ void AnimationPlayerEditor::unhandled_key_input(const Ref<InputEvent> &p_ev) { } accept_event(); } break; - case KEY_S: { + case Key::S: { _stop_pressed(); accept_event(); } break; - case KEY_D: { + case Key::D: { if (!k->is_shift_pressed()) { _play_from_pressed(); } else { @@ -1424,7 +1426,7 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() { float pos = cpos + step_off * anim->get_step(); - bool valid = anim->has_loop() || (pos >= 0 && pos <= anim->get_length()); + bool valid = anim->get_loop_mode() != Animation::LoopMode::LOOP_NONE || (pos >= 0 && pos <= anim->get_length()); onion.captures_valid.write[cidx] = valid; if (valid) { player->seek(pos, true); diff --git a/editor/plugins/animation_player_editor_plugin.h b/editor/plugins/animation_player_editor_plugin.h index eb8db2eaba..26bcff891d 100644 --- a/editor/plugins/animation_player_editor_plugin.h +++ b/editor/plugins/animation_player_editor_plugin.h @@ -187,7 +187,6 @@ class AnimationPlayerEditor : public VBoxContainer { void _scale_changed(const String &p_scale); void _save_animation(String p_file); void _load_animations(Vector<String> p_files); - void _seek_frame_changed(const String &p_frame); void _seek_value_changed(float p_value, bool p_set = false, bool p_timeline_only = false); void _blend_editor_next_changed(const int p_idx); @@ -217,7 +216,6 @@ class AnimationPlayerEditor : public VBoxContainer { void _pin_pressed(); - AnimationPlayerEditor(); ~AnimationPlayerEditor(); protected: diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp index a1f96f21bf..191f5d9071 100644 --- a/editor/plugins/animation_state_machine_editor.cpp +++ b/editor/plugins/animation_state_machine_editor.cpp @@ -66,7 +66,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv } Ref<InputEventKey> k = p_event; - if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_DELETE && !k->is_echo()) { + if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == Key::KEY_DELETE && !k->is_echo()) { if (selected_node != StringName() || selected_transition_to != StringName() || selected_transition_from != StringName()) { _erase_selected(); accept_event(); @@ -76,7 +76,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv Ref<InputEventMouseButton> mb = p_event; //Add new node - if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) || (tool_create->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT))) { + if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) || (tool_create->is_pressed() && mb->get_button_index() == MouseButton::LEFT))) { menu->clear(); animations_menu->clear(); animations_to_add.clear(); @@ -124,7 +124,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv } // select node or push a field inside - if (mb.is_valid() && !mb->is_shift_pressed() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_shift_pressed() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { selected_transition_from = StringName(); selected_transition_to = StringName(); selected_node = StringName(); @@ -216,7 +216,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv } //end moving node - if (mb.is_valid() && dragging_selected_attempt && mb->get_button_index() == MOUSE_BUTTON_LEFT && !mb->is_pressed()) { + if (mb.is_valid() && dragging_selected_attempt && mb->get_button_index() == MouseButton::LEFT && !mb->is_pressed()) { if (dragging_selected) { Ref<AnimationNode> an = state_machine->get_node(selected_node); updating = true; @@ -237,7 +237,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv } //connect nodes - if (mb.is_valid() && ((tool_select->is_pressed() && mb->is_shift_pressed()) || tool_connect->is_pressed()) && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) { + if (mb.is_valid() && ((tool_select->is_pressed() && mb->is_shift_pressed()) || tool_connect->is_pressed()) && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) { for (int i = node_rects.size() - 1; i >= 0; i--) { //inverse to draw order if (node_rects[i].node.has_point(mb->get_position())) { //select node since nothing else was selected connecting = true; @@ -250,7 +250,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv } //end connecting nodes - if (mb.is_valid() && connecting && mb->get_button_index() == MOUSE_BUTTON_LEFT && !mb->is_pressed()) { + if (mb.is_valid() && connecting && mb->get_button_index() == MouseButton::LEFT && !mb->is_pressed()) { if (connecting_to_node != StringName()) { if (state_machine->has_transition(connecting_from, connecting_to_node)) { EditorNode::get_singleton()->show_warning(TTR("Transition exists!")); @@ -284,7 +284,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv Ref<InputEventMouseMotion> mm = p_event; //pan window - if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { + if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_MIDDLE) != MouseButton::NONE) { h_scroll->set_value(h_scroll->get_value() - mm->get_relative().x); v_scroll->set_value(v_scroll->get_value() - mm->get_relative().y); } diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index aacfc3e305..1a216b3862 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -620,7 +620,7 @@ void EditorAssetLibrary::unhandled_key_input(const Ref<InputEvent> &p_event) { const Ref<InputEventKey> key = p_event; if (key.is_valid() && key->is_pressed()) { - if (key->get_keycode_with_modifiers() == (KEY_MASK_CMD | KEY_F) && is_visible_in_tree()) { + if (key->get_keycode_with_modifiers() == (KeyModifierMask::CMD | Key::F) && is_visible_in_tree()) { filter->grab_focus(); filter->select_all(); accept_event(); diff --git a/editor/plugins/asset_library_editor_plugin.h b/editor/plugins/asset_library_editor_plugin.h index 286546f962..5fbf2833b2 100644 --- a/editor/plugins/asset_library_editor_plugin.h +++ b/editor/plugins/asset_library_editor_plugin.h @@ -285,7 +285,6 @@ class EditorAssetLibrary : public PanelContainer { void _search_text_submitted(const String &p_text = ""); void _api_request(const String &p_request, RequestType p_request_type, const String &p_arguments = ""); void _http_request_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data); - void _http_download_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data); void _filter_debounce_timer_timeout(); void _repository_changed(int p_repository_id); diff --git a/editor/plugins/audio_stream_editor_plugin.cpp b/editor/plugins/audio_stream_editor_plugin.cpp index 482c08f50a..c76713f534 100644 --- a/editor/plugins/audio_stream_editor_plugin.cpp +++ b/editor/plugins/audio_stream_editor_plugin.cpp @@ -157,7 +157,7 @@ void AudioStreamEditor::_draw_indicator() { void AudioStreamEditor::_on_input_indicator(Ref<InputEvent> p_event) { const Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { _seek_to(mb->get_position().x); } @@ -232,7 +232,7 @@ AudioStreamEditor::AudioStreamEditor() { hbox->add_child(_play_button); _play_button->set_focus_mode(Control::FOCUS_NONE); _play_button->connect("pressed", callable_mp(this, &AudioStreamEditor::_play)); - _play_button->set_shortcut(ED_SHORTCUT("inspector/audio_preview_play_pause", TTR("Audio Preview Play/Pause"), KEY_SPACE)); + _play_button->set_shortcut(ED_SHORTCUT("inspector/audio_preview_play_pause", TTR("Audio Preview Play/Pause"), Key::SPACE)); _stop_button = memnew(Button); _stop_button->set_flat(true); diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index ef872bcead..aa46eef21f 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -242,7 +242,7 @@ bool CanvasItemEditor::_is_node_movable(const Node *p_node, bool p_popup_warning } if (Object::cast_to<Control>(p_node) && Object::cast_to<Container>(p_node->get_parent())) { if (p_popup_warning) { - _popup_warning_temporarily(warning_child_of_container, 3.0); + EditorToaster::get_singleton()->popup_str("Children of a container get their position and size determined only by their parent.", EditorToaster::SEVERITY_WARNING); } return false; } @@ -333,7 +333,7 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, unsig snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; - bool is_snap_active = smart_snap_active ^ Input::get_singleton()->is_key_pressed(KEY_CTRL); + bool is_snap_active = smart_snap_active ^ Input::get_singleton()->is_key_pressed(Key::CTRL); // Smart snap using the canvas position Vector2 output = p_target; @@ -461,7 +461,7 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, unsig } real_t CanvasItemEditor::snap_angle(real_t p_target, real_t p_start) const { - if (((smart_snap_active || snap_rotation) ^ Input::get_singleton()->is_key_pressed(KEY_CTRL)) && snap_rotation_step != 0) { + if (((smart_snap_active || snap_rotation) ^ Input::get_singleton()->is_key_pressed(Key::CTRL)) && snap_rotation_step != 0) { if (snap_relative) { return Math::snapped(p_target - snap_rotation_offset, snap_rotation_step) + snap_rotation_offset + (p_start - (int)(p_start / snap_rotation_step) * snap_rotation_step); } else { @@ -482,7 +482,7 @@ void CanvasItemEditor::unhandled_key_input(const Ref<InputEvent> &p_ev) { } if (k.is_valid()) { - if (k->get_keycode() == KEY_CTRL || k->get_keycode() == KEY_ALT || k->get_keycode() == KEY_SHIFT) { + if (k->get_keycode() == Key::CTRL || k->get_keycode() == Key::ALT || k->get_keycode() == Key::SHIFT) { viewport->update(); } @@ -658,7 +658,7 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel //Remove the item if invalid if (!canvas_item || duplicate || (canvas_item != scene && canvas_item->get_owner() != scene && !scene->is_editable_instance(canvas_item->get_owner())) || (!p_allow_locked && _is_node_locked(canvas_item))) { - r_items.remove(i); + r_items.remove_at(i); i--; } else { r_items.write[i].item = canvas_item; @@ -877,7 +877,7 @@ void CanvasItemEditor::_selection_result_pressed(int p_result) { void CanvasItemEditor::_selection_menu_hide() { selection_results.clear(); selection_menu->clear(); - selection_menu->set_size(Vector2(0, 0)); + selection_menu->reset_size(); } void CanvasItemEditor::_add_node_pressed(int p_result) { @@ -950,7 +950,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve } // Start dragging a guide - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && b->is_pressed()) { // Press button if (b->get_position().x < RULER_WIDTH && b->get_position().y < RULER_WIDTH) { // Drag a new double guide @@ -1009,7 +1009,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve } // Release confirms the guide move - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && !b->is_pressed()) { if (show_guides && EditorNode::get_singleton()->get_edited_scene()) { Transform2D xform = viewport_scrollable->get_transform() * transform; @@ -1045,7 +1045,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve } } else { if (dragged_guide_index >= 0) { - vguides.remove(dragged_guide_index); + vguides.remove_at(dragged_guide_index); undo_redo->create_action(TTR("Remove Vertical Guide")); if (vguides.is_empty()) { undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "remove_meta", "_edit_vertical_guides_"); @@ -1078,7 +1078,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve } } else { if (dragged_guide_index >= 0) { - hguides.remove(dragged_guide_index); + hguides.remove_at(dragged_guide_index); undo_redo->create_action(TTR("Remove Horizontal Guide")); if (hguides.is_empty()) { undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "remove_meta", "_edit_horizontal_guides_"); @@ -1123,7 +1123,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo if (pan_on_scroll) { // Perform horizontal scrolling first so we can check for Shift being held. if (b->is_pressed() && - (b->get_button_index() == MOUSE_BUTTON_WHEEL_LEFT || (b->is_shift_pressed() && b->get_button_index() == MOUSE_BUTTON_WHEEL_UP))) { + (b->get_button_index() == MouseButton::WHEEL_LEFT || (b->is_shift_pressed() && b->get_button_index() == MouseButton::WHEEL_UP))) { // Pan left view_offset.x -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); @@ -1131,7 +1131,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo } if (b->is_pressed() && - (b->get_button_index() == MOUSE_BUTTON_WHEEL_RIGHT || (b->is_shift_pressed() && b->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN))) { + (b->get_button_index() == MouseButton::WHEEL_RIGHT || (b->is_shift_pressed() && b->get_button_index() == MouseButton::WHEEL_DOWN))) { // Pan right view_offset.x += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); @@ -1139,13 +1139,13 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo } } - if (b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { + if (b->is_pressed() && b->get_button_index() == MouseButton::WHEEL_DOWN) { // Scroll or pan down if (pan_on_scroll) { view_offset.y += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); } else { - zoom_widget->set_zoom_by_increments(-1, Input::get_singleton()->is_key_pressed(KEY_ALT)); + zoom_widget->set_zoom_by_increments(-1, Input::get_singleton()->is_key_pressed(Key::ALT)); if (!Math::is_equal_approx(b->get_factor(), 1.0f)) { // Handle high-precision (analog) scrolling. zoom_widget->set_zoom(zoom * ((zoom_widget->get_zoom() / zoom - 1.f) * b->get_factor() + 1.f)); @@ -1155,13 +1155,13 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo return true; } - if (b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { + if (b->is_pressed() && b->get_button_index() == MouseButton::WHEEL_UP) { // Scroll or pan up if (pan_on_scroll) { view_offset.y -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); } else { - zoom_widget->set_zoom_by_increments(1, Input::get_singleton()->is_key_pressed(KEY_ALT)); + zoom_widget->set_zoom_by_increments(1, Input::get_singleton()->is_key_pressed(Key::ALT)); if (!Math::is_equal_approx(b->get_factor(), 1.0f)) { // Handle high-precision (analog) scrolling. zoom_widget->set_zoom(zoom * ((zoom_widget->get_zoom() / zoom - 1.f) * b->get_factor() + 1.f)); @@ -1173,17 +1173,16 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo if (!panning) { if (b->is_pressed() && - (b->get_button_index() == MOUSE_BUTTON_MIDDLE || - b->get_button_index() == MOUSE_BUTTON_RIGHT || - (b->get_button_index() == MOUSE_BUTTON_LEFT && tool == TOOL_PAN) || - (b->get_button_index() == MOUSE_BUTTON_LEFT && !EditorSettings::get_singleton()->get("editors/2d/simple_panning") && pan_pressed))) { + (b->get_button_index() == MouseButton::MIDDLE || + (b->get_button_index() == MouseButton::LEFT && tool == TOOL_PAN) || + (b->get_button_index() == MouseButton::LEFT && !EditorSettings::get_singleton()->get("editors/2d/simple_panning") && pan_pressed))) { // Pan the viewport panning = true; } } if (panning) { - if (!b->is_pressed() && (pan_on_scroll || (b->get_button_index() != MOUSE_BUTTON_WHEEL_DOWN && b->get_button_index() != MOUSE_BUTTON_WHEEL_UP))) { + if (!b->is_pressed() && (pan_on_scroll || (b->get_button_index() != MouseButton::WHEEL_DOWN && b->get_button_index() != MouseButton::WHEEL_UP))) { // Stop panning the viewport (for any mouse button press except zooming) panning = false; } @@ -1232,8 +1231,9 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo } } - if (is_pan_key) { + if (is_pan_key && pan_pressed != k->is_pressed()) { pan_pressed = k->is_pressed(); + _update_cursor(); } } @@ -1294,8 +1294,8 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) { // Drag the pivot (in pivot mode / with V key) if (drag_type == DRAG_NONE) { - if ((b.is_valid() && b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) || - (k.is_valid() && k->is_pressed() && !k->is_echo() && k->get_keycode() == KEY_V && tool == TOOL_SELECT && k->get_modifiers_mask() == 0)) { + if ((b.is_valid() && b->is_pressed() && b->get_button_index() == MouseButton::LEFT && tool == TOOL_EDIT_PIVOT) || + (k.is_valid() && k->is_pressed() && !k->is_echo() && k->get_keycode() == Key::V && tool == TOOL_SELECT && k->get_modifiers_mask() == Key::NONE)) { List<CanvasItem *> selection = _get_edited_canvas_items(); // Filters the selection with nodes that allow setting the pivot @@ -1345,8 +1345,8 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) { // Confirm the pivot move if (drag_selection.size() >= 1 && - ((b.is_valid() && !b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) || - (k.is_valid() && !k->is_pressed() && k->get_keycode() == KEY_V))) { + ((b.is_valid() && !b->is_pressed() && b->get_button_index() == MouseButton::LEFT && tool == TOOL_EDIT_PIVOT) || + (k.is_valid() && !k->is_pressed() && k->get_keycode() == Key::V))) { _commit_canvas_item_state( drag_selection, vformat( @@ -1359,7 +1359,7 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -1375,7 +1375,7 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) { // Start rotation if (drag_type == DRAG_NONE) { - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && b->is_pressed()) { if ((b->is_command_pressed() && !b->is_alt_pressed() && tool == TOOL_SELECT) || tool == TOOL_ROTATE) { List<CanvasItem *> selection = _get_edited_canvas_items(); @@ -1418,7 +1418,7 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) { } // Confirms the node rotation - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && !b->is_pressed()) { if (drag_selection.size() != 1) { _commit_canvas_item_state( drag_selection, @@ -1442,7 +1442,7 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -1456,7 +1456,7 @@ bool CanvasItemEditor::_gui_input_open_scene_on_double_click(const Ref<InputEven Ref<InputEventMouseButton> b = p_event; // Open a sub-scene on double-click - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && b->is_double_click() && tool == TOOL_SELECT) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && b->is_pressed() && b->is_double_click() && tool == TOOL_SELECT) { List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { CanvasItem *canvas_item = selection[0]; @@ -1475,7 +1475,7 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) { // Starts anchor dragging if needed if (drag_type == DRAG_NONE) { - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && b->is_pressed() && tool == TOOL_SELECT) { List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { Control *control = Object::cast_to<Control>(selection[0]); @@ -1595,7 +1595,7 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) { } // Confirms new anchor position - if (drag_selection.size() >= 1 && b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { + if (drag_selection.size() >= 1 && b.is_valid() && b->get_button_index() == MouseButton::LEFT && !b->is_pressed()) { _commit_canvas_item_state( drag_selection, vformat(TTR("Move CanvasItem \"%s\" Anchor"), drag_selection[0]->get_name())); @@ -1604,7 +1604,7 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -1620,7 +1620,7 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) { // Drag resize handles if (drag_type == DRAG_NONE) { - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && b->is_pressed() && tool == TOOL_SELECT) { List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { CanvasItem *canvas_item = selection[0]; @@ -1774,7 +1774,7 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) { } // Confirm resize - if (drag_selection.size() >= 1 && b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { + if (drag_selection.size() >= 1 && b.is_valid() && b->get_button_index() == MouseButton::LEFT && !b->is_pressed()) { const Node2D *node2d = Object::cast_to<Node2D>(drag_selection[0]); if (node2d) { // Extends from Node2D. @@ -1811,7 +1811,7 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; @@ -1829,7 +1829,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { // Drag resize handles if (drag_type == DRAG_NONE) { - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && ((b->is_alt_pressed() && b->is_ctrl_pressed()) || tool == TOOL_SCALE)) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && b->is_pressed() && ((b->is_alt_pressed() && b->is_ctrl_pressed()) || tool == TOOL_SCALE)) { List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { CanvasItem *canvas_item = selection[0]; @@ -1876,7 +1876,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { Transform2D simple_xform = (viewport->get_transform() * unscaled_transform).affine_inverse() * transform; bool uniform = m->is_shift_pressed(); - bool is_ctrl = Input::get_singleton()->is_key_pressed(KEY_CTRL); + bool is_ctrl = Input::get_singleton()->is_key_pressed(Key::CTRL); Point2 drag_from_local = simple_xform.xform(drag_from); Point2 drag_to_local = simple_xform.xform(drag_to); @@ -1925,7 +1925,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { } // Confirm resize - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && !b->is_pressed()) { if (drag_selection.size() != 1) { _commit_canvas_item_state( drag_selection, @@ -1950,7 +1950,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -1967,7 +1967,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { if (drag_type == DRAG_NONE) { //Start moving the nodes - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && b->is_pressed()) { if ((b->is_alt_pressed() && !b->is_ctrl_pressed()) || tool == TOOL_MOVE) { List<CanvasItem *> selection = _get_edited_canvas_items(); @@ -2050,7 +2050,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { } // Confirm the move (only if it was moved) - if (b.is_valid() && !b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT) { + if (b.is_valid() && !b->is_pressed() && b->get_button_index() == MouseButton::LEFT) { if (transform.affine_inverse().xform(b->get_position()) != drag_from) { if (drag_selection.size() != 1) { _commit_canvas_item_state( @@ -2083,7 +2083,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MouseButton::RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection, true); snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; @@ -2095,7 +2095,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { // Move the canvas items with the arrow keys if (k.is_valid() && k->is_pressed() && (tool == TOOL_SELECT || tool == TOOL_MOVE) && - (k->get_keycode() == KEY_UP || k->get_keycode() == KEY_DOWN || k->get_keycode() == KEY_LEFT || k->get_keycode() == KEY_RIGHT)) { + (k->get_keycode() == Key::UP || k->get_keycode() == Key::DOWN || k->get_keycode() == Key::LEFT || k->get_keycode() == Key::RIGHT)) { if (!k->is_echo()) { // Start moving the canvas items with the keyboard drag_selection = _get_edited_canvas_items(); @@ -2112,13 +2112,13 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { bool move_local_base_rotated = k->is_ctrl_pressed() || k->is_meta_pressed(); Vector2 dir; - if (k->get_keycode() == KEY_UP) { + if (k->get_keycode() == Key::UP) { dir += Vector2(0, -1); - } else if (k->get_keycode() == KEY_DOWN) { + } else if (k->get_keycode() == Key::DOWN) { dir += Vector2(0, 1); - } else if (k->get_keycode() == KEY_LEFT) { + } else if (k->get_keycode() == Key::LEFT) { dir += Vector2(-1, 0); - } else if (k->get_keycode() == KEY_RIGHT) { + } else if (k->get_keycode() == Key::RIGHT) { dir += Vector2(1, 0); } if (k->is_shift_pressed()) { @@ -2166,12 +2166,12 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { } if (k.is_valid() && !k->is_pressed() && drag_type == DRAG_KEY_MOVE && (tool == TOOL_SELECT || tool == TOOL_MOVE) && - (k->get_keycode() == KEY_UP || k->get_keycode() == KEY_DOWN || k->get_keycode() == KEY_LEFT || k->get_keycode() == KEY_RIGHT)) { + (k->get_keycode() == Key::UP || k->get_keycode() == Key::DOWN || k->get_keycode() == Key::LEFT || k->get_keycode() == Key::RIGHT)) { // Confirm canvas items move by arrow keys - if ((!Input::get_singleton()->is_key_pressed(KEY_UP)) && - (!Input::get_singleton()->is_key_pressed(KEY_DOWN)) && - (!Input::get_singleton()->is_key_pressed(KEY_LEFT)) && - (!Input::get_singleton()->is_key_pressed(KEY_RIGHT))) { + if ((!Input::get_singleton()->is_key_pressed(Key::UP)) && + (!Input::get_singleton()->is_key_pressed(Key::DOWN)) && + (!Input::get_singleton()->is_key_pressed(Key::LEFT)) && + (!Input::get_singleton()->is_key_pressed(Key::RIGHT))) { if (drag_selection.size() > 1) { _commit_canvas_item_state( drag_selection, @@ -2192,7 +2192,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { return true; } - return (k.is_valid() && (k->get_keycode() == KEY_UP || k->get_keycode() == KEY_DOWN || k->get_keycode() == KEY_LEFT || k->get_keycode() == KEY_RIGHT)); // Accept the key event in any case + return (k.is_valid() && (k->get_keycode() == Key::UP || k->get_keycode() == Key::DOWN || k->get_keycode() == Key::LEFT || k->get_keycode() == Key::RIGHT)); // Accept the key event in any case } bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { @@ -2202,8 +2202,8 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { if (drag_type == DRAG_NONE) { if (b.is_valid() && - ((b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_alt_pressed() && tool == TOOL_SELECT) || - (b->get_button_index() == MOUSE_BUTTON_LEFT && tool == TOOL_LIST_SELECT))) { + ((b->get_button_index() == MouseButton::RIGHT && b->is_alt_pressed() && tool == TOOL_SELECT) || + (b->get_button_index() == MouseButton::LEFT && tool == TOOL_LIST_SELECT))) { // Popup the selection menu list Point2 click = transform.affine_inverse().xform(b->get_position()); @@ -2264,15 +2264,15 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { } } - if (b.is_valid() && b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_ctrl_pressed()) { - add_node_menu->set_position(get_global_transform().xform(get_local_mouse_position())); - add_node_menu->set_size(Vector2(1, 1)); + if (b.is_valid() && b->is_pressed() && b->get_button_index() == MouseButton::RIGHT) { + add_node_menu->reset_size(); + add_node_menu->set_position(get_screen_position() + b->get_position()); add_node_menu->popup(); node_create_position = transform.affine_inverse().xform((get_local_mouse_position())); return true; } - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && b->is_pressed() && tool == TOOL_SELECT) { // Single item selection Point2 click = transform.affine_inverse().xform(b->get_position()); @@ -2339,7 +2339,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { if (selection2.size() > 0) { drag_type = DRAG_MOVE; - drag_from = click; + drag_from = drag_start_origin; _save_canvas_item_state(drag_selection); } return true; @@ -2348,7 +2348,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { } if (drag_type == DRAG_BOX_SELECTION) { - if (b.is_valid() && !b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT) { + if (b.is_valid() && !b->is_pressed() && b->get_button_index() == MouseButton::LEFT) { // Confirms box selection Node *scene = editor->get_edited_scene(); if (scene) { @@ -2377,7 +2377,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { return true; } - if (b.is_valid() && b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_RIGHT) { + if (b.is_valid() && b->is_pressed() && b->get_button_index() == MouseButton::RIGHT) { // Cancel box selection drag_type = DRAG_NONE; viewport->update(); @@ -2392,7 +2392,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { } } - if (k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_ESCAPE && drag_type == DRAG_NONE && tool == TOOL_SELECT) { + if (k.is_valid() && k->is_pressed() && k->get_keycode() == Key::ESCAPE && drag_type == DRAG_NONE && tool == TOOL_SELECT) { // Unselect everything editor_selection->clear(); viewport->update(); @@ -2414,7 +2414,7 @@ bool CanvasItemEditor::_gui_input_ruler_tool(const Ref<InputEvent> &p_event) { ruler_tool_origin = snap_point(viewport->get_local_mouse_position() / zoom + view_offset); } - if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT) { + if (b.is_valid() && b->get_button_index() == MouseButton::LEFT) { if (b->is_pressed()) { ruler_tool_active = true; } else { @@ -2615,7 +2615,19 @@ void CanvasItemEditor::_update_cursor() { c = CURSOR_HSIZE; } - viewport->set_default_cursor_shape(c); + if (pan_pressed) { + c = CURSOR_DRAG; + } + + if (c != viewport->get_default_cursor_shape()) { + viewport->set_default_cursor_shape(c); + + // Force refresh cursor if it's over the viewport. + if (viewport->get_global_rect().has_point(get_global_mouse_position())) { + DisplayServer::CursorShape ds_cursor_shape = (DisplayServer::CursorShape)viewport->get_default_cursor_shape(); + DisplayServer::get_singleton()->cursor_set_shape(ds_cursor_shape); + } + } } void CanvasItemEditor::_draw_text_at_position(Point2 p_position, String p_string, Side p_side) { @@ -2901,14 +2913,6 @@ void CanvasItemEditor::_draw_ruler_tool() { Point2 corner = Point2(begin.x, end.y); Vector2 length_vector = (begin - end).abs() / zoom; - bool draw_secondary_lines = !(Math::is_equal_approx(begin.y, corner.y) || Math::is_equal_approx(end.x, corner.x)); - - viewport->draw_line(begin, end, ruler_primary_color, Math::round(EDSCALE * 3)); - if (draw_secondary_lines) { - viewport->draw_line(begin, corner, ruler_secondary_color, Math::round(EDSCALE)); - viewport->draw_line(corner, end, ruler_secondary_color, Math::round(EDSCALE)); - } - Ref<Font> font = get_theme_font(SNAME("bold"), SNAME("EditorFonts")); int font_size = get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts")); Color font_color = get_theme_color(SNAME("font_color"), SNAME("Editor")); @@ -2924,8 +2928,24 @@ void CanvasItemEditor::_draw_ruler_tool() { Point2 text_pos = (begin + end) / 2 - Vector2(text_width / 2, text_height / 2); text_pos.x = CLAMP(text_pos.x, text_width / 2, viewport->get_rect().size.x - text_width * 1.5); text_pos.y = CLAMP(text_pos.y, text_height * 1.5, viewport->get_rect().size.y - text_height * 1.5); + + if (begin.is_equal_approx(end)) { + viewport->draw_string(font, text_pos, (String)ruler_tool_origin, HALIGN_LEFT, -1, font_size, font_color, outline_size, outline_color); + Ref<Texture2D> position_icon = get_theme_icon(SNAME("EditorPosition"), SNAME("EditorIcons")); + viewport->draw_texture(get_theme_icon(SNAME("EditorPosition"), SNAME("EditorIcons")), (ruler_tool_origin - view_offset) * zoom - position_icon->get_size() / 2); + return; + } + viewport->draw_string(font, text_pos, TS->format_number(vformat("%.1f px", length_vector.length())), HALIGN_LEFT, -1, font_size, font_color, outline_size, outline_color); + bool draw_secondary_lines = !(Math::is_equal_approx(begin.y, corner.y) || Math::is_equal_approx(end.x, corner.x)); + + viewport->draw_line(begin, end, ruler_primary_color, Math::round(EDSCALE * 3)); + if (draw_secondary_lines) { + viewport->draw_line(begin, corner, ruler_secondary_color, Math::round(EDSCALE)); + viewport->draw_line(corner, end, ruler_secondary_color, Math::round(EDSCALE)); + } + if (draw_secondary_lines) { const real_t horizontal_angle_rad = length_vector.angle(); const real_t vertical_angle_rad = Math_PI / 2.0 - horizontal_angle_rad; @@ -2971,18 +2991,16 @@ void CanvasItemEditor::_draw_ruler_tool() { const Vector2 end_to_begin = (end - begin); - real_t arc_1_start_angle = - end_to_begin.x < 0 ? - (end_to_begin.y < 0 ? 3.0 * Math_PI / 2.0 - vertical_angle_rad : Math_PI / 2.0) : - (end_to_begin.y < 0 ? 3.0 * Math_PI / 2.0 : Math_PI / 2.0 - vertical_angle_rad); + real_t arc_1_start_angle = end_to_begin.x < 0 + ? (end_to_begin.y < 0 ? 3.0 * Math_PI / 2.0 - vertical_angle_rad : Math_PI / 2.0) + : (end_to_begin.y < 0 ? 3.0 * Math_PI / 2.0 : Math_PI / 2.0 - vertical_angle_rad); real_t arc_1_end_angle = arc_1_start_angle + vertical_angle_rad; // Constrain arc to triangle height & max size real_t arc_1_radius = MIN(MIN(arc_radius_max_length_percent * ruler_length, ABS(end_to_begin.y)), arc_max_radius); - real_t arc_2_start_angle = - end_to_begin.x < 0 ? - (end_to_begin.y < 0 ? 0.0 : -horizontal_angle_rad) : - (end_to_begin.y < 0 ? Math_PI - horizontal_angle_rad : Math_PI); + real_t arc_2_start_angle = end_to_begin.x < 0 + ? (end_to_begin.y < 0 ? 0.0 : -horizontal_angle_rad) + : (end_to_begin.y < 0 ? Math_PI - horizontal_angle_rad : Math_PI); real_t arc_2_end_angle = arc_2_start_angle + horizontal_angle_rad; // Constrain arc to triangle width & max size real_t arc_2_radius = MIN(MIN(arc_radius_max_length_percent * ruler_length, ABS(end_to_begin.x)), arc_max_radius); @@ -3344,8 +3362,8 @@ void CanvasItemEditor::_draw_selection() { } // Draw the move handles - bool is_ctrl = Input::get_singleton()->is_key_pressed(KEY_CTRL); - bool is_alt = Input::get_singleton()->is_key_pressed(KEY_ALT); + bool is_ctrl = Input::get_singleton()->is_key_pressed(Key::CTRL); + bool is_alt = Input::get_singleton()->is_key_pressed(Key::ALT); if (tool == TOOL_MOVE && show_transformation_gizmos) { if (_is_node_movable(canvas_item)) { Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * canvas_item->_edit_get_transform()).orthonormalized(); @@ -3381,7 +3399,7 @@ void CanvasItemEditor::_draw_selection() { Transform2D simple_xform = viewport->get_transform() * unscaled_transform; Size2 scale_factor = Size2(SCALE_HANDLE_DISTANCE, SCALE_HANDLE_DISTANCE); - bool uniform = Input::get_singleton()->is_key_pressed(KEY_SHIFT); + bool uniform = Input::get_singleton()->is_key_pressed(Key::SHIFT); Point2 offset = (simple_xform.affine_inverse().xform(drag_to) - simple_xform.affine_inverse().xform(drag_from)) * zoom; if (drag_type == DRAG_SCALE_X) { @@ -3553,7 +3571,7 @@ void CanvasItemEditor::_draw_hover() { Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); - Size2 node_name_size = font->get_string_size(node_name); + Size2 node_name_size = font->get_string_size(node_name, font_size); Size2 item_size = Size2(node_icon->get_size().x + 4 + node_name_size.x, MAX(node_icon->get_size().y, node_name_size.y - 3)); Point2 pos = transform.xform(hovering_results[i].position) - Point2(0, item_size.y) + (Point2(node_icon->get_size().x, -node_icon->get_size().y) / 4); @@ -3655,8 +3673,6 @@ void CanvasItemEditor::_draw_viewport() { group_button->set_disabled(selection.is_empty()); ungroup_button->set_visible(all_group); - info_overlay->set_offset(SIDE_LEFT, (show_rulers ? RULER_WIDTH : 0) + 10); - _draw_grid(); _draw_ruler_tool(); _draw_axis(); @@ -3909,11 +3925,6 @@ void CanvasItemEditor::_notification(int p_what) { anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignWide"), SNAME("EditorIcons")), TTR("Full Rect"), ANCHORS_PRESET_WIDE); anchor_mode_button->set_icon(get_theme_icon(SNAME("Anchor"), SNAME("EditorIcons"))); - - info_overlay->get_theme()->set_stylebox("normal", "Label", get_theme_stylebox(SNAME("CanvasItemInfoOverlay"), SNAME("EditorStyles"))); - warning_child_of_container->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); - warning_child_of_container->add_theme_font_override("font", get_theme_font(SNAME("main"), SNAME("EditorFonts"))); - warning_child_of_container->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("main_size"), SNAME("EditorFonts"))); } if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { @@ -4069,34 +4080,6 @@ void CanvasItemEditor::_update_scrollbars() { updating_scroll = false; } -void CanvasItemEditor::_popup_warning_depop(Control *p_control) { - ERR_FAIL_COND(!popup_temporarily_timers.has(p_control)); - - Timer *timer = popup_temporarily_timers[p_control]; - timer->queue_delete(); - p_control->hide(); - popup_temporarily_timers.erase(p_control); - info_overlay->set_offset(SIDE_LEFT, (show_rulers ? RULER_WIDTH : 0) + 10); -} - -void CanvasItemEditor::_popup_warning_temporarily(Control *p_control, const double p_duration) { - Timer *timer; - if (!popup_temporarily_timers.has(p_control)) { - timer = memnew(Timer); - timer->connect("timeout", callable_mp(this, &CanvasItemEditor::_popup_warning_depop), varray(p_control)); - timer->set_one_shot(true); - add_child(timer); - - popup_temporarily_timers[p_control] = timer; - } else { - timer = popup_temporarily_timers[p_control]; - } - - timer->start(p_duration); - p_control->show(); - info_overlay->set_offset(SIDE_LEFT, (show_rulers ? RULER_WIDTH : 0) + 10); -} - void CanvasItemEditor::_update_scroll(real_t) { if (updating_scroll) { return; @@ -4254,10 +4237,6 @@ void CanvasItemEditor::_button_tool_select(int p_index) { viewport->update(); _update_cursor(); - - // Request immediate refresh of cursor when using hot-keys to switch between tools - DisplayServer::CursorShape ds_cursor_shape = (DisplayServer::CursorShape)viewport->get_default_cursor_shape(); - DisplayServer::get_singleton()->cursor_set_shape(ds_cursor_shape); } void CanvasItemEditor::_insert_animation_keys(bool p_location, bool p_rotation, bool p_scale, bool p_on_existing) { @@ -4769,10 +4748,6 @@ void CanvasItemEditor::_popup_callback(int p_op) { if (key_pos) { ctrl->set_position(Point2()); } - /* - if (key_scale) - AnimationPlayerEditor::get_singleton()->get_track_editor()->insert_node_value_key(ctrl,"rect/size",ctrl->get_size()); - */ } } @@ -5134,19 +5109,6 @@ void CanvasItemEditor::set_state(const Dictionary &p_state) { viewport->update(); } -void CanvasItemEditor::add_control_to_info_overlay(Control *p_control) { - ERR_FAIL_COND(!p_control); - - p_control->set_h_size_flags(p_control->get_h_size_flags() & ~Control::SIZE_EXPAND_FILL); - info_overlay->add_child(p_control); - info_overlay->set_offset(SIDE_LEFT, (show_rulers ? RULER_WIDTH : 0) + 10); -} - -void CanvasItemEditor::remove_control_from_info_overlay(Control *p_control) { - info_overlay->remove_child(p_control); - info_overlay->set_offset(SIDE_LEFT, (show_rulers ? RULER_WIDTH : 0) + 10); -} - void CanvasItemEditor::add_control_to_menu_panel(Control *p_control) { ERR_FAIL_COND(!p_control); @@ -5279,23 +5241,6 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { viewport->connect("draw", callable_mp(this, &CanvasItemEditor::_draw_viewport)); viewport->connect("gui_input", callable_mp(this, &CanvasItemEditor::_gui_input_viewport)); - info_overlay = memnew(VBoxContainer); - info_overlay->set_anchors_and_offsets_preset(Control::PRESET_BOTTOM_LEFT); - info_overlay->set_offset(SIDE_LEFT, 10); - info_overlay->set_offset(SIDE_BOTTOM, -15); - info_overlay->set_v_grow_direction(Control::GROW_DIRECTION_BEGIN); - info_overlay->add_theme_constant_override("separation", 10); - viewport_scrollable->add_child(info_overlay); - - // Make sure all labels inside of the container are styled the same. - Theme *info_overlay_theme = memnew(Theme); - info_overlay->set_theme(info_overlay_theme); - - warning_child_of_container = memnew(Label); - warning_child_of_container->hide(); - warning_child_of_container->set_text(TTR("Warning: Children of a container get their position and size determined only by their parent.")); - add_control_to_info_overlay(warning_child_of_container); - h_scroll = memnew(HScrollBar); viewport->add_child(h_scroll); h_scroll->connect("value_changed", callable_mp(this, &CanvasItemEditor::_update_scroll)); @@ -5328,9 +5273,9 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { select_button->set_toggle_mode(true); select_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_SELECT)); select_button->set_pressed(true); - select_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/select_mode", TTR("Select Mode"), KEY_Q)); + select_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/select_mode", TTR("Select Mode"), Key::Q)); select_button->set_shortcut_context(this); - select_button->set_tooltip(keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate selected node around pivot.") + "\n" + TTR("Alt+Drag: Move selected node.") + "\n" + TTR("V: Set selected node's pivot position.") + "\n" + TTR("Alt+RMB: Show list of all nodes at position clicked, including locked.") + "\n" + keycode_get_string(KEY_MASK_CMD) + TTR("RMB: Add node at position clicked.")); + select_button->set_tooltip(keycode_get_string((Key)KeyModifierMask::CMD) + TTR("Drag: Rotate selected node around pivot.") + "\n" + TTR("Alt+Drag: Move selected node.") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD) + TTR("Alt+Drag: Scale selected node.") + "\n" + TTR("V: Set selected node's pivot position.") + "\n" + TTR("Alt+RMB: Show list of all nodes at position clicked, including locked.") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD) + TTR("RMB: Add node at position clicked.")); hb->add_child(memnew(VSeparator)); @@ -5339,7 +5284,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { hb->add_child(move_button); move_button->set_toggle_mode(true); move_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_MOVE)); - move_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/move_mode", TTR("Move Mode"), KEY_W)); + move_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/move_mode", TTR("Move Mode"), Key::W)); move_button->set_shortcut_context(this); move_button->set_tooltip(TTR("Move Mode")); @@ -5348,7 +5293,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { hb->add_child(rotate_button); rotate_button->set_toggle_mode(true); rotate_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_ROTATE)); - rotate_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/rotate_mode", TTR("Rotate Mode"), KEY_E)); + rotate_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/rotate_mode", TTR("Rotate Mode"), Key::E)); rotate_button->set_shortcut_context(this); rotate_button->set_tooltip(TTR("Rotate Mode")); @@ -5357,9 +5302,9 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { hb->add_child(scale_button); scale_button->set_toggle_mode(true); scale_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_SCALE)); - scale_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/scale_mode", TTR("Scale Mode"), KEY_S)); + scale_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/scale_mode", TTR("Scale Mode"), Key::S)); scale_button->set_shortcut_context(this); - scale_button->set_tooltip(TTR("Scale Mode")); + scale_button->set_tooltip(TTR("Shift: Scale proportionally.")); hb->add_child(memnew(VSeparator)); @@ -5382,16 +5327,16 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { hb->add_child(pan_button); pan_button->set_toggle_mode(true); pan_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_PAN)); - pan_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/pan_mode", TTR("Pan Mode"), KEY_G)); + pan_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/pan_mode", TTR("Pan Mode"), Key::G)); pan_button->set_shortcut_context(this); - pan_button->set_tooltip(TTR("Pan Mode")); + pan_button->set_tooltip(TTR("You can also use Pan View shortcut (Space by default) to pan in any mode.")); ruler_button = memnew(Button); ruler_button->set_flat(true); hb->add_child(ruler_button); ruler_button->set_toggle_mode(true); ruler_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_RULER)); - ruler_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/ruler_mode", TTR("Ruler Mode"), KEY_R)); + ruler_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/ruler_mode", TTR("Ruler Mode"), Key::R)); ruler_button->set_shortcut_context(this); ruler_button->set_tooltip(TTR("Ruler Mode")); @@ -5403,7 +5348,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { smart_snap_button->set_toggle_mode(true); smart_snap_button->connect("toggled", callable_mp(this, &CanvasItemEditor::_button_toggle_smart_snap)); smart_snap_button->set_tooltip(TTR("Toggle smart snapping.")); - smart_snap_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/use_smart_snap", TTR("Use Smart Snap"), KEY_MASK_SHIFT | KEY_S)); + smart_snap_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/use_smart_snap", TTR("Use Smart Snap"), KeyModifierMask::SHIFT | Key::S)); smart_snap_button->set_shortcut_context(this); grid_snap_button = memnew(Button); @@ -5412,7 +5357,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { grid_snap_button->set_toggle_mode(true); grid_snap_button->connect("toggled", callable_mp(this, &CanvasItemEditor::_button_toggle_grid_snap)); grid_snap_button->set_tooltip(TTR("Toggle grid snapping.")); - grid_snap_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/use_grid_snap", TTR("Use Grid Snap"), KEY_MASK_SHIFT | KEY_G)); + grid_snap_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/use_grid_snap", TTR("Use Grid Snap"), KeyModifierMask::SHIFT | Key::G)); grid_snap_button->set_shortcut_context(this); snap_config_menu = memnew(MenuButton); @@ -5455,7 +5400,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { lock_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(LOCK_SELECTED)); lock_button->set_tooltip(TTR("Lock selected node, preventing selection and movement.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - lock_button->set_shortcut(ED_SHORTCUT("editor/lock_selected_nodes", TTR("Lock Selected Node(s)"), KEY_MASK_CMD | KEY_L)); + lock_button->set_shortcut(ED_SHORTCUT("editor/lock_selected_nodes", TTR("Lock Selected Node(s)"), KeyModifierMask::CMD | Key::L)); unlock_button = memnew(Button); unlock_button->set_flat(true); @@ -5463,7 +5408,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { unlock_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(UNLOCK_SELECTED)); unlock_button->set_tooltip(TTR("Unlock selected node, allowing selection and movement.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - unlock_button->set_shortcut(ED_SHORTCUT("editor/unlock_selected_nodes", TTR("Unlock Selected Node(s)"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_L)); + unlock_button->set_shortcut(ED_SHORTCUT("editor/unlock_selected_nodes", TTR("Unlock Selected Node(s)"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::L)); group_button = memnew(Button); group_button->set_flat(true); @@ -5471,7 +5416,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { group_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(GROUP_SELECTED)); group_button->set_tooltip(TTR("Makes sure the object's children are not selectable.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - group_button->set_shortcut(ED_SHORTCUT("editor/group_selected_nodes", TTR("Group Selected Node(s)"), KEY_MASK_CMD | KEY_G)); + group_button->set_shortcut(ED_SHORTCUT("editor/group_selected_nodes", TTR("Group Selected Node(s)"), KeyModifierMask::CMD | Key::G)); ungroup_button = memnew(Button); ungroup_button->set_flat(true); @@ -5479,7 +5424,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { ungroup_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(UNGROUP_SELECTED)); ungroup_button->set_tooltip(TTR("Restores the object's children's ability to be selected.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - ungroup_button->set_shortcut(ED_SHORTCUT("editor/ungroup_selected_nodes", TTR("Ungroup Selected Node(s)"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_G)); + ungroup_button->set_shortcut(ED_SHORTCUT("editor/ungroup_selected_nodes", TTR("Ungroup Selected Node(s)"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::G)); hb->add_child(memnew(VSeparator)); @@ -5493,7 +5438,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { p->set_hide_on_checkable_item_selection(false); p->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_show_bones", TTR("Show Bones")), SKELETON_SHOW_BONES); p->add_separator(); - p->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_make_bones", TTR("Make Bone2D Node(s) from Node(s)"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_B), SKELETON_MAKE_BONES); + p->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_make_bones", TTR("Make Bone2D Node(s) from Node(s)"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::B), SKELETON_MAKE_BONES); p->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback)); hb->add_child(memnew(VSeparator)); @@ -5517,21 +5462,21 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { p = view_menu->get_popup(); p->set_hide_on_checkable_item_selection(false); - p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_grid", TTR("Always Show Grid"), KEY_NUMBERSIGN), SHOW_GRID); - p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_helpers", TTR("Show Helpers"), KEY_H), SHOW_HELPERS); + p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_grid", TTR("Always Show Grid"), Key::NUMBERSIGN), SHOW_GRID); + p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_helpers", TTR("Show Helpers"), Key::H), SHOW_HELPERS); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_rulers", TTR("Show Rulers")), SHOW_RULERS); - p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_guides", TTR("Show Guides"), KEY_Y), SHOW_GUIDES); + p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_guides", TTR("Show Guides"), Key::Y), SHOW_GUIDES); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_origin", TTR("Show Origin")), SHOW_ORIGIN); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_viewport", TTR("Show Viewport")), SHOW_VIEWPORT); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_edit_locks", TTR("Show Group And Lock Icons")), SHOW_EDIT_LOCKS); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_transformation_gizmos", TTR("Show Transformation Gizmos")), SHOW_TRANSFORMATION_GIZMOS); p->add_separator(); - p->add_shortcut(ED_SHORTCUT("canvas_item_editor/center_selection", TTR("Center Selection"), KEY_F), VIEW_CENTER_TO_SELECTION); - p->add_shortcut(ED_SHORTCUT("canvas_item_editor/frame_selection", TTR("Frame Selection"), KEY_MASK_SHIFT | KEY_F), VIEW_FRAME_TO_SELECTION); + p->add_shortcut(ED_SHORTCUT("canvas_item_editor/center_selection", TTR("Center Selection"), Key::F), VIEW_CENTER_TO_SELECTION); + p->add_shortcut(ED_SHORTCUT("canvas_item_editor/frame_selection", TTR("Frame Selection"), KeyModifierMask::SHIFT | Key::F), VIEW_FRAME_TO_SELECTION); p->add_shortcut(ED_SHORTCUT("canvas_item_editor/clear_guides", TTR("Clear Guides")), CLEAR_GUIDES); p->add_separator(); - p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/preview_canvas_scale", TTR("Preview Canvas Scale"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_P), PREVIEW_CANVAS_SCALE); + p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/preview_canvas_scale", TTR("Preview Canvas Scale"), KeyModifierMask::SHIFT | KeyModifierMask::CMD | Key::P), PREVIEW_CANVAS_SCALE); hb->add_child(memnew(VSeparator)); @@ -5602,7 +5547,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { key_insert_button->set_focus_mode(FOCUS_NONE); key_insert_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(ANIM_INSERT_KEY)); key_insert_button->set_tooltip(TTR("Insert keys (based on mask).")); - key_insert_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/anim_insert_key", TTR("Insert Key"), KEY_INSERT)); + key_insert_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/anim_insert_key", TTR("Insert Key"), Key::INSERT)); key_insert_button->set_shortcut_context(this); animation_hb->add_child(key_insert_button); @@ -5625,11 +5570,11 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { p = animation_menu->get_popup(); p->add_shortcut(ED_GET_SHORTCUT("canvas_item_editor/anim_insert_key"), ANIM_INSERT_KEY); - p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_insert_key_existing_tracks", TTR("Insert Key (Existing Tracks)"), KEY_MASK_CMD + KEY_INSERT), ANIM_INSERT_KEY_EXISTING); + p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_insert_key_existing_tracks", TTR("Insert Key (Existing Tracks)"), KeyModifierMask::CMD + Key::INSERT), ANIM_INSERT_KEY_EXISTING); p->add_separator(); p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_copy_pose", TTR("Copy Pose")), ANIM_COPY_POSE); p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_paste_pose", TTR("Paste Pose")), ANIM_PASTE_POSE); - p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_clear_pose", TTR("Clear Pose"), KEY_MASK_SHIFT | KEY_K), ANIM_CLEAR_POSE); + p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_clear_pose", TTR("Clear Pose"), KeyModifierMask::SHIFT | Key::K), ANIM_CLEAR_POSE); snap_dialog = memnew(SnapDialog); snap_dialog->connect("confirmed", callable_mp(this, &CanvasItemEditor::_snap_changed)); @@ -5649,9 +5594,9 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { add_node_menu->add_icon_item(editor->get_scene_tree_dock()->get_theme_icon(SNAME("Instance"), SNAME("EditorIcons")), TTR("Instance Scene Here")); add_node_menu->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_add_node_pressed)); - multiply_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/multiply_grid_step", TTR("Multiply grid step by 2"), KEY_KP_MULTIPLY); - divide_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/divide_grid_step", TTR("Divide grid step by 2"), KEY_KP_DIVIDE); - pan_view_shortcut = ED_SHORTCUT("canvas_item_editor/pan_view", TTR("Pan View"), KEY_SPACE); + multiply_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/multiply_grid_step", TTR("Multiply grid step by 2"), Key::KP_MULTIPLY); + divide_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/divide_grid_step", TTR("Divide grid step by 2"), Key::KP_DIVIDE); + pan_view_shortcut = ED_SHORTCUT("canvas_item_editor/pan_view", TTR("Pan View"), Key::SPACE); skeleton_menu->get_popup()->set_item_checked(skeleton_menu->get_popup()->get_item_index(SKELETON_SHOW_BONES), true); singleton = this; @@ -5660,16 +5605,16 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { // those shortcuts one by one. // Resetting zoom to 100% is a duplicate shortcut of `canvas_item_editor/reset_zoom`, // but it ensures both 1 and Ctrl + 0 can be used to reset zoom. - ED_SHORTCUT("canvas_item_editor/zoom_3.125_percent", TTR("Zoom to 3.125%"), KEY_MASK_SHIFT | KEY_5); - ED_SHORTCUT("canvas_item_editor/zoom_6.25_percent", TTR("Zoom to 6.25%"), KEY_MASK_SHIFT | KEY_4); - ED_SHORTCUT("canvas_item_editor/zoom_12.5_percent", TTR("Zoom to 12.5%"), KEY_MASK_SHIFT | KEY_3); - ED_SHORTCUT("canvas_item_editor/zoom_25_percent", TTR("Zoom to 25%"), KEY_MASK_SHIFT | KEY_2); - ED_SHORTCUT("canvas_item_editor/zoom_50_percent", TTR("Zoom to 50%"), KEY_MASK_SHIFT | KEY_1); - ED_SHORTCUT("canvas_item_editor/zoom_100_percent", TTR("Zoom to 100%"), KEY_1); - ED_SHORTCUT("canvas_item_editor/zoom_200_percent", TTR("Zoom to 200%"), KEY_2); - ED_SHORTCUT("canvas_item_editor/zoom_400_percent", TTR("Zoom to 400%"), KEY_3); - ED_SHORTCUT("canvas_item_editor/zoom_800_percent", TTR("Zoom to 800%"), KEY_4); - ED_SHORTCUT("canvas_item_editor/zoom_1600_percent", TTR("Zoom to 1600%"), KEY_5); + ED_SHORTCUT("canvas_item_editor/zoom_3.125_percent", TTR("Zoom to 3.125%"), KeyModifierMask::SHIFT | Key::KEY_5); + ED_SHORTCUT("canvas_item_editor/zoom_6.25_percent", TTR("Zoom to 6.25%"), KeyModifierMask::SHIFT | Key::KEY_4); + ED_SHORTCUT("canvas_item_editor/zoom_12.5_percent", TTR("Zoom to 12.5%"), KeyModifierMask::SHIFT | Key::KEY_3); + ED_SHORTCUT("canvas_item_editor/zoom_25_percent", TTR("Zoom to 25%"), KeyModifierMask::SHIFT | Key::KEY_2); + ED_SHORTCUT("canvas_item_editor/zoom_50_percent", TTR("Zoom to 50%"), KeyModifierMask::SHIFT | Key::KEY_1); + ED_SHORTCUT("canvas_item_editor/zoom_100_percent", TTR("Zoom to 100%"), Key::KEY_1); + ED_SHORTCUT("canvas_item_editor/zoom_200_percent", TTR("Zoom to 200%"), Key::KEY_2); + ED_SHORTCUT("canvas_item_editor/zoom_400_percent", TTR("Zoom to 400%"), Key::KEY_3); + ED_SHORTCUT("canvas_item_editor/zoom_800_percent", TTR("Zoom to 800%"), Key::KEY_4); + ED_SHORTCUT("canvas_item_editor/zoom_1600_percent", TTR("Zoom to 1600%"), Key::KEY_5); set_process_unhandled_key_input(true); @@ -5834,7 +5779,7 @@ void CanvasItemEditorViewport::_create_nodes(Node *parent, Node *child, String & Ref<Texture2D> texture = Ref<Texture2D>(Object::cast_to<Texture2D>(ResourceCache::get(path))); if (parent) { - editor_data->get_undo_redo().add_do_method(parent, "add_child", child); + editor_data->get_undo_redo().add_do_method(parent, "add_child", child, true); editor_data->get_undo_redo().add_do_method(child, "set_owner", editor->get_edited_scene()); editor_data->get_undo_redo().add_do_reference(child); editor_data->get_undo_redo().add_undo_method(parent, "remove_child", child); @@ -6057,9 +6002,9 @@ bool CanvasItemEditorViewport::_only_packed_scenes_selected() const { } void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p_data) { - bool is_shift = Input::get_singleton()->is_key_pressed(KEY_SHIFT); - bool is_ctrl = Input::get_singleton()->is_key_pressed(KEY_CTRL); - bool is_alt = Input::get_singleton()->is_key_pressed(KEY_ALT); + bool is_shift = Input::get_singleton()->is_key_pressed(Key::SHIFT); + bool is_ctrl = Input::get_singleton()->is_key_pressed(Key::CTRL); + bool is_alt = Input::get_singleton()->is_key_pressed(Key::ALT); selected_files.clear(); Dictionary d = p_data; @@ -6190,14 +6135,14 @@ CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasIte label = memnew(Label); label->add_theme_color_override("font_shadow_color", Color(0, 0, 0, 1)); - label->add_theme_constant_override("shadow_as_outline", 1 * EDSCALE); + label->add_theme_constant_override("shadow_outline_size", 1 * EDSCALE); label->hide(); canvas_item_editor->get_controls_container()->add_child(label); label_desc = memnew(Label); label_desc->add_theme_color_override("font_color", Color(0.6f, 0.6f, 0.6f, 1)); label_desc->add_theme_color_override("font_shadow_color", Color(0.2f, 0.2f, 0.2f, 1)); - label_desc->add_theme_constant_override("shadow_as_outline", 1 * EDSCALE); + label_desc->add_theme_constant_override("shadow_outline_size", 1 * EDSCALE); label_desc->add_theme_constant_override("line_spacing", 0); label_desc->hide(); canvas_item_editor->get_controls_container()->add_child(label_desc); diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 1965efbf30..b6576b7144 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -235,11 +235,6 @@ private: PanelContainer *context_menu_container; HBoxContainer *hbc_context_menu; - Map<Control *, Timer *> popup_temporarily_timers; - - Label *warning_child_of_container; - VBoxContainer *info_overlay; - Transform2D transform; bool show_grid; bool show_rulers; @@ -421,8 +416,6 @@ private: CanvasItem *ref_item; - void _add_canvas_item(CanvasItem *p_canvas_item); - void _save_canvas_item_state(List<CanvasItem *> p_canvas_items, bool save_bones = false); void _restore_canvas_item_state(List<CanvasItem *> p_canvas_items, bool restore_bones = false); void _commit_canvas_item_state(List<CanvasItem *> p_canvas_items, String action_name, bool commit_bones = false); @@ -434,7 +427,6 @@ private: bool updating_scroll; void _update_scroll(real_t); void _update_scrollbars(); - void _append_canvas_item(CanvasItem *p_item); void _snap_changed(); void _selection_result_pressed(int); void _selection_menu_hide(); @@ -519,7 +511,6 @@ private: const Node *p_current); void _set_anchors_preset(Control::LayoutPreset p_preset); - void _set_offsets_preset(Control::LayoutPreset p_preset); void _set_anchors_and_offsets_preset(Control::LayoutPreset p_preset); void _set_anchors_and_offsets_to_keep_ratio(); @@ -540,8 +531,6 @@ private: VSplitContainer *bottom_split; void _update_context_menu_stylebox(); - void _popup_warning_temporarily(Control *p_control, const double p_duration); - void _popup_warning_depop(Control *p_control); void _set_owner_for_node_and_children(Node *p_node, Node *p_owner); @@ -551,15 +540,9 @@ protected: void _notification(int p_what); static void _bind_methods(); - void end_drag(); - void box_selection_start(Point2 &click); - bool box_selection_end(); HBoxContainer *get_panel_hb() { return hb; } - template <class P, class C> - void space_selected_items(); - static CanvasItemEditor *singleton; public: @@ -588,9 +571,6 @@ public: void add_control_to_menu_panel(Control *p_control); void remove_control_from_menu_panel(Control *p_control); - void add_control_to_info_overlay(Control *p_control); - void remove_control_from_info_overlay(Control *p_control); - HSplitContainer *get_palette_split(); VSplitContainer *get_bottom_split(); diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.cpp b/editor/plugins/collision_polygon_3d_editor_plugin.cpp index 1ee834a974..4c728ff757 100644 --- a/editor/plugins/collision_polygon_3d_editor_plugin.cpp +++ b/editor/plugins/collision_polygon_3d_editor_plugin.cpp @@ -112,7 +112,7 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( Transform3D gi = gt.affine_inverse(); float depth = _get_depth() * 0.5; Vector3 n = gt.basis.get_axis(2).normalized(); - Plane p(gt.origin + n * depth, n); + Plane p(n, gt.origin + n * depth); Ref<InputEventMouseButton> mb = p_event; @@ -142,7 +142,7 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( switch (mode) { case MODE_CREATE: { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) { + if (mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) { if (!wip_active) { wip.clear(); wip.push_back(cpoint); @@ -166,14 +166,14 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( return EditorPlugin::AFTER_GUI_INPUT_STOP; } } - } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && wip_active) { + } else if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed() && wip_active) { _wip_close(); } } break; case MODE_EDIT: { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { if (mb->is_ctrl_pressed()) { if (poly.size() < 3) { @@ -267,7 +267,7 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( } } } - if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && edited_point == -1) { + if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed() && edited_point == -1) { int closest_idx = -1; Vector2 closest_pos; real_t closest_dist = 1e10; @@ -285,7 +285,7 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( if (closest_idx >= 0) { undo_redo->create_action(TTR("Edit Poly (Remove Point)")); undo_redo->add_undo_method(node, "set_polygon", poly); - poly.remove(closest_idx); + poly.remove_at(closest_idx); undo_redo->add_do_method(node, "set_polygon", poly); undo_redo->add_do_method(this, "_polygon_draw"); undo_redo->add_undo_method(this, "_polygon_draw"); @@ -301,7 +301,7 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - if (edited_point != -1 && (wip_active || mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT)) { + if (edited_point != -1 && (wip_active || (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE)) { Vector2 gpoint = mm->get_position(); Vector3 ray_from = p_camera->project_ray_origin(gpoint); @@ -317,7 +317,7 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( Vector2 cpoint(spoint.x, spoint.y); - if (snap_ignore && !Input::get_singleton()->is_key_pressed(KEY_CTRL)) { + if (snap_ignore && !Input::get_singleton()->is_key_pressed(Key::CTRL)) { snap_ignore = false; } diff --git a/editor/plugins/collision_shape_2d_editor_plugin.cpp b/editor/plugins/collision_shape_2d_editor_plugin.cpp index fb32d7b1fd..94fd9a5a08 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.cpp +++ b/editor/plugins/collision_shape_2d_editor_plugin.cpp @@ -183,7 +183,7 @@ void CollisionShape2DEditor::set_handle(int idx, Point2 &p_point) { size.y = p_point.y * RECT_HANDLES[idx].y * 2; } - if (Input::get_singleton()->is_key_pressed(KEY_ALT)) { + if (Input::get_singleton()->is_key_pressed(Key::ALT)) { rect->set_size(size.abs()); node->set_global_position(original_transform.get_origin()); } else { @@ -333,7 +333,7 @@ bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_e if (mb.is_valid()) { Vector2 gpoint = mb->get_position(); - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { for (int i = 0; i < handles.size(); i++) { if (xform.xform(handles[i]).distance_to(gpoint) < 8) { @@ -394,7 +394,7 @@ bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_e return false; } - if (shape_type == RECTANGLE_SHAPE && k->get_keycode() == KEY_ALT) { + if (shape_type == RECTANGLE_SHAPE && k->get_keycode() == Key::ALT) { set_handle(edit_handle, last_point); // Update handle when Alt key is toggled. } } diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp index 4a22dc5b62..d99d6709ad 100644 --- a/editor/plugins/curve_editor_plugin.cpp +++ b/editor/plugins/curve_editor_plugin.cpp @@ -115,16 +115,16 @@ void CurveEditor::gui_input(const Ref<InputEvent> &p_event) { } switch (mb.get_button_index()) { - case MOUSE_BUTTON_RIGHT: + case MouseButton::RIGHT: _context_click_pos = mpos; open_context_menu(get_global_transform().xform(mpos)); break; - case MOUSE_BUTTON_MIDDLE: + case MouseButton::MIDDLE: remove_point(_hover_point); break; - case MOUSE_BUTTON_LEFT: + case MouseButton::LEFT: _dragging = true; break; default: @@ -132,7 +132,7 @@ void CurveEditor::gui_input(const Ref<InputEvent> &p_event) { } } - if (!mb.is_pressed() && _dragging && mb.get_button_index() == MOUSE_BUTTON_LEFT) { + if (!mb.is_pressed() && _dragging && mb.get_button_index() == MouseButton::LEFT) { _dragging = false; if (_has_undo_data) { UndoRedo &ur = *EditorNode::get_singleton()->get_undo_redo(); @@ -210,7 +210,7 @@ void CurveEditor::gui_input(const Ref<InputEvent> &p_event) { tangent = 9999 * (dir.y >= 0 ? 1 : -1); } - bool link = !Input::get_singleton()->is_key_pressed(KEY_SHIFT); + bool link = !Input::get_singleton()->is_key_pressed(Key::SHIFT); if (_selected_tangent == TANGENT_LEFT) { curve.set_point_left_tangent(_selected_point, tangent); @@ -240,7 +240,7 @@ void CurveEditor::gui_input(const Ref<InputEvent> &p_event) { const InputEventKey &key = **key_ref; if (key.is_pressed() && _selected_point != -1) { - if (key.get_keycode() == KEY_DELETE) { + if (key.get_keycode() == Key::KEY_DELETE) { remove_point(_selected_point); } } @@ -354,9 +354,9 @@ void CurveEditor::open_context_menu(Vector2 pos) { _context_menu->add_check_item(TTR("Linear"), CONTEXT_LINEAR); - bool is_linear = _selected_tangent == TANGENT_LEFT ? - _curve_ref->get_point_left_mode(_selected_point) == Curve::TANGENT_LINEAR : - _curve_ref->get_point_right_mode(_selected_point) == Curve::TANGENT_LINEAR; + bool is_linear = _selected_tangent == TANGENT_LEFT + ? _curve_ref->get_point_left_mode(_selected_point) == Curve::TANGENT_LINEAR + : _curve_ref->get_point_right_mode(_selected_point) == Curve::TANGENT_LINEAR; _context_menu->set_item_checked(_context_menu->get_item_index(CONTEXT_LINEAR), is_linear); @@ -383,7 +383,7 @@ void CurveEditor::open_context_menu(Vector2 pos) { _context_menu->add_submenu_item(TTR("Load Preset"), _presets_menu->get_name()); - _context_menu->set_size(Size2(0, 0)); + _context_menu->reset_size(); _context_menu->popup(); } @@ -460,7 +460,7 @@ void CurveEditor::remove_point(int index) { Curve::Point p = _curve_ref->get_point(index); ur.add_do_method(*_curve_ref, "remove_point", index); - ur.add_undo_method(*_curve_ref, "add_point", p.pos, p.left_tangent, p.right_tangent, p.left_mode, p.right_mode); + ur.add_undo_method(*_curve_ref, "add_point", p.position, p.left_tangent, p.right_tangent, p.left_mode, p.right_mode); if (index == _selected_point) { set_selected_point(-1); diff --git a/editor/plugins/debugger_editor_plugin.cpp b/editor/plugins/debugger_editor_plugin.cpp index 1512e1817a..51e1b639a4 100644 --- a/editor/plugins/debugger_editor_plugin.cpp +++ b/editor/plugins/debugger_editor_plugin.cpp @@ -34,16 +34,17 @@ #include "editor/debugger/editor_debugger_node.h" #include "editor/debugger/editor_debugger_server.h" #include "editor/editor_node.h" +#include "editor/editor_scale.h" #include "editor/fileserver/editor_file_server.h" #include "scene/gui/menu_button.h" DebuggerEditorPlugin::DebuggerEditorPlugin(EditorNode *p_editor, MenuButton *p_debug_menu) { EditorDebuggerServer::initialize(); - ED_SHORTCUT("debugger/step_into", TTR("Step Into"), KEY_F11); - ED_SHORTCUT("debugger/step_over", TTR("Step Over"), KEY_F10); + ED_SHORTCUT("debugger/step_into", TTR("Step Into"), Key::F11); + ED_SHORTCUT("debugger/step_over", TTR("Step Over"), Key::F10); ED_SHORTCUT("debugger/break", TTR("Break")); - ED_SHORTCUT("debugger/continue", TTR("Continue"), KEY_F12); + ED_SHORTCUT("debugger/continue", TTR("Continue"), Key::F12); ED_SHORTCUT("debugger/keep_debugger_open", TTR("Keep Debugger Open")); ED_SHORTCUT("debugger/debug_with_external_editor", TTR("Debug with External Editor")); @@ -52,6 +53,8 @@ DebuggerEditorPlugin::DebuggerEditorPlugin(EditorNode *p_editor, MenuButton *p_d EditorDebuggerNode *debugger = memnew(EditorDebuggerNode); Button *db = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Debugger"), debugger); + // Add separation for the warning/error icon that is displayed later. + db->add_theme_constant_override("hseparation", 6 * EDSCALE); debugger->set_tool_button(db); // Main editor debug menu. diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp index 4cb2c0a76b..9702c7e734 100644 --- a/editor/plugins/editor_preview_plugins.cpp +++ b/editor/plugins/editor_preview_plugins.cpp @@ -297,12 +297,14 @@ EditorPackedScenePreviewPlugin::EditorPackedScenePreviewPlugin() { ////////////////////////////////////////////////////////////////// -void EditorMaterialPreviewPlugin::_preview_done(const Variant &p_udata) { - preview_done.set(); +void EditorMaterialPreviewPlugin::_generate_frame_started() { + RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture + + RS::get_singleton()->request_frame_drawn_callback(callable_mp(const_cast<EditorMaterialPreviewPlugin *>(this), &EditorMaterialPreviewPlugin::_preview_done)); } -void EditorMaterialPreviewPlugin::_bind_methods() { - ClassDB::bind_method("_preview_done", &EditorMaterialPreviewPlugin::_preview_done); +void EditorMaterialPreviewPlugin::_preview_done() { + preview_done.post(); } bool EditorMaterialPreviewPlugin::handles(const String &p_type) const { @@ -320,14 +322,9 @@ Ref<Texture2D> EditorMaterialPreviewPlugin::generate(const RES &p_from, const Si if (material->get_shader_mode() == Shader::MODE_SPATIAL) { RS::get_singleton()->mesh_surface_set_material(sphere, 0, material->get_rid()); - RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture + RS::get_singleton()->connect(SNAME("frame_pre_draw"), callable_mp(const_cast<EditorMaterialPreviewPlugin *>(this), &EditorMaterialPreviewPlugin::_generate_frame_started), Vector<Variant>(), Object::CONNECT_ONESHOT); - preview_done.clear(); - RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMaterialPreviewPlugin *>(this), "_preview_done", Variant()); - - while (!preview_done.is_set()) { - OS::get_singleton()->delay_usec(10); - } + preview_done.wait(); Ref<Image> img = RS::get_singleton()->texture_2d_get(viewport_texture); RS::get_singleton()->mesh_surface_set_material(sphere, 0, RID()); @@ -699,12 +696,14 @@ EditorAudioStreamPreviewPlugin::EditorAudioStreamPreviewPlugin() { /////////////////////////////////////////////////////////////////////////// -void EditorMeshPreviewPlugin::_preview_done(const Variant &p_udata) { - preview_done.set(); +void EditorMeshPreviewPlugin::_generate_frame_started() { + RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture + + RS::get_singleton()->request_frame_drawn_callback(callable_mp(const_cast<EditorMeshPreviewPlugin *>(this), &EditorMeshPreviewPlugin::_preview_done)); } -void EditorMeshPreviewPlugin::_bind_methods() { - ClassDB::bind_method("_preview_done", &EditorMeshPreviewPlugin::_preview_done); +void EditorMeshPreviewPlugin::_preview_done() { + preview_done.post(); } bool EditorMeshPreviewPlugin::handles(const String &p_type) const { @@ -735,14 +734,9 @@ Ref<Texture2D> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 xform.origin.z -= rot_aabb.size.z * 2; RS::get_singleton()->instance_set_transform(mesh_instance, xform); - RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture + RS::get_singleton()->connect(SNAME("frame_pre_draw"), callable_mp(const_cast<EditorMeshPreviewPlugin *>(this), &EditorMeshPreviewPlugin::_generate_frame_started), Vector<Variant>(), Object::CONNECT_ONESHOT); - preview_done.clear(); - RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMeshPreviewPlugin *>(this), "_preview_done", Variant()); - - while (!preview_done.is_set()) { - OS::get_singleton()->delay_usec(10); - } + preview_done.wait(); Ref<Image> img = RS::get_singleton()->texture_2d_get(viewport_texture); ERR_FAIL_COND_V(img.is_null(), Ref<ImageTexture>()); @@ -814,12 +808,14 @@ EditorMeshPreviewPlugin::~EditorMeshPreviewPlugin() { /////////////////////////////////////////////////////////////////////////// -void EditorFontPreviewPlugin::_preview_done(const Variant &p_udata) { - preview_done.set(); +void EditorFontPreviewPlugin::_generate_frame_started() { + RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture + + RS::get_singleton()->request_frame_drawn_callback(callable_mp(const_cast<EditorFontPreviewPlugin *>(this), &EditorFontPreviewPlugin::_preview_done)); } -void EditorFontPreviewPlugin::_bind_methods() { - ClassDB::bind_method("_preview_done", &EditorFontPreviewPlugin::_preview_done); +void EditorFontPreviewPlugin::_preview_done() { + preview_done.post(); } bool EditorFontPreviewPlugin::handles(const String &p_type) const { @@ -857,13 +853,9 @@ Ref<Texture2D> EditorFontPreviewPlugin::generate_from_path(const String &p_path, font->draw_string(canvas_item, pos, sample, HALIGN_LEFT, -1.f, 50, Color(1, 1, 1)); - preview_done.clear(); - RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture - RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorFontPreviewPlugin *>(this), "_preview_done", Variant()); + RS::get_singleton()->connect(SNAME("frame_pre_draw"), callable_mp(const_cast<EditorFontPreviewPlugin *>(this), &EditorFontPreviewPlugin::_generate_frame_started), Vector<Variant>(), Object::CONNECT_ONESHOT); - while (!preview_done.is_set()) { - OS::get_singleton()->delay_usec(10); - } + preview_done.wait(); RS::get_singleton()->canvas_item_clear(canvas_item); diff --git a/editor/plugins/editor_preview_plugins.h b/editor/plugins/editor_preview_plugins.h index 6e8b9a34cf..bf52f5771d 100644 --- a/editor/plugins/editor_preview_plugins.h +++ b/editor/plugins/editor_preview_plugins.h @@ -92,12 +92,10 @@ class EditorMaterialPreviewPlugin : public EditorResourcePreviewGenerator { RID light2; RID light_instance2; RID camera; - mutable SafeFlag preview_done; + Semaphore preview_done; - void _preview_done(const Variant &p_udata); - -protected: - static void _bind_methods(); + void _generate_frame_started(); + void _preview_done(); public: virtual bool handles(const String &p_type) const override; @@ -136,12 +134,10 @@ class EditorMeshPreviewPlugin : public EditorResourcePreviewGenerator { RID light2; RID light_instance2; RID camera; - mutable SafeFlag preview_done; - - void _preview_done(const Variant &p_udata); + Semaphore preview_done; -protected: - static void _bind_methods(); + void _generate_frame_started(); + void _preview_done(); public: virtual bool handles(const String &p_type) const override; @@ -158,12 +154,10 @@ class EditorFontPreviewPlugin : public EditorResourcePreviewGenerator { RID viewport_texture; RID canvas; RID canvas_item; - mutable SafeFlag preview_done; - - void _preview_done(const Variant &p_udata); + Semaphore preview_done; -protected: - static void _bind_methods(); + void _generate_frame_started(); + void _preview_done(); public: virtual bool handles(const String &p_type) const override; @@ -173,4 +167,20 @@ public: EditorFontPreviewPlugin(); ~EditorFontPreviewPlugin(); }; + +class EditorTileMapPatternPreviewPlugin : public EditorResourcePreviewGenerator { + GDCLASS(EditorTileMapPatternPreviewPlugin, EditorResourcePreviewGenerator); + + Semaphore preview_done; + + void _generate_frame_started(); + void _preview_done(); + +public: + virtual bool handles(const String &p_type) const override; + virtual Ref<Texture2D> generate(const RES &p_from, const Size2 &p_size) const override; + + EditorTileMapPatternPreviewPlugin(); + ~EditorTileMapPatternPreviewPlugin(); +}; #endif // EDITORPREVIEWPLUGINS_H diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.cpp b/editor/plugins/gpu_particles_2d_editor_plugin.cpp index 44c789b145..4b50f484a4 100644 --- a/editor/plugins/gpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_2d_editor_plugin.cpp @@ -57,6 +57,27 @@ void GPUParticles2DEditorPlugin::_file_selected(const String &p_file) { emission_mask->popup_centered(); } +void GPUParticles2DEditorPlugin::_selection_changed() { + List<Node *> selected_nodes = editor->get_editor_selection()->get_selected_node_list(); + + if (selected_particles.is_empty() && selected_nodes.is_empty()) { + return; + } + + for (GPUParticles2D *SP : selected_particles) { + SP->set_show_visibility_rect(false); + } + selected_particles.clear(); + + for (Node *P : selected_nodes) { + GPUParticles2D *selected_particle = Object::cast_to<GPUParticles2D>(P); + if (selected_particle != nullptr) { + selected_particle->set_show_visibility_rect(true); + selected_particles.push_back(selected_particle); + } + } +} + void GPUParticles2DEditorPlugin::_menu_callback(int p_idx) { switch (p_idx) { case MENU_GENERATE_VISIBILITY_RECT: { @@ -334,6 +355,7 @@ void GPUParticles2DEditorPlugin::_notification(int p_what) { menu->get_popup()->connect("id_pressed", callable_mp(this, &GPUParticles2DEditorPlugin::_menu_callback)); menu->set_icon(menu->get_theme_icon(SNAME("GPUParticles2D"), SNAME("EditorIcons"))); file->connect("file_selected", callable_mp(this, &GPUParticles2DEditorPlugin::_file_selected)); + EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", callable_mp(this, &GPUParticles2DEditorPlugin::_selection_changed)); } } diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.h b/editor/plugins/gpu_particles_2d_editor_plugin.h index 0b2028b745..bdfc021aa7 100644 --- a/editor/plugins/gpu_particles_2d_editor_plugin.h +++ b/editor/plugins/gpu_particles_2d_editor_plugin.h @@ -56,6 +56,7 @@ class GPUParticles2DEditorPlugin : public EditorPlugin { }; GPUParticles2D *particles; + List<GPUParticles2D *> selected_particles; EditorFileDialog *file; EditorNode *editor; @@ -79,6 +80,7 @@ class GPUParticles2DEditorPlugin : public EditorPlugin { void _menu_callback(int p_idx); void _generate_visibility_rect(); void _generate_emission_mask(); + void _selection_changed(); protected: void _notification(int p_what); diff --git a/editor/plugins/gpu_particles_collision_sdf_editor_plugin.cpp b/editor/plugins/gpu_particles_collision_sdf_editor_plugin.cpp index 6df2e34ceb..57279c57e7 100644 --- a/editor/plugins/gpu_particles_collision_sdf_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_collision_sdf_editor_plugin.cpp @@ -68,32 +68,36 @@ void GPUParticlesCollisionSDFEditorPlugin::_notification(int p_what) { return; } + // Set information tooltip on the Bake button. This information is useful + // to optimize performance (video RAM size) and reduce collision tunneling (individual cell size). + const Vector3i size = col_sdf->get_estimated_cell_size(); - String text = vformat(String::utf8("%d × %d × %d"), size.x, size.y, size.z); - int data_size = 2; - const double size_mb = size.x * size.y * size.z * data_size / (1024.0 * 1024.0); - text += " - " + vformat(TTR("VRAM Size: %s MB"), String::num(size_mb, 2)); + const Vector3 extents = col_sdf->get_extents(); - if (bake_info->get_text() == text) { - return; + int data_size = 2; + const double size_mb = size.x * size.y * size.z * data_size / (1024.0 * 1024.0); + // Add a qualitative measurement to help the user assess whether a GPUParticlesCollisionSDF node is using a lot of VRAM. + String size_quality; + if (size_mb < 8.0) { + size_quality = TTR("Low"); + } else if (size_mb < 32.0) { + size_quality = TTR("Moderate"); + } else { + size_quality = TTR("High"); } - // Color the label depending on the estimated performance level. - Color color; - if (size_mb <= 16.0 + CMP_EPSILON) { - // Fast. - color = bake_info->get_theme_color(SNAME("success_color"), SNAME("Editor")); - } else if (size_mb <= 64.0 + CMP_EPSILON) { - // Medium. - color = bake_info->get_theme_color(SNAME("warning_color"), SNAME("Editor")); - } else { - // Slow. - color = bake_info->get_theme_color(SNAME("error_color"), SNAME("Editor")); + String text; + text += vformat(TTR("Subdivisions: %s"), vformat(String::utf8("%d × %d × %d"), size.x, size.y, size.z)) + "\n"; + text += vformat(TTR("Cell size: %s"), vformat(String::utf8("%.3f × %.3f × %.3f"), extents.x / size.x, extents.y / size.y, extents.z / size.z)) + "\n"; + text += vformat(TTR("Video RAM size: %s MB (%s)"), String::num(size_mb, 2), size_quality); + + // Only update the tooltip when needed to avoid constant redrawing. + if (bake->get_tooltip(Point2()) == text) { + return; } - bake_info->add_theme_color_override("font_color", color); - bake_info->set_text(text); + bake->set_tooltip(text); } } @@ -178,10 +182,6 @@ GPUParticlesCollisionSDFEditorPlugin::GPUParticlesCollisionSDFEditorPlugin(Edito bake->set_text(TTR("Bake SDF")); bake->connect("pressed", callable_mp(this, &GPUParticlesCollisionSDFEditorPlugin::_bake)); bake_hb->add_child(bake); - bake_info = memnew(Label); - bake_info->set_h_size_flags(Control::SIZE_EXPAND_FILL); - bake_info->set_clip_text(true); - bake_hb->add_child(bake_info); add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU, bake_hb); col_sdf = nullptr; diff --git a/editor/plugins/gpu_particles_collision_sdf_editor_plugin.h b/editor/plugins/gpu_particles_collision_sdf_editor_plugin.h index 5a71fc44ef..26b8b352d6 100644 --- a/editor/plugins/gpu_particles_collision_sdf_editor_plugin.h +++ b/editor/plugins/gpu_particles_collision_sdf_editor_plugin.h @@ -42,7 +42,6 @@ class GPUParticlesCollisionSDFEditorPlugin : public EditorPlugin { GPUParticlesCollisionSDF *col_sdf; HBoxContainer *bake_hb; - Label *bake_info; Button *bake; EditorNode *editor; diff --git a/editor/plugins/gradient_editor_plugin.cpp b/editor/plugins/gradient_editor_plugin.cpp index 355bdb69d8..da050abc02 100644 --- a/editor/plugins/gradient_editor_plugin.cpp +++ b/editor/plugins/gradient_editor_plugin.cpp @@ -46,6 +46,8 @@ void GradientEditor::_gradient_changed() { editing = true; Vector<Gradient::Point> points = gradient->get_points(); set_points(points); + set_interpolation_mode(gradient->get_interpolation_mode()); + update(); editing = false; } @@ -55,8 +57,10 @@ void GradientEditor::_ramp_changed() { undo_redo->create_action(TTR("Gradient Edited")); undo_redo->add_do_method(gradient.ptr(), "set_offsets", get_offsets()); undo_redo->add_do_method(gradient.ptr(), "set_colors", get_colors()); + undo_redo->add_do_method(gradient.ptr(), "set_interpolation_mode", get_interpolation_mode()); undo_redo->add_undo_method(gradient.ptr(), "set_offsets", gradient->get_offsets()); undo_redo->add_undo_method(gradient.ptr(), "set_colors", gradient->get_colors()); + undo_redo->add_undo_method(gradient.ptr(), "set_interpolation_mode", gradient->get_interpolation_mode()); undo_redo->commit_action(); editing = false; } @@ -69,6 +73,14 @@ void GradientEditor::set_gradient(const Ref<Gradient> &p_gradient) { connect("ramp_changed", callable_mp(this, &GradientEditor::_ramp_changed)); gradient->connect("changed", callable_mp(this, &GradientEditor::_gradient_changed)); set_points(gradient->get_points()); + set_interpolation_mode(gradient->get_interpolation_mode()); +} + +void GradientEditor::reverse_gradient() { + gradient->reverse(); + set_points(gradient->get_points()); + emit_signal(SNAME("ramp_changed")); + update(); } GradientEditor::GradientEditor() { @@ -77,6 +89,23 @@ GradientEditor::GradientEditor() { /////////////////////// +void GradientReverseButton::_notification(int p_what) { + if (p_what == NOTIFICATION_DRAW) { + Ref<Texture2D> icon = get_theme_icon(SNAME("ReverseGradient"), SNAME("EditorIcons")); + if (is_pressed()) { + draw_texture_rect(icon, Rect2(margin, margin, icon->get_width(), icon->get_height()), false, get_theme_color(SNAME("icon_pressed_color"), SNAME("Button"))); + } else { + draw_texture_rect(icon, Rect2(margin, margin, icon->get_width(), icon->get_height())); + } + } +} + +Size2 GradientReverseButton::get_minimum_size() const { + return (get_theme_icon(SNAME("ReverseGradient"), SNAME("EditorIcons"))->get_size() + Size2(margin * 2, margin * 2)); +} + +/////////////////////// + bool EditorInspectorPluginGradient::can_handle(Object *p_object) { return Object::cast_to<Gradient>(p_object) != nullptr; } @@ -85,9 +114,23 @@ void EditorInspectorPluginGradient::parse_begin(Object *p_object) { Gradient *gradient = Object::cast_to<Gradient>(p_object); Ref<Gradient> g(gradient); - GradientEditor *editor = memnew(GradientEditor); + editor = memnew(GradientEditor); editor->set_gradient(g); add_custom_control(editor); + + reverse_btn = memnew(GradientReverseButton); + + gradient_tools_hbox = memnew(HBoxContainer); + gradient_tools_hbox->add_child(reverse_btn); + + add_custom_control(gradient_tools_hbox); + + reverse_btn->connect("pressed", callable_mp(this, &EditorInspectorPluginGradient::_reverse_button_pressed)); + reverse_btn->set_tooltip(TTR("Reverse/mirror gradient.")); +} + +void EditorInspectorPluginGradient::_reverse_button_pressed() { + editor->reverse_gradient(); } GradientEditorPlugin::GradientEditorPlugin(EditorNode *p_node) { diff --git a/editor/plugins/gradient_editor_plugin.h b/editor/plugins/gradient_editor_plugin.h index bcbb86e422..95b7b466c9 100644 --- a/editor/plugins/gradient_editor_plugin.h +++ b/editor/plugins/gradient_editor_plugin.h @@ -50,12 +50,28 @@ protected: public: virtual Size2 get_minimum_size() const override; void set_gradient(const Ref<Gradient> &p_gradient); + void reverse_gradient(); GradientEditor(); }; +class GradientReverseButton : public BaseButton { + GDCLASS(GradientReverseButton, BaseButton); + + int margin = 2; + + void _notification(int p_what); + virtual Size2 get_minimum_size() const override; +}; + class EditorInspectorPluginGradient : public EditorInspectorPlugin { GDCLASS(EditorInspectorPluginGradient, EditorInspectorPlugin); + GradientEditor *editor; + HBoxContainer *gradient_tools_hbox; + GradientReverseButton *reverse_btn; + + void _reverse_button_pressed(); + public: virtual bool can_handle(Object *p_object) override; virtual void parse_begin(Object *p_object) override; diff --git a/editor/plugins/item_list_editor_plugin.cpp b/editor/plugins/item_list_editor_plugin.cpp deleted file mode 100644 index 16cafda899..0000000000 --- a/editor/plugins/item_list_editor_plugin.cpp +++ /dev/null @@ -1,410 +0,0 @@ -/*************************************************************************/ -/* item_list_editor_plugin.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#include "item_list_editor_plugin.h" - -#include "core/io/resource_loader.h" -#include "editor/editor_scale.h" - -bool ItemListPlugin::_set(const StringName &p_name, const Variant &p_value) { - String name = p_name; - int idx = name.get_slice("/", 0).to_int(); - String what = name.get_slice("/", 1); - - if (what == "text") { - set_item_text(idx, p_value); - } else if (what == "icon") { - set_item_icon(idx, p_value); - } else if (what == "checkable") { - // This keeps compatibility to/from versions where this property was a boolean, before radio buttons - switch ((int)p_value) { - case 0: - case 1: - set_item_checkable(idx, p_value); - break; - case 2: - set_item_radio_checkable(idx, true); - break; - } - } else if (what == "checked") { - set_item_checked(idx, p_value); - } else if (what == "id") { - set_item_id(idx, p_value); - } else if (what == "enabled") { - set_item_enabled(idx, p_value); - } else if (what == "separator") { - set_item_separator(idx, p_value); - } else { - return false; - } - - return true; -} - -bool ItemListPlugin::_get(const StringName &p_name, Variant &r_ret) const { - String name = p_name; - int idx = name.get_slice("/", 0).to_int(); - String what = name.get_slice("/", 1); - - if (what == "text") { - r_ret = get_item_text(idx); - } else if (what == "icon") { - r_ret = get_item_icon(idx); - } else if (what == "checkable") { - // This keeps compatibility to/from versions where this property was a boolean, before radio buttons - if (!is_item_checkable(idx)) { - r_ret = 0; - } else { - r_ret = is_item_radio_checkable(idx) ? 2 : 1; - } - } else if (what == "checked") { - r_ret = is_item_checked(idx); - } else if (what == "id") { - r_ret = get_item_id(idx); - } else if (what == "enabled") { - r_ret = is_item_enabled(idx); - } else if (what == "separator") { - r_ret = is_item_separator(idx); - } else { - return false; - } - - return true; -} - -void ItemListPlugin::_get_property_list(List<PropertyInfo> *p_list) const { - for (int i = 0; i < get_item_count(); i++) { - String base = itos(i) + "/"; - - p_list->push_back(PropertyInfo(Variant::STRING, base + "text")); - p_list->push_back(PropertyInfo(Variant::OBJECT, base + "icon", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D")); - - int flags = get_flags(); - - if (flags & FLAG_CHECKABLE) { - p_list->push_back(PropertyInfo(Variant::INT, base + "checkable", PROPERTY_HINT_ENUM, "No,As checkbox,As radio button")); - p_list->push_back(PropertyInfo(Variant::BOOL, base + "checked")); - } - - if (flags & FLAG_ID) { - p_list->push_back(PropertyInfo(Variant::INT, base + "id", PROPERTY_HINT_RANGE, "-1,4096")); - } - - if (flags & FLAG_ENABLE) { - p_list->push_back(PropertyInfo(Variant::BOOL, base + "enabled")); - } - - if (flags & FLAG_SEPARATOR) { - p_list->push_back(PropertyInfo(Variant::BOOL, base + "separator")); - } - } -} - -/////////////////////////////////////////////////////////////// -///////////////////////// PLUGINS ///////////////////////////// -/////////////////////////////////////////////////////////////// - -void ItemListOptionButtonPlugin::set_object(Object *p_object) { - ob = Object::cast_to<OptionButton>(p_object); -} - -bool ItemListOptionButtonPlugin::handles(Object *p_object) const { - return p_object->is_class("OptionButton"); -} - -int ItemListOptionButtonPlugin::get_flags() const { - return FLAG_ICON | FLAG_ID | FLAG_ENABLE; -} - -void ItemListOptionButtonPlugin::add_item() { - ob->add_item(vformat(TTR("Item %d"), ob->get_item_count())); - notify_property_list_changed(); -} - -int ItemListOptionButtonPlugin::get_item_count() const { - return ob->get_item_count(); -} - -void ItemListOptionButtonPlugin::erase(int p_idx) { - ob->remove_item(p_idx); - notify_property_list_changed(); -} - -ItemListOptionButtonPlugin::ItemListOptionButtonPlugin() { - ob = nullptr; -} - -/////////////////////////////////////////////////////////////// - -void ItemListPopupMenuPlugin::set_object(Object *p_object) { - if (p_object->is_class("MenuButton")) { - pp = Object::cast_to<MenuButton>(p_object)->get_popup(); - } else { - pp = Object::cast_to<PopupMenu>(p_object); - } -} - -bool ItemListPopupMenuPlugin::handles(Object *p_object) const { - return p_object->is_class("PopupMenu") || p_object->is_class("MenuButton"); -} - -int ItemListPopupMenuPlugin::get_flags() const { - return FLAG_ICON | FLAG_CHECKABLE | FLAG_ID | FLAG_ENABLE | FLAG_SEPARATOR; -} - -void ItemListPopupMenuPlugin::add_item() { - pp->add_item(vformat(TTR("Item %d"), pp->get_item_count())); - notify_property_list_changed(); -} - -int ItemListPopupMenuPlugin::get_item_count() const { - return pp->get_item_count(); -} - -void ItemListPopupMenuPlugin::erase(int p_idx) { - pp->remove_item(p_idx); - notify_property_list_changed(); -} - -ItemListPopupMenuPlugin::ItemListPopupMenuPlugin() { - pp = nullptr; -} - -/////////////////////////////////////////////////////////////// - -void ItemListItemListPlugin::set_object(Object *p_object) { - pp = Object::cast_to<ItemList>(p_object); -} - -bool ItemListItemListPlugin::handles(Object *p_object) const { - return p_object->is_class("ItemList"); -} - -int ItemListItemListPlugin::get_flags() const { - return FLAG_ICON | FLAG_ENABLE; -} - -void ItemListItemListPlugin::add_item() { - pp->add_item(vformat(TTR("Item %d"), pp->get_item_count())); - notify_property_list_changed(); -} - -int ItemListItemListPlugin::get_item_count() const { - return pp->get_item_count(); -} - -void ItemListItemListPlugin::erase(int p_idx) { - pp->remove_item(p_idx); - notify_property_list_changed(); -} - -ItemListItemListPlugin::ItemListItemListPlugin() { - pp = nullptr; -} - -/////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////// - -void ItemListEditor::_node_removed(Node *p_node) { - if (p_node == item_list) { - item_list = nullptr; - hide(); - dialog->hide(); - } -} - -void ItemListEditor::_notification(int p_notification) { - if (p_notification == NOTIFICATION_ENTER_TREE || p_notification == NOTIFICATION_THEME_CHANGED) { - add_button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); - clear_button->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); - del_button->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); - } else if (p_notification == NOTIFICATION_READY) { - get_tree()->connect("node_removed", callable_mp(this, &ItemListEditor::_node_removed)); - } -} - -void ItemListEditor::_add_pressed() { - if (selected_idx == -1) { - return; - } - - item_plugins[selected_idx]->add_item(); -} - -void ItemListEditor::_clear_pressed() { - for (int i = item_plugins[selected_idx]->get_item_count() - 1; i >= 0; i--) { - item_plugins[selected_idx]->erase(i); - } -} - -void ItemListEditor::_delete_pressed() { - if (selected_idx == -1) { - return; - } - - String current_selected = (String)property_editor->get_selected_path(); - - if (current_selected == "") { - return; - } - - // FIXME: Currently relying on selecting a *property* to derive what item to delete - // e.g. you select "1/enabled" to delete item 1. - // This should be fixed so that you can delete by selecting the item section header, - // or a delete button on that header. - - int idx = current_selected.get_slice("/", 0).to_int(); - - item_plugins[selected_idx]->erase(idx); -} - -void ItemListEditor::_edit_items() { - dialog->popup_centered_clamped(Vector2(425, 1200) * EDSCALE, 0.8); -} - -void ItemListEditor::edit(Node *p_item_list) { - item_list = p_item_list; - - if (!item_list) { - selected_idx = -1; - property_editor->edit(nullptr); - return; - } - - for (int i = 0; i < item_plugins.size(); i++) { - if (item_plugins[i]->handles(p_item_list)) { - item_plugins[i]->set_object(p_item_list); - property_editor->edit(item_plugins[i]); - - toolbar_button->set_icon(EditorNode::get_singleton()->get_object_icon(item_list, "")); - - selected_idx = i; - return; - } - } - - selected_idx = -1; - property_editor->edit(nullptr); -} - -bool ItemListEditor::handles(Object *p_object) const { - for (int i = 0; i < item_plugins.size(); i++) { - if (item_plugins[i]->handles(p_object)) { - return true; - } - } - - return false; -} - -void ItemListEditor::_bind_methods() { -} - -ItemListEditor::ItemListEditor() { - selected_idx = -1; - item_list = nullptr; - - toolbar_button = memnew(Button); - toolbar_button->set_flat(true); - toolbar_button->set_text(TTR("Items")); - add_child(toolbar_button); - toolbar_button->connect("pressed", callable_mp(this, &ItemListEditor::_edit_items)); - - dialog = memnew(AcceptDialog); - dialog->set_title(TTR("Item List Editor")); - add_child(dialog); - - VBoxContainer *vbc = memnew(VBoxContainer); - dialog->add_child(vbc); - //dialog->set_child_rect(vbc); - - HBoxContainer *hbc = memnew(HBoxContainer); - hbc->set_h_size_flags(SIZE_EXPAND_FILL); - vbc->add_child(hbc); - - add_button = memnew(Button); - add_button->set_text(TTR("Add")); - hbc->add_child(add_button); - add_button->connect("pressed", callable_mp(this, &ItemListEditor::_add_pressed)); - - hbc->add_spacer(); - - clear_button = memnew(Button); - clear_button->set_text(TTR("Delete All")); - hbc->add_child(clear_button); - clear_button->connect("pressed", callable_mp(this, &ItemListEditor::_clear_pressed)); - - del_button = memnew(Button); - del_button->set_text(TTR("Delete")); - hbc->add_child(del_button); - del_button->connect("pressed", callable_mp(this, &ItemListEditor::_delete_pressed)); - - property_editor = memnew(EditorInspector); - vbc->add_child(property_editor); - property_editor->set_v_size_flags(SIZE_EXPAND_FILL); -} - -ItemListEditor::~ItemListEditor() { - for (int i = 0; i < item_plugins.size(); i++) { - memdelete(item_plugins[i]); - } -} - -void ItemListEditorPlugin::edit(Object *p_object) { - item_list_editor->edit(Object::cast_to<Node>(p_object)); -} - -bool ItemListEditorPlugin::handles(Object *p_object) const { - return item_list_editor->handles(p_object); -} - -void ItemListEditorPlugin::make_visible(bool p_visible) { - if (p_visible) { - item_list_editor->show(); - } else { - item_list_editor->hide(); - item_list_editor->edit(nullptr); - } -} - -ItemListEditorPlugin::ItemListEditorPlugin(EditorNode *p_node) { - editor = p_node; - item_list_editor = memnew(ItemListEditor); - CanvasItemEditor::get_singleton()->add_control_to_menu_panel(item_list_editor); - - item_list_editor->hide(); - item_list_editor->add_plugin(memnew(ItemListOptionButtonPlugin)); - item_list_editor->add_plugin(memnew(ItemListPopupMenuPlugin)); - item_list_editor->add_plugin(memnew(ItemListItemListPlugin)); -} - -ItemListEditorPlugin::~ItemListEditorPlugin() { -} diff --git a/editor/plugins/item_list_editor_plugin.h b/editor/plugins/item_list_editor_plugin.h deleted file mode 100644 index 8f61aef083..0000000000 --- a/editor/plugins/item_list_editor_plugin.h +++ /dev/null @@ -1,250 +0,0 @@ -/*************************************************************************/ -/* item_list_editor_plugin.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef ITEM_LIST_EDITOR_PLUGIN_H -#define ITEM_LIST_EDITOR_PLUGIN_H - -#include "canvas_item_editor_plugin.h" -#include "editor/editor_inspector.h" -#include "editor/editor_node.h" -#include "editor/editor_plugin.h" -#include "scene/gui/menu_button.h" -#include "scene/gui/option_button.h" -#include "scene/gui/popup_menu.h" - -class ItemListPlugin : public Object { - GDCLASS(ItemListPlugin, Object); - -protected: - bool _set(const StringName &p_name, const Variant &p_value); - bool _get(const StringName &p_name, Variant &r_ret) const; - void _get_property_list(List<PropertyInfo> *p_list) const; - -public: - enum Flags { - FLAG_ICON = 1, - FLAG_CHECKABLE = 2, - FLAG_ID = 4, - FLAG_ENABLE = 8, - FLAG_SEPARATOR = 16 - }; - - virtual void set_object(Object *p_object) = 0; - virtual bool handles(Object *p_object) const = 0; - - virtual int get_flags() const = 0; - - virtual void set_item_text(int p_idx, const String &p_text) {} - virtual String get_item_text(int p_idx) const { return ""; }; - - virtual void set_item_icon(int p_idx, const Ref<Texture2D> &p_tex) {} - virtual Ref<Texture2D> get_item_icon(int p_idx) const { return Ref<Texture2D>(); }; - - virtual void set_item_checkable(int p_idx, bool p_check) {} - virtual void set_item_radio_checkable(int p_idx, bool p_check) {} - virtual bool is_item_checkable(int p_idx) const { return false; }; - virtual bool is_item_radio_checkable(int p_idx) const { return false; }; - - virtual void set_item_checked(int p_idx, bool p_checked) {} - virtual bool is_item_checked(int p_idx) const { return false; }; - - virtual void set_item_enabled(int p_idx, int p_enabled) {} - virtual bool is_item_enabled(int p_idx) const { return false; }; - - virtual void set_item_id(int p_idx, int p_id) {} - virtual int get_item_id(int p_idx) const { return -1; }; - - virtual void set_item_separator(int p_idx, bool p_separator) {} - virtual bool is_item_separator(int p_idx) const { return false; }; - - virtual void add_item() = 0; - virtual int get_item_count() const = 0; - virtual void erase(int p_idx) = 0; - - ItemListPlugin() {} -}; - -/////////////////////////////////////////////////////////////// - -class ItemListOptionButtonPlugin : public ItemListPlugin { - GDCLASS(ItemListOptionButtonPlugin, ItemListPlugin); - - OptionButton *ob; - -public: - virtual void set_object(Object *p_object) override; - virtual bool handles(Object *p_object) const override; - virtual int get_flags() const override; - - virtual void set_item_text(int p_idx, const String &p_text) override { ob->set_item_text(p_idx, p_text); } - virtual String get_item_text(int p_idx) const override { return ob->get_item_text(p_idx); } - - virtual void set_item_icon(int p_idx, const Ref<Texture2D> &p_tex) override { ob->set_item_icon(p_idx, p_tex); } - virtual Ref<Texture2D> get_item_icon(int p_idx) const override { return ob->get_item_icon(p_idx); } - - virtual void set_item_enabled(int p_idx, int p_enabled) override { ob->set_item_disabled(p_idx, !p_enabled); } - virtual bool is_item_enabled(int p_idx) const override { return !ob->is_item_disabled(p_idx); } - - virtual void set_item_id(int p_idx, int p_id) override { ob->set_item_id(p_idx, p_id); } - virtual int get_item_id(int p_idx) const override { return ob->get_item_id(p_idx); } - - virtual void add_item() override; - virtual int get_item_count() const override; - virtual void erase(int p_idx) override; - - ItemListOptionButtonPlugin(); -}; - -class ItemListPopupMenuPlugin : public ItemListPlugin { - GDCLASS(ItemListPopupMenuPlugin, ItemListPlugin); - - PopupMenu *pp; - -public: - virtual void set_object(Object *p_object) override; - virtual bool handles(Object *p_object) const override; - virtual int get_flags() const override; - - virtual void set_item_text(int p_idx, const String &p_text) override { pp->set_item_text(p_idx, p_text); } - virtual String get_item_text(int p_idx) const override { return pp->get_item_text(p_idx); } - - virtual void set_item_icon(int p_idx, const Ref<Texture2D> &p_tex) override { pp->set_item_icon(p_idx, p_tex); } - virtual Ref<Texture2D> get_item_icon(int p_idx) const override { return pp->get_item_icon(p_idx); } - - virtual void set_item_checkable(int p_idx, bool p_check) override { pp->set_item_as_checkable(p_idx, p_check); } - virtual void set_item_radio_checkable(int p_idx, bool p_check) override { pp->set_item_as_radio_checkable(p_idx, p_check); } - virtual bool is_item_checkable(int p_idx) const override { return pp->is_item_checkable(p_idx); } - virtual bool is_item_radio_checkable(int p_idx) const override { return pp->is_item_radio_checkable(p_idx); } - - virtual void set_item_checked(int p_idx, bool p_checked) override { pp->set_item_checked(p_idx, p_checked); } - virtual bool is_item_checked(int p_idx) const override { return pp->is_item_checked(p_idx); } - - virtual void set_item_enabled(int p_idx, int p_enabled) override { pp->set_item_disabled(p_idx, !p_enabled); } - virtual bool is_item_enabled(int p_idx) const override { return !pp->is_item_disabled(p_idx); } - - virtual void set_item_id(int p_idx, int p_id) override { pp->set_item_id(p_idx, p_id); } - virtual int get_item_id(int p_idx) const override { return pp->get_item_id(p_idx); } - - virtual void set_item_separator(int p_idx, bool p_separator) override { pp->set_item_as_separator(p_idx, p_separator); } - virtual bool is_item_separator(int p_idx) const override { return pp->is_item_separator(p_idx); } - - virtual void add_item() override; - virtual int get_item_count() const override; - virtual void erase(int p_idx) override; - - ItemListPopupMenuPlugin(); -}; - -/////////////////////////////////////////////////////////////// - -class ItemListItemListPlugin : public ItemListPlugin { - GDCLASS(ItemListItemListPlugin, ItemListPlugin); - - ItemList *pp; - -public: - virtual void set_object(Object *p_object) override; - virtual bool handles(Object *p_object) const override; - virtual int get_flags() const override; - - virtual void set_item_text(int p_idx, const String &p_text) override { pp->set_item_text(p_idx, p_text); } - virtual String get_item_text(int p_idx) const override { return pp->get_item_text(p_idx); } - - virtual void set_item_icon(int p_idx, const Ref<Texture2D> &p_tex) override { pp->set_item_icon(p_idx, p_tex); } - virtual Ref<Texture2D> get_item_icon(int p_idx) const override { return pp->get_item_icon(p_idx); } - - virtual void set_item_enabled(int p_idx, int p_enabled) override { pp->set_item_disabled(p_idx, !p_enabled); } - virtual bool is_item_enabled(int p_idx) const override { return !pp->is_item_disabled(p_idx); } - - virtual void add_item() override; - virtual int get_item_count() const override; - virtual void erase(int p_idx) override; - - ItemListItemListPlugin(); -}; - -/////////////////////////////////////////////////////////////// - -class ItemListEditor : public HBoxContainer { - GDCLASS(ItemListEditor, HBoxContainer); - - Node *item_list; - - Button *toolbar_button; - - AcceptDialog *dialog; - EditorInspector *property_editor; - Tree *tree; - Button *add_button; - Button *del_button; - Button *clear_button; - - int selected_idx; - - Vector<ItemListPlugin *> item_plugins; - - void _edit_items(); - - void _add_pressed(); - void _delete_pressed(); - void _clear_pressed(); - - void _node_removed(Node *p_node); - -protected: - void _notification(int p_notification); - static void _bind_methods(); - -public: - void edit(Node *p_item_list); - bool handles(Object *p_object) const; - void add_plugin(ItemListPlugin *p_plugin) { item_plugins.push_back(p_plugin); } - ItemListEditor(); - ~ItemListEditor(); -}; - -class ItemListEditorPlugin : public EditorPlugin { - GDCLASS(ItemListEditorPlugin, EditorPlugin); - - ItemListEditor *item_list_editor; - EditorNode *editor; - -public: - virtual String get_name() const override { return "ItemList"; } - bool has_main_screen() const override { return false; } - virtual void edit(Object *p_object) override; - virtual bool handles(Object *p_object) const override; - virtual void make_visible(bool p_visible) override; - - ItemListEditorPlugin(EditorNode *p_node); - ~ItemListEditorPlugin(); -}; - -#endif // ITEM_LIST_EDITOR_PLUGIN_H diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp index 30945826bb..140d2952dd 100644 --- a/editor/plugins/material_editor_plugin.cpp +++ b/editor/plugins/material_editor_plugin.cpp @@ -32,6 +32,7 @@ #include "editor/editor_scale.h" #include "scene/gui/subviewport_container.h" +#include "scene/resources/fog_material.h" #include "scene/resources/particles_material.h" #include "scene/resources/sky_material.h" @@ -283,6 +284,52 @@ Ref<Resource> StandardMaterial3DConversionPlugin::convert(const Ref<Resource> &p return smat; } +String ORMMaterial3DConversionPlugin::converts_to() const { + return "ShaderMaterial"; +} + +bool ORMMaterial3DConversionPlugin::handles(const Ref<Resource> &p_resource) const { + Ref<ORMMaterial3D> mat = p_resource; + return mat.is_valid(); +} + +Ref<Resource> ORMMaterial3DConversionPlugin::convert(const Ref<Resource> &p_resource) const { + Ref<ORMMaterial3D> mat = p_resource; + ERR_FAIL_COND_V(!mat.is_valid(), Ref<Resource>()); + + Ref<ShaderMaterial> smat; + smat.instantiate(); + + Ref<Shader> shader; + shader.instantiate(); + + String code = RS::get_singleton()->shader_get_code(mat->get_shader_rid()); + + shader->set_code(code); + + smat->set_shader(shader); + + List<PropertyInfo> params; + RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), ¶ms); + + for (const PropertyInfo &E : params) { + // Texture parameter has to be treated specially since ORMMaterial3D saved it + // as RID but ShaderMaterial needs Texture itself + Ref<Texture2D> texture = mat->get_texture_by_name(E.name); + if (texture.is_valid()) { + smat->set_shader_param(E.name, texture); + } else { + Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E.name); + smat->set_shader_param(E.name, value); + } + } + + smat->set_render_priority(mat->get_render_priority()); + smat->set_local_to_scene(mat->is_local_to_scene()); + smat->set_name(mat->get_name()); + return smat; +} + String ParticlesMaterialConversionPlugin::converts_to() const { return "ShaderMaterial"; } @@ -477,3 +524,40 @@ Ref<Resource> PhysicalSkyMaterialConversionPlugin::convert(const Ref<Resource> & smat->set_name(mat->get_name()); return smat; } + +String FogMaterialConversionPlugin::converts_to() const { + return "ShaderMaterial"; +} + +bool FogMaterialConversionPlugin::handles(const Ref<Resource> &p_resource) const { + Ref<FogMaterial> mat = p_resource; + return mat.is_valid(); +} + +Ref<Resource> FogMaterialConversionPlugin::convert(const Ref<Resource> &p_resource) const { + Ref<FogMaterial> mat = p_resource; + ERR_FAIL_COND_V(!mat.is_valid(), Ref<Resource>()); + + Ref<ShaderMaterial> smat; + smat.instantiate(); + + Ref<Shader> shader; + shader.instantiate(); + + String code = RS::get_singleton()->shader_get_code(mat->get_shader_rid()); + + shader->set_code(code); + + smat->set_shader(shader); + + List<PropertyInfo> params; + RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), ¶ms); + + for (const PropertyInfo &E : params) { + Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E.name); + smat->set_shader_param(E.name, value); + } + + smat->set_render_priority(mat->get_render_priority()); + return smat; +} diff --git a/editor/plugins/material_editor_plugin.h b/editor/plugins/material_editor_plugin.h index a4532b58b3..62549843f7 100644 --- a/editor/plugins/material_editor_plugin.h +++ b/editor/plugins/material_editor_plugin.h @@ -107,6 +107,15 @@ public: virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const override; }; +class ORMMaterial3DConversionPlugin : public EditorResourceConversionPlugin { + GDCLASS(ORMMaterial3DConversionPlugin, EditorResourceConversionPlugin); + +public: + virtual String converts_to() const override; + virtual bool handles(const Ref<Resource> &p_resource) const override; + virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const override; +}; + class ParticlesMaterialConversionPlugin : public EditorResourceConversionPlugin { GDCLASS(ParticlesMaterialConversionPlugin, EditorResourceConversionPlugin); @@ -152,4 +161,13 @@ public: virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const override; }; +class FogMaterialConversionPlugin : public EditorResourceConversionPlugin { + GDCLASS(FogMaterialConversionPlugin, EditorResourceConversionPlugin); + +public: + virtual String converts_to() const override; + virtual bool handles(const Ref<Resource> &p_resource) const override; + virtual Ref<Resource> convert(const Ref<Resource> &p_resource) const override; +}; + #endif // MATERIAL_EDITOR_PLUGIN_H diff --git a/editor/plugins/mesh_editor_plugin.cpp b/editor/plugins/mesh_editor_plugin.cpp index dc16a7a325..4b18ac6e9f 100644 --- a/editor/plugins/mesh_editor_plugin.cpp +++ b/editor/plugins/mesh_editor_plugin.cpp @@ -36,7 +36,7 @@ void MeshEditor::gui_input(const Ref<InputEvent> &p_event) { ERR_FAIL_COND(p_event.is_null()); Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { rot_x -= mm->get_relative().y * 0.01; rot_y -= mm->get_relative().x * 0.01; if (rot_x < -Math_PI / 2) { diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.cpp b/editor/plugins/mesh_instance_3d_editor_plugin.cpp index 574d3ef27e..7a85c5167b 100644 --- a/editor/plugins/mesh_instance_3d_editor_plugin.cpp +++ b/editor/plugins/mesh_instance_3d_editor_plugin.cpp @@ -79,7 +79,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) { Node *owner = node == get_tree()->get_edited_scene_root() ? node : node->get_owner(); ur->create_action(TTR("Create Static Trimesh Body")); - ur->add_do_method(node, "add_child", body); + ur->add_do_method(node, "add_child", body, true); ur->add_do_method(body, "set_owner", owner); ur->add_do_method(cshape, "set_owner", owner); ur->add_do_reference(body); @@ -113,7 +113,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) { Node *owner = instance == get_tree()->get_edited_scene_root() ? instance : instance->get_owner(); - ur->add_do_method(instance, "add_child", body); + ur->add_do_method(instance, "add_child", body, true); ur->add_do_method(body, "set_owner", owner); ur->add_do_method(cshape, "set_owner", owner); ur->add_do_reference(body); @@ -146,7 +146,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) { ur->create_action(TTR("Create Trimesh Static Shape")); - ur->add_do_method(node->get_parent(), "add_child", cshape); + ur->add_do_method(node->get_parent(), "add_child", cshape, true); ur->add_do_method(node->get_parent(), "move_child", cshape, node->get_index() + 1); ur->add_do_method(cshape, "set_owner", owner); ur->add_do_reference(cshape); @@ -185,7 +185,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) { Node *owner = node->get_owner(); - ur->add_do_method(node->get_parent(), "add_child", cshape); + ur->add_do_method(node->get_parent(), "add_child", cshape, true); ur->add_do_method(node->get_parent(), "move_child", cshape, node->get_index() + 1); ur->add_do_method(cshape, "set_owner", owner); ur->add_do_reference(cshape); @@ -247,7 +247,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) { UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Create Navigation Mesh")); - ur->add_do_method(node, "add_child", nmi); + ur->add_do_method(node, "add_child", nmi, true); ur->add_do_method(nmi, "set_owner", owner); ur->add_do_reference(nmi); @@ -426,7 +426,7 @@ void MeshInstance3DEditor::_create_outline_mesh() { ur->create_action(TTR("Create Outline")); - ur->add_do_method(node, "add_child", mi); + ur->add_do_method(node, "add_child", mi, true); ur->add_do_method(mi, "set_owner", owner); ur->add_do_reference(mi); diff --git a/editor/plugins/node_3d_editor_gizmos.cpp b/editor/plugins/node_3d_editor_gizmos.cpp index 4d2fc29fe0..1f5d68929a 100644 --- a/editor/plugins/node_3d_editor_gizmos.cpp +++ b/editor/plugins/node_3d_editor_gizmos.cpp @@ -41,6 +41,7 @@ #include "scene/3d/collision_shape_3d.h" #include "scene/3d/cpu_particles_3d.h" #include "scene/3d/decal.h" +#include "scene/3d/fog_volume.h" #include "scene/3d/gpu_particles_3d.h" #include "scene/3d/gpu_particles_collision_3d.h" #include "scene/3d/joint_3d.h" @@ -243,8 +244,10 @@ void EditorNode3DGizmo::Instance::create_instance(Node3D *p_base, bool p_hidden) RS::get_singleton()->instance_geometry_set_flag(instance, RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true); } -void EditorNode3DGizmo::add_mesh(const Ref<ArrayMesh> &p_mesh, const Ref<Material> &p_material, const Transform3D &p_xform, const Ref<SkinReference> &p_skin_reference) { +void EditorNode3DGizmo::add_mesh(const Ref<Mesh> &p_mesh, const Ref<Material> &p_material, const Transform3D &p_xform, const Ref<SkinReference> &p_skin_reference) { ERR_FAIL_COND(!spatial_node); + ERR_FAIL_COND_MSG(!p_mesh.is_valid(), "EditorNode3DGizmo.add_mesh() requires a valid Mesh resource."); + Instance ins; ins.mesh = p_mesh; @@ -682,7 +685,7 @@ bool EditorNode3DGizmo::intersect_ray(Camera3D *p_camera, const Point2 &p_point, } if (collision_segments.size()) { - Plane camp(p_camera->get_transform().origin, (-p_camera->get_transform().basis.get_axis(2)).normalized()); + Plane camp(-p_camera->get_transform().basis.get_axis(2).normalized(), p_camera->get_transform().origin); int vc = collision_segments.size(); const Vector3 *vptr = collision_segments.ptr(); @@ -1313,7 +1316,7 @@ void Light3DGizmoPlugin::set_handle(const EditorNode3DGizmo *p_gizmo, int p_id, light->set_param(Light3D::PARAM_RANGE, d); } else if (Object::cast_to<OmniLight3D>(light)) { - Plane cp = Plane(gt.origin, p_camera->get_transform().basis.get_axis(2)); + Plane cp = Plane(p_camera->get_transform().basis.get_axis(2), gt.origin); Vector3 inters; if (cp.intersects_ray(ray_from, ray_dir, &inters)) { @@ -2578,7 +2581,7 @@ void CPUParticles3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { GPUParticles3DGizmoPlugin::GPUParticles3DGizmoPlugin() { Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/particles", Color(0.8, 0.7, 0.4)); create_material("particles_material", gizmo_color); - gizmo_color.a = 0.1; + gizmo_color.a = MAX((gizmo_color.a - 0.2) * 0.02, 0.0); create_material("particles_solid_material", gizmo_color); create_icon_material("particles_icon", Node3DEditor::get_singleton()->get_theme_icon(SNAME("GizmoGPUParticles3D"), SNAME("EditorIcons"))); create_handle_material("handles"); @@ -2868,7 +2871,6 @@ void GPUParticlesCollision3DGizmoPlugin::commit_handle(const EditorNode3DGizmo * void GPUParticlesCollision3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { Node3D *cs = p_gizmo->get_spatial_node(); - print_line("redraw request " + itos(cs != nullptr)); p_gizmo->clear(); const Ref<Material> material = @@ -3641,15 +3643,15 @@ void LightmapGIGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { const float c4 = 0.886227; const float c5 = 0.247708; Vector3 light = (c1 * sh_col[8] * (n.x * n.x - n.y * n.y) + - c3 * sh_col[6] * n.z * n.z + - c4 * sh_col[0] - - c5 * sh_col[6] + - 2.0 * c1 * sh_col[4] * n.x * n.y + - 2.0 * c1 * sh_col[7] * n.x * n.z + - 2.0 * c1 * sh_col[5] * n.y * n.z + - 2.0 * c2 * sh_col[3] * n.x + - 2.0 * c2 * sh_col[1] * n.y + - 2.0 * c2 * sh_col[2] * n.z); + c3 * sh_col[6] * n.z * n.z + + c4 * sh_col[0] - + c5 * sh_col[6] + + 2.0 * c1 * sh_col[4] * n.x * n.y + + 2.0 * c1 * sh_col[7] * n.x * n.z + + 2.0 * c1 * sh_col[5] * n.y * n.z + + 2.0 * c2 * sh_col[3] * n.x + + 2.0 * c2 * sh_col[1] * n.y + + 2.0 * c2 * sh_col[2] * n.z); colors.push_back(Color(light.x, light.y, light.z, 1)); } @@ -5272,3 +5274,119 @@ void Joint3DGizmoPlugin::CreateGeneric6DOFJointGizmo( #undef ADD_VTX } + +//// + +FogVolumeGizmoPlugin::FogVolumeGizmoPlugin() { + Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/fog_volume", Color(0.5, 0.7, 1)); + create_material("shape_material", gizmo_color); + gizmo_color.a = 0.15; + create_material("shape_material_internal", gizmo_color); + + create_handle_material("handles"); +} + +bool FogVolumeGizmoPlugin::has_gizmo(Node3D *p_spatial) { + return (Object::cast_to<FogVolume>(p_spatial) != nullptr); +} + +String FogVolumeGizmoPlugin::get_gizmo_name() const { + return "FogVolume"; +} + +int FogVolumeGizmoPlugin::get_priority() const { + return -1; +} + +String FogVolumeGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_id) const { + return "Extents"; +} + +Variant FogVolumeGizmoPlugin::get_handle_value(const EditorNode3DGizmo *p_gizmo, int p_id) const { + return Vector3(p_gizmo->get_spatial_node()->call("get_extents")); +} + +void FogVolumeGizmoPlugin::set_handle(const EditorNode3DGizmo *p_gizmo, int p_id, Camera3D *p_camera, const Point2 &p_point) { + Node3D *sn = p_gizmo->get_spatial_node(); + + Transform3D gt = sn->get_global_transform(); + Transform3D gi = gt.affine_inverse(); + + Vector3 ray_from = p_camera->project_ray_origin(p_point); + Vector3 ray_dir = p_camera->project_ray_normal(p_point); + + Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) }; + + Vector3 axis; + axis[p_id] = 1.0; + Vector3 ra, rb; + Geometry3D::get_closest_points_between_segments(Vector3(), axis * 4096, sg[0], sg[1], ra, rb); + float d = ra[p_id]; + if (Node3DEditor::get_singleton()->is_snap_enabled()) { + d = Math::snapped(d, Node3DEditor::get_singleton()->get_translate_snap()); + } + + if (d < 0.001) { + d = 0.001; + } + + Vector3 he = sn->call("get_extents"); + he[p_id] = d; + sn->call("set_extents", he); +} + +void FogVolumeGizmoPlugin::commit_handle(const EditorNode3DGizmo *p_gizmo, int p_id, const Variant &p_restore, bool p_cancel) { + Node3D *sn = p_gizmo->get_spatial_node(); + + if (p_cancel) { + sn->call("set_extents", p_restore); + return; + } + + UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo(); + ur->create_action(TTR("Change Fog Volume Extents")); + ur->add_do_method(sn, "set_extents", sn->call("get_extents")); + ur->add_undo_method(sn, "set_extents", p_restore); + ur->commit_action(); +} + +void FogVolumeGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { + Node3D *cs = p_gizmo->get_spatial_node(); + + p_gizmo->clear(); + + if (RS::FogVolumeShape(int(p_gizmo->get_spatial_node()->call("get_shape"))) != RS::FOG_VOLUME_SHAPE_WORLD) { + const Ref<Material> material = + get_material("shape_material", p_gizmo); + const Ref<Material> material_internal = + get_material("shape_material_internal", p_gizmo); + + Ref<Material> handles_material = get_material("handles"); + + Vector<Vector3> lines; + AABB aabb; + aabb.position = -cs->call("get_extents").operator Vector3(); + aabb.size = aabb.position * -2; + + for (int i = 0; i < 12; i++) { + Vector3 a, b; + aabb.get_edge(i, a, b); + lines.push_back(a); + lines.push_back(b); + } + + Vector<Vector3> handles; + + for (int i = 0; i < 3; i++) { + Vector3 ax; + ax[i] = cs->call("get_extents").operator Vector3()[i]; + handles.push_back(ax); + } + + p_gizmo->add_lines(lines, material); + p_gizmo->add_collision_segments(lines); + p_gizmo->add_handles(handles, handles_material); + } +} + +///// diff --git a/editor/plugins/node_3d_editor_gizmos.h b/editor/plugins/node_3d_editor_gizmos.h index d1aca4d92e..cf9a464b69 100644 --- a/editor/plugins/node_3d_editor_gizmos.h +++ b/editor/plugins/node_3d_editor_gizmos.h @@ -45,7 +45,7 @@ class EditorNode3DGizmo : public Node3DGizmo { struct Instance { RID instance; - Ref<ArrayMesh> mesh; + Ref<Mesh> mesh; Ref<Material> material; Ref<SkinReference> skin_reference; bool extra_margin = false; @@ -95,7 +95,7 @@ protected: public: void add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material, bool p_billboard = false, const Color &p_modulate = Color(1, 1, 1)); void add_vertices(const Vector<Vector3> &p_vertices, const Ref<Material> &p_material, Mesh::PrimitiveType p_primitive_type, bool p_billboard = false, const Color &p_modulate = Color(1, 1, 1)); - void add_mesh(const Ref<ArrayMesh> &p_mesh, const Ref<Material> &p_material = Ref<Material>(), const Transform3D &p_xform = Transform3D(), const Ref<SkinReference> &p_skin_reference = Ref<SkinReference>()); + void add_mesh(const Ref<Mesh> &p_mesh, const Ref<Material> &p_material = Ref<Material>(), const Transform3D &p_xform = Transform3D(), const Ref<SkinReference> &p_skin_reference = Ref<SkinReference>()); void add_collision_segments(const Vector<Vector3> &p_lines); void add_collision_triangles(const Ref<TriangleMesh> &p_tmesh); void add_unscaled_billboard(const Ref<Material> &p_material, real_t p_scale = 1, const Color &p_modulate = Color(1, 1, 1)); @@ -669,4 +669,21 @@ public: Joint3DGizmoPlugin(); }; +class FogVolumeGizmoPlugin : public EditorNode3DGizmoPlugin { + GDCLASS(FogVolumeGizmoPlugin, EditorNode3DGizmoPlugin); + +public: + bool has_gizmo(Node3D *p_spatial) override; + String get_gizmo_name() const override; + int get_priority() const override; + void redraw(EditorNode3DGizmo *p_gizmo) override; + + String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_id) const override; + Variant get_handle_value(const EditorNode3DGizmo *p_gizmo, int p_id) const override; + void set_handle(const EditorNode3DGizmo *p_gizmo, int p_id, Camera3D *p_camera, const Point2 &p_point) override; + void commit_handle(const EditorNode3DGizmo *p_gizmo, int p_id, const Variant &p_restore, bool p_cancel = false) override; + + FogVolumeGizmoPlugin(); +}; + #endif // NODE_3D_EDITOR_GIZMOS_H diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index ea6ef8ab84..51086d47b7 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -185,7 +185,7 @@ void ViewportRotationControl::gui_input(const Ref<InputEvent> &p_event) { ERR_FAIL_COND(p_event.is_null()); const Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) { Vector2 pos = mb->get_position(); if (mb->is_pressed()) { if (pos.distance_to(get_size() / 2.0) < get_size().x / 2.0) { @@ -252,6 +252,14 @@ void ViewportRotationControl::set_viewport(Node3DEditorViewport *p_viewport) { viewport = p_viewport; } +void Node3DEditorViewport::_view_settings_confirmed(real_t p_interp_delta) { + // Set FOV override multiplier back to the default, so that the FOV + // setting specified in the View menu is correctly applied. + cursor.fov_scale = 1.0; + + _update_camera(p_interp_delta); +} + void Node3DEditorViewport::_update_camera(real_t p_interp_delta) { bool is_orthogonal = camera->get_projection() == Camera3D::PROJECTION_ORTHOGONAL; @@ -318,6 +326,8 @@ void Node3DEditorViewport::_update_camera(real_t p_interp_delta) { equal = false; } else if (!Math::is_equal_approx(old_camera_cursor.distance, camera_cursor.distance, tolerance)) { equal = false; + } else if (!Math::is_equal_approx(old_camera_cursor.fov_scale, camera_cursor.fov_scale, tolerance)) { + equal = false; } if (!equal || p_interp_delta == 0 || is_orthogonal != orthogonal) { @@ -383,7 +393,7 @@ float Node3DEditorViewport::get_zfar() const { } float Node3DEditorViewport::get_fov() const { - return CLAMP(spatial_editor->get_fov(), MIN_FOV, MAX_FOV); + return CLAMP(spatial_editor->get_fov() * cursor.fov_scale, MIN_FOV, MAX_FOV); } Transform3D Node3DEditorViewport::_get_camera_transform() const { @@ -479,7 +489,7 @@ ObjectID Node3DEditorViewport::_select_ray(const Point2 &p_pos) { RS::get_singleton()->sdfgi_set_debug_probe_select(pos, ray); } - Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world_3d()->get_scenario()); + Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, pos + ray * camera->get_far(), get_tree()->get_root()->get_world_3d()->get_scenario()); Set<Ref<EditorNode3DGizmo>> found_gizmos; Node *edited_scene = get_tree()->get_edited_scene_root(); @@ -542,7 +552,7 @@ void Node3DEditorViewport::_find_items_at_pos(const Point2 &p_pos, Vector<_RayRe Vector3 ray = _get_ray(p_pos); Vector3 pos = _get_ray_pos(p_pos); - Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world_3d()->get_scenario()); + Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, pos + ray * camera->get_far(), get_tree()->get_root()->get_world_3d()->get_scenario()); Set<Node3D *> found_nodes; for (int i = 0; i < instances.size(); i++) { @@ -651,13 +661,13 @@ void Node3DEditorViewport::_select_region() { Vector3 a = _get_screen_to_space(box[i]); Vector3 b = _get_screen_to_space(box[(i + 1) % 4]); if (orthogonal) { - frustum.push_back(Plane(a, (a - b).normalized())); + frustum.push_back(Plane((a - b).normalized(), a)); } else { frustum.push_back(Plane(a, b, cam_pos)); } } - Plane near(cam_pos, -_get_camera_normal()); + Plane near(-_get_camera_normal(), cam_pos); near.d -= get_znear(); frustum.push_back(near); @@ -850,7 +860,7 @@ void Node3DEditorViewport::_update_name() { } view_menu->set_text(name); - view_menu->set_size(Vector2(0, 0)); // resets the button size + view_menu->reset_size(); } void Node3DEditorViewport::_compute_edit(const Point2 &p_point) { @@ -891,36 +901,36 @@ void Node3DEditorViewport::_compute_edit(const Point2 &p_point) { } } -static int _get_key_modifier_setting(const String &p_property) { +static Key _get_key_modifier_setting(const String &p_property) { switch (EditorSettings::get_singleton()->get(p_property).operator int()) { case 0: - return 0; + return Key::NONE; case 1: - return KEY_SHIFT; + return Key::SHIFT; case 2: - return KEY_ALT; + return Key::ALT; case 3: - return KEY_META; + return Key::META; case 4: - return KEY_CTRL; + return Key::CTRL; } - return 0; + return Key::NONE; } -static int _get_key_modifier(Ref<InputEventWithModifiers> e) { +static Key _get_key_modifier(Ref<InputEventWithModifiers> e) { if (e->is_shift_pressed()) { - return KEY_SHIFT; + return Key::SHIFT; } if (e->is_alt_pressed()) { - return KEY_ALT; + return Key::ALT; } if (e->is_ctrl_pressed()) { - return KEY_CTRL; + return Key::CTRL; } if (e->is_meta_pressed()) { - return KEY_META; + return Key::META; } - return 0; + return Key::NONE; } bool Node3DEditorViewport::_transform_gizmo_select(const Vector2 &p_screenpos, bool p_highlight_only) { @@ -972,7 +982,7 @@ bool Node3DEditorViewport::_transform_gizmo_select(const Vector2 &p_screenpos, b const Vector3 grabber_pos = gt.origin + (ivec2 + ivec3) * gizmo_scale * (GIZMO_PLANE_SIZE + GIZMO_PLANE_DST * 0.6667); Vector3 r; - Plane plane(gt.origin, gt.basis.get_axis(i).normalized()); + Plane plane(gt.basis.get_axis(i).normalized(), gt.origin); if (plane.intersects_ray(ray_pos, ray, &r)) { const real_t dist = r.distance_to(grabber_pos); @@ -1010,7 +1020,7 @@ bool Node3DEditorViewport::_transform_gizmo_select(const Vector2 &p_screenpos, b float col_d = 1e20; for (int i = 0; i < 3; i++) { - Plane plane(gt.origin, gt.basis.get_axis(i).normalized()); + Plane plane(gt.basis.get_axis(i).normalized(), gt.origin); Vector3 r; if (!plane.intersects_ray(ray_pos, ray, &r)) { continue; @@ -1076,7 +1086,7 @@ bool Node3DEditorViewport::_transform_gizmo_select(const Vector2 &p_screenpos, b const Vector3 grabber_pos = gt.origin + (ivec2 + ivec3) * gizmo_scale * (GIZMO_PLANE_SIZE + GIZMO_PLANE_DST * 0.6667); Vector3 r; - Plane plane(gt.origin, gt.basis.get_axis(i).normalized()); + Plane plane(gt.basis.get_axis(i).normalized(), gt.origin); if (plane.intersects_ray(ray_pos, ray, &r)) { const real_t dist = r.distance_to(grabber_pos); @@ -1228,7 +1238,7 @@ void Node3DEditorViewport::_list_select(Ref<InputEventMouseButton> b) { Node3D *item = selection_results[i].item; if (item != scene && item->get_owner() != scene && item != scene->get_deepest_editable_node(item)) { //invalid result - selection_results.remove(i); + selection_results.remove_at(i); i--; } } @@ -1326,21 +1336,29 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { const real_t zoom_factor = 1 + (ZOOM_FREELOOK_MULTIPLIER - 1) * b->get_factor(); switch (b->get_button_index()) { - case MOUSE_BUTTON_WHEEL_UP: { - if (is_freelook_active()) { - scale_freelook_speed(zoom_factor); + case MouseButton::WHEEL_UP: { + if (b->is_alt_pressed()) { + scale_fov(-0.05); } else { - scale_cursor_distance(1.0 / zoom_factor); + if (is_freelook_active()) { + scale_freelook_speed(zoom_factor); + } else { + scale_cursor_distance(1.0 / zoom_factor); + } } } break; - case MOUSE_BUTTON_WHEEL_DOWN: { - if (is_freelook_active()) { - scale_freelook_speed(1.0 / zoom_factor); + case MouseButton::WHEEL_DOWN: { + if (b->is_alt_pressed()) { + scale_fov(0.05); } else { - scale_cursor_distance(zoom_factor); + if (is_freelook_active()) { + scale_freelook_speed(1.0 / zoom_factor); + } else { + scale_cursor_distance(zoom_factor); + } } } break; - case MOUSE_BUTTON_RIGHT: { + case MouseButton::RIGHT: { NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int(); if (b->is_pressed() && _edit.gizmo.is_valid()) { @@ -1397,7 +1415,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } if (b->is_pressed()) { - const int mod = _get_key_modifier(b); + const Key mod = _get_key_modifier(b); if (!orthogonal) { if (mod == _get_key_modifier_setting("editors/3d/freelook/freelook_activation_modifier")) { set_freelook_active(true); @@ -1414,7 +1432,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } break; - case MOUSE_BUTTON_MIDDLE: { + case MouseButton::MIDDLE: { if (b->is_pressed() && _edit.mode != TRANSFORM_NONE) { switch (_edit.plane) { case TRANSFORM_VIEW: { @@ -1445,7 +1463,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } } break; - case MOUSE_BUTTON_LEFT: { + case MouseButton::LEFT: { if (b->is_pressed()) { NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int(); if ((nav_scheme == NAVIGATION_MAYA || nav_scheme == NAVIGATION_MODO) && b->is_alt_pressed()) { @@ -1706,7 +1724,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } - if (spatial_editor->get_current_hover_gizmo().is_null() && !(m->get_button_mask() & 1) && !_edit.gizmo.is_valid()) { + if (spatial_editor->get_current_hover_gizmo().is_null() && (m->get_button_mask() & MouseButton::MASK_LEFT) == MouseButton::NONE && !_edit.gizmo.is_valid()) { _transform_gizmo_select(_edit.mouse_pos, true); } @@ -1719,7 +1737,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { String n = _edit.gizmo->get_handle_name(_edit.gizmo_handle); set_message(n + ": " + String(v)); - } else if (m->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + } else if ((m->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { if (nav_scheme == NAVIGATION_MAYA && m->is_alt_pressed()) { nav_mode = NAVIGATION_ORBIT; } else if (nav_scheme == NAVIGATION_MODO && m->is_alt_pressed() && m->is_shift_pressed()) { @@ -1731,7 +1749,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } else { const bool movement_threshold_passed = _edit.original_mouse_pos.distance_to(_edit.mouse_pos) > 8 * EDSCALE; if (clicked.is_valid() && movement_threshold_passed) { - _compute_edit(_edit.mouse_pos); + _compute_edit(_edit.original_mouse_pos); clicked = ObjectID(); _edit.mode = TRANSFORM_TRANSLATE; @@ -1761,33 +1779,33 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { switch (_edit.plane) { case TRANSFORM_VIEW: motion_mask = Vector3(0, 0, 0); - plane = Plane(_edit.center, _get_camera_normal()); + plane = Plane(_get_camera_normal(), _edit.center); break; case TRANSFORM_X_AXIS: motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0); - plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized()); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); break; case TRANSFORM_Y_AXIS: motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1); - plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized()); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); break; case TRANSFORM_Z_AXIS: motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2); - plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized()); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); break; case TRANSFORM_YZ: motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2) + spatial_editor->get_gizmo_transform().basis.get_axis(1); - plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(0)); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0), _edit.center); plane_mv = true; break; case TRANSFORM_XZ: motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2) + spatial_editor->get_gizmo_transform().basis.get_axis(0); - plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(1)); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1), _edit.center); plane_mv = true; break; case TRANSFORM_XY: motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0) + spatial_editor->get_gizmo_transform().basis.get_axis(1); - plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(2)); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2), _edit.center); plane_mv = true; break; } @@ -1809,7 +1827,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } else { // Alternative planar scaling mode - if (_get_key_modifier(m) != KEY_SHIFT) { + if (_get_key_modifier(m) != Key::SHIFT) { motion = motion_mask.dot(motion) * motion_mask; } } @@ -1837,7 +1855,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { 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) + ")"); + String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); List<Node *> &selection = editor_selection->get_selected_node_list(); for (Node *E : selection) { @@ -1882,30 +1900,30 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { switch (_edit.plane) { case TRANSFORM_VIEW: - plane = Plane(_edit.center, _get_camera_normal()); + plane = Plane(_get_camera_normal(), _edit.center); break; case TRANSFORM_X_AXIS: motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0); - plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized()); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); break; case TRANSFORM_Y_AXIS: motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1); - plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized()); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); break; case TRANSFORM_Z_AXIS: motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2); - plane = Plane(_edit.center, motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized()); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); break; case TRANSFORM_YZ: - plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(0)); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0), _edit.center); plane_mv = true; break; case TRANSFORM_XZ: - plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(1)); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1), _edit.center); plane_mv = true; break; case TRANSFORM_XY: - plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(2)); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2), _edit.center); plane_mv = true; break; } @@ -1936,7 +1954,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { 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) + ")"); + String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); List<Node *> &selection = editor_selection->get_selected_node_list(); for (Node *E : selection) { @@ -1978,18 +1996,18 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { switch (_edit.plane) { case TRANSFORM_VIEW: - plane = Plane(_edit.center, _get_camera_normal()); + plane = Plane(_get_camera_normal(), _edit.center); break; case TRANSFORM_X_AXIS: - plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(0)); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0), _edit.center); axis = Vector3(1, 0, 0); break; case TRANSFORM_Y_AXIS: - plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(1)); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1), _edit.center); axis = Vector3(0, 1, 0); break; case TRANSFORM_Z_AXIS: - plane = Plane(_edit.center, spatial_editor->get_gizmo_transform().basis.get_axis(2)); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2), _edit.center); axis = Vector3(0, 0, 1); break; case TRANSFORM_YZ: @@ -2064,7 +2082,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } } - } else if ((m->get_button_mask() & MOUSE_BUTTON_MASK_RIGHT) || freelook_active) { + } else if ((m->get_button_mask() & MouseButton::MASK_RIGHT) != MouseButton::NONE || freelook_active) { if (nav_scheme == NAVIGATION_MAYA && m->is_alt_pressed()) { nav_mode = NAVIGATION_ZOOM; } else if (freelook_active) { @@ -2073,14 +2091,14 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { nav_mode = NAVIGATION_PAN; } - } else if (m->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { - const int mod = _get_key_modifier(m); + } else if ((m->get_button_mask() & MouseButton::MASK_MIDDLE) != MouseButton::NONE) { + const Key mod = _get_key_modifier(m); if (nav_scheme == NAVIGATION_GODOT) { if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) { nav_mode = NAVIGATION_PAN; } else if (mod == _get_key_modifier_setting("editors/3d/navigation/zoom_modifier")) { nav_mode = NAVIGATION_ZOOM; - } else if (mod == KEY_ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) { + } else if (mod == Key::ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) { // Always allow Alt as a modifier to better support graphic tablets. nav_mode = NAVIGATION_ORBIT; } @@ -2091,14 +2109,14 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } else if (EditorSettings::get_singleton()->get("editors/3d/navigation/emulate_3_button_mouse")) { // Handle trackpad (no external mouse) use case - const int mod = _get_key_modifier(m); + const Key mod = _get_key_modifier(m); - if (mod) { + if (mod != Key::NONE) { if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) { nav_mode = NAVIGATION_PAN; } else if (mod == _get_key_modifier_setting("editors/3d/navigation/zoom_modifier")) { nav_mode = NAVIGATION_ZOOM; - } else if (mod == KEY_ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) { + } else if (mod == Key::ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) { // Always allow Alt as a modifier to better support graphic tablets. nav_mode = NAVIGATION_ORBIT; } @@ -2146,13 +2164,13 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { NavigationMode nav_mode = NAVIGATION_NONE; if (nav_scheme == NAVIGATION_GODOT) { - const int mod = _get_key_modifier(pan_gesture); + const Key mod = _get_key_modifier(pan_gesture); if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) { nav_mode = NAVIGATION_PAN; } else if (mod == _get_key_modifier_setting("editors/3d/navigation/zoom_modifier")) { nav_mode = NAVIGATION_ZOOM; - } else if (mod == KEY_ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) { + } else if (mod == Key::ALT || mod == _get_key_modifier_setting("editors/3d/navigation/orbit_modifier")) { // Always allow Alt as a modifier to better support graphic tablets. nav_mode = NAVIGATION_ORBIT; } @@ -2197,9 +2215,9 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } if (EditorSettings::get_singleton()->get("editors/3d/navigation/emulate_numpad")) { - const uint32_t code = k->get_keycode(); - if (code >= KEY_0 && code <= KEY_9) { - k->set_keycode(code - KEY_0 + KEY_KP_0); + const Key code = k->get_keycode(); + if (code >= Key::KEY_0 && code <= Key::KEY_9) { + k->set_keycode(code - Key::KEY_0 + Key::KP_0); } } @@ -2226,6 +2244,33 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { if (ED_IS_SHORTCUT("spatial_editor/right_view", p_event)) { _menu_option(VIEW_RIGHT); } + if (ED_IS_SHORTCUT("spatial_editor/orbit_view_down", p_event)) { + // Clamp rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented. + cursor.x_rot = CLAMP(cursor.x_rot - Math_PI / 12.0, -1.57, 1.57); + view_type = VIEW_TYPE_USER; + _update_name(); + } + if (ED_IS_SHORTCUT("spatial_editor/orbit_view_up", p_event)) { + // Clamp rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented. + cursor.x_rot = CLAMP(cursor.x_rot + Math_PI / 12.0, -1.57, 1.57); + view_type = VIEW_TYPE_USER; + _update_name(); + } + if (ED_IS_SHORTCUT("spatial_editor/orbit_view_right", p_event)) { + cursor.y_rot -= Math_PI / 12.0; + view_type = VIEW_TYPE_USER; + _update_name(); + } + if (ED_IS_SHORTCUT("spatial_editor/orbit_view_left", p_event)) { + cursor.y_rot += Math_PI / 12.0; + view_type = VIEW_TYPE_USER; + _update_name(); + } + if (ED_IS_SHORTCUT("spatial_editor/orbit_view_180", p_event)) { + cursor.y_rot += Math_PI; + view_type = VIEW_TYPE_USER; + _update_name(); + } if (ED_IS_SHORTCUT("spatial_editor/focus_origin", p_event)) { _menu_option(VIEW_CENTER_TO_ORIGIN); } @@ -2271,15 +2316,27 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { if (!orthogonal && ED_IS_SHORTCUT("spatial_editor/freelook_toggle", p_event)) { set_freelook_active(!is_freelook_active()); - } else if (k->get_keycode() == KEY_ESCAPE) { + } else if (k->get_keycode() == Key::ESCAPE) { set_freelook_active(false); } - if (k->get_keycode() == KEY_SPACE) { + if (k->get_keycode() == Key::SPACE) { if (!k->is_pressed()) { emit_signal(SNAME("toggle_maximize_view"), this); } } + + if (ED_IS_SHORTCUT("spatial_editor/decrease_fov", p_event)) { + scale_fov(-0.05); + } + + if (ED_IS_SHORTCUT("spatial_editor/increase_fov", p_event)) { + scale_fov(0.05); + } + + if (ED_IS_SHORTCUT("spatial_editor/reset_fov", p_event)) { + reset_fov(); + } } // freelook uses most of the useful shortcuts, like save, so its ok @@ -2447,6 +2504,16 @@ void Node3DEditorViewport::set_freelook_active(bool active_now) { freelook_active = active_now; } +void Node3DEditorViewport::scale_fov(real_t p_fov_offset) { + cursor.fov_scale = CLAMP(cursor.fov_scale + p_fov_offset, 0.1, 2.5); + surface->update(); +} + +void Node3DEditorViewport::reset_fov() { + cursor.fov_scale = 1.0; + surface->update(); +} + void Node3DEditorViewport::scale_cursor_distance(real_t scale) { real_t min_distance = MAX(camera->get_near() * 4, ZOOM_FREELOOK_MIN); real_t max_distance = MIN(camera->get_far() / 4, ZOOM_FREELOOK_MAX); @@ -2820,13 +2887,13 @@ void Node3DEditorViewport::_notification(int p_what) { // Color labels depending on performance level ("good" = green, "OK" = yellow, "bad" = red). // Middle point is at 15 ms. - cpu_time_label->set_text(vformat(TTR("CPU Time: %s ms"), rtos(cpu_time).pad_decimals(1))); + cpu_time_label->set_text(vformat(TTR("CPU Time: %s ms"), rtos(cpu_time).pad_decimals(2))); cpu_time_label->add_theme_color_override( "font_color", frame_time_gradient->get_color_at_offset( Math::range_lerp(cpu_time, 0, 30, 0, 1))); - gpu_time_label->set_text(vformat(TTR("GPU Time: %s ms"), rtos(gpu_time).pad_decimals(1))); + gpu_time_label->set_text(vformat(TTR("GPU Time: %s ms"), rtos(gpu_time).pad_decimals(2))); // Middle point is at 15 ms. gpu_time_label->add_theme_color_override( "font_color", @@ -3188,7 +3255,7 @@ void Node3DEditorViewport::_menu_option(int p_option) { continue; } - undo_redo->add_do_method(sp, "set_rotation", camera_transform.basis.get_rotation()); + undo_redo->add_do_method(sp, "set_rotation", camera_transform.basis.get_euler_normalized()); undo_redo->add_undo_method(sp, "set_rotation", sp->get_rotation()); } undo_redo->commit_action(); @@ -3553,7 +3620,7 @@ void Node3DEditorViewport::_selection_result_pressed(int p_result) { void Node3DEditorViewport::_selection_menu_hide() { selection_results.clear(); selection_menu->clear(); - selection_menu->set_size(Vector2(0, 0)); + selection_menu->reset_size(); } void Node3DEditorViewport::set_can_preview(Camera3D *p_preview) { @@ -3588,7 +3655,7 @@ void Node3DEditorViewport::update_transform_gizmo_view() { const Vector3 camz = -camera_xform.get_basis().get_axis(2).normalized(); const Vector3 camy = -camera_xform.get_basis().get_axis(1).normalized(); - const Plane p(camera_xform.origin, camz); + const Plane p = Plane(camz, camera_xform.origin); const real_t gizmo_d = MAX(Math::abs(p.distance_to(xform.origin)), CMP_EPSILON); const real_t d0 = camera->unproject_position(camera_xform.origin + camz * gizmo_d).y; const real_t d1 = camera->unproject_position(camera_xform.origin + camz * gizmo_d + camy).y; @@ -3863,7 +3930,7 @@ void Node3DEditorViewport::assign_pending_data_pointers(Node3D *p_preview_node, } Vector3 Node3DEditorViewport::_get_instance_position(const Point2 &p_pos) const { - const float MAX_DISTANCE = 10; + const float MAX_DISTANCE = 50.0; Vector3 world_ray = _get_ray(p_pos); Vector3 world_pos = _get_ray_pos(p_pos); @@ -3871,9 +3938,13 @@ Vector3 Node3DEditorViewport::_get_instance_position(const Point2 &p_pos) const Vector3 point = world_pos + world_ray * MAX_DISTANCE; PhysicsDirectSpaceState3D *ss = get_tree()->get_root()->get_world_3d()->get_direct_space_state(); - PhysicsDirectSpaceState3D::RayResult result; - if (ss->intersect_ray(world_pos, world_pos + world_ray * MAX_DISTANCE, result)) { + PhysicsDirectSpaceState3D::RayParameters ray_params; + ray_params.from = world_pos; + ray_params.to = world_pos + world_ray * MAX_DISTANCE; + + PhysicsDirectSpaceState3D::RayResult result; + if (ss->intersect_ray(ray_params, result)) { point = result.position; } @@ -3977,7 +4048,23 @@ bool Node3DEditorViewport::_create_instance(Node *parent, String &path, const Po if (mesh != nullptr) { MeshInstance3D *mesh_instance = memnew(MeshInstance3D); mesh_instance->set_mesh(mesh); - mesh_instance->set_name(path.get_file().get_basename()); + + // Adjust casing according to project setting. The file name is expected to be in snake_case, but will work for others. + String name = path.get_file().get_basename(); + switch (ProjectSettings::get_singleton()->get("editor/node_naming/name_casing").operator int()) { + case NAME_CASING_PASCAL_CASE: + name = name.capitalize().replace(" ", ""); + break; + case NAME_CASING_CAMEL_CASE: + name = name.capitalize().replace(" ", ""); + name[0] = name.to_lower()[0]; + break; + case NAME_CASING_SNAKE_CASE: + name = name.capitalize().replace(" ", "_").to_lower(); + break; + } + mesh_instance->set_name(name); + instantiated_scene = mesh_instance; } else { if (!scene.is_valid()) { // invalid scene @@ -4127,8 +4214,8 @@ void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_ return; } - bool is_shift = Input::get_singleton()->is_key_pressed(KEY_SHIFT); - bool is_ctrl = Input::get_singleton()->is_key_pressed(KEY_CTRL); + bool is_shift = Input::get_singleton()->is_key_pressed(Key::SHIFT); + bool is_ctrl = Input::get_singleton()->is_key_pressed(Key::CTRL); selected_files.clear(); Dictionary d = p_data; @@ -4150,10 +4237,9 @@ void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_ if (root_node) { target_node = root_node; } else { - accept->set_text(TTR("Cannot drag and drop into scene with no root node.")); - accept->popup_centered(); - _remove_preview(); - return; + // Create a root node so we can add child nodes to it. + EditorNode::get_singleton()->get_scene_tree_dock()->add_root_node(memnew(Node3D)); + target_node = get_tree()->get_edited_scene_root(); } } else { accept->set_text(TTR("Cannot drag and drop into multiple selected nodes.")); @@ -4311,7 +4397,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito const int wireframe_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_WIREFRAME); const int overdraw_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_OVERDRAW); const int shadeless_idx = view_menu->get_popup()->get_item_index(VIEW_DISPLAY_SHADELESS); - const String unsupported_tooltip = TTR("Not available when using the GLES2 renderer."); + const String unsupported_tooltip = TTR("Not available when using the OpenGL renderer."); view_menu->get_popup()->set_item_disabled(normal_idx, true); view_menu->get_popup()->set_item_tooltip(normal_idx, unsupported_tooltip); @@ -4323,18 +4409,18 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito view_menu->get_popup()->set_item_tooltip(shadeless_idx, unsupported_tooltip); } - ED_SHORTCUT("spatial_editor/freelook_left", TTR("Freelook Left"), KEY_A); - ED_SHORTCUT("spatial_editor/freelook_right", TTR("Freelook Right"), KEY_D); - ED_SHORTCUT("spatial_editor/freelook_forward", TTR("Freelook Forward"), KEY_W); - ED_SHORTCUT("spatial_editor/freelook_backwards", TTR("Freelook Backwards"), KEY_S); - ED_SHORTCUT("spatial_editor/freelook_up", TTR("Freelook Up"), KEY_E); - ED_SHORTCUT("spatial_editor/freelook_down", TTR("Freelook Down"), KEY_Q); - ED_SHORTCUT("spatial_editor/freelook_speed_modifier", TTR("Freelook Speed Modifier"), KEY_SHIFT); - ED_SHORTCUT("spatial_editor/freelook_slow_modifier", TTR("Freelook Slow Modifier"), KEY_ALT); + ED_SHORTCUT("spatial_editor/freelook_left", TTR("Freelook Left"), Key::A); + ED_SHORTCUT("spatial_editor/freelook_right", TTR("Freelook Right"), Key::D); + ED_SHORTCUT("spatial_editor/freelook_forward", TTR("Freelook Forward"), Key::W); + ED_SHORTCUT("spatial_editor/freelook_backwards", TTR("Freelook Backwards"), Key::S); + ED_SHORTCUT("spatial_editor/freelook_up", TTR("Freelook Up"), Key::E); + ED_SHORTCUT("spatial_editor/freelook_down", TTR("Freelook Down"), Key::Q); + ED_SHORTCUT("spatial_editor/freelook_speed_modifier", TTR("Freelook Speed Modifier"), Key::SHIFT); + ED_SHORTCUT("spatial_editor/freelook_slow_modifier", TTR("Freelook Slow Modifier"), Key::ALT); preview_camera = memnew(CheckBox); preview_camera->set_text(TTR("Preview")); - preview_camera->set_shortcut(ED_SHORTCUT("spatial_editor/toggle_camera_preview", TTR("Toggle Camera Preview"), KEY_MASK_CMD | KEY_P)); + preview_camera->set_shortcut(ED_SHORTCUT("spatial_editor/toggle_camera_preview", TTR("Toggle Camera Preview"), KeyModifierMask::CMD | Key::P)); vbox->add_child(preview_camera); preview_camera->set_h_size_flags(0); preview_camera->hide(); @@ -4448,7 +4534,7 @@ void Node3DEditorViewportContainer::gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { Vector2 size = get_size(); @@ -6171,7 +6257,7 @@ void Node3DEditor::_init_grid() { if (orthogonal) { camera_distance = camera->get_size() / 2.0; Vector3 camera_direction = -camera->get_global_transform().get_basis().get_axis(2); - Plane grid_plane = Plane(Vector3(), normal); + Plane grid_plane = Plane(normal); Vector3 intersection; if (grid_plane.intersects_ray(camera_position, camera_direction, &intersection)) { camera_position = intersection; @@ -6469,7 +6555,7 @@ void Node3DEditor::snap_selected_nodes_to_floor() { // We add a bit of margin to the from position to avoid it from snapping // when the spatial is already on a floor and there's another floor under // it - from = from + Vector3(0.0, 0.2, 0.0); + from = from + Vector3(0.0, 1, 0.0); Dictionary d; @@ -6485,7 +6571,7 @@ void Node3DEditor::snap_selected_nodes_to_floor() { Array keys = snap_data.keys(); // The maximum height an object can travel to be snapped - const float max_snap_height = 20.0; + const float max_snap_height = 500.0; // Will be set to `true` if at least one node from the selection was successfully snapped bool snapped_to_floor = false; @@ -6501,7 +6587,12 @@ void Node3DEditor::snap_selected_nodes_to_floor() { Vector3 to = from - Vector3(0.0, max_snap_height, 0.0); Set<RID> excluded = _get_physics_bodies_rid(sp); - if (ss->intersect_ray(from, to, result, excluded)) { + PhysicsDirectSpaceState3D::RayParameters ray_params; + ray_params.from = from; + ray_params.to = to; + ray_params.exclude = excluded; + + if (ss->intersect_ray(ray_params, result)) { snapped_to_floor = true; } } @@ -6518,7 +6609,12 @@ void Node3DEditor::snap_selected_nodes_to_floor() { Vector3 to = from - Vector3(0.0, max_snap_height, 0.0); Set<RID> excluded = _get_physics_bodies_rid(sp); - if (ss->intersect_ray(from, to, result, excluded)) { + PhysicsDirectSpaceState3D::RayParameters ray_params; + ray_params.from = from; + ray_params.to = to; + ray_params.exclude = excluded; + + if (ss->intersect_ray(ray_params, result)) { Vector3 position_offset = d["position_offset"]; Transform3D new_transform = sp->get_global_transform(); @@ -6544,7 +6640,7 @@ void Node3DEditor::unhandled_key_input(const Ref<InputEvent> &p_event) { return; } - snap_key_enabled = Input::get_singleton()->is_key_pressed(KEY_CTRL); + snap_key_enabled = Input::get_singleton()->is_key_pressed(Key::CTRL); } void Node3DEditor::_sun_environ_settings_pressed() { @@ -6556,7 +6652,7 @@ void Node3DEditor::_sun_environ_settings_pressed() { void Node3DEditor::_add_sun_to_scene(bool p_already_added_environment) { sun_environ_popup->hide(); - if (!p_already_added_environment && world_env_count == 0 && Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (!p_already_added_environment && world_env_count == 0 && Input::get_singleton()->is_key_pressed(Key::SHIFT)) { // Prevent infinite feedback loop between the sun and environment methods. _add_environment_to_scene(true); } @@ -6571,7 +6667,7 @@ void Node3DEditor::_add_sun_to_scene(bool p_already_added_environment) { Node *new_sun = preview_sun->duplicate(); undo_redo->create_action(TTR("Add Preview Sun to Scene")); - undo_redo->add_do_method(base, "add_child", new_sun); + undo_redo->add_do_method(base, "add_child", new_sun, true); // Move to the beginning of the scene tree since more "global" nodes // generally look better when placed at the top. undo_redo->add_do_method(base, "move_child", new_sun, 0); @@ -6584,7 +6680,7 @@ void Node3DEditor::_add_sun_to_scene(bool p_already_added_environment) { void Node3DEditor::_add_environment_to_scene(bool p_already_added_sun) { sun_environ_popup->hide(); - if (!p_already_added_sun && directional_light_count == 0 && Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (!p_already_added_sun && directional_light_count == 0 && Input::get_singleton()->is_key_pressed(Key::SHIFT)) { // Prevent infinite feedback loop between the sun and environment methods. _add_sun_to_scene(true); } @@ -6601,7 +6697,7 @@ void Node3DEditor::_add_environment_to_scene(bool p_already_added_sun) { new_env->set_environment(preview_environment->get_environment()->duplicate(true)); undo_redo->create_action(TTR("Add Preview Environment to Scene")); - undo_redo->add_do_method(base, "add_child", new_env); + undo_redo->add_do_method(base, "add_child", new_env, true); // Move to the beginning of the scene tree since more "global" nodes // generally look better when placed at the top. undo_redo->add_do_method(base, "move_child", new_env, 0); @@ -6939,6 +7035,7 @@ void Node3DEditor::_register_all_gizmos() { add_gizmo_plugin(Ref<NavigationRegion3DGizmoPlugin>(memnew(NavigationRegion3DGizmoPlugin))); add_gizmo_plugin(Ref<Joint3DGizmoPlugin>(memnew(Joint3DGizmoPlugin))); add_gizmo_plugin(Ref<PhysicalBone3DGizmoPlugin>(memnew(PhysicalBone3DGizmoPlugin))); + add_gizmo_plugin(Ref<FogVolumeGizmoPlugin>(memnew(FogVolumeGizmoPlugin))); } void Node3DEditor::_bind_methods() { @@ -7066,7 +7163,7 @@ void Node3DEditor::_update_preview_environment() { } else { if (!preview_sun->get_parent()) { - add_child(preview_sun); + add_child(preview_sun, true); sun_state->hide(); sun_vb->show(); } @@ -7102,7 +7199,7 @@ void Node3DEditor::_update_preview_environment() { void Node3DEditor::_sun_direction_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { sun_rotation.x += mm->get_relative().y * (0.02 * EDSCALE); sun_rotation.y -= mm->get_relative().x * (0.02 * EDSCALE); sun_rotation.x = CLAMP(sun_rotation.x, -Math_TAU / 4, Math_TAU / 4); @@ -7159,9 +7256,9 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_button[TOOL_MODE_SELECT]->set_pressed(true); button_binds.write[0] = MENU_TOOL_SELECT; tool_button[TOOL_MODE_SELECT]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); - tool_button[TOOL_MODE_SELECT]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_select", TTR("Select Mode"), KEY_Q)); + tool_button[TOOL_MODE_SELECT]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_select", TTR("Select Mode"), Key::Q)); tool_button[TOOL_MODE_SELECT]->set_shortcut_context(this); - tool_button[TOOL_MODE_SELECT]->set_tooltip(keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate selected node around pivot.") + "\n" + TTR("Alt+RMB: Show list of all nodes at position clicked, including locked.")); + tool_button[TOOL_MODE_SELECT]->set_tooltip(keycode_get_string((Key)KeyModifierMask::CMD) + TTR("Drag: Rotate selected node around pivot.") + "\n" + TTR("Alt+RMB: Show list of all nodes at position clicked, including locked.")); hbc_menu->add_child(memnew(VSeparator)); tool_button[TOOL_MODE_MOVE] = memnew(Button); @@ -7170,7 +7267,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_button[TOOL_MODE_MOVE]->set_flat(true); button_binds.write[0] = MENU_TOOL_MOVE; tool_button[TOOL_MODE_MOVE]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); - tool_button[TOOL_MODE_MOVE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_move", TTR("Move Mode"), KEY_W)); + tool_button[TOOL_MODE_MOVE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_move", TTR("Move Mode"), Key::W)); tool_button[TOOL_MODE_MOVE]->set_shortcut_context(this); tool_button[TOOL_MODE_ROTATE] = memnew(Button); @@ -7179,7 +7276,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_button[TOOL_MODE_ROTATE]->set_flat(true); button_binds.write[0] = MENU_TOOL_ROTATE; tool_button[TOOL_MODE_ROTATE]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); - tool_button[TOOL_MODE_ROTATE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_rotate", TTR("Rotate Mode"), KEY_E)); + tool_button[TOOL_MODE_ROTATE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_rotate", TTR("Rotate Mode"), Key::E)); tool_button[TOOL_MODE_ROTATE]->set_shortcut_context(this); tool_button[TOOL_MODE_SCALE] = memnew(Button); @@ -7188,7 +7285,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_button[TOOL_MODE_SCALE]->set_flat(true); button_binds.write[0] = MENU_TOOL_SCALE; tool_button[TOOL_MODE_SCALE]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); - tool_button[TOOL_MODE_SCALE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_scale", TTR("Scale Mode"), KEY_R)); + tool_button[TOOL_MODE_SCALE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_scale", TTR("Scale Mode"), Key::R)); tool_button[TOOL_MODE_SCALE]->set_shortcut_context(this); hbc_menu->add_child(memnew(VSeparator)); @@ -7208,7 +7305,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_button[TOOL_LOCK_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); tool_button[TOOL_LOCK_SELECTED]->set_tooltip(TTR("Lock selected node, preventing selection and movement.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - tool_button[TOOL_LOCK_SELECTED]->set_shortcut(ED_SHORTCUT("editor/lock_selected_nodes", TTR("Lock Selected Node(s)"), KEY_MASK_CMD | KEY_L)); + tool_button[TOOL_LOCK_SELECTED]->set_shortcut(ED_SHORTCUT("editor/lock_selected_nodes", TTR("Lock Selected Node(s)"), KeyModifierMask::CMD | Key::L)); tool_button[TOOL_UNLOCK_SELECTED] = memnew(Button); hbc_menu->add_child(tool_button[TOOL_UNLOCK_SELECTED]); @@ -7217,7 +7314,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_button[TOOL_UNLOCK_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); tool_button[TOOL_UNLOCK_SELECTED]->set_tooltip(TTR("Unlock selected node, allowing selection and movement.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - tool_button[TOOL_UNLOCK_SELECTED]->set_shortcut(ED_SHORTCUT("editor/unlock_selected_nodes", TTR("Unlock Selected Node(s)"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_L)); + tool_button[TOOL_UNLOCK_SELECTED]->set_shortcut(ED_SHORTCUT("editor/unlock_selected_nodes", TTR("Unlock Selected Node(s)"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::L)); tool_button[TOOL_GROUP_SELECTED] = memnew(Button); hbc_menu->add_child(tool_button[TOOL_GROUP_SELECTED]); @@ -7226,7 +7323,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_button[TOOL_GROUP_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); tool_button[TOOL_GROUP_SELECTED]->set_tooltip(TTR("Makes sure the object's children are not selectable.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - tool_button[TOOL_GROUP_SELECTED]->set_shortcut(ED_SHORTCUT("editor/group_selected_nodes", TTR("Group Selected Node(s)"), KEY_MASK_CMD | KEY_G)); + tool_button[TOOL_GROUP_SELECTED]->set_shortcut(ED_SHORTCUT("editor/group_selected_nodes", TTR("Group Selected Node(s)"), KeyModifierMask::CMD | Key::G)); tool_button[TOOL_UNGROUP_SELECTED] = memnew(Button); hbc_menu->add_child(tool_button[TOOL_UNGROUP_SELECTED]); @@ -7235,7 +7332,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_button[TOOL_UNGROUP_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); tool_button[TOOL_UNGROUP_SELECTED]->set_tooltip(TTR("Restores the object's children's ability to be selected.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - tool_button[TOOL_UNGROUP_SELECTED]->set_shortcut(ED_SHORTCUT("editor/ungroup_selected_nodes", TTR("Ungroup Selected Node(s)"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_G)); + tool_button[TOOL_UNGROUP_SELECTED]->set_shortcut(ED_SHORTCUT("editor/ungroup_selected_nodes", TTR("Ungroup Selected Node(s)"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::G)); hbc_menu->add_child(memnew(VSeparator)); @@ -7245,7 +7342,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_flat(true); button_binds.write[0] = MENU_TOOL_LOCAL_COORDS; tool_option_button[TOOL_OPT_LOCAL_COORDS]->connect("toggled", callable_mp(this, &Node3DEditor::_menu_item_toggled), button_binds); - tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_shortcut(ED_SHORTCUT("spatial_editor/local_coords", TTR("Use Local Space"), KEY_T)); + tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_shortcut(ED_SHORTCUT("spatial_editor/local_coords", TTR("Use Local Space"), Key::T)); tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_shortcut_context(this); tool_option_button[TOOL_OPT_USE_SNAP] = memnew(Button); @@ -7254,7 +7351,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_option_button[TOOL_OPT_USE_SNAP]->set_flat(true); button_binds.write[0] = MENU_TOOL_USE_SNAP; tool_option_button[TOOL_OPT_USE_SNAP]->connect("toggled", callable_mp(this, &Node3DEditor::_menu_item_toggled), button_binds); - tool_option_button[TOOL_OPT_USE_SNAP]->set_shortcut(ED_SHORTCUT("spatial_editor/snap", TTR("Use Snap"), KEY_Y)); + tool_option_button[TOOL_OPT_USE_SNAP]->set_shortcut(ED_SHORTCUT("spatial_editor/snap", TTR("Use Snap"), Key::Y)); tool_option_button[TOOL_OPT_USE_SNAP]->set_shortcut_context(this); hbc_menu->add_child(memnew(VSeparator)); @@ -7300,19 +7397,27 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { preview_node = memnew(Node3D); preview_bounds = AABB(); - ED_SHORTCUT("spatial_editor/bottom_view", TTR("Bottom View"), KEY_MASK_ALT + KEY_KP_7); - ED_SHORTCUT("spatial_editor/top_view", TTR("Top View"), KEY_KP_7); - ED_SHORTCUT("spatial_editor/rear_view", TTR("Rear View"), KEY_MASK_ALT + KEY_KP_1); - ED_SHORTCUT("spatial_editor/front_view", TTR("Front View"), KEY_KP_1); - ED_SHORTCUT("spatial_editor/left_view", TTR("Left View"), KEY_MASK_ALT + KEY_KP_3); - ED_SHORTCUT("spatial_editor/right_view", TTR("Right View"), KEY_KP_3); - ED_SHORTCUT("spatial_editor/switch_perspective_orthogonal", TTR("Switch Perspective/Orthogonal View"), KEY_KP_5); - ED_SHORTCUT("spatial_editor/insert_anim_key", TTR("Insert Animation Key"), KEY_K); - ED_SHORTCUT("spatial_editor/focus_origin", TTR("Focus Origin"), KEY_O); - ED_SHORTCUT("spatial_editor/focus_selection", TTR("Focus Selection"), KEY_F); - ED_SHORTCUT("spatial_editor/align_transform_with_view", TTR("Align Transform with View"), 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/freelook_toggle", TTR("Toggle Freelook"), KEY_MASK_SHIFT + KEY_F); + ED_SHORTCUT("spatial_editor/bottom_view", TTR("Bottom View"), KeyModifierMask::ALT + Key::KP_7); + ED_SHORTCUT("spatial_editor/top_view", TTR("Top View"), Key::KP_7); + ED_SHORTCUT("spatial_editor/rear_view", TTR("Rear View"), KeyModifierMask::ALT + Key::KP_1); + ED_SHORTCUT("spatial_editor/front_view", TTR("Front View"), Key::KP_1); + ED_SHORTCUT("spatial_editor/left_view", TTR("Left View"), KeyModifierMask::ALT + Key::KP_3); + ED_SHORTCUT("spatial_editor/right_view", TTR("Right View"), Key::KP_3); + ED_SHORTCUT("spatial_editor/orbit_view_down", TTR("Orbit View Down"), Key::KP_2); + ED_SHORTCUT("spatial_editor/orbit_view_left", TTR("Orbit View Left"), Key::KP_4); + ED_SHORTCUT("spatial_editor/orbit_view_right", TTR("Orbit View Right"), Key::KP_6); + ED_SHORTCUT("spatial_editor/orbit_view_up", TTR("Orbit View Up"), Key::KP_8); + ED_SHORTCUT("spatial_editor/orbit_view_180", TTR("Orbit View 180"), Key::KP_9); + ED_SHORTCUT("spatial_editor/switch_perspective_orthogonal", TTR("Switch Perspective/Orthogonal View"), Key::KP_5); + ED_SHORTCUT("spatial_editor/insert_anim_key", TTR("Insert Animation Key"), Key::K); + ED_SHORTCUT("spatial_editor/focus_origin", TTR("Focus Origin"), Key::O); + ED_SHORTCUT("spatial_editor/focus_selection", TTR("Focus Selection"), Key::F); + ED_SHORTCUT("spatial_editor/align_transform_with_view", TTR("Align Transform with View"), KeyModifierMask::ALT + KeyModifierMask::CMD + Key::M); + ED_SHORTCUT("spatial_editor/align_rotation_with_view", TTR("Align Rotation with View"), KeyModifierMask::ALT + KeyModifierMask::CMD + Key::F); + ED_SHORTCUT("spatial_editor/freelook_toggle", TTR("Toggle Freelook"), KeyModifierMask::SHIFT + Key::F); + ED_SHORTCUT("spatial_editor/decrease_fov", TTR("Decrease Field of View"), KeyModifierMask::CMD + Key::EQUAL); // Usually direct access key for `KEY_PLUS`. + ED_SHORTCUT("spatial_editor/increase_fov", TTR("Increase Field of View"), KeyModifierMask::CMD + Key::MINUS); + ED_SHORTCUT("spatial_editor/reset_fov", TTR("Reset Field of View to Default"), KeyModifierMask::CMD + Key::KEY_0); PopupMenu *p; @@ -7323,7 +7428,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { hbc_menu->add_child(transform_menu); p = transform_menu->get_popup(); - p->add_shortcut(ED_SHORTCUT("spatial_editor/snap_to_floor", TTR("Snap Object to Floor"), KEY_PAGEDOWN), MENU_SNAP_TO_FLOOR); + p->add_shortcut(ED_SHORTCUT("spatial_editor/snap_to_floor", TTR("Snap Object to Floor"), Key::PAGEDOWN), MENU_SNAP_TO_FLOOR); p->add_shortcut(ED_SHORTCUT("spatial_editor/transform_dialog", TTR("Transform Dialog...")), MENU_TRANSFORM_DIALOG); p->add_separator(); @@ -7355,19 +7460,19 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { accept = memnew(AcceptDialog); editor->get_gui_base()->add_child(accept); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/1_viewport", TTR("1 Viewport"), KEY_MASK_CMD + KEY_1), MENU_VIEW_USE_1_VIEWPORT); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports", TTR("2 Viewports"), KEY_MASK_CMD + KEY_2), MENU_VIEW_USE_2_VIEWPORTS); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports_alt", TTR("2 Viewports (Alt)"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_2), MENU_VIEW_USE_2_VIEWPORTS_ALT); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports", TTR("3 Viewports"), KEY_MASK_CMD + KEY_3), MENU_VIEW_USE_3_VIEWPORTS); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports_alt", TTR("3 Viewports (Alt)"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_3), MENU_VIEW_USE_3_VIEWPORTS_ALT); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/4_viewports", TTR("4 Viewports"), KEY_MASK_CMD + KEY_4), MENU_VIEW_USE_4_VIEWPORTS); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/1_viewport", TTR("1 Viewport"), KeyModifierMask::CMD + Key::KEY_1), MENU_VIEW_USE_1_VIEWPORT); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports", TTR("2 Viewports"), KeyModifierMask::CMD + Key::KEY_2), MENU_VIEW_USE_2_VIEWPORTS); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports_alt", TTR("2 Viewports (Alt)"), KeyModifierMask::ALT + KeyModifierMask::CMD + Key::KEY_2), MENU_VIEW_USE_2_VIEWPORTS_ALT); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports", TTR("3 Viewports"), KeyModifierMask::CMD + Key::KEY_3), MENU_VIEW_USE_3_VIEWPORTS); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports_alt", TTR("3 Viewports (Alt)"), KeyModifierMask::ALT + KeyModifierMask::CMD + Key::KEY_3), MENU_VIEW_USE_3_VIEWPORTS_ALT); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/4_viewports", TTR("4 Viewports"), KeyModifierMask::CMD + Key::KEY_4), MENU_VIEW_USE_4_VIEWPORTS); p->add_separator(); p->add_submenu_item(TTR("Gizmos"), "GizmosMenu"); p->add_separator(); p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_origin", TTR("View Origin")), MENU_VIEW_ORIGIN); - p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_grid", TTR("View Grid"), KEY_NUMBERSIGN), MENU_VIEW_GRID); + p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_grid", TTR("View Grid"), Key::NUMBERSIGN), MENU_VIEW_GRID); p->add_separator(); p->add_shortcut(ED_SHORTCUT("spatial_editor/settings", TTR("Settings...")), MENU_VIEW_CAMERA_SETTINGS); @@ -7460,7 +7565,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { settings_vbc->add_margin_child(TTR("View Z-Far:"), settings_zfar); for (uint32_t i = 0; i < VIEWPORTS_COUNT; ++i) { - settings_dialog->connect("confirmed", callable_mp(viewports[i], &Node3DEditorViewport::_update_camera), varray(0.0)); + settings_dialog->connect("confirmed", callable_mp(viewports[i], &Node3DEditorViewport::_view_settings_confirmed), varray(0.0)); } /* XFORM DIALOG */ @@ -7780,7 +7885,7 @@ bool Node3DEditor::is_gizmo_visible() const { double Node3DEditor::get_translate_snap() const { double snap_value; - if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) { snap_value = snap_translate->get_text().to_float() / 10.0; } else { snap_value = snap_translate->get_text().to_float(); @@ -7791,7 +7896,7 @@ double Node3DEditor::get_translate_snap() const { double Node3DEditor::get_rotate_snap() const { double snap_value; - if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) { snap_value = snap_rotate->get_text().to_float() / 3.0; } else { snap_value = snap_rotate->get_text().to_float(); @@ -7802,7 +7907,7 @@ double Node3DEditor::get_rotate_snap() const { double Node3DEditor::get_scale_snap() const { double snap_value; - if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) { snap_value = snap_scale->get_text().to_float() / 2.0; } else { snap_value = snap_scale->get_text().to_float(); diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index 2d5aeaa981..8d647808ba 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -41,6 +41,7 @@ #include "scene/3d/world_environment.h" #include "scene/gui/panel_container.h" #include "scene/resources/environment.h" +#include "scene/resources/fog_material.h" #include "scene/resources/sky_material.h" class Node3DEditor; @@ -315,7 +316,7 @@ private: struct Cursor { Vector3 pos; - real_t x_rot, y_rot, distance; + real_t x_rot, y_rot, distance, fov_scale; Vector3 eye_pos; // Used in freelook mode bool region_select; Point2 region_begin, region_end; @@ -325,6 +326,7 @@ private: x_rot = 0.5; y_rot = -0.5; distance = 4; + fov_scale = 1.0; region_select = false; } }; @@ -333,6 +335,8 @@ private: Cursor cursor; // Immediate cursor Cursor camera_cursor; // That one may be interpolated (don't modify this one except for smoothing purposes) + void scale_fov(real_t p_fov_offset); + void reset_fov(); void scale_cursor_distance(real_t scale); void set_freelook_active(bool active_now); @@ -349,6 +353,7 @@ private: void set_message(String p_message, float p_time = 5); + void _view_settings_confirmed(real_t p_interp_delta); void _update_camera(real_t p_interp_delta); Transform3D to_camera_transform(const Cursor &p_cursor) const; void _draw(); @@ -677,8 +682,6 @@ private: void _register_all_gizmos(); - Node3DEditor(); - void _selection_changed(); void _refresh_menu_icons(); diff --git a/editor/plugins/ot_features_plugin.cpp b/editor/plugins/ot_features_plugin.cpp index fd42bce06e..c949621e28 100644 --- a/editor/plugins/ot_features_plugin.cpp +++ b/editor/plugins/ot_features_plugin.cpp @@ -185,12 +185,6 @@ bool EditorInspectorPluginOpenTypeFeatures::can_handle(Object *p_object) { return (Object::cast_to<Control>(p_object) != nullptr); } -void EditorInspectorPluginOpenTypeFeatures::parse_begin(Object *p_object) { -} - -void EditorInspectorPluginOpenTypeFeatures::parse_category(Object *p_object, const String &p_parse_category) { -} - bool EditorInspectorPluginOpenTypeFeatures::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { if (p_path == "opentype_features/_new") { OpenTypeFeaturesAdd *editor = memnew(OpenTypeFeaturesAdd); diff --git a/editor/plugins/ot_features_plugin.h b/editor/plugins/ot_features_plugin.h index dbafa3bbf6..add491ed48 100644 --- a/editor/plugins/ot_features_plugin.h +++ b/editor/plugins/ot_features_plugin.h @@ -86,8 +86,6 @@ class EditorInspectorPluginOpenTypeFeatures : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object) override; - virtual void parse_begin(Object *p_object) override; - virtual void parse_category(Object *p_object, const String &p_parse_category) override; virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; }; diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp index 119ecddf63..79f8ce95cd 100644 --- a/editor/plugins/path_2d_editor_plugin.cpp +++ b/editor/plugins/path_2d_editor_plugin.cpp @@ -88,7 +88,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { real_t dist_to_p_in = gpoint.distance_to(xform.xform(curve->get_point_position(i) + curve->get_point_in(i))); // Check for point movement start (for point + in/out controls). - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mode == MODE_EDIT && !mb->is_shift_pressed() && dist_to_p < grab_threshold) { // Points can only be moved in edit mode. @@ -118,7 +118,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } // Check for point deletion. - if ((mb->get_button_index() == MOUSE_BUTTON_RIGHT && mode == MODE_EDIT) || (mb->get_button_index() == MOUSE_BUTTON_LEFT && mode == MODE_DELETE)) { + if ((mb->get_button_index() == MouseButton::RIGHT && mode == MODE_EDIT) || (mb->get_button_index() == MouseButton::LEFT && mode == MODE_DELETE)) { if (dist_to_p < grab_threshold) { undo_redo->create_action(TTR("Remove Point from Curve")); undo_redo->add_do_method(curve.ptr(), "remove_point", i); @@ -149,7 +149,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } // Check for point creation. - if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && ((mb->is_command_pressed() && mode == MODE_EDIT) || mode == MODE_CREATE)) { + if (mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && ((mb->is_command_pressed() && mode == MODE_EDIT) || mode == MODE_CREATE)) { Ref<Curve2D> curve = node->get_curve(); undo_redo->create_action(TTR("Add Point to Curve")); @@ -170,7 +170,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } // Check for segment split. - if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mode == MODE_EDIT && on_edge) { + if (mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && mode == MODE_EDIT && on_edge) { Vector2 gpoint2 = mb->get_position(); Ref<Curve2D> curve = node->get_curve(); @@ -207,7 +207,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } // Check for point movement completion. - if (!mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && action != ACTION_NONE) { + if (!mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && action != ACTION_NONE) { Ref<Curve2D> curve = node->get_curve(); Vector2 new_pos = moving_from + xform.affine_inverse().basis_xform(gpoint - moving_screen_from); @@ -537,7 +537,7 @@ Path2DEditor::Path2DEditor(EditorNode *p_editor) { curve_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("CurveEdit"), SNAME("EditorIcons"))); curve_edit->set_toggle_mode(true); curve_edit->set_focus_mode(Control::FOCUS_NONE); - curve_edit->set_tooltip(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string(KEY_MASK_CMD) + TTR("Click: Add Point") + "\n" + TTR("Left Click: Split Segment (in curve)") + "\n" + TTR("Right Click: Delete Point")); + curve_edit->set_tooltip(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD) + TTR("Click: Add Point") + "\n" + TTR("Left Click: Split Segment (in curve)") + "\n" + TTR("Right Click: Delete Point")); curve_edit->connect("pressed", callable_mp(this, &Path2DEditor::_mode_selected), varray(MODE_EDIT)); base_hb->add_child(curve_edit); curve_edit_curve = memnew(Button); diff --git a/editor/plugins/path_3d_editor_plugin.cpp b/editor/plugins/path_3d_editor_plugin.cpp index 0268b6e5ea..e83f6481f9 100644 --- a/editor/plugins/path_3d_editor_plugin.cpp +++ b/editor/plugins/path_3d_editor_plugin.cpp @@ -101,7 +101,7 @@ void Path3DGizmo::set_handle(int p_id, Camera3D *p_camera, const Point2 &p_point // Setting curve point positions if (p_id < c->get_point_count()) { - Plane p(gt.xform(original), p_camera->get_transform().basis.get_axis(2)); + const Plane p = Plane(p_camera->get_transform().basis.get_axis(2), gt.xform(original)); Vector3 inters; @@ -125,7 +125,7 @@ void Path3DGizmo::set_handle(int p_id, Camera3D *p_camera, const Point2 &p_point Vector3 base = c->get_point_position(idx); - Plane p(gt.xform(original), p_camera->get_transform().basis.get_axis(2)); + Plane p(p_camera->get_transform().basis.get_axis(2), gt.xform(original)); Vector3 inters; @@ -316,7 +316,7 @@ EditorPlugin::AfterGUIInput Path3DEditorPlugin::forward_spatial_gui_input(Camera set_handle_clicked(false); } - if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && (curve_create->is_pressed() || (curve_edit->is_pressed() && mb->is_ctrl_pressed()))) { + if (mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && (curve_create->is_pressed() || (curve_edit->is_pressed() && mb->is_ctrl_pressed()))) { //click into curve, break it down Vector<Vector3> v3a = c->tessellate(); int idx = 0; @@ -389,13 +389,13 @@ EditorPlugin::AfterGUIInput Path3DEditorPlugin::forward_spatial_gui_input(Camera return EditorPlugin::AFTER_GUI_INPUT_STOP; } else { - Vector3 org; + Vector3 origin; if (c->get_point_count() == 0) { - org = path->get_transform().get_origin(); + origin = path->get_transform().get_origin(); } else { - org = gt.xform(c->get_point_position(c->get_point_count() - 1)); + origin = gt.xform(c->get_point_position(c->get_point_count() - 1)); } - Plane p(org, p_camera->get_transform().basis.get_axis(2)); + Plane p(p_camera->get_transform().basis.get_axis(2), origin); Vector3 ray_from = p_camera->project_ray_origin(mbpos); Vector3 ray_dir = p_camera->project_ray_normal(mbpos); @@ -411,7 +411,7 @@ EditorPlugin::AfterGUIInput Path3DEditorPlugin::forward_spatial_gui_input(Camera //add new at pos } - } else if (mb->is_pressed() && ((mb->get_button_index() == MOUSE_BUTTON_LEFT && curve_del->is_pressed()) || (mb->get_button_index() == MOUSE_BUTTON_RIGHT && curve_edit->is_pressed()))) { + } else if (mb->is_pressed() && ((mb->get_button_index() == MouseButton::LEFT && curve_del->is_pressed()) || (mb->get_button_index() == MouseButton::RIGHT && curve_edit->is_pressed()))) { for (int i = 0; i < c->get_point_count(); i++) { real_t dist_to_p = p_camera->unproject_position(gt.xform(c->get_point_position(i))).distance_to(mbpos); real_t dist_to_p_out = p_camera->unproject_position(gt.xform(c->get_point_position(i) + c->get_point_out(i))).distance_to(mbpos); @@ -573,7 +573,7 @@ Path3DEditorPlugin::Path3DEditorPlugin(EditorNode *p_node) { curve_edit->set_toggle_mode(true); curve_edit->hide(); curve_edit->set_focus_mode(Control::FOCUS_NONE); - curve_edit->set_tooltip(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string(KEY_MASK_CMD) + TTR("Click: Add Point") + "\n" + TTR("Right Click: Delete Point")); + curve_edit->set_tooltip(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD) + TTR("Click: Add Point") + "\n" + TTR("Right Click: Delete Point")); Node3DEditor::get_singleton()->add_control_to_menu_panel(curve_edit); curve_create = memnew(Button); curve_create->set_flat(true); @@ -614,15 +614,6 @@ Path3DEditorPlugin::Path3DEditorPlugin(EditorNode *p_node) { menu->connect("id_pressed", callable_mp(this, &Path3DEditorPlugin::_handle_option_pressed)); curve_edit->set_pressed(true); - /* - collision_polygon_editor = memnew( PathEditor(p_node) ); - editor->get_main_control()->add_child(collision_polygon_editor); - collision_polygon_editor->set_margin(MARGIN_LEFT,200); - collision_polygon_editor->set_margin(MARGIN_RIGHT,230); - collision_polygon_editor->set_margin(MARGIN_TOP,0); - collision_polygon_editor->set_margin(MARGIN_BOTTOM,10); - collision_polygon_editor->hide(); - */ } Path3DEditorPlugin::~Path3DEditorPlugin() { diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index 5afe9ed60c..79cfcbec64 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -447,7 +447,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseButton> mb = p_input; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { uv_drag_from = snap_point(mb->get_position()); uv_drag = true; @@ -584,10 +584,10 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { return; } - uv_create_poly_prev.remove(closest); - uv_create_uv_prev.remove(closest); + uv_create_poly_prev.remove_at(closest); + uv_create_uv_prev.remove_at(closest); if (uv_create_colors_prev.size()) { - uv_create_colors_prev.remove(closest); + uv_create_colors_prev.remove_at(closest); } undo_redo->create_action(TTR("Remove Internal Vertex")); @@ -599,7 +599,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { undo_redo->add_undo_method(node, "set_vertex_colors", node->get_vertex_colors()); for (int i = 0; i < node->get_bone_count(); i++) { Vector<float> bonew = node->get_bone_weights(i); - bonew.remove(closest); + bonew.remove_at(closest); undo_redo->add_do_method(node, "set_bone_weights", i, bonew); undo_redo->add_undo_method(node, "set_bone_weights", i, node->get_bone_weights(i)); } @@ -702,7 +702,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { } if (erase_index != -1) { - polygons.remove(erase_index); + polygons.remove_at(erase_index); undo_redo->create_action(TTR("Remove Custom Polygon")); undo_redo->add_do_method(node, "set_polygons", polygons); undo_redo->add_undo_method(node, "set_polygons", node->get_polygons()); @@ -759,7 +759,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { bone_painting = false; } } - } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { + } else if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) { _cancel_editing(); if (bone_painting) { @@ -768,9 +768,9 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { uv_edit_draw->update(); - } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed()) { + } else if (mb->get_button_index() == MouseButton::WHEEL_UP && mb->is_pressed()) { uv_zoom->set_value(uv_zoom->get_value() / (1 - (0.1 * mb->get_factor()))); - } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed()) { + } else if (mb->get_button_index() == MouseButton::WHEEL_DOWN && mb->is_pressed()) { uv_zoom->set_value(uv_zoom->get_value() * (1 - (0.1 * mb->get_factor()))); } } @@ -778,7 +778,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseMotion> mm = p_input; if (mm.is_valid()) { - if ((mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { + if ((mm->get_button_mask() & MouseButton::MASK_MIDDLE) != MouseButton::NONE || Input::get_singleton()->is_key_pressed(Key::SPACE)) { Vector2 drag = mm->get_relative(); uv_hscroll->set_value(uv_hscroll->get_value() - drag.x); uv_vscroll->set_value(uv_vscroll->get_value() - drag.y); diff --git a/editor/plugins/resource_preloader_editor_plugin.h b/editor/plugins/resource_preloader_editor_plugin.h index 04ab458eb5..943765d4e0 100644 --- a/editor/plugins/resource_preloader_editor_plugin.h +++ b/editor/plugins/resource_preloader_editor_plugin.h @@ -59,7 +59,6 @@ class ResourcePreloaderEditor : public PanelContainer { ResourcePreloader *preloader; void _load_pressed(); - void _load_scene_pressed(); void _files_load_request(const Vector<String> &p_paths); void _paste_pressed(); void _remove_resource(const String &p_to_remove); diff --git a/editor/plugins/root_motion_editor_plugin.cpp b/editor/plugins/root_motion_editor_plugin.cpp index ed91f174d1..0f3c50a861 100644 --- a/editor/plugins/root_motion_editor_plugin.cpp +++ b/editor/plugins/root_motion_editor_plugin.cpp @@ -271,11 +271,7 @@ EditorPropertyRootMotion::EditorPropertyRootMotion() { ////////////////////////// bool EditorInspectorRootMotionPlugin::can_handle(Object *p_object) { - return true; //can handle everything -} - -void EditorInspectorRootMotionPlugin::parse_begin(Object *p_object) { - //do none + return true; // Can handle everything. } bool EditorInspectorRootMotionPlugin::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { @@ -288,9 +284,5 @@ bool EditorInspectorRootMotionPlugin::parse_property(Object *p_object, const Var return true; } - return false; //can be overridden, although it will most likely be last anyway -} - -void EditorInspectorRootMotionPlugin::parse_end() { - //do none + return false; } diff --git a/editor/plugins/root_motion_editor_plugin.h b/editor/plugins/root_motion_editor_plugin.h index 1484af62e8..c05975b6c3 100644 --- a/editor/plugins/root_motion_editor_plugin.h +++ b/editor/plugins/root_motion_editor_plugin.h @@ -64,9 +64,7 @@ class EditorInspectorRootMotionPlugin : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object) override; - virtual void parse_begin(Object *p_object) override; virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; - virtual void parse_end() override; }; #endif // ROOT_MOTION_EDITOR_PLUGIN_H diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index ca6ecfbd3a..aeb6ba13d5 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -46,7 +46,7 @@ #include "editor/find_in_files.h" #include "editor/node_dock.h" #include "editor/plugins/shader_editor_plugin.h" -#include "modules/visual_script/visual_script_editor.h" +#include "modules/visual_script/editor/visual_script_editor.h" #include "scene/main/window.h" #include "scene/scene_string_names.h" #include "script_text_editor.h" @@ -227,12 +227,6 @@ void ScriptEditorBase::_bind_methods() { ADD_SIGNAL(MethodInfo("replace_in_files_requested", PropertyInfo(Variant::STRING, "text"))); } -static bool _is_built_in_script(Script *p_script) { - String path = p_script->get_path(); - - return path.find("::") != -1; -} - class EditorScriptCodeCompletionCache : public ScriptCodeCompletionCache { struct Cache { uint64_t time_loaded = 0; @@ -315,10 +309,7 @@ void ScriptEditorQuickOpen::_text_changed(const String &p_newtext) { void ScriptEditorQuickOpen::_sbox_input(const Ref<InputEvent> &p_ie) { Ref<InputEventKey> k = p_ie; - if (k.is_valid() && (k->get_keycode() == KEY_UP || - k->get_keycode() == KEY_DOWN || - k->get_keycode() == KEY_PAGEUP || - k->get_keycode() == KEY_PAGEDOWN)) { + if (k.is_valid() && (k->get_keycode() == Key::UP || k->get_keycode() == Key::DOWN || k->get_keycode() == Key::PAGEUP || k->get_keycode() == Key::PAGEDOWN)) { search_options->gui_input(k); search_box->accept_event(); } @@ -742,7 +733,7 @@ void ScriptEditor::_open_recent_script(int p_idx) { return; } - rc.remove(p_idx); + rc.remove_at(p_idx); EditorSettings::get_singleton()->set_project_metadata("recent_files", "scripts", rc); _update_recent_scripts(); _show_error_dialog(path); @@ -763,20 +754,24 @@ void ScriptEditor::_close_tab(int p_idx, bool p_save, bool p_history_back) { ScriptEditorBase *current = Object::cast_to<ScriptEditorBase>(tselected); if (current) { - Ref<Script> script = current->get_edited_resource(); - if (p_save && script.is_valid()) { + RES file = current->get_edited_resource(); + if (p_save && file.is_valid()) { // Do not try to save internal scripts, but prompt to save in-memory // scripts which are not saved to disk yet (have empty path). - if (script->get_path().find("local://") == -1 && script->get_path().find("::") == -1) { + if (file->is_built_in()) { save_current_script(); } } - if (script.is_valid()) { - if (!script->get_path().is_empty()) { + if (file.is_valid()) { + if (!file->get_path().is_empty()) { // Only saved scripts can be restored. - previous_scripts.push_back(script->get_path()); + previous_scripts.push_back(file->get_path()); + } + + Ref<Script> script = file; + if (script.is_valid()) { + notify_script_close(script); } - notify_script_close(script); } } @@ -790,7 +785,7 @@ void ScriptEditor::_close_tab(int p_idx, bool p_save, bool p_history_back) { for (int i = 0; i < history.size(); i++) { if (history[i].control == tselected) { - history.remove(i); + history.remove_at(i); i--; history_pos--; } @@ -909,7 +904,7 @@ void ScriptEditor::_resave_scripts(const String &p_str) { RES script = se->get_edited_resource(); - if (script->get_path() == "" || script->get_path().find("local://") != -1 || script->get_path().find("::") != -1) { + if (script->is_built_in()) { continue; //internal script, who cares } @@ -950,7 +945,7 @@ void ScriptEditor::_reload_scripts() { RES edited_res = se->get_edited_resource(); - if (edited_res->get_path() == "" || edited_res->get_path().find("local://") != -1 || edited_res->get_path().find("::") != -1) { + if (edited_res->is_built_in()) { continue; //internal script, who cares } @@ -994,10 +989,6 @@ void ScriptEditor::_res_saved_callback(const Ref<Resource> &p_res) { RES script = se->get_edited_resource(); - if (script->get_path() == "" || script->get_path().find("local://") != -1 || script->get_path().find("::") != -1) { - continue; //internal script, who cares - } - if (script == p_res) { se->tag_saved_version(); } @@ -1007,6 +998,31 @@ void ScriptEditor::_res_saved_callback(const Ref<Resource> &p_res) { _trigger_live_script_reload(); } +void ScriptEditor::_scene_saved_callback(const String &p_path) { + // If scene was saved, mark all built-in scripts from that scene as saved. + for (int i = 0; i < tab_container->get_child_count(); i++) { + ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i)); + if (!se) { + continue; + } + + RES edited_res = se->get_edited_resource(); + + if (!edited_res->is_built_in()) { + continue; // External script, who cares. + } + + if (edited_res->get_path().get_slice("::", 0) == p_path) { + se->tag_saved_version(); + } + + Ref<Script> scr = edited_res; + if (scr.is_valid() && scr->is_tool()) { + scr->reload(true); + } + } +} + void ScriptEditor::_trigger_live_script_reload() { if (!pending_auto_reload && auto_reload_running_scripts) { call_deferred(SNAME("_live_auto_reload_running_scripts")); @@ -1036,7 +1052,7 @@ bool ScriptEditor::_test_script_times_on_disk(RES p_for_script) { continue; } - if (edited_res->get_path() == "" || edited_res->get_path().find("local://") != -1 || edited_res->get_path().find("::") != -1) { + if (edited_res->is_built_in()) { continue; //internal script, who cares } @@ -1080,7 +1096,6 @@ void ScriptEditor::_file_dialog_action(String p_file) { memdelete(file); if (EditorFileSystem::get_singleton()) { - const Vector<String> textfile_extensions = ((String)(EditorSettings::get_singleton()->get("docks/filesystem/textfile_extensions"))).split(",", false); if (textfile_extensions.has(p_file.get_extension())) { EditorFileSystem::get_singleton()->update_file(p_file); } @@ -1168,9 +1183,8 @@ void ScriptEditor::_menu_option(int p_option) { file_dialog_option = FILE_NEW_TEXTFILE; file_dialog->clear_filters(); - const Vector<String> textfile_ext = ((String)(EditorSettings::get_singleton()->get("docks/filesystem/textfile_extensions"))).split(",", false); - for (int i = 0; i < textfile_ext.size(); i++) { - file_dialog->add_filter("*." + textfile_ext[i] + " ; " + textfile_ext[i].to_upper()); + for (const String &E : textfile_extensions) { + file_dialog->add_filter("*." + E + " ; " + E.to_upper()); } file_dialog->popup_file_dialog(); file_dialog->set_title(TTR("New Text File...")); @@ -1188,9 +1202,8 @@ void ScriptEditor::_menu_option(int p_option) { file_dialog->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper()); } - const Vector<String> textfile_ext = ((String)(EditorSettings::get_singleton()->get("docks/filesystem/textfile_extensions"))).split(",", false); - for (int i = 0; i < textfile_ext.size(); i++) { - file_dialog->add_filter("*." + textfile_ext[i] + " ; " + textfile_ext[i].to_upper()); + for (const String &E : textfile_extensions) { + file_dialog->add_filter("*." + E + " ; " + E.to_upper()); } file_dialog->popup_file_dialog(); @@ -1402,8 +1415,12 @@ void ScriptEditor::_menu_option(int p_option) { } break; case SHOW_IN_FILE_SYSTEM: { const RES script = current->get_edited_resource(); - const String path = script->get_path(); + String path = script->get_path(); if (!path.is_empty()) { + if (script->is_built_in()) { + path = path.get_slice("::", 0); // Show the scene instead. + } + FileSystemDock *file_system_dock = EditorNode::get_singleton()->get_filesystem_dock(); file_system_dock->navigate_to_path(path); // Ensure that the FileSystem dock is visible. @@ -1533,6 +1550,7 @@ void ScriptEditor::_notification(int p_what) { editor->connect("stop_pressed", callable_mp(this, &ScriptEditor::_editor_stop)); editor->connect("script_add_function_request", callable_mp(this, &ScriptEditor::_add_callback)); editor->connect("resource_saved", callable_mp(this, &ScriptEditor::_res_saved_callback)); + editor->connect("scene_saved", callable_mp(this, &ScriptEditor::_scene_saved_callback)); editor->get_filesystem_dock()->connect("files_moved", callable_mp(this, &ScriptEditor::_files_moved)); editor->get_filesystem_dock()->connect("file_removed", callable_mp(this, &ScriptEditor::_file_removed)); script_list->connect("item_selected", callable_mp(this, &ScriptEditor::_script_selected)); @@ -1543,6 +1561,7 @@ void ScriptEditor::_notification(int p_what) { EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &ScriptEditor::_editor_settings_changed)); EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &ScriptEditor::_filesystem_changed)); + _editor_settings_changed(); [[fallthrough]]; } case NOTIFICATION_TRANSLATION_CHANGED: @@ -1625,8 +1644,8 @@ void ScriptEditor::close_builtin_scripts_from_scene(const String &p_scene) { continue; } - if (script->get_path().find("::") != -1 && script->get_path().begins_with(p_scene)) { //is an internal script and belongs to scene being closed - _close_tab(i); + if (script->is_built_in() && script->get_path().begins_with(p_scene)) { //is an internal script and belongs to scene being closed + _close_tab(i, false); i--; } } @@ -1709,7 +1728,7 @@ void ScriptEditor::_help_overview_selected(int p_idx) { } void ScriptEditor::_script_selected(int p_idx) { - grab_focus_block = !Input::get_singleton()->is_mouse_button_pressed(MOUSE_BUTTON_LEFT); //amazing hack, simply amazing + grab_focus_block = !Input::get_singleton()->is_mouse_button_pressed(MouseButton::LEFT); //amazing hack, simply amazing _go_to_tab(script_list->get_item_metadata(p_idx)); grab_focus_block = false; @@ -1933,20 +1952,7 @@ void ScriptEditor::_update_script_names() { // to update original path to previously edited resource. se->set_meta("_edit_res_path", path); } - bool built_in = !path.is_resource_file(); - String name; - - if (built_in) { - name = path.get_file(); - const String &resource_name = se->get_edited_resource()->get_name(); - if (resource_name != "") { - // If the built-in script has a custom resource name defined, - // display the built-in script name as follows: `ResourceName (scene_file.tscn)` - name = vformat("%s (%s)", resource_name, name.substr(0, name.find("::", 0))); - } - } else { - name = se->get_name(); - } + String name = se->get_name(); _ScriptEditorItemData sd; sd.icon = icon; @@ -2118,7 +2124,7 @@ void ScriptEditor::_update_script_connections() { } } -Ref<TextFile> ScriptEditor::_load_text_file(const String &p_path, Error *r_error) { +Ref<TextFile> ScriptEditor::_load_text_file(const String &p_path, Error *r_error) const { if (r_error) { *r_error = ERR_FILE_CANT_OPEN; } @@ -2181,9 +2187,10 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra Ref<Script> script = p_resource; // Don't open dominant script if using an external editor. - const bool use_external_editor = + bool use_external_editor = EditorSettings::get_singleton()->get("text_editor/external/use_external_editor") || (script.is_valid() && script->get_language()->overrides_external_editor()); + use_external_editor = use_external_editor && !(script.is_valid() && script->is_built_in()); // Ignore external editor for built-in scripts. const bool open_dominant = EditorSettings::get_singleton()->get("text_editor/behavior/files/open_dominant_script_on_scene_change"); const bool should_open = (open_dominant && !use_external_editor) || !EditorNode::get_singleton()->is_changing_scene(); @@ -2409,7 +2416,17 @@ void ScriptEditor::save_current_script() { } } - editor->save_resource(resource); + if (resource->is_built_in()) { + // If built-in script, save the scene instead. + const String scene_path = resource->get_path().get_slice("::", 0); + if (!scene_path.is_empty()) { + Vector<String> scene_to_save; + scene_to_save.push_back(scene_path); + editor->save_scene_list(scene_to_save); + } + } else { + editor->save_resource(resource); + } if (script != nullptr) { const Vector<DocData::ClassDoc> &documentations = script->get_documentation(); @@ -2422,6 +2439,8 @@ void ScriptEditor::save_current_script() { } void ScriptEditor::save_all_scripts() { + Vector<String> scenes_to_save; + for (int i = 0; i < tab_container->get_child_count(); i++) { ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i)); if (!se) { @@ -2451,7 +2470,7 @@ void ScriptEditor::save_all_scripts() { se->apply_code(); } - if (edited_res->get_path() != "" && edited_res->get_path().find("local://") == -1 && edited_res->get_path().find("::") == -1) { + if (!edited_res->is_built_in()) { Ref<TextFile> text_file = edited_res; Ref<Script> script = edited_res; @@ -2480,9 +2499,19 @@ void ScriptEditor::save_all_scripts() { update_doc(doc.name); } } + } else { + // For built-in scripts, save their scenes instead. + const String scene_path = edited_res->get_path().get_slice("::", 0); + if (!scenes_to_save.has(scene_path)) { + scenes_to_save.push_back(scene_path); + } } } + if (!scenes_to_save.is_empty()) { + editor->save_scene_list(scenes_to_save); + } + _update_script_names(); EditorFileSystem::get_singleton()->update_script_classes(); } @@ -2571,7 +2600,7 @@ void ScriptEditor::_add_callback(Object *p_obj, const String &p_function, const script_list->select(script_list->find_metadata(i)); // Save the current script so the changes can be picked up by an external editor. - if (!_is_built_in_script(script.ptr())) { // But only if it's not built-in script. + if (!script.ptr()->is_built_in()) { // But only if it's not built-in script. save_current_script(); } @@ -2602,6 +2631,12 @@ void ScriptEditor::_save_layout() { } void ScriptEditor::_editor_settings_changed() { + textfile_extensions.clear(); + const Vector<String> textfile_ext = ((String)(EditorSettings::get_singleton()->get("docks/filesystem/textfile_extensions"))).split(",", false); + for (const String &E : textfile_ext) { + textfile_extensions.insert(E); + } + trim_trailing_whitespace_on_save = EditorSettings::get_singleton()->get("text_editor/behavior/files/trim_trailing_whitespace_on_save"); convert_indent_on_save = EditorSettings::get_singleton()->get("text_editor/behavior/files/convert_indent_on_save"); use_space_indentation = EditorSettings::get_singleton()->get("text_editor/behavior/indent/type"); @@ -2808,12 +2843,22 @@ bool ScriptEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data if (file == "" || !FileAccess::exists(file)) { continue; } - Ref<Script> scr = ResourceLoader::load(file); - if (scr.is_valid()) { - return true; + if (ResourceLoader::exists(file, "Script")) { + Ref<Script> scr = ResourceLoader::load(file); + if (scr.is_valid()) { + return true; + } + } + + if (textfile_extensions.has(file.get_extension())) { + Error err; + Ref<TextFile> text_file = _load_text_file(file, &err); + if (text_file.is_valid() && err == OK) { + return true; + } } } - return true; + return false; } return false; @@ -2878,9 +2923,13 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co if (file == "" || !FileAccess::exists(file)) { continue; } - Ref<Script> scr = ResourceLoader::load(file); - if (scr.is_valid()) { - edit(scr); + + if (!ResourceLoader::exists(file, "Script") && !textfile_extensions.has(file.get_extension())) { + continue; + } + + RES res = open_file(file); + if (res.is_valid()) { if (tab_container->get_child_count() > num_tabs_before) { tab_container->move_child(tab_container->get_child(tab_container->get_child_count() - 1), new_index); num_tabs_before = tab_container->get_child_count(); @@ -2906,11 +2955,11 @@ void ScriptEditor::input(const Ref<InputEvent> &p_event) { // This must be hardcoded as the editor shortcuts dialog doesn't allow assigning // more than one shortcut per action. if (mb.is_valid() && mb->is_pressed() && is_visible_in_tree()) { - if (mb->get_button_index() == MOUSE_BUTTON_XBUTTON1) { + if (mb->get_button_index() == MouseButton::MB_XBUTTON1) { _history_back(); } - if (mb->get_button_index() == MOUSE_BUTTON_XBUTTON2) { + if (mb->get_button_index() == MouseButton::MB_XBUTTON2) { _history_forward(); } } @@ -2951,7 +3000,7 @@ void ScriptEditor::_script_list_gui_input(const Ref<InputEvent> &ev) { Ref<InputEventMouseButton> mb = ev; if (mb.is_valid() && mb->is_pressed()) { switch (mb->get_button_index()) { - case MOUSE_BUTTON_MIDDLE: { + case MouseButton::MIDDLE: { // Right-click selects automatically; middle-click does not. int idx = script_list->get_item_at_position(mb->get_position(), true); if (idx >= 0) { @@ -2961,7 +3010,7 @@ void ScriptEditor::_script_list_gui_input(const Ref<InputEvent> &ev) { } } break; - case MOUSE_BUTTON_RIGHT: { + case MouseButton::RIGHT: { _make_script_list_context_menu(); } break; default: @@ -3007,7 +3056,7 @@ void ScriptEditor::_make_script_list_context_menu() { context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/toggle_scripts_panel"), TOGGLE_SCRIPTS_PANEL); context_menu->set_position(get_global_transform().xform(get_local_mouse_position())); - context_menu->set_size(Vector2(1, 1)); + context_menu->reset_size(); context_menu->popup(); } @@ -3231,15 +3280,15 @@ void ScriptEditor::_update_selected_editor_menu() { EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_current_tab_control()); script_search_menu->get_popup()->clear(); if (eh) { - script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find", TTR("Find..."), KEY_MASK_CMD | KEY_F), HELP_SEARCH_FIND); - script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_next", TTR("Find Next"), KEY_F3), HELP_SEARCH_FIND_NEXT); - script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_previous", TTR("Find Previous"), KEY_MASK_SHIFT | KEY_F3), HELP_SEARCH_FIND_PREVIOUS); + script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find", TTR("Find..."), KeyModifierMask::CMD | Key::F), HELP_SEARCH_FIND); + script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_next", TTR("Find Next"), Key::F3), HELP_SEARCH_FIND_NEXT); + script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_previous", TTR("Find Previous"), KeyModifierMask::SHIFT | Key::F3), HELP_SEARCH_FIND_PREVIOUS); script_search_menu->get_popup()->add_separator(); - script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F), SEARCH_IN_FILES); + script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F), SEARCH_IN_FILES); script_search_menu->show(); } else { if (tab_container->get_child_count() == 0) { - script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F), SEARCH_IN_FILES); + script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F), SEARCH_IN_FILES); script_search_menu->show(); } else { script_search_menu->hide(); @@ -3327,9 +3376,10 @@ Array ScriptEditor::_get_open_script_editors() const { void ScriptEditor::set_scene_root_script(Ref<Script> p_script) { // Don't open dominant script if using an external editor. - const bool use_external_editor = + bool use_external_editor = EditorSettings::get_singleton()->get("text_editor/external/use_external_editor") || (p_script.is_valid() && p_script->get_language()->overrides_external_editor()); + use_external_editor = use_external_editor && !(p_script.is_valid() && p_script->is_built_in()); // Ignore external editor for built-in scripts. const bool open_dominant = EditorSettings::get_singleton()->get("text_editor/behavior/files/open_dominant_script_on_scene_change"); if (open_dominant && !use_external_editor && p_script.is_valid()) { @@ -3419,6 +3469,9 @@ void ScriptEditor::_on_find_in_files_result_selected(String fpath, int line_numb shader_editor->make_visible(true); shader_editor->get_shader_editor()->goto_line_selection(line_number - 1, begin, end); return; + } else if (fpath.get_extension() == "tscn") { + editor->load_scene(fpath); + return; } else { Ref<Script> script = res; if (script.is_valid()) { @@ -3619,11 +3672,11 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { find_replace_bar->hide(); ED_SHORTCUT("script_editor/window_sort", TTR("Sort")); - ED_SHORTCUT("script_editor/window_move_up", TTR("Move Up"), KEY_MASK_SHIFT | KEY_MASK_ALT | KEY_UP); - ED_SHORTCUT("script_editor/window_move_down", TTR("Move Down"), KEY_MASK_SHIFT | KEY_MASK_ALT | KEY_DOWN); - // FIXME: These should be `KEY_GREATER` and `KEY_LESS` but those don't work. - ED_SHORTCUT("script_editor/next_script", TTR("Next Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_PERIOD); - ED_SHORTCUT("script_editor/prev_script", TTR("Previous Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_COMMA); + ED_SHORTCUT("script_editor/window_move_up", TTR("Move Up"), KeyModifierMask::SHIFT | KeyModifierMask::ALT | Key::UP); + ED_SHORTCUT("script_editor/window_move_down", TTR("Move Down"), KeyModifierMask::SHIFT | KeyModifierMask::ALT | Key::DOWN); + // FIXME: These should be `Key::GREATER` and `Key::LESS` but those don't work. + ED_SHORTCUT("script_editor/next_script", TTR("Next Script"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::PERIOD); + ED_SHORTCUT("script_editor/prev_script", TTR("Previous Script"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::COMMA); set_process_input(true); set_process_unhandled_input(true); @@ -3636,7 +3689,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New Script...")), FILE_NEW); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new_textfile", TTR("New Text File...")), FILE_NEW_TEXTFILE); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open...")), FILE_OPEN); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_T), FILE_REOPEN_CLOSED); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::T), FILE_REOPEN_CLOSED); file_menu->get_popup()->add_submenu_item(TTR("Open Recent"), "RecentScripts", FILE_OPEN_RECENT); recent_scripts = memnew(PopupMenu); @@ -3646,17 +3699,17 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { _update_recent_scripts(); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save", TTR("Save"), KEY_MASK_ALT | KEY_MASK_CMD | KEY_S), FILE_SAVE); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save", TTR("Save"), KeyModifierMask::ALT | KeyModifierMask::CMD | Key::S), FILE_SAVE); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_as", TTR("Save As...")), FILE_SAVE_AS); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_all", TTR("Save All"), KEY_MASK_SHIFT | KEY_MASK_ALT | KEY_S), FILE_SAVE_ALL); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_all", TTR("Save All"), KeyModifierMask::SHIFT | KeyModifierMask::ALT | Key::S), FILE_SAVE_ALL); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Script"), KEY_MASK_CMD | KEY_MASK_ALT | KEY_R), FILE_TOOL_RELOAD_SOFT); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Script"), KeyModifierMask::CMD | KeyModifierMask::ALT | Key::R), FILE_TOOL_RELOAD_SOFT); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/copy_path", TTR("Copy Script Path")), FILE_COPY_PATH); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/show_in_file_system", TTR("Show in FileSystem")), SHOW_IN_FILE_SYSTEM); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/history_previous", TTR("History Previous"), KEY_MASK_ALT | KEY_LEFT), WINDOW_PREV); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/history_next", TTR("History Next"), KEY_MASK_ALT | KEY_RIGHT), WINDOW_NEXT); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/history_previous", TTR("History Previous"), KeyModifierMask::ALT | Key::LEFT), WINDOW_PREV); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/history_next", TTR("History Next"), KeyModifierMask::ALT | Key::RIGHT), WINDOW_NEXT); file_menu->get_popup()->add_separator(); file_menu->get_popup()->add_submenu_item(TTR("Theme"), "Theme", FILE_THEME); @@ -3673,16 +3726,16 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/save_theme_as", TTR("Save Theme As...")), THEME_SAVE_AS); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_file", TTR("Close"), KEY_MASK_CMD | KEY_W), FILE_CLOSE); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_file", TTR("Close"), KeyModifierMask::CMD | Key::W), FILE_CLOSE); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_all", TTR("Close All")), CLOSE_ALL); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_other_tabs", TTR("Close Other Tabs")), CLOSE_OTHER_TABS); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_docs", TTR("Close Docs")), CLOSE_DOCS); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/run_file", TTR("Run"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_X), FILE_RUN); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/run_file", TTR("Run"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::X), FILE_RUN); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/toggle_scripts_panel", TTR("Toggle Scripts Panel"), KEY_MASK_CMD | KEY_BACKSLASH), TOGGLE_SCRIPTS_PANEL); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/toggle_scripts_panel", TTR("Toggle Scripts Panel"), KeyModifierMask::CMD | Key::BACKSLASH), TOGGLE_SCRIPTS_PANEL); file_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptEditor::_menu_option)); script_search_menu = memnew(MenuButton); @@ -3839,7 +3892,7 @@ void ScriptEditorPlugin::edit(Object *p_object) { Script *p_script = Object::cast_to<Script>(p_object); String res_path = p_script->get_path().get_slice("::", 0); - if (_is_built_in_script(p_script)) { + if (p_script->is_built_in()) { if (ResourceLoader::get_resource_type(res_path) == "PackedScene") { if (!EditorNode::get_singleton()->is_scene_open(res_path)) { EditorNode::get_singleton()->load_scene(res_path); @@ -3935,7 +3988,7 @@ ScriptEditorPlugin::ScriptEditorPlugin(EditorNode *p_node) { EDITOR_DEF("text_editor/external/exec_flags", "{file}"); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "text_editor/external/exec_flags", PROPERTY_HINT_PLACEHOLDER_TEXT, "Call flags with placeholders: {project}, {file}, {col}, {line}.")); - ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_T); + ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::T); ED_SHORTCUT("script_editor/clear_recent", TTR("Clear Recent Scripts")); } diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index ce26699280..0adeca031e 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -365,20 +365,18 @@ class ScriptEditor : public PanelContainer { void _add_callback(Object *p_obj, const String &p_function, const PackedStringArray &p_args); void _res_saved_callback(const Ref<Resource> &p_res); + void _scene_saved_callback(const String &p_path); bool open_textfile_after_create = true; bool trim_trailing_whitespace_on_save; bool use_space_indentation; bool convert_indent_on_save; - void _trim_trailing_whitespace(TextEdit *tx); - void _goto_script_line2(int p_line); void _goto_script_line(REF p_script, int p_line); void _set_execution(REF p_script, int p_line); void _clear_execution(REF p_script); void _breaked(bool p_breaked, bool p_can_debug); - void _update_window_menu(); void _script_created(Ref<Script> p_script); void _set_breakpoint(REF p_scrpt, int p_line, bool p_enabled); void _clear_breakpoints(); @@ -430,7 +428,6 @@ class ScriptEditor : public PanelContainer { void _make_script_list_context_menu(); void _help_search(String p_text); - void _help_index(String p_text); void _history_forward(); void _history_back(); @@ -453,7 +450,8 @@ class ScriptEditor : public PanelContainer { Ref<Script> _get_current_script(); Array _get_open_scripts() const; - Ref<TextFile> _load_text_file(const String &p_path, Error *r_error); + Set<String> textfile_extensions; + Ref<TextFile> _load_text_file(const String &p_path, Error *r_error) const; Error _save_text_file(Ref<TextFile> p_text_file, const String &p_path); void _on_find_in_files_requested(String text); diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 2c02389db2..30a4cef8ca 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -375,18 +375,21 @@ void ScriptTextEditor::ensure_focus() { String ScriptTextEditor::get_name() { String name; - if (script->get_path().find("local://") == -1 && script->get_path().find("::") == -1) { - name = script->get_path().get_file(); - if (is_unsaved()) { - if (script->get_path().is_empty()) { - name = TTR("[unsaved]"); - } - name += "(*)"; + name = script->get_path().get_file(); + if (name.is_empty()) { + // This appears for newly created built-in scripts before saving the scene. + name = TTR("[unsaved]"); + } else if (script->is_built_in()) { + const String &script_name = script->get_name(); + if (script_name != "") { + // If the built-in script has a custom resource name defined, + // display the built-in script name as follows: `ResourceName (scene_file.tscn)` + name = vformat("%s (%s)", script_name, name.get_slice("::", 0)); } - } else if (script->get_name() != "") { - name = script->get_name(); - } else { - name = script->get_class() + "(" + itos(script->get_instance_id()) + ")"; + } + + if (is_unsaved()) { + name += "(*)"; } return name; @@ -547,7 +550,7 @@ void ScriptTextEditor::_validate_script() { void ScriptTextEditor::_update_bookmark_list() { bookmarks_menu->clear(); - bookmarks_menu->set_size(Size2(1, 1)); + bookmarks_menu->reset_size(); bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_bookmark"), BOOKMARK_TOGGLE); bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/remove_all_bookmarks"), BOOKMARK_REMOVE_ALL); @@ -658,7 +661,7 @@ void ScriptEditor::_update_modified_scripts_for_external_editor(Ref<Script> p_fo continue; } - if (script->get_path() == "" || script->get_path().find("local://") != -1 || script->get_path().find("::") != -1) { + if (script->is_built_in()) { continue; //internal script, who cares, though weird } @@ -699,7 +702,7 @@ void ScriptTextEditor::_code_complete_script(const String &p_code, List<ScriptCo void ScriptTextEditor::_update_breakpoint_list() { breakpoints_menu->clear(); - breakpoints_menu->set_size(Size2(1, 1)); + breakpoints_menu->reset_size(); breakpoints_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_breakpoint"), DEBUG_TOGGLE_BREAKPOINT); breakpoints_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/remove_all_breakpoints"), DEBUG_REMOVE_ALL_BREAKPOINTS); @@ -1396,11 +1399,12 @@ Variant ScriptTextEditor::get_drag_data_fw(const Point2 &p_point, Control *p_fro bool ScriptTextEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { Dictionary d = p_data; - if (d.has("type") && (String(d["type"]) == "resource" || - String(d["type"]) == "files" || - String(d["type"]) == "nodes" || - String(d["type"]) == "obj_property" || - String(d["type"]) == "files_and_dirs")) { + if (d.has("type") && + (String(d["type"]) == "resource" || + String(d["type"]) == "files" || + String(d["type"]) == "nodes" || + String(d["type"]) == "obj_property" || + String(d["type"]) == "files_and_dirs")) { return true; } @@ -1458,7 +1462,7 @@ void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data Array files = d["files"]; String text_to_drop; - bool preload = Input::get_singleton()->is_key_pressed(KEY_CTRL); + bool preload = Input::get_singleton()->is_key_pressed(Key::CTRL); for (int i = 0; i < files.size(); i++) { if (i > 0) { text_to_drop += ", "; @@ -1522,7 +1526,7 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { bool create_menu = false; CodeEdit *tx = code_editor->get_text_editor(); - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) { local_pos = mb->get_global_position() - tx->get_global_position(); create_menu = true; } else if (k.is_valid() && k->is_action("ui_menu", true)) { @@ -1625,10 +1629,7 @@ void ScriptTextEditor::_color_changed(const Color &p_color) { } String line = code_editor->get_text_editor()->get_line(color_position.x); - int color_args_pos = line.find(color_args, color_position.y); - String line_with_replaced_args = line; - line_with_replaced_args.erase(color_args_pos, color_args.length()); - line_with_replaced_args = line_with_replaced_args.insert(color_args_pos, new_args); + String line_with_replaced_args = line.replace(color_args, new_args); color_args = new_args; code_editor->get_text_editor()->begin_complex_operation(); @@ -1688,7 +1689,7 @@ void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p context_menu->set_item_disabled(context_menu->get_item_index(EDIT_REDO), !tx->has_redo()); context_menu->set_position(get_global_transform().xform(p_pos)); - context_menu->set_size(Vector2(1, 1)); + context_menu->reset_size(); context_menu->popup(); } @@ -1803,9 +1804,9 @@ void ScriptTextEditor::_enable_code_editor() { edit_menu->get_popup()->add_child(convert_case); edit_menu->get_popup()->add_submenu_item(TTR("Convert Case"), "convert_case"); - convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/convert_to_uppercase", TTR("Uppercase"), KEY_MASK_SHIFT | KEY_F4), EDIT_TO_UPPERCASE); - convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/convert_to_lowercase", TTR("Lowercase"), KEY_MASK_SHIFT | KEY_F5), EDIT_TO_LOWERCASE); - convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/capitalize", TTR("Capitalize"), KEY_MASK_SHIFT | KEY_F6), EDIT_CAPITALIZE); + convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/convert_to_uppercase", TTR("Uppercase"), KeyModifierMask::SHIFT | Key::F4), EDIT_TO_UPPERCASE); + convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/convert_to_lowercase", TTR("Lowercase"), KeyModifierMask::SHIFT | Key::F5), EDIT_TO_LOWERCASE); + convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/capitalize", TTR("Capitalize"), KeyModifierMask::SHIFT | Key::F6), EDIT_CAPITALIZE); convert_case->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option)); edit_menu->get_popup()->add_child(highlighter_menu); @@ -1952,60 +1953,60 @@ static ScriptEditorBase *create_editor(const RES &p_resource) { } void ScriptTextEditor::register_editor() { - ED_SHORTCUT("script_text_editor/move_up", TTR("Move Up"), KEY_MASK_ALT | KEY_UP); - ED_SHORTCUT("script_text_editor/move_down", TTR("Move Down"), KEY_MASK_ALT | KEY_DOWN); - ED_SHORTCUT("script_text_editor/delete_line", TTR("Delete Line"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_K); + ED_SHORTCUT("script_text_editor/move_up", TTR("Move Up"), KeyModifierMask::ALT | Key::UP); + ED_SHORTCUT("script_text_editor/move_down", TTR("Move Down"), KeyModifierMask::ALT | Key::DOWN); + ED_SHORTCUT("script_text_editor/delete_line", TTR("Delete Line"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::K); // Leave these at zero, same can be accomplished with tab/shift-tab, including selection. // The next/previous in history shortcut in this case makes a lot more sense. - ED_SHORTCUT("script_text_editor/indent_left", TTR("Indent Left"), KEY_NONE); - ED_SHORTCUT("script_text_editor/indent_right", TTR("Indent Right"), KEY_NONE); - ED_SHORTCUT("script_text_editor/toggle_comment", TTR("Toggle Comment"), KEY_MASK_CMD | KEY_K); - ED_SHORTCUT("script_text_editor/toggle_fold_line", TTR("Fold/Unfold Line"), KEY_MASK_ALT | KEY_F); - ED_SHORTCUT("script_text_editor/fold_all_lines", TTR("Fold All Lines"), KEY_NONE); - ED_SHORTCUT("script_text_editor/unfold_all_lines", TTR("Unfold All Lines"), KEY_NONE); - ED_SHORTCUT("script_text_editor/duplicate_selection", TTR("Duplicate Selection"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_D); - ED_SHORTCUT_OVERRIDE("script_text_editor/duplicate_selection", "macos", KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_C); - ED_SHORTCUT("script_text_editor/evaluate_selection", TTR("Evaluate Selection"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_E); - ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KEY_MASK_CMD | KEY_MASK_ALT | KEY_T); - ED_SHORTCUT("script_text_editor/convert_indent_to_spaces", TTR("Convert Indent to Spaces"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Y); - ED_SHORTCUT("script_text_editor/convert_indent_to_tabs", TTR("Convert Indent to Tabs"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_I); - ED_SHORTCUT("script_text_editor/auto_indent", TTR("Auto Indent"), KEY_MASK_CMD | KEY_I); + ED_SHORTCUT("script_text_editor/indent_left", TTR("Indent Left"), Key::NONE); + ED_SHORTCUT("script_text_editor/indent_right", TTR("Indent Right"), Key::NONE); + ED_SHORTCUT("script_text_editor/toggle_comment", TTR("Toggle Comment"), KeyModifierMask::CMD | Key::K); + ED_SHORTCUT("script_text_editor/toggle_fold_line", TTR("Fold/Unfold Line"), KeyModifierMask::ALT | Key::F); + ED_SHORTCUT("script_text_editor/fold_all_lines", TTR("Fold All Lines"), Key::NONE); + ED_SHORTCUT("script_text_editor/unfold_all_lines", TTR("Unfold All Lines"), Key::NONE); + ED_SHORTCUT("script_text_editor/duplicate_selection", TTR("Duplicate Selection"), KeyModifierMask::SHIFT | KeyModifierMask::CMD | Key::D); + ED_SHORTCUT_OVERRIDE("script_text_editor/duplicate_selection", "macos", KeyModifierMask::SHIFT | KeyModifierMask::CMD | Key::C); + ED_SHORTCUT("script_text_editor/evaluate_selection", TTR("Evaluate Selection"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::E); + ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KeyModifierMask::CMD | KeyModifierMask::ALT | Key::T); + ED_SHORTCUT("script_text_editor/convert_indent_to_spaces", TTR("Convert Indent to Spaces"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::Y); + ED_SHORTCUT("script_text_editor/convert_indent_to_tabs", TTR("Convert Indent to Tabs"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::I); + ED_SHORTCUT("script_text_editor/auto_indent", TTR("Auto Indent"), KeyModifierMask::CMD | Key::I); - ED_SHORTCUT_AND_COMMAND("script_text_editor/find", TTR("Find..."), KEY_MASK_CMD | KEY_F); + ED_SHORTCUT_AND_COMMAND("script_text_editor/find", TTR("Find..."), KeyModifierMask::CMD | Key::F); - ED_SHORTCUT("script_text_editor/find_next", TTR("Find Next"), KEY_F3); - ED_SHORTCUT_OVERRIDE("script_text_editor/find_next", "macos", KEY_MASK_CMD | KEY_G); + ED_SHORTCUT("script_text_editor/find_next", TTR("Find Next"), Key::F3); + ED_SHORTCUT_OVERRIDE("script_text_editor/find_next", "macos", KeyModifierMask::CMD | Key::G); - ED_SHORTCUT("script_text_editor/find_previous", TTR("Find Previous"), KEY_MASK_SHIFT | KEY_F3); - ED_SHORTCUT_OVERRIDE("script_text_editor/find_previous", "macos", KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_G); + ED_SHORTCUT("script_text_editor/find_previous", TTR("Find Previous"), KeyModifierMask::SHIFT | Key::F3); + ED_SHORTCUT_OVERRIDE("script_text_editor/find_previous", "macos", KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::G); - ED_SHORTCUT_AND_COMMAND("script_text_editor/replace", TTR("Replace..."), KEY_MASK_CMD | KEY_R); - ED_SHORTCUT_OVERRIDE("script_text_editor/replace", "macos", KEY_MASK_ALT | KEY_MASK_CMD | KEY_F); + ED_SHORTCUT_AND_COMMAND("script_text_editor/replace", TTR("Replace..."), KeyModifierMask::CMD | Key::R); + ED_SHORTCUT_OVERRIDE("script_text_editor/replace", "macos", KeyModifierMask::ALT | KeyModifierMask::CMD | Key::F); - ED_SHORTCUT("script_text_editor/find_in_files", TTR("Find in Files..."), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F); - ED_SHORTCUT("script_text_editor/replace_in_files", TTR("Replace in Files..."), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_R); + ED_SHORTCUT("script_text_editor/find_in_files", TTR("Find in Files..."), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F); + ED_SHORTCUT("script_text_editor/replace_in_files", TTR("Replace in Files..."), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::R); - ED_SHORTCUT("script_text_editor/contextual_help", TTR("Contextual Help"), KEY_MASK_ALT | KEY_F1); - ED_SHORTCUT_OVERRIDE("script_text_editor/contextual_help", "macos", KEY_MASK_ALT | KEY_MASK_SHIFT | KEY_SPACE); + ED_SHORTCUT("script_text_editor/contextual_help", TTR("Contextual Help"), KeyModifierMask::ALT | Key::F1); + ED_SHORTCUT_OVERRIDE("script_text_editor/contextual_help", "macos", KeyModifierMask::ALT | KeyModifierMask::SHIFT | Key::SPACE); - ED_SHORTCUT("script_text_editor/toggle_bookmark", TTR("Toggle Bookmark"), KEY_MASK_CMD | KEY_MASK_ALT | KEY_B); - ED_SHORTCUT("script_text_editor/goto_next_bookmark", TTR("Go to Next Bookmark"), KEY_MASK_CMD | KEY_B); - ED_SHORTCUT("script_text_editor/goto_previous_bookmark", TTR("Go to Previous Bookmark"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_B); - ED_SHORTCUT("script_text_editor/remove_all_bookmarks", TTR("Remove All Bookmarks"), KEY_NONE); + ED_SHORTCUT("script_text_editor/toggle_bookmark", TTR("Toggle Bookmark"), KeyModifierMask::CMD | KeyModifierMask::ALT | Key::B); + ED_SHORTCUT("script_text_editor/goto_next_bookmark", TTR("Go to Next Bookmark"), KeyModifierMask::CMD | Key::B); + ED_SHORTCUT("script_text_editor/goto_previous_bookmark", TTR("Go to Previous Bookmark"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::B); + ED_SHORTCUT("script_text_editor/remove_all_bookmarks", TTR("Remove All Bookmarks"), Key::NONE); - ED_SHORTCUT("script_text_editor/goto_function", TTR("Go to Function..."), KEY_MASK_ALT | KEY_MASK_CMD | KEY_F); - ED_SHORTCUT_OVERRIDE("script_text_editor/goto_function", "macos", KEY_MASK_CTRL | KEY_MASK_CMD | KEY_J); + ED_SHORTCUT("script_text_editor/goto_function", TTR("Go to Function..."), KeyModifierMask::ALT | KeyModifierMask::CMD | Key::F); + ED_SHORTCUT_OVERRIDE("script_text_editor/goto_function", "macos", KeyModifierMask::CTRL | KeyModifierMask::CMD | Key::J); - ED_SHORTCUT("script_text_editor/goto_line", TTR("Go to Line..."), KEY_MASK_CMD | KEY_L); + ED_SHORTCUT("script_text_editor/goto_line", TTR("Go to Line..."), KeyModifierMask::CMD | Key::L); - ED_SHORTCUT("script_text_editor/toggle_breakpoint", TTR("Toggle Breakpoint"), KEY_F9); - ED_SHORTCUT_OVERRIDE("script_text_editor/toggle_breakpoint", "macos", KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_B); + ED_SHORTCUT("script_text_editor/toggle_breakpoint", TTR("Toggle Breakpoint"), Key::F9); + ED_SHORTCUT_OVERRIDE("script_text_editor/toggle_breakpoint", "macos", KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::B); - ED_SHORTCUT("script_text_editor/remove_all_breakpoints", TTR("Remove All Breakpoints"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F9); - ED_SHORTCUT("script_text_editor/goto_next_breakpoint", TTR("Go to Next Breakpoint"), KEY_MASK_CMD | KEY_PERIOD); - ED_SHORTCUT("script_text_editor/goto_previous_breakpoint", TTR("Go to Previous Breakpoint"), KEY_MASK_CMD | KEY_COMMA); + ED_SHORTCUT("script_text_editor/remove_all_breakpoints", TTR("Remove All Breakpoints"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F9); + ED_SHORTCUT("script_text_editor/goto_next_breakpoint", TTR("Go to Next Breakpoint"), KeyModifierMask::CMD | Key::PERIOD); + ED_SHORTCUT("script_text_editor/goto_previous_breakpoint", TTR("Go to Previous Breakpoint"), KeyModifierMask::CMD | Key::COMMA); ScriptEditor::register_create_script_editor_function(create_editor); } diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index a88e24c0d0..7c1fda77bb 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -34,6 +34,7 @@ #include "core/io/resource_saver.h" #include "core/os/keyboard.h" #include "core/os/os.h" +#include "core/version_generated.gen.h" #include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" @@ -142,10 +143,10 @@ void ShaderTextEditor::_load_theme_settings() { } } - const Color member_variable_color = EDITOR_GET("text_editor/theme/highlighting/member_variable_color"); + const Color user_type_color = EDITOR_GET("text_editor/theme/highlighting/user_type_color"); for (const String &E : built_ins) { - syntax_highlighter->add_keyword_color(E, member_variable_color); + syntax_highlighter->add_keyword_color(E, user_type_color); } // Colorize comments. @@ -178,6 +179,10 @@ void ShaderTextEditor::_check_shader_mode() { mode = Shader::MODE_CANVAS_ITEM; } else if (type == "particles") { mode = Shader::MODE_PARTICLES; + } else if (type == "sky") { + mode = Shader::MODE_SKY; + } else if (type == "fog") { + mode = Shader::MODE_FOG; } else { mode = Shader::MODE_SPATIAL; } @@ -380,7 +385,7 @@ void ShaderEditor::_menu_option(int p_option) { shader_editor->remove_all_bookmarks(); } break; case HELP_DOCS: { - OS::get_singleton()->shell_open("https://docs.godotengine.org/en/latest/tutorials/shaders/shader_reference/index.html"); + OS::get_singleton()->shell_open(vformat("%s/tutorials/shaders/shader_reference/index.html", VERSION_DOCS_URL)); } break; } if (p_option != SEARCH_FIND && p_option != SEARCH_REPLACE && p_option != SEARCH_GOTO_LINE) { @@ -478,8 +483,7 @@ void ShaderEditor::_check_for_external_edit() { return; } - // internal shader. - if (shader->get_path() == "" || shader->get_path().find("local://") != -1 || shader->get_path().find("::") != -1) { + if (shader->is_built_in()) { return; } @@ -526,7 +530,7 @@ void ShaderEditor::save_external_data(const String &p_str) { } apply_shaders(); - if (shader->get_path() != "" && shader->get_path().find("local://") == -1 && shader->get_path().find("::") == -1) { + if (!shader->is_built_in()) { //external shader, save it ResourceSaver::save(shader->get_path(), shader); } @@ -549,7 +553,7 @@ void ShaderEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { Ref<InputEventMouseButton> mb = ev; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { + if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) { CodeEdit *tx = shader_editor->get_text_editor(); Point2i pos = tx->get_line_column_at_pos(mb->get_global_position() - tx->get_global_position()); @@ -642,7 +646,7 @@ void ShaderEditor::_make_context_menu(bool p_selection, Vector2 p_position) { context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_bookmark"), BOOKMARK_TOGGLE); context_menu->set_position(get_global_transform().xform(p_position)); - context_menu->set_size(Vector2(1, 1)); + context_menu->reset_size(); context_menu->popup(); } diff --git a/editor/plugins/skeleton_2d_editor_plugin.cpp b/editor/plugins/skeleton_2d_editor_plugin.cpp index c350004f0f..510e264c48 100644 --- a/editor/plugins/skeleton_2d_editor_plugin.cpp +++ b/editor/plugins/skeleton_2d_editor_plugin.cpp @@ -52,34 +52,34 @@ void Skeleton2DEditor::_menu_option(int p_option) { } switch (p_option) { - case MENU_OPTION_MAKE_REST: { + case MENU_OPTION_SET_REST: { if (node->get_bone_count() == 0) { err_dialog->set_text(TTR("This skeleton has no bones, create some children Bone2D nodes.")); err_dialog->popup_centered(); return; } UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action(TTR("Create Rest Pose from Bones")); + ur->create_action(TTR("Set Rest Pose to Bones")); for (int i = 0; i < node->get_bone_count(); i++) { Bone2D *bone = node->get_bone(i); - ur->add_do_method(bone, "set_rest", bone->get_transform()); - ur->add_undo_method(bone, "set_rest", bone->get_rest()); + ur->add_do_method(bone, "set_transform", bone->get_rest()); + ur->add_undo_method(bone, "set_transform", bone->get_transform()); } ur->commit_action(); } break; - case MENU_OPTION_SET_REST: { + case MENU_OPTION_MAKE_REST: { if (node->get_bone_count() == 0) { err_dialog->set_text(TTR("This skeleton has no bones, create some children Bone2D nodes.")); err_dialog->popup_centered(); return; } UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action(TTR("Set Rest Pose to Bones")); + ur->create_action(TTR("Create Rest Pose from Bones")); for (int i = 0; i < node->get_bone_count(); i++) { Bone2D *bone = node->get_bone(i); - ur->add_do_method(bone, "set_transform", bone->get_rest()); - ur->add_undo_method(bone, "set_transform", bone->get_transform()); + ur->add_do_method(bone, "set_rest", bone->get_transform()); + ur->add_undo_method(bone, "set_rest", bone->get_rest()); } ur->commit_action(); @@ -98,10 +98,10 @@ Skeleton2DEditor::Skeleton2DEditor() { options->set_text(TTR("Skeleton2D")); options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Skeleton2D"), SNAME("EditorIcons"))); - options->get_popup()->add_item(TTR("Reset to Rest Pose"), MENU_OPTION_MAKE_REST); + options->get_popup()->add_item(TTR("Reset to Rest Pose"), MENU_OPTION_SET_REST); options->get_popup()->add_separator(); // Use the "Overwrite" word to highlight that this is a destructive operation. - options->get_popup()->add_item(TTR("Overwrite Rest Pose"), MENU_OPTION_SET_REST); + options->get_popup()->add_item(TTR("Overwrite Rest Pose"), MENU_OPTION_MAKE_REST); options->set_switch_on_hover(true); options->get_popup()->connect("id_pressed", callable_mp(this, &Skeleton2DEditor::_menu_option)); diff --git a/editor/plugins/skeleton_2d_editor_plugin.h b/editor/plugins/skeleton_2d_editor_plugin.h index dacd8fe43f..066888f685 100644 --- a/editor/plugins/skeleton_2d_editor_plugin.h +++ b/editor/plugins/skeleton_2d_editor_plugin.h @@ -40,8 +40,8 @@ class Skeleton2DEditor : public Control { GDCLASS(Skeleton2DEditor, Control); enum Menu { - MENU_OPTION_MAKE_REST, MENU_OPTION_SET_REST, + MENU_OPTION_MAKE_REST, }; Skeleton2D *node; diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index 531ffc6a73..bb5ef0f6eb 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -49,296 +49,159 @@ void BoneTransformEditor::create_editors() { section = memnew(EditorInspectorSection); section->setup("trf_properties", label, this, section_color, true); + section->unfold(); add_child(section); - enabled_checkbox = memnew(CheckBox(TTR("Pose Enabled"))); - enabled_checkbox->set_flat(true); - enabled_checkbox->set_visible(toggle_enabled); + enabled_checkbox = memnew(EditorPropertyCheck()); + enabled_checkbox->set_label("Pose Enabled"); + enabled_checkbox->set_selectable(false); + enabled_checkbox->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed)); section->get_vbox()->add_child(enabled_checkbox); - key_button = memnew(Button); - key_button->set_text(TTR("Key Transform")); - key_button->set_visible(keyable); - key_button->set_icon(get_theme_icon(SNAME("Key"), SNAME("EditorIcons"))); - key_button->set_flat(true); - section->get_vbox()->add_child(key_button); - - // Translation property. - translation_property = memnew(EditorPropertyVector3()); - translation_property->setup(-10000, 10000, 0.001f, true); - translation_property->set_label("Translation"); - translation_property->set_use_folding(true); - translation_property->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed_vector3)); - section->get_vbox()->add_child(translation_property); + // Position property. + position_property = memnew(EditorPropertyVector3()); + position_property->setup(-10000, 10000, 0.001f, true); + position_property->set_label("Position"); + position_property->set_selectable(false); + position_property->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed)); + position_property->connect("property_keyed", callable_mp(this, &BoneTransformEditor::_property_keyed)); + section->get_vbox()->add_child(position_property); // Rotation property. - rotation_property = memnew(EditorPropertyVector3()); + rotation_property = memnew(EditorPropertyQuaternion()); rotation_property->setup(-10000, 10000, 0.001f, true); - rotation_property->set_label("Rotation Degrees"); - rotation_property->set_use_folding(true); - rotation_property->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed_vector3)); + rotation_property->set_label("Rotation"); + rotation_property->set_selectable(false); + rotation_property->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed)); + rotation_property->connect("property_keyed", callable_mp(this, &BoneTransformEditor::_property_keyed)); section->get_vbox()->add_child(rotation_property); // Scale property. scale_property = memnew(EditorPropertyVector3()); scale_property->setup(-10000, 10000, 0.001f, true); scale_property->set_label("Scale"); - scale_property->set_use_folding(true); - scale_property->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed_vector3)); + scale_property->set_selectable(false); + scale_property->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed)); + scale_property->connect("property_keyed", callable_mp(this, &BoneTransformEditor::_property_keyed)); section->get_vbox()->add_child(scale_property); // Transform/Matrix section. - transform_section = memnew(EditorInspectorSection); - transform_section->setup("trf_properties_transform", "Matrix", this, section_color, true); - section->get_vbox()->add_child(transform_section); + rest_section = memnew(EditorInspectorSection); + rest_section->setup("trf_properties_transform", "Rest", this, section_color, true); + section->get_vbox()->add_child(rest_section); // Transform/Matrix property. - transform_property = memnew(EditorPropertyTransform3D()); - transform_property->setup(-10000, 10000, 0.001f, true); - transform_property->set_label("Transform"); - transform_property->set_use_folding(true); - transform_property->connect("property_changed", callable_mp(this, &BoneTransformEditor::_value_changed_transform)); - transform_section->get_vbox()->add_child(transform_property); + rest_matrix = memnew(EditorPropertyTransform3D()); + rest_matrix->setup(-10000, 10000, 0.001f, true); + rest_matrix->set_label("Transform"); + rest_matrix->set_selectable(false); + rest_section->get_vbox()->add_child(rest_matrix); } void BoneTransformEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { create_editors(); - key_button->connect("pressed", callable_mp(this, &BoneTransformEditor::_key_button_pressed)); - enabled_checkbox->connect("pressed", callable_mp(this, &BoneTransformEditor::_checkbox_pressed)); - [[fallthrough]]; - } - case NOTIFICATION_SORT_CHILDREN: { - const Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Tree")); - int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Tree")); - - Point2 buffer; - buffer.x += get_theme_constant(SNAME("inspector_margin"), SNAME("Editor")); - buffer.y += font->get_height(font_size); - buffer.y += get_theme_constant(SNAME("vseparation"), SNAME("Tree")); - - const float vector_height = translation_property->get_size().y; - const float transform_height = transform_property->get_size().y; - const float button_height = key_button->get_size().y; - - const float width = get_size().x - get_theme_constant(SNAME("inspector_margin"), SNAME("Editor")); - Vector<Rect2> input_rects; - if (keyable && section->get_vbox()->is_visible()) { - input_rects.push_back(Rect2(key_button->get_position() + buffer, Size2(width, button_height))); - } else { - input_rects.push_back(Rect2(0, 0, 0, 0)); - } - - if (section->get_vbox()->is_visible()) { - input_rects.push_back(Rect2(translation_property->get_position() + buffer, Size2(width, vector_height))); - input_rects.push_back(Rect2(rotation_property->get_position() + buffer, Size2(width, vector_height))); - input_rects.push_back(Rect2(scale_property->get_position() + buffer, Size2(width, vector_height))); - input_rects.push_back(Rect2(transform_property->get_position() + buffer, Size2(width, transform_height))); - } else { - const int32_t start = input_rects.size(); - const int32_t empty_input_rect_elements = 4; - const int32_t end = start + empty_input_rect_elements; - for (int i = start; i < end; ++i) { - input_rects.push_back(Rect2(0, 0, 0, 0)); - } - } - - for (int32_t i = 0; i < input_rects.size(); i++) { - background_rects[i] = input_rects[i]; - } - - update(); - break; - } - case NOTIFICATION_DRAW: { - const Color dark_color = get_theme_color(SNAME("dark_color_2"), SNAME("Editor")); - - for (int i = 0; i < 5; ++i) { - draw_rect(background_rects[i], dark_color); - } - break; } } } -void BoneTransformEditor::_value_changed(const double p_value) { - if (updating) { - return; - } - - Transform3D tform = compute_transform_from_vector3s(); - _change_transform(tform); -} - -void BoneTransformEditor::_value_changed_vector3(const String p_property_name, const Vector3 p_vector, const StringName p_edited_property_name, const bool p_boolean) { - if (updating) { - return; - } - Transform3D tform = compute_transform_from_vector3s(); - _change_transform(tform); -} - -Transform3D BoneTransformEditor::compute_transform_from_vector3s() const { - // Convert rotation from degrees to radians. - Vector3 prop_rotation = rotation_property->get_vector(); - prop_rotation.x = Math::deg2rad(prop_rotation.x); - prop_rotation.y = Math::deg2rad(prop_rotation.y); - prop_rotation.z = Math::deg2rad(prop_rotation.z); - - return Transform3D( - Basis(prop_rotation, scale_property->get_vector()), - translation_property->get_vector()); -} - -void BoneTransformEditor::_value_changed_transform(const String p_property_name, const Transform3D p_transform, const StringName p_edited_property_name, const bool p_boolean) { +void BoneTransformEditor::_value_changed(const String &p_property, Variant p_value, const String &p_name, bool p_changing) { if (updating) { return; } - _change_transform(p_transform); -} - -void BoneTransformEditor::_change_transform(Transform3D p_new_transform) { - if (property.get_slicec('/', 0) == "bones" && property.get_slicec('/', 2) == "custom_pose") { - undo_redo->create_action(TTR("Set Custom Bone Pose Transform"), UndoRedo::MERGE_ENDS); - undo_redo->add_undo_method(skeleton, "set_bone_custom_pose", property.get_slicec('/', 1).to_int(), skeleton->get_bone_custom_pose(property.get_slicec('/', 1).to_int())); - undo_redo->add_do_method(skeleton, "set_bone_custom_pose", property.get_slicec('/', 1).to_int(), p_new_transform); - undo_redo->commit_action(); - } else if (property.get_slicec('/', 0) == "bones") { + if (skeleton) { undo_redo->create_action(TTR("Set Bone Transform"), UndoRedo::MERGE_ENDS); - undo_redo->add_undo_property(skeleton, property, skeleton->get(property)); - undo_redo->add_do_property(skeleton, property, p_new_transform); + undo_redo->add_undo_property(skeleton, p_property, skeleton->get(p_property)); + undo_redo->add_do_property(skeleton, p_property, p_value); undo_redo->commit_action(); } } -void BoneTransformEditor::update_enabled_checkbox() { - if (enabled_checkbox) { - const String path = "bones/" + property.get_slicec('/', 1) + "/enabled"; - const bool is_enabled = skeleton->get(path); - enabled_checkbox->set_pressed(is_enabled); - } -} - -void BoneTransformEditor::_update_properties() { - if (updating) { - return; - } - - if (!skeleton) { - return; - } - - updating = true; - - Transform3D tform = skeleton->get(property); - _update_transform_properties(tform); -} - -void BoneTransformEditor::_update_custom_pose_properties() { - if (updating) { - return; - } - - if (!skeleton) { - return; - } - - updating = true; - - Transform3D tform = skeleton->get_bone_custom_pose(property.to_int()); - _update_transform_properties(tform); -} - -void BoneTransformEditor::_update_transform_properties(Transform3D tform) { - Basis rotation_basis = tform.get_basis(); - Vector3 rotation_radians = rotation_basis.get_rotation_euler(); - Vector3 rotation_degrees = Vector3(Math::rad2deg(rotation_radians.x), Math::rad2deg(rotation_radians.y), Math::rad2deg(rotation_radians.z)); - Vector3 translation = tform.get_origin(); - Vector3 scale = tform.basis.get_scale(); - - translation_property->update_using_vector(translation); - rotation_property->update_using_vector(rotation_degrees); - scale_property->update_using_vector(scale); - transform_property->update_using_transform(tform); - - update_enabled_checkbox(); - updating = false; -} - BoneTransformEditor::BoneTransformEditor(Skeleton3D *p_skeleton) : skeleton(p_skeleton) { undo_redo = EditorNode::get_undo_redo(); } -void BoneTransformEditor::set_target(const String &p_prop) { - property = p_prop; -} - void BoneTransformEditor::set_keyable(const bool p_keyable) { - keyable = p_keyable; + position_property->set_keying(p_keyable); + rotation_property->set_keying(p_keyable); + scale_property->set_keying(p_keyable); } -void BoneTransformEditor::_update_key_button(const bool p_keyable) { - bool is_keyable = keyable && p_keyable; - if (key_button) { - key_button->set_visible(is_keyable); - } -} +void BoneTransformEditor::set_target(const String &p_prop) { + enabled_checkbox->set_object_and_property(skeleton, p_prop + "enabled"); + enabled_checkbox->update_property(); -void BoneTransformEditor::set_properties_read_only(const bool p_readonly) { - enabled_checkbox->set_disabled(p_readonly); - enabled_checkbox->update(); -} + position_property->set_object_and_property(skeleton, p_prop + "position"); + position_property->update_property(); -void BoneTransformEditor::set_transform_read_only(const bool p_readonly) { - translation_property->set_read_only(p_readonly); - rotation_property->set_read_only(p_readonly); - scale_property->set_read_only(p_readonly); - transform_property->set_read_only(p_readonly); - translation_property->update(); - rotation_property->update(); - scale_property->update(); - transform_property->update(); - _update_key_button(!p_readonly); -} + rotation_property->set_object_and_property(skeleton, p_prop + "rotation"); + rotation_property->update_property(); -void BoneTransformEditor::set_toggle_enabled(const bool p_enabled) { - toggle_enabled = p_enabled; - if (enabled_checkbox) { - enabled_checkbox->set_visible(p_enabled); - } -} + scale_property->set_object_and_property(skeleton, p_prop + "scale"); + scale_property->update_property(); -void BoneTransformEditor::_key_button_pressed() { - if (!skeleton) { - return; - } - - const BoneId bone_id = property.get_slicec('/', 1).to_int(); - const String name = skeleton->get_bone_name(bone_id); + rest_matrix->set_object_and_property(skeleton, p_prop + "rest"); + rest_matrix->update_property(); +} - if (name.is_empty()) { - return; +void BoneTransformEditor::_property_keyed(const String &p_path, bool p_advance) { + AnimationTrackEditor *te = AnimationPlayerEditor::get_singleton()->get_track_editor(); + PackedStringArray split = p_path.split("/"); + if (split.size() == 3 && split[0] == "bones") { + int bone_idx = split[1].to_int(); + if (split[2] == "position") { + te->insert_transform_key(skeleton, skeleton->get_bone_name(bone_idx), Animation::TYPE_POSITION_3D, skeleton->get(p_path)); + } + if (split[2] == "rotation") { + te->insert_transform_key(skeleton, skeleton->get_bone_name(bone_idx), Animation::TYPE_ROTATION_3D, skeleton->get(p_path)); + } + if (split[2] == "scale") { + te->insert_transform_key(skeleton, skeleton->get_bone_name(bone_idx), Animation::TYPE_SCALE_3D, skeleton->get(p_path)); + } } - - Transform3D tform = compute_transform_from_vector3s(); - AnimationPlayerEditor::get_singleton()->get_track_editor()->insert_transform_key(skeleton, name, tform); } -void BoneTransformEditor::_checkbox_pressed() { +void BoneTransformEditor::_update_properties() { if (!skeleton) { return; } - - const BoneId bone_id = property.get_slicec('/', 1).to_int(); - if (enabled_checkbox) { - undo_redo->create_action(TTR("Set Pose Enabled")); - bool enabled = skeleton->is_bone_enabled(bone_id); - undo_redo->add_do_method(skeleton, "set_bone_enabled", bone_id, !enabled); - undo_redo->add_undo_method(skeleton, "set_bone_enabled", bone_id, enabled); - undo_redo->commit_action(); + int selected = Skeleton3DEditor::get_singleton()->get_selected_bone(); + List<PropertyInfo> props; + skeleton->get_property_list(&props); + for (const PropertyInfo &E : props) { + PackedStringArray split = E.name.split("/"); + if (split.size() == 3 && split[0] == "bones") { + if (split[1].to_int() == selected) { + if (split[2] == "enabled") { + enabled_checkbox->set_read_only(E.usage & PROPERTY_USAGE_READ_ONLY); + enabled_checkbox->update_property(); + enabled_checkbox->update(); + } + if (split[2] == "position") { + position_property->set_read_only(E.usage & PROPERTY_USAGE_READ_ONLY); + position_property->update_property(); + position_property->update(); + } + if (split[2] == "rotation") { + rotation_property->set_read_only(E.usage & PROPERTY_USAGE_READ_ONLY); + rotation_property->update_property(); + rotation_property->update(); + } + if (split[2] == "scale") { + scale_property->set_read_only(E.usage & PROPERTY_USAGE_READ_ONLY); + scale_property->update_property(); + scale_property->update(); + } + if (split[2] == "rest") { + rest_matrix->set_read_only(E.usage & PROPERTY_USAGE_READ_ONLY); + rest_matrix->update_property(); + rest_matrix->update(); + } + } + } } } @@ -346,89 +209,94 @@ Skeleton3DEditor *Skeleton3DEditor::singleton = nullptr; void Skeleton3DEditor::set_keyable(const bool p_keyable) { keyable = p_keyable; - skeleton_options->get_popup()->set_item_disabled(SKELETON_OPTION_INSERT_KEYS, !p_keyable); - skeleton_options->get_popup()->set_item_disabled(SKELETON_OPTION_INSERT_KEYS_EXISTED, !p_keyable); + if (p_keyable) { + animation_hb->show(); + } else { + animation_hb->hide(); + } }; -void Skeleton3DEditor::set_rest_options_enabled(const bool p_rest_options_enabled) { - rest_options->get_popup()->set_item_disabled(REST_OPTION_POSE_TO_REST, !p_rest_options_enabled); +void Skeleton3DEditor::set_bone_options_enabled(const bool p_bone_options_enabled) { + skeleton_options->get_popup()->set_item_disabled(SKELETON_OPTION_INIT_SELECTED_POSES, !p_bone_options_enabled); + skeleton_options->get_popup()->set_item_disabled(SKELETON_OPTION_SELECTED_POSES_TO_RESTS, !p_bone_options_enabled); }; -void Skeleton3DEditor::_update_show_rest_only() { - _update_pose_enabled(-1); -} - -void Skeleton3DEditor::_update_pose_enabled(int p_bone) { - if (!skeleton) { - return; - } - if (pose_editor) { - pose_editor->set_properties_read_only(skeleton->is_show_rest_only()); - - if (selected_bone > 0) { - pose_editor->set_transform_read_only(skeleton->is_show_rest_only() || !(skeleton->is_bone_enabled(selected_bone))); - } - } - _update_gizmo_visible(); -} - void Skeleton3DEditor::_on_click_skeleton_option(int p_skeleton_option) { if (!skeleton) { return; } switch (p_skeleton_option) { - case SKELETON_OPTION_CREATE_PHYSICAL_SKELETON: { - create_physical_skeleton(); + case SKELETON_OPTION_INIT_ALL_POSES: { + init_pose(true); + break; + } + case SKELETON_OPTION_INIT_SELECTED_POSES: { + init_pose(false); break; } - case SKELETON_OPTION_INIT_POSE: { - init_pose(); + case SKELETON_OPTION_ALL_POSES_TO_RESTS: { + pose_to_rest(true); break; } - case SKELETON_OPTION_INSERT_KEYS: { - insert_keys(true); + case SKELETON_OPTION_SELECTED_POSES_TO_RESTS: { + pose_to_rest(false); break; } - case SKELETON_OPTION_INSERT_KEYS_EXISTED: { - insert_keys(false); + case SKELETON_OPTION_CREATE_PHYSICAL_SKELETON: { + create_physical_skeleton(); break; } } } -void Skeleton3DEditor::_on_click_rest_option(int p_rest_option) { +void Skeleton3DEditor::init_pose(const bool p_all_bones) { if (!skeleton) { return; } - - switch (p_rest_option) { - case REST_OPTION_POSE_TO_REST: { - pose_to_rest(); - break; - } - } -} - -void Skeleton3DEditor::init_pose() { const int bone_len = skeleton->get_bone_count(); if (!bone_len) { return; } + UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Set Bone Transform"), UndoRedo::MERGE_ENDS); - for (int i = 0; i < bone_len; i++) { - ur->add_do_method(skeleton, "set_bone_pose", i, Transform3D()); - ur->add_undo_method(skeleton, "set_bone_pose", i, skeleton->get_bone_pose(i)); + if (p_all_bones) { + for (int i = 0; i < bone_len; i++) { + Transform3D rest = skeleton->get_bone_rest(i); + ur->add_do_method(skeleton, "set_bone_pose_position", i, rest.origin); + ur->add_do_method(skeleton, "set_bone_pose_rotation", i, rest.basis.get_rotation_quaternion()); + ur->add_do_method(skeleton, "set_bone_pose_scale", i, rest.basis.get_scale()); + ur->add_undo_method(skeleton, "set_bone_pose_position", i, skeleton->get_bone_pose_position(i)); + ur->add_undo_method(skeleton, "set_bone_pose_rotation", i, skeleton->get_bone_pose_rotation(i)); + ur->add_undo_method(skeleton, "set_bone_pose_scale", i, skeleton->get_bone_pose_scale(i)); + } + } else { + // Todo: Do method with multiple bone selection. + if (selected_bone == -1) { + ur->commit_action(); + return; + } + Transform3D rest = skeleton->get_bone_rest(selected_bone); + ur->add_do_method(skeleton, "set_bone_pose_position", selected_bone, rest.origin); + ur->add_do_method(skeleton, "set_bone_pose_rotation", selected_bone, rest.basis.get_rotation_quaternion()); + ur->add_do_method(skeleton, "set_bone_pose_scale", selected_bone, rest.basis.get_scale()); + ur->add_undo_method(skeleton, "set_bone_pose_position", selected_bone, skeleton->get_bone_pose_position(selected_bone)); + ur->add_undo_method(skeleton, "set_bone_pose_rotation", selected_bone, skeleton->get_bone_pose_rotation(selected_bone)); + ur->add_undo_method(skeleton, "set_bone_pose_scale", selected_bone, skeleton->get_bone_pose_scale(selected_bone)); } ur->commit_action(); } -void Skeleton3DEditor::insert_keys(bool p_all_bones) { +void Skeleton3DEditor::insert_keys(const bool p_all_bones) { if (!skeleton) { return; } + bool pos_enabled = key_loc_button->is_pressed(); + bool rot_enabled = key_rot_button->is_pressed(); + bool scl_enabled = key_scale_button->is_pressed(); + int bone_len = skeleton->get_bone_count(); Node *root = EditorNode::get_singleton()->get_tree()->get_root(); String path = root->get_path_to(skeleton); @@ -442,32 +310,44 @@ void Skeleton3DEditor::insert_keys(bool p_all_bones) { continue; } - if (!p_all_bones && !te->has_transform_track(skeleton, name)) { - continue; + if (pos_enabled && (p_all_bones || te->has_track(skeleton, name, Animation::TYPE_POSITION_3D))) { + te->insert_transform_key(skeleton, name, Animation::TYPE_POSITION_3D, skeleton->get_bone_pose_position(i)); + } + if (rot_enabled && (p_all_bones || te->has_track(skeleton, name, Animation::TYPE_ROTATION_3D))) { + te->insert_transform_key(skeleton, name, Animation::TYPE_ROTATION_3D, skeleton->get_bone_pose_rotation(i)); + } + if (scl_enabled && (p_all_bones || te->has_track(skeleton, name, Animation::TYPE_SCALE_3D))) { + te->insert_transform_key(skeleton, name, Animation::TYPE_SCALE_3D, skeleton->get_bone_pose_scale(i)); } - - Transform3D tform = skeleton->get_bone_pose(i); - te->insert_transform_key(skeleton, name, tform); } te->commit_insert_queue(); } -void Skeleton3DEditor::pose_to_rest() { +void Skeleton3DEditor::pose_to_rest(const bool p_all_bones) { if (!skeleton) { return; } + const int bone_len = skeleton->get_bone_count(); + if (!bone_len) { + return; + } - // Todo: Do method with multiple bone selection. UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action(TTR("Set Bone Transform"), UndoRedo::MERGE_ENDS); - - ur->add_do_method(skeleton, "set_bone_pose", selected_bone, Transform3D()); - ur->add_undo_method(skeleton, "set_bone_pose", selected_bone, skeleton->get_bone_pose(selected_bone)); - ur->add_do_method(skeleton, "set_bone_custom_pose", selected_bone, Transform3D()); - ur->add_undo_method(skeleton, "set_bone_custom_pose", selected_bone, skeleton->get_bone_custom_pose(selected_bone)); - ur->add_do_method(skeleton, "set_bone_rest", selected_bone, skeleton->get_bone_rest(selected_bone) * skeleton->get_bone_custom_pose(selected_bone) * skeleton->get_bone_pose(selected_bone)); - ur->add_undo_method(skeleton, "set_bone_rest", selected_bone, skeleton->get_bone_rest(selected_bone)); - + ur->create_action(TTR("Set Bone Rest"), UndoRedo::MERGE_ENDS); + if (p_all_bones) { + for (int i = 0; i < bone_len; i++) { + ur->add_do_method(skeleton, "set_bone_rest", i, skeleton->get_bone_pose(i)); + ur->add_undo_method(skeleton, "set_bone_rest", i, skeleton->get_bone_rest(i)); + } + } else { + // Todo: Do method with multiple bone selection. + if (selected_bone == -1) { + ur->commit_action(); + return; + } + ur->add_do_method(skeleton, "set_bone_rest", selected_bone, skeleton->get_bone_pose(selected_bone)); + ur->add_undo_method(skeleton, "set_bone_rest", selected_bone, skeleton->get_bone_rest(selected_bone)); + } ur->commit_action(); } @@ -652,20 +532,15 @@ void Skeleton3DEditor::_joint_tree_selection_changed() { const int b_idx = path.get_slicec('/', 1).to_int(); const String bone_path = "bones/" + itos(b_idx) + "/"; - pose_editor->set_target(bone_path + "pose"); - rest_editor->set_target(bone_path + "rest"); - custom_pose_editor->set_target(bone_path + "custom_pose"); - - pose_editor->set_visible(true); - rest_editor->set_visible(true); - custom_pose_editor->set_visible(true); - + pose_editor->set_target(bone_path); + pose_editor->set_keyable(keyable); selected_bone = b_idx; } } - set_rest_options_enabled(selected); + pose_editor->set_visible(selected); + set_bone_options_enabled(selected); _update_properties(); - _update_pose_enabled(); + _update_gizmo_visible(); } // May be not used with single select mode. @@ -673,16 +548,10 @@ void Skeleton3DEditor::_joint_tree_rmb_select(const Vector2 &p_pos) { } void Skeleton3DEditor::_update_properties() { - if (rest_editor) { - rest_editor->_update_properties(); - } if (pose_editor) { pose_editor->_update_properties(); } - if (custom_pose_editor) { - custom_pose_editor->_update_custom_pose_properties(); - } - _update_gizmo_transform(); + Node3DEditor::get_singleton()->update_transform_gizmo(); } void Skeleton3DEditor::update_joint_tree() { @@ -748,43 +617,82 @@ void Skeleton3DEditor::create_editors() { skeleton_options->set_text(TTR("Skeleton3D")); skeleton_options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Skeleton3D"), SNAME("EditorIcons"))); - skeleton_options->get_popup()->add_item(TTR("Init pose"), SKELETON_OPTION_INIT_POSE); - skeleton_options->get_popup()->add_item(TTR("Insert key of all bone poses"), SKELETON_OPTION_INSERT_KEYS); - skeleton_options->get_popup()->add_item(TTR("Insert key of bone poses already exist track"), SKELETON_OPTION_INSERT_KEYS_EXISTED); - skeleton_options->get_popup()->add_item(TTR("Create physical skeleton"), SKELETON_OPTION_CREATE_PHYSICAL_SKELETON); - - skeleton_options->get_popup()->connect("id_pressed", callable_mp(this, &Skeleton3DEditor::_on_click_skeleton_option)); - - // Create Rest Option in Top Menu Bar. - rest_options = memnew(MenuButton); - ne->add_control_to_menu_panel(rest_options); - - rest_options->set_text(TTR("Edit Rest")); - rest_options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("BoneAttachment3D"), SNAME("EditorIcons"))); + // Skeleton options. + PopupMenu *p = skeleton_options->get_popup(); + p->add_shortcut(ED_SHORTCUT("skeleton_3d_editor/init_all_poses", TTR("Init all Poses")), SKELETON_OPTION_INIT_ALL_POSES); + p->add_shortcut(ED_SHORTCUT("skeleton_3d_editor/init_selected_poses", TTR("Init selected Poses")), SKELETON_OPTION_INIT_SELECTED_POSES); + p->add_shortcut(ED_SHORTCUT("skeleton_3d_editor/all_poses_to_rests", TTR("Apply all poses to rests")), SKELETON_OPTION_ALL_POSES_TO_RESTS); + p->add_shortcut(ED_SHORTCUT("skeleton_3d_editor/selected_poses_to_rests", TTR("Apply selected poses to rests")), SKELETON_OPTION_SELECTED_POSES_TO_RESTS); + p->add_item(TTR("Create physical skeleton"), SKELETON_OPTION_CREATE_PHYSICAL_SKELETON); - rest_options->get_popup()->add_item(TTR("Apply current pose to rest"), REST_OPTION_POSE_TO_REST); - rest_options->get_popup()->connect("id_pressed", callable_mp(this, &Skeleton3DEditor::_on_click_rest_option)); - set_rest_options_enabled(false); + p->connect("id_pressed", callable_mp(this, &Skeleton3DEditor::_on_click_skeleton_option)); + set_bone_options_enabled(false); Vector<Variant> button_binds; button_binds.resize(1); edit_mode_button = memnew(Button); ne->add_control_to_menu_panel(edit_mode_button); - edit_mode_button->set_tooltip(TTR("Edit Mode\nShow buttons on joints.")); - edit_mode_button->set_toggle_mode(true); edit_mode_button->set_flat(true); + edit_mode_button->set_toggle_mode(true); + edit_mode_button->set_focus_mode(FOCUS_NONE); + edit_mode_button->set_tooltip(TTR("Edit Mode\nShow buttons on joints.")); edit_mode_button->connect("toggled", callable_mp(this, &Skeleton3DEditor::edit_mode_toggled)); edit_mode = false; - set_keyable(te->has_keying()); - if (skeleton) { skeleton->add_child(handles_mesh_instance); handles_mesh_instance->set_skeleton_path(NodePath("")); } + // Keying buttons. + animation_hb = memnew(HBoxContainer); + ne->add_control_to_menu_panel(animation_hb); + animation_hb->add_child(memnew(VSeparator)); + animation_hb->hide(); + + key_loc_button = memnew(Button); + key_loc_button->set_flat(true); + key_loc_button->set_toggle_mode(true); + key_loc_button->set_pressed(false); + key_loc_button->set_focus_mode(FOCUS_NONE); + key_loc_button->set_tooltip(TTR("Translation mask for inserting keys.")); + animation_hb->add_child(key_loc_button); + + key_rot_button = memnew(Button); + key_rot_button->set_flat(true); + key_rot_button->set_toggle_mode(true); + key_rot_button->set_pressed(true); + key_rot_button->set_focus_mode(FOCUS_NONE); + key_rot_button->set_tooltip(TTR("Rotation mask for inserting keys.")); + animation_hb->add_child(key_rot_button); + + key_scale_button = memnew(Button); + key_scale_button->set_flat(true); + key_scale_button->set_toggle_mode(true); + key_scale_button->set_pressed(false); + key_scale_button->set_focus_mode(FOCUS_NONE); + key_scale_button->set_tooltip(TTR("Scale mask for inserting keys.")); + animation_hb->add_child(key_scale_button); + + key_insert_button = memnew(Button); + key_insert_button->set_flat(true); + key_insert_button->set_focus_mode(FOCUS_NONE); + key_insert_button->connect("pressed", callable_mp(this, &Skeleton3DEditor::insert_keys), varray(false)); + key_insert_button->set_tooltip(TTR("Insert key of bone poses already exist track.")); + key_insert_button->set_shortcut(ED_SHORTCUT("skeleton_3d_editor/insert_key_to_existing_tracks", TTR("Insert Key (Existing Tracks)"), Key::INSERT)); + animation_hb->add_child(key_insert_button); + + key_insert_all_button = memnew(Button); + key_insert_all_button->set_flat(true); + key_insert_all_button->set_focus_mode(FOCUS_NONE); + key_insert_all_button->connect("pressed", callable_mp(this, &Skeleton3DEditor::insert_keys), varray(true)); + key_insert_all_button->set_tooltip(TTR("Insert key of all bone poses.")); + key_insert_all_button->set_shortcut(ED_SHORTCUT("skeleton_3d_editor/insert_key_of_all_bones", TTR("Insert Key (All Bones)"), KeyModifierMask::CMD + Key::INSERT)); + animation_hb->add_child(key_insert_all_button); + + // Bone tree. const Color section_color = get_theme_color(SNAME("prop_subsection"), SNAME("Editor")); EditorInspectorSection *bones_section = memnew(EditorInspectorSection); @@ -809,29 +717,22 @@ void Skeleton3DEditor::create_editors() { s_con->add_child(joint_tree); pose_editor = memnew(BoneTransformEditor(skeleton)); - pose_editor->set_label(TTR("Bone Pose")); - pose_editor->set_toggle_enabled(true); - pose_editor->set_keyable(te->has_keying()); + pose_editor->set_label(TTR("Bone Transform")); pose_editor->set_visible(false); add_child(pose_editor); - rest_editor = memnew(BoneTransformEditor(skeleton)); - rest_editor->set_label(TTR("Bone Rest")); - rest_editor->set_visible(false); - add_child(rest_editor); - rest_editor->set_transform_read_only(true); - - custom_pose_editor = memnew(BoneTransformEditor(skeleton)); - custom_pose_editor->set_label(TTR("Bone Custom Pose")); - custom_pose_editor->set_visible(false); - add_child(custom_pose_editor); - custom_pose_editor->set_transform_read_only(true); + set_keyable(te->has_keying()); } void Skeleton3DEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: { - edit_mode_button->set_icon(get_theme_icon("ToolBoneSelect", "EditorIcons")); + edit_mode_button->set_icon(get_theme_icon(SNAME("ToolBoneSelect"), SNAME("EditorIcons"))); + key_loc_button->set_icon(get_theme_icon(SNAME("KeyPosition"), SNAME("EditorIcons"))); + key_rot_button->set_icon(get_theme_icon(SNAME("KeyRotation"), SNAME("EditorIcons"))); + key_scale_button->set_icon(get_theme_icon(SNAME("KeyScale"), SNAME("EditorIcons"))); + key_insert_button->set_icon(get_theme_icon(SNAME("Key"), SNAME("EditorIcons"))); + key_insert_all_button->set_icon(get_theme_icon(SNAME("NewKey"), SNAME("EditorIcons"))); get_tree()->connect("node_removed", callable_mp(this, &Skeleton3DEditor::_node_removed), Vector<Variant>(), Object::CONNECT_ONESHOT); break; } @@ -844,8 +745,8 @@ void Skeleton3DEditor::_notification(int p_what) { #ifdef TOOLS_ENABLED skeleton->connect("pose_updated", callable_mp(this, &Skeleton3DEditor::_draw_gizmo)); skeleton->connect("pose_updated", callable_mp(this, &Skeleton3DEditor::_update_properties)); - skeleton->connect("bone_enabled_changed", callable_mp(this, &Skeleton3DEditor::_update_pose_enabled)); - skeleton->connect("show_rest_only_changed", callable_mp(this, &Skeleton3DEditor::_update_show_rest_only)); + skeleton->connect("bone_enabled_changed", callable_mp(this, &Skeleton3DEditor::_bone_enabled_changed)); + skeleton->connect("show_rest_only_changed", callable_mp(this, &Skeleton3DEditor::_update_gizmo_visible)); #endif break; } @@ -856,7 +757,6 @@ void Skeleton3DEditor::_node_removed(Node *p_node) { if (skeleton && p_node == skeleton) { skeleton = nullptr; skeleton_options->hide(); - rest_options->hide(); } _update_properties(); @@ -866,11 +766,8 @@ void Skeleton3DEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("_node_removed"), &Skeleton3DEditor::_node_removed); ClassDB::bind_method(D_METHOD("_joint_tree_selection_changed"), &Skeleton3DEditor::_joint_tree_selection_changed); ClassDB::bind_method(D_METHOD("_joint_tree_rmb_select"), &Skeleton3DEditor::_joint_tree_rmb_select); - ClassDB::bind_method(D_METHOD("_update_show_rest_only"), &Skeleton3DEditor::_update_show_rest_only); - ClassDB::bind_method(D_METHOD("_update_pose_enabled"), &Skeleton3DEditor::_update_pose_enabled); ClassDB::bind_method(D_METHOD("_update_properties"), &Skeleton3DEditor::_update_properties); ClassDB::bind_method(D_METHOD("_on_click_skeleton_option"), &Skeleton3DEditor::_on_click_skeleton_option); - ClassDB::bind_method(D_METHOD("_on_click_rest_option"), &Skeleton3DEditor::_on_click_rest_option); ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &Skeleton3DEditor::get_drag_data_fw); ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &Skeleton3DEditor::can_drop_data_fw); @@ -938,7 +835,9 @@ void Skeleton3DEditor::update_bone_original() { if (skeleton->get_bone_count() == 0 || selected_bone == -1) { return; } - bone_original = skeleton->get_bone_pose(selected_bone); + bone_original_position = skeleton->get_bone_pose_position(selected_bone); + bone_original_rotation = skeleton->get_bone_pose_rotation(selected_bone); + bone_original_scale = skeleton->get_bone_pose_scale(selected_bone); } void Skeleton3DEditor::_hide_handles() { @@ -1065,20 +964,27 @@ void Skeleton3DEditor::select_bone(int p_idx) { Skeleton3DEditor::~Skeleton3DEditor() { if (skeleton) { + select_bone(-1); #ifdef TOOLS_ENABLED - skeleton->disconnect("show_rest_only_changed", callable_mp(this, &Skeleton3DEditor::_update_show_rest_only)); - skeleton->disconnect("bone_enabled_changed", callable_mp(this, &Skeleton3DEditor::_update_pose_enabled)); + skeleton->disconnect("show_rest_only_changed", callable_mp(this, &Skeleton3DEditor::_update_gizmo_visible)); + skeleton->disconnect("bone_enabled_changed", callable_mp(this, &Skeleton3DEditor::_bone_enabled_changed)); skeleton->disconnect("pose_updated", callable_mp(this, &Skeleton3DEditor::_draw_gizmo)); skeleton->disconnect("pose_updated", callable_mp(this, &Skeleton3DEditor::_update_properties)); skeleton->set_transform_gizmo_visible(true); #endif handles_mesh_instance->get_parent()->remove_child(handles_mesh_instance); } + edit_mode_toggled(false); handles_mesh_instance->queue_delete(); Node3DEditor *ne = Node3DEditor::get_singleton(); + if (animation_hb) { + ne->remove_control_from_menu_panel(animation_hb); + memdelete(animation_hb); + } + if (separator) { ne->remove_control_from_menu_panel(separator); memdelete(separator); @@ -1089,11 +995,6 @@ Skeleton3DEditor::~Skeleton3DEditor() { memdelete(skeleton_options); } - if (rest_options) { - ne->remove_control_from_menu_panel(rest_options); - memdelete(rest_options); - } - if (edit_mode_button) { ne->remove_control_from_menu_panel(edit_mode_button); memdelete(edit_mode_button); @@ -1129,7 +1030,7 @@ EditorPlugin::AfterGUIInput Skeleton3DEditorPlugin::forward_spatial_gui_input(Ca Node3DEditor *ne = Node3DEditor::get_singleton(); if (se->is_edit_mode()) { const Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) { if (ne->get_tool_mode() != Node3DEditor::TOOL_MODE_SELECT) { if (!ne->is_gizmo_visible()) { return EditorPlugin::AFTER_GUI_INPUT_STOP; @@ -1148,9 +1049,9 @@ bool Skeleton3DEditorPlugin::handles(Object *p_object) const { return p_object->is_class("Skeleton3D"); } -void Skeleton3DEditor::_update_gizmo_transform() { - Node3DEditor::get_singleton()->update_transform_gizmo(); -}; +void Skeleton3DEditor::_bone_enabled_changed(const int p_bone_id) { + _update_gizmo_visible(); +} void Skeleton3DEditor::_update_gizmo_visible() { _subgizmo_selection_change(); @@ -1289,7 +1190,6 @@ void Skeleton3DGizmoPlugin::set_subgizmo_transform(const EditorNode3DGizmo *p_gi if (parent_idx >= 0) { original_to_local = original_to_local * skeleton->get_bone_global_pose(parent_idx); } - original_to_local = original_to_local * skeleton->get_bone_rest(p_id) * skeleton->get_bone_custom_pose(p_id); Basis to_local = original_to_local.get_basis().inverse(); // Prepare transform. @@ -1305,7 +1205,9 @@ void Skeleton3DGizmoPlugin::set_subgizmo_transform(const EditorNode3DGizmo *p_gi t.origin = orig + to_local.xform(sub); // Apply transform. - skeleton->set_bone_pose(p_id, t); + skeleton->set_bone_pose_position(p_id, t.origin); + skeleton->set_bone_pose_rotation(p_id, t.basis.get_rotation_quaternion()); + skeleton->set_bone_pose_scale(p_id, t.basis.get_scale()); } void Skeleton3DGizmoPlugin::commit_subgizmos(const EditorNode3DGizmo *p_gizmo, const Vector<int> &p_ids, const Vector<Transform3D> &p_restore, bool p_cancel) { @@ -1313,12 +1215,30 @@ void Skeleton3DGizmoPlugin::commit_subgizmos(const EditorNode3DGizmo *p_gizmo, c ERR_FAIL_COND(!skeleton); Skeleton3DEditor *se = Skeleton3DEditor::get_singleton(); + Node3DEditor *ne = Node3DEditor::get_singleton(); UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - for (int i = 0; i < p_ids.size(); i++) { - ur->create_action(TTR("Set Bone Transform")); - ur->add_do_method(skeleton, "set_bone_pose", p_ids[i], skeleton->get_bone_pose(p_ids[i])); - ur->add_undo_method(skeleton, "set_bone_pose", p_ids[i], se->get_bone_original()); + ur->create_action(TTR("Set Bone Transform")); + if (ne->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || ne->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE) { + for (int i = 0; i < p_ids.size(); i++) { + ur->add_do_method(skeleton, "set_bone_pose_position", p_ids[i], skeleton->get_bone_pose_position(p_ids[i])); + ur->add_undo_method(skeleton, "set_bone_pose_position", p_ids[i], se->get_bone_original_position()); + } + } + if (ne->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || ne->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE) { + for (int i = 0; i < p_ids.size(); i++) { + ur->add_do_method(skeleton, "set_bone_pose_rotation", p_ids[i], skeleton->get_bone_pose_rotation(p_ids[i])); + ur->add_undo_method(skeleton, "set_bone_pose_rotation", p_ids[i], se->get_bone_original_rotation()); + } + } + if (ne->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE) { + for (int i = 0; i < p_ids.size(); i++) { + // If the axis is swapped by scaling, the rotation can be changed. + ur->add_do_method(skeleton, "set_bone_pose_rotation", p_ids[i], skeleton->get_bone_pose_rotation(p_ids[i])); + ur->add_undo_method(skeleton, "set_bone_pose_rotation", p_ids[i], se->get_bone_original_rotation()); + ur->add_do_method(skeleton, "set_bone_pose_scale", p_ids[i], skeleton->get_bone_pose_scale(p_ids[i])); + ur->add_undo_method(skeleton, "set_bone_pose_scale", p_ids[i], se->get_bone_original_scale()); + } } ur->commit_action(); } @@ -1516,5 +1436,5 @@ void Skeleton3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { } Ref<ArrayMesh> m = surface_tool->commit(); - p_gizmo->add_mesh(m, Ref<Material>(), Transform3D(), skeleton->register_skin(Ref<Skin>())); + p_gizmo->add_mesh(m, Ref<Material>(), Transform3D(), skeleton->register_skin(skeleton->create_skin_from_rest_transforms())); } diff --git a/editor/plugins/skeleton_3d_editor_plugin.h b/editor/plugins/skeleton_3d_editor_plugin.h index e2a1d9a628..1dd2d2281d 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.h +++ b/editor/plugins/skeleton_3d_editor_plugin.h @@ -45,30 +45,27 @@ class Joint; class PhysicalBone3D; class Skeleton3DEditorPlugin; class Button; -class CheckBox; class BoneTransformEditor : public VBoxContainer { GDCLASS(BoneTransformEditor, VBoxContainer); EditorInspectorSection *section = nullptr; - EditorPropertyVector3 *translation_property = nullptr; - EditorPropertyVector3 *rotation_property = nullptr; + EditorPropertyCheck *enabled_checkbox = nullptr; + EditorPropertyVector3 *position_property = nullptr; + EditorPropertyQuaternion *rotation_property = nullptr; EditorPropertyVector3 *scale_property = nullptr; - EditorInspectorSection *transform_section = nullptr; - EditorPropertyTransform3D *transform_property = nullptr; + + EditorInspectorSection *rest_section = nullptr; + EditorPropertyTransform3D *rest_matrix = nullptr; Rect2 background_rects[5]; Skeleton3D *skeleton; - String property; + // String property; UndoRedo *undo_redo; - Button *key_button = nullptr; - CheckBox *enabled_checkbox = nullptr; - - bool keyable = false; bool toggle_enabled = false; bool updating = false; @@ -76,20 +73,9 @@ class BoneTransformEditor : public VBoxContainer { void create_editors(); - // Called when one of the EditorSpinSliders are changed. - void _value_changed(const double p_value); - // Called when the one of the EditorPropertyVector3 are updated. - void _value_changed_vector3(const String p_property_name, const Vector3 p_vector, const StringName p_edited_property_name, const bool p_boolean); - // Called when the transform_property is updated. - void _value_changed_transform(const String p_property_name, const Transform3D p_transform, const StringName p_edited_property_name, const bool p_boolean); - // Changes the transform to the given transform and updates the UI accordingly. - void _change_transform(Transform3D p_new_transform); - // Update it is truely keyable then. - void _update_key_button(const bool p_keyable); - // Creates a Transform using the EditorPropertyVector3 properties. - Transform3D compute_transform_from_vector3s() const; - - void update_enabled_checkbox(); + void _value_changed(const String &p_property, Variant p_value, const String &p_name, bool p_changing); + + void _property_keyed(const String &p_path, bool p_advance); protected: void _notification(int p_what); @@ -100,26 +86,9 @@ public: // Which transform target to modify. void set_target(const String &p_prop); void set_label(const String &p_label) { label = p_label; } - - void _update_properties(); - void _update_custom_pose_properties(); - void _update_transform_properties(Transform3D p_transform); - - // Transform can be keyed, whether or not to show the button. void set_keyable(const bool p_keyable); - // When rest mode, pose and custom_pose editor are diasbled. - void set_properties_read_only(const bool p_readonly); - void set_transform_read_only(const bool p_readonly); - - // Bone can be toggled enabled or disabled, whether or not to show the checkbox. - void set_toggle_enabled(const bool p_enabled); - - // Key Transform Button pressed. - void _key_button_pressed(); - - // Bone Enabled Checkbox toggled. - void _checkbox_pressed(); + void _update_properties(); }; class Skeleton3DEditor : public VBoxContainer { @@ -128,14 +97,11 @@ class Skeleton3DEditor : public VBoxContainer { friend class Skeleton3DEditorPlugin; enum SkeletonOption { - SKELETON_OPTION_INIT_POSE, - SKELETON_OPTION_INSERT_KEYS, - SKELETON_OPTION_INSERT_KEYS_EXISTED, - SKELETON_OPTION_CREATE_PHYSICAL_SKELETON - }; - - enum RestOption { - REST_OPTION_POSE_TO_REST + SKELETON_OPTION_INIT_ALL_POSES, + SKELETON_OPTION_INIT_SELECTED_POSES, + SKELETON_OPTION_ALL_POSES_TO_RESTS, + SKELETON_OPTION_SELECTED_POSES_TO_RESTS, + SKELETON_OPTION_CREATE_PHYSICAL_SKELETON, }; struct BoneInfo { @@ -151,15 +117,20 @@ class Skeleton3DEditor : public VBoxContainer { Tree *joint_tree = nullptr; BoneTransformEditor *rest_editor = nullptr; BoneTransformEditor *pose_editor = nullptr; - BoneTransformEditor *custom_pose_editor = nullptr; VSeparator *separator; MenuButton *skeleton_options = nullptr; - MenuButton *rest_options = nullptr; Button *edit_mode_button; bool edit_mode = false; + HBoxContainer *animation_hb; + Button *key_loc_button; + Button *key_rot_button; + Button *key_scale_button; + Button *key_insert_button; + Button *key_insert_all_button; + EditorFileDialog *file_dialog = nullptr; bool keyable; @@ -167,7 +138,6 @@ class Skeleton3DEditor : public VBoxContainer { static Skeleton3DEditor *singleton; void _on_click_skeleton_option(int p_skeleton_option); - void _on_click_rest_option(int p_rest_option); void _file_selected(const String &p_file); TreeItem *_find(TreeItem *p_node, const NodePath &p_path); void edit_mode_toggled(const bool pressed); @@ -179,9 +149,10 @@ class Skeleton3DEditor : public VBoxContainer { void create_editors(); - void init_pose(); - void insert_keys(bool p_all_bones); - void pose_to_rest(); + void init_pose(const bool p_all_bones); + void pose_to_rest(const bool p_all_bones); + + void insert_keys(const bool p_all_bones); void create_physical_skeleton(); PhysicalBone3D *create_physical_bone(int bone_id, int bone_child_id, const Vector<BoneInfo> &bones_infos); @@ -191,7 +162,7 @@ class Skeleton3DEditor : public VBoxContainer { void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); void set_keyable(const bool p_keyable); - void set_rest_options_enabled(const bool p_rest_options_enabled); + void set_bone_options_enabled(const bool p_bone_options_enabled); // Handle. MeshInstance3D *handles_mesh_instance; @@ -199,13 +170,12 @@ class Skeleton3DEditor : public VBoxContainer { Ref<ShaderMaterial> handle_material; Ref<Shader> handle_shader; - Transform3D bone_original; - - void _update_pose_enabled(int p_bone = -1); - void _update_show_rest_only(); + Vector3 bone_original_position; + Quaternion bone_original_rotation; + Vector3 bone_original_scale; - void _update_gizmo_transform(); void _update_gizmo_visible(); + void _bone_enabled_changed(const int p_bone_id); void _hide_handles(); @@ -239,7 +209,9 @@ public: bool is_edit_mode() const { return edit_mode; } void update_bone_original(); - Transform3D get_bone_original() { return bone_original; }; + Vector3 get_bone_original_position() const { return bone_original_position; }; + Quaternion get_bone_original_rotation() const { return bone_original_rotation; }; + Vector3 get_bone_original_scale() const { return bone_original_scale; }; Skeleton3DEditor(EditorInspectorPluginSkeleton *e_plugin, EditorNode *p_editor, Skeleton3D *skeleton); ~Skeleton3DEditor(); diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index 8a8d80891a..d455f4618b 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -126,7 +126,7 @@ void SpriteFramesEditor::_sheet_preview_draw() { void SpriteFramesEditor::_sheet_preview_input(const Ref<InputEvent> &p_event) { const Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { const int idx = _sheet_preview_position_to_frame_index(mb->get_position()); if (idx != -1) { @@ -166,12 +166,12 @@ void SpriteFramesEditor::_sheet_preview_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { frames_toggled_by_mouse_hover.clear(); } const Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { // Select by holding down the mouse button on frames. const int idx = _sheet_preview_position_to_frame_index(mm->get_position()); @@ -200,11 +200,11 @@ void SpriteFramesEditor::_sheet_scroll_input(const Ref<InputEvent> &p_event) { // Zoom in/out using Ctrl + mouse wheel. This is done on the ScrollContainer // to allow performing this action anywhere, even if the cursor isn't // hovering the texture in the workspace. - if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed() && mb->is_ctrl_pressed()) { + if (mb->get_button_index() == MouseButton::WHEEL_UP && mb->is_pressed() && mb->is_ctrl_pressed()) { _sheet_zoom_in(); // Don't scroll up after zooming in. accept_event(); - } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->is_ctrl_pressed()) { + } else if (mb->get_button_index() == MouseButton::WHEEL_DOWN && mb->is_pressed() && mb->is_ctrl_pressed()) { _sheet_zoom_out(); // Don't scroll down after zooming out. accept_event(); @@ -746,11 +746,11 @@ void SpriteFramesEditor::_tree_input(const Ref<InputEvent> &p_event) { const Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed() && mb->is_ctrl_pressed()) { + if (mb->get_button_index() == MouseButton::WHEEL_UP && mb->is_pressed() && mb->is_ctrl_pressed()) { _zoom_in(); // Don't scroll up after zooming in. accept_event(); - } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->is_ctrl_pressed()) { + } else if (mb->get_button_index() == MouseButton::WHEEL_DOWN && mb->is_pressed() && mb->is_ctrl_pressed()) { _zoom_out(); // Don't scroll down after zooming out. accept_event(); @@ -1006,7 +1006,7 @@ void SpriteFramesEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da if (String(d["type"]) == "files") { Vector<String> files = d["files"]; - if (Input::get_singleton()->is_key_pressed(KEY_CTRL)) { + if (Input::get_singleton()->is_key_pressed(Key::CTRL)) { _prepare_sprite_sheet(files[0]); } else { _file_load_request(files, at_pos); diff --git a/editor/plugins/sprite_frames_editor_plugin.h b/editor/plugins/sprite_frames_editor_plugin.h index 5e3b2fb8c1..9732384000 100644 --- a/editor/plugins/sprite_frames_editor_plugin.h +++ b/editor/plugins/sprite_frames_editor_plugin.h @@ -100,7 +100,6 @@ class SpriteFramesEditor : public HSplitContainer { float min_sheet_zoom; void _load_pressed(); - void _load_scene_pressed(); void _file_load_request(const Vector<String> &p_path, int p_at_pos = -1); void _copy_pressed(); void _paste_pressed(); @@ -128,7 +127,6 @@ class SpriteFramesEditor : public HSplitContainer { UndoRedo *undo_redo; - bool _is_drop_valid(const Dictionary &p_drag_data, const Dictionary &p_item_data) const; Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); diff --git a/editor/plugins/style_box_editor_plugin.cpp b/editor/plugins/style_box_editor_plugin.cpp index 91c5e96f08..1c7f319280 100644 --- a/editor/plugins/style_box_editor_plugin.cpp +++ b/editor/plugins/style_box_editor_plugin.cpp @@ -44,13 +44,6 @@ void EditorInspectorPluginStyleBox::parse_begin(Object *p_object) { add_custom_control(preview); } -bool EditorInspectorPluginStyleBox::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, bool p_wide) { - return false; //do not want -} - -void EditorInspectorPluginStyleBox::parse_end() { -} - void StyleBoxPreview::edit(const Ref<StyleBox> &p_stylebox) { if (stylebox.is_valid()) { stylebox->disconnect("changed", callable_mp(this, &StyleBoxPreview::_sb_changed)); diff --git a/editor/plugins/style_box_editor_plugin.h b/editor/plugins/style_box_editor_plugin.h index 8ca348bd80..d82e5ab05e 100644 --- a/editor/plugins/style_box_editor_plugin.h +++ b/editor/plugins/style_box_editor_plugin.h @@ -61,8 +61,6 @@ class EditorInspectorPluginStyleBox : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object) override; virtual void parse_begin(Object *p_object) override; - virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; - virtual void parse_end() override; }; class StyleBoxEditorPlugin : public EditorPlugin { diff --git a/editor/plugins/text_control_editor_plugin.cpp b/editor/plugins/text_control_editor_plugin.cpp new file mode 100644 index 0000000000..c878c83430 --- /dev/null +++ b/editor/plugins/text_control_editor_plugin.cpp @@ -0,0 +1,375 @@ +/*************************************************************************/ +/* text_control_editor_plugin.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "text_control_editor_plugin.h" + +#include "editor/editor_scale.h" + +void TextControlEditor::_notification(int p_notification) { + switch (p_notification) { + case NOTIFICATION_ENTER_TREE: { + if (!EditorFileSystem::get_singleton()->is_connected("filesystem_changed", callable_mp(this, &TextControlEditor::_reload_fonts))) { + EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &TextControlEditor::_reload_fonts), make_binds("")); + } + [[fallthrough]]; + } + case NOTIFICATION_THEME_CHANGED: { + clear_formatting->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); + } break; + case NOTIFICATION_EXIT_TREE: { + if (EditorFileSystem::get_singleton()->is_connected("filesystem_changed", callable_mp(this, &TextControlEditor::_reload_fonts))) { + EditorFileSystem::get_singleton()->disconnect("filesystem_changed", callable_mp(this, &TextControlEditor::_reload_fonts)); + } + } break; + default: + break; + } +} + +void TextControlEditor::_find_resources(EditorFileSystemDirectory *p_dir) { + for (int i = 0; i < p_dir->get_subdir_count(); i++) { + _find_resources(p_dir->get_subdir(i)); + } + + for (int i = 0; i < p_dir->get_file_count(); i++) { + if (p_dir->get_file_type(i) == "FontData") { + Ref<FontData> fd = ResourceLoader::load(p_dir->get_file_path(i)); + if (fd.is_valid()) { + String name = fd->get_font_name(); + String sty = fd->get_font_style_name(); + if (sty.is_empty()) { + sty = "Default"; + } + fonts[name][sty] = p_dir->get_file_path(i); + } + } + } +} + +void TextControlEditor::_reload_fonts(const String &p_path) { + fonts.clear(); + _find_resources(EditorFileSystem::get_singleton()->get_filesystem()); + _update_control(); +} + +void TextControlEditor::_update_fonts_menu() { + font_list->clear(); + font_list->add_item(TTR("[Theme Default]"), FONT_INFO_THEME_DEFAULT); + if (custom_font.is_valid()) { + font_list->add_item(TTR("[Custom Font]"), FONT_INFO_USER_CUSTOM); + } + + int id = FONT_INFO_ID; + for (Map<String, Map<String, String>>::Element *E = fonts.front(); E; E = E->next()) { + font_list->add_item(E->key(), id++); + } + + if (font_list->get_item_count() > 1) { + font_list->show(); + } else { + font_list->hide(); + } +} + +void TextControlEditor::_update_styles_menu() { + font_style_list->clear(); + if ((font_list->get_selected_id() >= FONT_INFO_ID)) { + const String &name = font_list->get_item_text(font_list->get_selected()); + for (Map<String, String>::Element *E = fonts[name].front(); E; E = E->next()) { + font_style_list->add_item(E->key()); + } + } else { + font_style_list->add_item("Default"); + } + + if (font_style_list->get_item_count() > 1) { + font_style_list->show(); + } else { + font_style_list->hide(); + } +} + +void TextControlEditor::_update_control() { + if (edited_control) { + // Get override names. + if (edited_control->is_class("RichTextLabel")) { + edited_color = "default_color"; + edited_font = "normal_font"; + edited_font_size = "normal_font_size"; + } else { + edited_color = "font_color"; + edited_font = "font"; + edited_font_size = "font_size"; + } + + // Get font override. + Ref<Font> font; + if (edited_control->has_theme_font_override(edited_font)) { + font = edited_control->get_theme_font(edited_font); + } + if (font.is_valid()) { + if (font->get_data_count() != 1) { + // Composite font, save it to "custom_font" to allow undoing font change. + custom_font = font; + _update_fonts_menu(); + font_list->select(FONT_INFO_USER_CUSTOM); + _update_styles_menu(); + font_style_list->select(0); + } else { + // Single face font, search for the font with matching name and style. + String name = font->get_data(0)->get_font_name(); + String style = font->get_data(0)->get_font_style_name(); + if (fonts.has(name) && fonts[name].has(style)) { + _update_fonts_menu(); + for (int i = 0; i < font_list->get_item_count(); i++) { + if (font_list->get_item_text(i) == name) { + font_list->select(i); + break; + } + } + _update_styles_menu(); + for (int i = 0; i < font_style_list->get_item_count(); i++) { + if (font_style_list->get_item_text(i) == style) { + font_style_list->select(i); + break; + } + } + } else { + // Unknown font, save it to "custom_font" to allow undoing font change. + custom_font = font; + _update_fonts_menu(); + font_list->select(FONT_INFO_USER_CUSTOM); + _update_styles_menu(); + font_style_list->select(0); + } + } + } else { + // No font override, select "Theme Default". + _update_fonts_menu(); + font_list->select(FONT_INFO_THEME_DEFAULT); + _update_styles_menu(); + font_style_list->select(0); + } + + // Get other theme overrides. + font_size_list->set_value(edited_control->get_theme_font_size(edited_font_size)); + outline_size_list->set_value(edited_control->get_theme_constant("outline_size")); + + font_color_picker->set_pick_color(edited_control->get_theme_color(edited_color)); + outline_color_picker->set_pick_color(edited_control->get_theme_color("font_outline_color")); + } +} + +void TextControlEditor::_font_selected(int p_id) { + _update_styles_menu(); + _set_font(); +} + +void TextControlEditor::_font_style_selected(int p_id) { + _set_font(); +} + +void TextControlEditor::_set_font() { + if (edited_control) { + if (font_list->get_selected_id() == FONT_INFO_THEME_DEFAULT) { + // Remove font override. + edited_control->remove_theme_font_override(edited_font); + return; + } else if (font_list->get_selected_id() == FONT_INFO_USER_CUSTOM) { + // Restore "custom_font". + edited_control->add_theme_font_override(edited_font, custom_font); + return; + } else { + // Load new font resource using selected name and style. + String name = font_list->get_item_text(font_list->get_selected()); + String sty = font_style_list->get_item_text(font_style_list->get_selected()); + if (sty.is_empty()) { + sty = "Default"; + } + if (fonts.has(name)) { + Ref<FontData> fd = ResourceLoader::load(fonts[name][sty]); + if (fd.is_valid()) { + Ref<Font> f; + f.instantiate(); + f->add_data(fd); + edited_control->add_theme_font_override(edited_font, f); + } + } + } + } +} + +void TextControlEditor::_font_size_selected(double p_size) { + if (edited_control) { + edited_control->add_theme_font_size_override(edited_font_size, p_size); + } +} + +void TextControlEditor::_outline_size_selected(double p_size) { + if (edited_control) { + edited_control->add_theme_constant_override("outline_size", p_size); + } +} + +void TextControlEditor::_font_color_changed(const Color &p_color) { + if (edited_control) { + edited_control->add_theme_color_override(edited_color, p_color); + } +} + +void TextControlEditor::_outline_color_changed(const Color &p_color) { + if (edited_control) { + edited_control->add_theme_color_override("font_outline_color", p_color); + } +} + +void TextControlEditor::_clear_formatting() { + if (edited_control) { + edited_control->begin_bulk_theme_override(); + edited_control->remove_theme_font_override(edited_font); + edited_control->remove_theme_font_size_override(edited_font_size); + edited_control->remove_theme_color_override(edited_color); + edited_control->remove_theme_color_override("font_outline_color"); + edited_control->remove_theme_constant_override("outline_size"); + edited_control->end_bulk_theme_override(); + _update_control(); + } +} + +void TextControlEditor::edit(Object *p_object) { + Control *ctrl = Object::cast_to<Control>(p_object); + if (!ctrl) { + edited_control = nullptr; + custom_font = Ref<Font>(); + } else { + edited_control = ctrl; + custom_font = Ref<Font>(); + _update_control(); + } +} + +bool TextControlEditor::handles(Object *p_object) const { + Control *ctrl = Object::cast_to<Control>(p_object); + if (!ctrl) { + return false; + } else { + bool valid = false; + ctrl->get("text", &valid); + return valid; + } +} + +TextControlEditor::TextControlEditor() { + add_child(memnew(VSeparator)); + + font_list = memnew(OptionButton); + font_list->set_flat(true); + font_list->set_tooltip(TTR("Font")); + add_child(font_list); + font_list->connect("item_selected", callable_mp(this, &TextControlEditor::_font_selected)); + + font_style_list = memnew(OptionButton); + font_style_list->set_flat(true); + font_style_list->set_tooltip(TTR("Font style")); + font_style_list->set_toggle_mode(true); + add_child(font_style_list); + font_style_list->connect("item_selected", callable_mp(this, &TextControlEditor::_font_style_selected)); + + font_size_list = memnew(SpinBox); + font_size_list->set_tooltip(TTR("Font Size")); + font_size_list->get_line_edit()->add_theme_constant_override("minimum_character_width", 2); + font_size_list->set_min(6); + font_size_list->set_step(1); + font_size_list->set_max(96); + font_size_list->get_line_edit()->set_flat(true); + add_child(font_size_list); + font_size_list->connect("value_changed", callable_mp(this, &TextControlEditor::_font_size_selected)); + + font_color_picker = memnew(ColorPickerButton); + font_color_picker->set_custom_minimum_size(Size2(20, 0) * EDSCALE); + font_color_picker->set_flat(true); + font_color_picker->set_tooltip(TTR("Text Color")); + add_child(font_color_picker); + font_color_picker->connect("color_changed", callable_mp(this, &TextControlEditor::_font_color_changed)); + + add_child(memnew(VSeparator)); + + outline_size_list = memnew(SpinBox); + outline_size_list->set_tooltip(TTR("Outline Size")); + outline_size_list->get_line_edit()->add_theme_constant_override("minimum_character_width", 2); + outline_size_list->set_min(0); + outline_size_list->set_step(1); + outline_size_list->set_max(96); + outline_size_list->get_line_edit()->set_flat(true); + add_child(outline_size_list); + outline_size_list->connect("value_changed", callable_mp(this, &TextControlEditor::_outline_size_selected)); + + outline_color_picker = memnew(ColorPickerButton); + outline_color_picker->set_custom_minimum_size(Size2(20, 0) * EDSCALE); + outline_color_picker->set_flat(true); + outline_color_picker->set_tooltip(TTR("Outline Color")); + add_child(outline_color_picker); + outline_color_picker->connect("color_changed", callable_mp(this, &TextControlEditor::_outline_color_changed)); + + add_child(memnew(VSeparator)); + + clear_formatting = memnew(Button); + clear_formatting->set_flat(true); + clear_formatting->set_tooltip(TTR("Clear Formatting")); + add_child(clear_formatting); + clear_formatting->connect("pressed", callable_mp(this, &TextControlEditor::_clear_formatting)); +} + +/*************************************************************************/ + +void TextControlEditorPlugin::edit(Object *p_object) { + text_ctl_editor->edit(p_object); +} + +bool TextControlEditorPlugin::handles(Object *p_object) const { + return text_ctl_editor->handles(p_object); +} + +void TextControlEditorPlugin::make_visible(bool p_visible) { + if (p_visible) { + text_ctl_editor->show(); + } else { + text_ctl_editor->hide(); + text_ctl_editor->edit(nullptr); + } +} + +TextControlEditorPlugin::TextControlEditorPlugin(EditorNode *p_node) { + editor = p_node; + text_ctl_editor = memnew(TextControlEditor); + CanvasItemEditor::get_singleton()->add_control_to_menu_panel(text_ctl_editor); + + text_ctl_editor->hide(); +} diff --git a/editor/plugins/text_control_editor_plugin.h b/editor/plugins/text_control_editor_plugin.h new file mode 100644 index 0000000000..7f4aa3754c --- /dev/null +++ b/editor/plugins/text_control_editor_plugin.h @@ -0,0 +1,119 @@ +/*************************************************************************/ +/* text_control_editor_plugin.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef TEXT_CONTROL_EDITOR_PLUGIN_H +#define TEXT_CONTROL_EDITOR_PLUGIN_H + +#include "canvas_item_editor_plugin.h" +#include "editor/editor_file_system.h" +#include "editor/editor_inspector.h" +#include "editor/editor_node.h" +#include "editor/editor_plugin.h" +#include "scene/gui/color_rect.h" +#include "scene/gui/menu_button.h" +#include "scene/gui/option_button.h" +#include "scene/gui/popup_menu.h" + +/*************************************************************************/ + +class TextControlEditor : public HBoxContainer { + GDCLASS(TextControlEditor, HBoxContainer); + + enum FontInfoID { + FONT_INFO_THEME_DEFAULT = 0, + FONT_INFO_USER_CUSTOM = 1, + FONT_INFO_ID = 100, + }; + + Map<String, Map<String, String>> fonts; + + OptionButton *font_list = nullptr; + SpinBox *font_size_list = nullptr; + OptionButton *font_style_list = nullptr; + ColorPickerButton *font_color_picker = nullptr; + SpinBox *outline_size_list = nullptr; + ColorPickerButton *outline_color_picker = nullptr; + Button *clear_formatting = nullptr; + + Control *edited_control = nullptr; + String edited_color; + String edited_font; + String edited_font_size; + Ref<Font> custom_font; + +protected: + void _notification(int p_notification); + static void _bind_methods(){}; + + void _find_resources(EditorFileSystemDirectory *p_dir); + void _reload_fonts(const String &p_path); + + void _update_fonts_menu(); + void _update_styles_menu(); + void _update_control(); + + void _font_selected(int p_id); + void _font_style_selected(int p_id); + void _set_font(); + + void _font_size_selected(double p_size); + void _outline_size_selected(double p_size); + + void _font_color_changed(const Color &p_color); + void _outline_color_changed(const Color &p_color); + + void _clear_formatting(); + +public: + void edit(Object *p_object); + bool handles(Object *p_object) const; + + TextControlEditor(); +}; + +/*************************************************************************/ + +class TextControlEditorPlugin : public EditorPlugin { + GDCLASS(TextControlEditorPlugin, EditorPlugin); + + TextControlEditor *text_ctl_editor; + EditorNode *editor; + +public: + virtual String get_name() const override { return "TextControlFontEditor"; } + bool has_main_screen() const override { return false; } + virtual void edit(Object *p_object) override; + virtual bool handles(Object *p_object) const override; + virtual void make_visible(bool p_visible) override; + + TextControlEditorPlugin(EditorNode *p_node); +}; + +#endif // TEXT_CONTROL_EDITOR_PLUGIN_H diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index 1fc7eb98e0..e252792c43 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -65,18 +65,21 @@ void TextEditor::_load_theme_settings() { String TextEditor::get_name() { String name; - if (text_file->get_path().find("local://") == -1 && text_file->get_path().find("::") == -1) { - name = text_file->get_path().get_file(); - if (is_unsaved()) { - if (text_file->get_path().is_empty()) { - name = TTR("[unsaved]"); - } - name += "(*)"; + name = text_file->get_path().get_file(); + if (name.is_empty()) { + // This appears for newly created built-in text_files before saving the scene. + name = TTR("[unsaved]"); + } else if (text_file->is_built_in()) { + const String &text_file_name = text_file->get_name(); + if (text_file_name != "") { + // If the built-in text_file has a custom resource name defined, + // display the built-in text_file name as follows: `ResourceName (scene_file.tscn)` + name = vformat("%s (%s)", text_file_name, name.get_slice("::", 0)); } - } else if (text_file->get_name() != "") { - name = text_file->get_name(); - } else { - name = text_file->get_class() + "(" + itos(text_file->get_instance_id()) + ")"; + } + + if (is_unsaved()) { + name += "(*)"; } return name; @@ -422,7 +425,7 @@ void TextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { Ref<InputEventMouseButton> mb = ev; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) { + if (mb->get_button_index() == MouseButton::RIGHT) { CodeEdit *tx = code_editor->get_text_editor(); Point2i pos = tx->get_line_column_at_pos(mb->get_global_position() - tx->get_global_position()); @@ -505,7 +508,7 @@ void TextEditor::_make_context_menu(bool p_selection, bool p_can_fold, bool p_is context_menu->set_item_disabled(context_menu->get_item_index(EDIT_REDO), !tx->has_redo()); context_menu->set_position(get_global_transform().xform(p_position)); - context_menu->set_size(Vector2(1, 1)); + context_menu->reset_size(); context_menu->popup(); } diff --git a/editor/plugins/texture_3d_editor_plugin.cpp b/editor/plugins/texture_3d_editor_plugin.cpp index bd1923f4ab..b4e394a1c0 100644 --- a/editor/plugins/texture_3d_editor_plugin.cpp +++ b/editor/plugins/texture_3d_editor_plugin.cpp @@ -173,7 +173,7 @@ Texture3DEditor::Texture3DEditor() { info->set_v_grow_direction(GROW_DIRECTION_BEGIN); info->add_theme_color_override("font_color", Color(1, 1, 1, 1)); info->add_theme_color_override("font_shadow_color", Color(0, 0, 0, 0.5)); - info->add_theme_constant_override("shadow_as_outline", 1); + info->add_theme_constant_override("shadow_outline_size", 1); info->add_theme_constant_override("shadow_offset_x", 2); info->add_theme_constant_override("shadow_offset_y", 2); diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp index b9ec6bf5ab..e25b0270b4 100644 --- a/editor/plugins/texture_editor_plugin.cpp +++ b/editor/plugins/texture_editor_plugin.cpp @@ -101,7 +101,7 @@ TexturePreview::TexturePreview(Ref<Texture2D> p_texture, bool p_show_metadata) { metadata_label->add_theme_color_override("font_outline_color", Color::named("black")); metadata_label->add_theme_constant_override("outline_size", 2 * EDSCALE); - metadata_label->add_theme_constant_override("shadow_as_outline", 1); + metadata_label->add_theme_constant_override("shadow_outline_size", 1); metadata_label->set_h_size_flags(Control::SIZE_SHRINK_END); metadata_label->set_v_size_flags(Control::SIZE_SHRINK_END); diff --git a/editor/plugins/texture_layered_editor_plugin.cpp b/editor/plugins/texture_layered_editor_plugin.cpp index 424e018a47..1f536d13cf 100644 --- a/editor/plugins/texture_layered_editor_plugin.cpp +++ b/editor/plugins/texture_layered_editor_plugin.cpp @@ -38,7 +38,7 @@ void TextureLayeredEditor::gui_input(const Ref<InputEvent> &p_event) { ERR_FAIL_COND(p_event.is_null()); Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { y_rot += -mm->get_relative().x * 0.01; x_rot += mm->get_relative().y * 0.01; _update_material(); @@ -249,7 +249,7 @@ TextureLayeredEditor::TextureLayeredEditor() { info->set_v_grow_direction(GROW_DIRECTION_BEGIN); info->add_theme_color_override("font_color", Color(1, 1, 1, 1)); info->add_theme_color_override("font_shadow_color", Color(0, 0, 0, 0.5)); - info->add_theme_constant_override("shadow_as_outline", 1); + info->add_theme_constant_override("shadow_outline_size", 1); info->add_theme_constant_override("shadow_offset_x", 2); info->add_theme_constant_override("shadow_offset_y", 2); diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index ce90d61616..8e1c81a876 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -284,7 +284,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseButton> mb = p_input; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { if (node_ninepatch || obj_styleBox.is_valid()) { edited_margin = -1; @@ -330,7 +330,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { for (const Rect2 &E : autoslice_cache) { if (E.has_point(point)) { rect = E; - if (Input::get_singleton()->is_key_pressed(KEY_CTRL) && !(Input::get_singleton()->is_key_pressed(Key(KEY_SHIFT | KEY_ALT)))) { + if (Input::get_singleton()->is_key_pressed(Key::CTRL) && !(Input::get_singleton()->is_key_pressed(Key(Key::SHIFT | Key::ALT)))) { Rect2 r; if (atlas_tex.is_valid()) { r = atlas_tex->get_region(); @@ -446,7 +446,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { creating = false; } - } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { + } else if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) { if (drag) { drag = false; if (edited_margin >= 0) { @@ -465,9 +465,9 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { drag_index = -1; } } - } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed()) { + } else if (mb->get_button_index() == MouseButton::WHEEL_UP && mb->is_pressed()) { _zoom_on_position(draw_zoom * ((0.95 + (0.05 * mb->get_factor())) / 0.95), mb->get_position()); - } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed()) { + } else if (mb->get_button_index() == MouseButton::WHEEL_DOWN && mb->is_pressed()) { _zoom_on_position(draw_zoom * (1 - (0.05 * mb->get_factor())), mb->get_position()); } } @@ -475,7 +475,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseMotion> mm = p_input; if (mm.is_valid()) { - if (mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { + if ((mm->get_button_mask() & MouseButton::MASK_MIDDLE) != MouseButton::NONE || Input::get_singleton()->is_key_pressed(Key::SPACE)) { Vector2 dragged(mm->get_relative().x / draw_zoom, mm->get_relative().y / draw_zoom); hscroll->set_value(hscroll->get_value() - dragged.x); vscroll->set_value(vscroll->get_value() - dragged.y); diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index 19e1b40a0d..f62dbfc2cc 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -1711,13 +1711,13 @@ void ThemeItemEditorDialog::_edit_theme_item_gui_input(const Ref<InputEvent> &p_ } switch (k->get_keycode()) { - case KEY_KP_ENTER: - case KEY_ENTER: { + case Key::KP_ENTER: + case Key::ENTER: { _confirm_edit_theme_item(); edit_theme_item_dialog->hide(); edit_theme_item_dialog->set_input_as_handled(); } break; - case KEY_ESCAPE: { + case Key::ESCAPE: { edit_theme_item_dialog->hide(); edit_theme_item_dialog->set_input_as_handled(); } break; @@ -2581,11 +2581,11 @@ void ThemeTypeEditor::_update_type_items() { } // Various type settings. - if (ClassDB::class_exists(edited_type)) { + if (edited_type.is_empty() || ClassDB::class_exists(edited_type)) { type_variation_edit->set_editable(false); type_variation_edit->set_text(""); type_variation_button->hide(); - type_variation_locked->show(); + type_variation_locked->set_visible(!edited_type.is_empty()); } else { type_variation_edit->set_editable(true); type_variation_edit->set_text(edited_theme->get_type_variation_base(edited_type)); @@ -2848,7 +2848,7 @@ void ThemeTypeEditor::_font_size_item_changed(float p_value, String p_item_name) edited_theme->set_font_size(p_item_name, edited_type, int(p_value)); } -void ThemeTypeEditor::_edit_resource_item(RES p_resource) { +void ThemeTypeEditor::_edit_resource_item(RES p_resource, bool p_edit) { EditorNode::get_singleton()->edit_resource(p_resource); } @@ -3204,7 +3204,7 @@ void ThemeEditor::_add_preview_tab(ThemeEditorPreview *p_preview_tab, const Stri preview_tabs->add_tab(p_preview_name, p_icon); preview_tabs_content->add_child(p_preview_tab); - preview_tabs->set_tab_right_button(preview_tabs->get_tab_count() - 1, EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("close"), SNAME("Tabs"))); + preview_tabs->set_tab_right_button(preview_tabs->get_tab_count() - 1, EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("close"), SNAME("TabBar"))); p_preview_tab->connect("control_picked", callable_mp(this, &ThemeEditor::_preview_control_picked)); preview_tabs->set_current_tab(preview_tabs->get_tab_count() - 1); @@ -3328,8 +3328,8 @@ ThemeEditor::ThemeEditor() { preview_tabs_content->set_draw_behind_parent(true); preview_tabs_vb->add_child(preview_tabs_content); - preview_tabs = memnew(Tabs); - preview_tabs->set_tab_align(Tabs::ALIGN_LEFT); + preview_tabs = memnew(TabBar); + preview_tabs->set_tab_align(TabBar::ALIGN_LEFT); preview_tabs->set_h_size_flags(SIZE_EXPAND_FILL); preview_tabbar_hb->add_child(preview_tabs); preview_tabs->connect("tab_changed", callable_mp(this, &ThemeEditor::_change_preview_tab)); diff --git a/editor/plugins/theme_editor_plugin.h b/editor/plugins/theme_editor_plugin.h index 5b0357e3f8..f5ad577aff 100644 --- a/editor/plugins/theme_editor_plugin.h +++ b/editor/plugins/theme_editor_plugin.h @@ -34,7 +34,7 @@ #include "scene/gui/margin_container.h" #include "scene/gui/option_button.h" #include "scene/gui/scroll_container.h" -#include "scene/gui/tabs.h" +#include "scene/gui/tab_bar.h" #include "scene/gui/texture_rect.h" #include "scene/resources/theme.h" #include "theme_editor_preview.h" @@ -347,7 +347,6 @@ class ThemeTypeEditor : public MarginContainer { void _update_type_items(); void _list_type_selected(int p_index); - void _select_type(String p_type_name); void _add_type_button_cbk(); void _add_default_type_items(); @@ -363,7 +362,7 @@ class ThemeTypeEditor : public MarginContainer { void _color_item_changed(Color p_value, String p_item_name); void _constant_item_changed(float p_value, String p_item_name); void _font_size_item_changed(float p_value, String p_item_name); - void _edit_resource_item(RES p_resource); + void _edit_resource_item(RES p_resource, bool p_edit); void _font_item_changed(Ref<Font> p_value, String p_item_name); void _icon_item_changed(Ref<Texture2D> p_value, String p_item_name); void _stylebox_item_changed(Ref<StyleBox> p_value, String p_item_name); @@ -391,7 +390,7 @@ class ThemeEditor : public VBoxContainer { Ref<Theme> theme; - Tabs *preview_tabs; + TabBar *preview_tabs; PanelContainer *preview_tabs_content; Button *add_preview_button; EditorFileDialog *preview_scene_dialog; diff --git a/editor/plugins/theme_editor_preview.cpp b/editor/plugins/theme_editor_preview.cpp index d26d0ec39d..86b0fc0eaf 100644 --- a/editor/plugins/theme_editor_preview.cpp +++ b/editor/plugins/theme_editor_preview.cpp @@ -71,6 +71,9 @@ void ThemeEditorPreview::_preview_visibility_changed() { void ThemeEditorPreview::_picker_button_cbk() { picker_overlay->set_visible(picker_button->is_pressed()); + if (picker_button->is_pressed()) { + _reset_picker_overlay(); + } } Control *ThemeEditorPreview::_find_hovered_control(Control *p_parent, Vector2 p_mouse_position) { @@ -117,7 +120,7 @@ void ThemeEditorPreview::_draw_picker_overlay() { } Rect2 highlight_label_rect = highlight_rect; - highlight_label_rect.size = theme_cache.preview_picker_font->get_string_size(highlight_name); + highlight_label_rect.size = theme_cache.preview_picker_font->get_string_size(highlight_name, theme_cache.font_size); int margin_top = theme_cache.preview_picker_label->get_margin(SIDE_TOP); int margin_left = theme_cache.preview_picker_label->get_margin(SIDE_LEFT); @@ -133,7 +136,7 @@ void ThemeEditorPreview::_draw_picker_overlay() { Point2 label_pos = highlight_label_rect.position; label_pos.y += highlight_label_rect.size.y - margin_bottom; label_pos.x += margin_left; - picker_overlay->draw_string(theme_cache.preview_picker_font, label_pos, highlight_name); + picker_overlay->draw_string(theme_cache.preview_picker_font, label_pos, highlight_name, HALIGN_LEFT, -1, theme_cache.font_size); } } @@ -144,7 +147,7 @@ void ThemeEditorPreview::_gui_input_picker_overlay(const Ref<InputEvent> &p_even Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { if (hovered_control) { StringName theme_type = hovered_control->get_theme_type_variation(); if (theme_type == StringName()) { @@ -154,6 +157,7 @@ void ThemeEditorPreview::_gui_input_picker_overlay(const Ref<InputEvent> &p_even emit_signal(SNAME("control_picked"), theme_type); picker_button->set_pressed(false); picker_overlay->set_visible(false); + return; } } @@ -164,6 +168,9 @@ void ThemeEditorPreview::_gui_input_picker_overlay(const Ref<InputEvent> &p_even hovered_control = _find_hovered_control(preview_content, mp); picker_overlay->update(); } + + // Forward input to the scroll container underneath to allow scrolling. + preview_container->gui_input(p_event); } void ThemeEditorPreview::_reset_picker_overlay() { @@ -188,6 +195,7 @@ void ThemeEditorPreview::_notification(int p_what) { theme_cache.preview_picker_overlay_color = get_theme_color(SNAME("preview_picker_overlay_color"), SNAME("ThemeEditor")); theme_cache.preview_picker_label = get_theme_stylebox(SNAME("preview_picker_label"), SNAME("ThemeEditor")); theme_cache.preview_picker_font = get_theme_font(SNAME("status_source"), SNAME("EditorFonts")); + theme_cache.font_size = get_theme_font_size(SNAME("font_size"), SNAME("EditorFonts")); } break; case NOTIFICATION_PROCESS: { time_left -= get_process_delta_time(); @@ -219,7 +227,7 @@ ThemeEditorPreview::ThemeEditorPreview() { preview_body->set_v_size_flags(SIZE_EXPAND_FILL); add_child(preview_body); - ScrollContainer *preview_container = memnew(ScrollContainer); + preview_container = memnew(ScrollContainer); preview_container->set_enable_v_scroll(true); preview_container->set_enable_h_scroll(true); preview_body->add_child(preview_container); diff --git a/editor/plugins/theme_editor_preview.h b/editor/plugins/theme_editor_preview.h index 4e1b149e70..73422b4fba 100644 --- a/editor/plugins/theme_editor_preview.h +++ b/editor/plugins/theme_editor_preview.h @@ -55,6 +55,7 @@ class ThemeEditorPreview : public VBoxContainer { GDCLASS(ThemeEditorPreview, VBoxContainer); + ScrollContainer *preview_container; ColorRect *preview_bg; MarginContainer *preview_overlay; Control *picker_overlay; @@ -65,6 +66,7 @@ class ThemeEditorPreview : public VBoxContainer { Color preview_picker_overlay_color; Ref<StyleBox> preview_picker_label; Ref<Font> preview_picker_font; + int font_size = 16; } theme_cache; double time_left = 0; diff --git a/editor/plugins/tiles/atlas_merging_dialog.cpp b/editor/plugins/tiles/atlas_merging_dialog.cpp index 2a8a3216ed..efccac7b74 100644 --- a/editor/plugins/tiles/atlas_merging_dialog.cpp +++ b/editor/plugins/tiles/atlas_merging_dialog.cpp @@ -118,6 +118,7 @@ void AtlasMergingDialog::_generate_merged(Vector<Ref<TileSetAtlasSource>> p_atla output_image_texture.instantiate(); output_image_texture->create_from_image(output_image); + merged->set_name(p_atlas_sources[0]->get_name()); merged->set_texture(output_image_texture); merged->set_texture_region_size(new_texture_region_size); } diff --git a/editor/plugins/tiles/tile_atlas_view.cpp b/editor/plugins/tiles/tile_atlas_view.cpp index f21d5098d3..604143ef93 100644 --- a/editor/plugins/tiles/tile_atlas_view.cpp +++ b/editor/plugins/tiles/tile_atlas_view.cpp @@ -46,7 +46,7 @@ void TileAtlasView::gui_input(const Ref<InputEvent> &p_event) { if (mb.is_valid()) { drag_type = DRAG_TYPE_NONE; - Vector2i scroll_vec = Vector2((mb->get_button_index() == MOUSE_BUTTON_WHEEL_LEFT) - (mb->get_button_index() == MOUSE_BUTTON_WHEEL_RIGHT), (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) - (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN)); + Vector2i scroll_vec = Vector2((mb->get_button_index() == MouseButton::WHEEL_LEFT) - (mb->get_button_index() == MouseButton::WHEEL_RIGHT), (mb->get_button_index() == MouseButton::WHEEL_UP) - (mb->get_button_index() == MouseButton::WHEEL_DOWN)); if (scroll_vec != Vector2()) { if (mb->is_ctrl_pressed()) { if (mb->is_shift_pressed()) { @@ -69,7 +69,7 @@ void TileAtlasView::gui_input(const Ref<InputEvent> &p_event) { } } - if (mb->get_button_index() == MOUSE_BUTTON_MIDDLE || mb->get_button_index() == MOUSE_BUTTON_RIGHT) { + if (mb->get_button_index() == MouseButton::MIDDLE || mb->get_button_index() == MouseButton::RIGHT) { if (mb->is_pressed()) { drag_type = DRAG_TYPE_PAN; } else { @@ -97,15 +97,6 @@ Size2i TileAtlasView::_compute_base_tiles_control_size() { if (texture.is_valid()) { size = texture->get_size(); } - - // Extend the size to all existing tiles. - Size2i grid_size = tile_set_atlas_source->get_atlas_grid_size(); - for (int i = 0; i < tile_set_atlas_source->get_tiles_count(); i++) { - Vector2i tile_id = tile_set_atlas_source->get_tile_id(i); - grid_size = grid_size.max(tile_id + Vector2i(1, 1)); - } - size = size.max(grid_size * (tile_set_atlas_source->get_texture_region_size() + tile_set_atlas_source->get_separation()) + tile_set_atlas_source->get_margins()); - return size; } @@ -213,43 +204,56 @@ void TileAtlasView::_draw_base_tiles() { Ref<Texture2D> texture = tile_set_atlas_source->get_texture(); if (texture.is_valid()) { Vector2i margins = tile_set_atlas_source->get_margins(); + Vector2i separation = tile_set_atlas_source->get_separation(); Vector2i texture_region_size = tile_set_atlas_source->get_texture_region_size(); - - // Draw the texture, square by square. Size2i grid_size = tile_set_atlas_source->get_atlas_grid_size(); + + // Draw the texture where there is no tile. for (int x = 0; x < grid_size.x; x++) { for (int y = 0; y < grid_size.y; y++) { Vector2i coords = Vector2i(x, y); if (tile_set_atlas_source->get_tile_at_coords(coords) == TileSetSource::INVALID_ATLAS_COORDS) { - Rect2i rect = Rect2i(texture_region_size * coords + margins, texture_region_size); - base_tiles_draw->draw_texture_rect_region(texture, rect, rect); + Rect2i rect = Rect2i((texture_region_size + separation) * coords + margins, texture_region_size + separation); + rect = rect.intersection(Rect2i(Vector2(), texture->get_size())); + if (rect.size.x > 0 && rect.size.y > 0) { + base_tiles_draw->draw_texture_rect_region(texture, rect, rect); + base_tiles_draw->draw_rect(rect, Color(0.0, 0.0, 0.0, 0.5)); + } } } } // Draw the texture around the grid. Rect2i rect; + // Top. rect.position = Vector2i(); rect.set_end(Vector2i(texture->get_size().x, margins.y)); base_tiles_draw->draw_texture_rect_region(texture, rect, rect); + base_tiles_draw->draw_rect(rect, Color(0.0, 0.0, 0.0, 0.5)); + // Bottom - int bottom_border = margins.y + (grid_size.y * texture_region_size.y); + int bottom_border = margins.y + (grid_size.y * (texture_region_size.y + separation.y)); if (bottom_border < texture->get_size().y) { rect.position = Vector2i(0, bottom_border); rect.set_end(texture->get_size()); base_tiles_draw->draw_texture_rect_region(texture, rect, rect); + base_tiles_draw->draw_rect(rect, Color(0.0, 0.0, 0.0, 0.5)); } + // Left rect.position = Vector2i(0, margins.y); - rect.set_end(Vector2i(margins.x, margins.y + (grid_size.y * texture_region_size.y))); + rect.set_end(Vector2i(margins.x, margins.y + (grid_size.y * (texture_region_size.y + separation.y)))); base_tiles_draw->draw_texture_rect_region(texture, rect, rect); + base_tiles_draw->draw_rect(rect, Color(0.0, 0.0, 0.0, 0.5)); + // Right. - int right_border = margins.x + (grid_size.x * texture_region_size.x); + int right_border = margins.x + (grid_size.x * (texture_region_size.x + separation.x)); if (right_border < texture->get_size().x) { rect.position = Vector2i(right_border, margins.y); - rect.set_end(Vector2i(texture->get_size().x, margins.y + (grid_size.y * texture_region_size.y))); + rect.set_end(Vector2i(texture->get_size().x, margins.y + (grid_size.y * (texture_region_size.y + separation.y)))); base_tiles_draw->draw_texture_rect_region(texture, rect, rect); + base_tiles_draw->draw_rect(rect, Color(0.0, 0.0, 0.0, 0.5)); } // Draw actual tiles, using their properties (modulation, etc...) @@ -258,12 +262,30 @@ void TileAtlasView::_draw_base_tiles() { for (int frame = 0; frame < tile_set_atlas_source->get_tile_animation_frames_count(atlas_coords); frame++) { // Update the y to max value. - int animation_columns = tile_set_atlas_source->get_tile_animation_columns(atlas_coords); - Vector2i frame_coords = atlas_coords + (tile_set_atlas_source->get_tile_size_in_atlas(atlas_coords) + tile_set_atlas_source->get_tile_animation_separation(atlas_coords)) * ((animation_columns > 0) ? Vector2i(frame % animation_columns, frame / animation_columns) : Vector2i(frame, 0)); - Vector2i offset_pos = (margins + (frame_coords * texture_region_size) + tile_set_atlas_source->get_tile_texture_region(atlas_coords, frame).size / 2 + tile_set_atlas_source->get_tile_effective_texture_offset(atlas_coords, 0)); + Rect2i base_frame_rect = tile_set_atlas_source->get_tile_texture_region(atlas_coords, frame); + Vector2i offset_pos = base_frame_rect.get_center() + tile_set_atlas_source->get_tile_effective_texture_offset(atlas_coords, 0); // Draw the tile. TileMap::draw_tile(base_tiles_draw->get_canvas_item(), offset_pos, tile_set, source_id, atlas_coords, 0, frame); + + // Draw, the texture in the separation areas + if (separation.x > 0) { + Rect2i right_sep_rect = Rect2i(base_frame_rect.get_position() + Vector2i(base_frame_rect.size.x, 0), Vector2i(separation.x, base_frame_rect.size.y)); + right_sep_rect = right_sep_rect.intersection(Rect2i(Vector2(), texture->get_size())); + if (right_sep_rect.size.x > 0 && right_sep_rect.size.y > 0) { + base_tiles_draw->draw_texture_rect_region(texture, right_sep_rect, right_sep_rect); + base_tiles_draw->draw_rect(right_sep_rect, Color(0.0, 0.0, 0.0, 0.5)); + } + } + + if (separation.y > 0) { + Rect2i bottom_sep_rect = Rect2i(base_frame_rect.get_position() + Vector2i(0, base_frame_rect.size.y), Vector2i(base_frame_rect.size.x + separation.x, separation.y)); + bottom_sep_rect = bottom_sep_rect.intersection(Rect2i(Vector2(), texture->get_size())); + if (bottom_sep_rect.size.x > 0 && bottom_sep_rect.size.y > 0) { + base_tiles_draw->draw_texture_rect_region(texture, bottom_sep_rect, bottom_sep_rect); + base_tiles_draw->draw_rect(bottom_sep_rect, Color(0.0, 0.0, 0.0, 0.5)); + } + } } } } @@ -299,30 +321,6 @@ void TileAtlasView::_draw_base_tiles_texture_grid() { } } -void TileAtlasView::_draw_base_tiles_dark() { - Ref<Texture2D> texture = tile_set_atlas_source->get_texture(); - if (texture.is_valid()) { - Vector2i margins = tile_set_atlas_source->get_margins(); - Vector2i separation = tile_set_atlas_source->get_separation(); - Vector2i texture_region_size = tile_set_atlas_source->get_texture_region_size(); - - Size2i grid_size = tile_set_atlas_source->get_atlas_grid_size(); - - // Draw each tile texture region. - for (int x = 0; x < grid_size.x; x++) { - for (int y = 0; y < grid_size.y; y++) { - Vector2i origin = margins + (Vector2i(x, y) * (texture_region_size + separation)); - Vector2i base_tile_coords = tile_set_atlas_source->get_tile_at_coords(Vector2i(x, y)); - - if (base_tile_coords == TileSetSource::INVALID_ATLAS_COORDS) { - // Draw the grid. - base_tiles_dark->draw_rect(Rect2i(origin, texture_region_size), Color(0.0, 0.0, 0.0, 0.5), true); - } - } - } - } -} - void TileAtlasView::_draw_base_tiles_shape_grid() { // Draw the shapes. Color grid_color = EditorSettings::get_singleton()->get("editors/tiles_editor/grid_color"); @@ -453,7 +451,6 @@ void TileAtlasView::set_atlas_source(TileSet *p_tile_set, TileSetAtlasSource *p_ base_tiles_draw->update(); base_tiles_texture_grid->update(); base_tiles_shape_grid->update(); - base_tiles_dark->update(); alternatives_draw->update(); background_left->update(); background_right->update(); @@ -544,7 +541,6 @@ void TileAtlasView::update() { base_tiles_draw->update(); base_tiles_texture_grid->update(); base_tiles_shape_grid->update(); - base_tiles_dark->update(); alternatives_draw->update(); background_left->update(); background_right->update(); @@ -660,12 +656,6 @@ TileAtlasView::TileAtlasView() { base_tiles_shape_grid->connect("draw", callable_mp(this, &TileAtlasView::_draw_base_tiles_shape_grid)); base_tiles_drawing_root->add_child(base_tiles_shape_grid); - base_tiles_dark = memnew(Control); - base_tiles_dark->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); - base_tiles_dark->set_anchors_and_offsets_preset(Control::PRESET_WIDE); - base_tiles_dark->connect("draw", callable_mp(this, &TileAtlasView::_draw_base_tiles_dark)); - base_tiles_drawing_root->add_child(base_tiles_dark); - // Alternative tiles. Label *alternative_tiles_label = memnew(Label); alternative_tiles_label->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); diff --git a/editor/plugins/tiles/tile_atlas_view.h b/editor/plugins/tiles/tile_atlas_view.h index 5b0df366ae..e1ca3eebee 100644 --- a/editor/plugins/tiles/tile_atlas_view.h +++ b/editor/plugins/tiles/tile_atlas_view.h @@ -93,9 +93,6 @@ private: Control *base_tiles_shape_grid; void _draw_base_tiles_shape_grid(); - Control *base_tiles_dark; - void _draw_base_tiles_dark(); - Size2i _compute_base_tiles_control_size(); // Right side. @@ -124,7 +121,6 @@ public: // Left side. void set_texture_grid_visible(bool p_visible) { base_tiles_texture_grid->set_visible(p_visible); }; - void set_dark_visible(bool p_visible) { base_tiles_dark->set_visible(p_visible); }; void set_tile_shape_grid_visible(bool p_visible) { base_tiles_shape_grid->set_visible(p_visible); }; Vector2i get_atlas_tile_coords_at_pos(const Vector2 p_pos) const; diff --git a/editor/plugins/tiles/tile_data_editors.cpp b/editor/plugins/tiles/tile_data_editors.cpp index 1a69d19d3c..44cf6b42bc 100644 --- a/editor/plugins/tiles/tile_data_editors.cpp +++ b/editor/plugins/tiles/tile_data_editors.cpp @@ -38,8 +38,16 @@ #include "editor/editor_properties.h" #include "editor/editor_scale.h" -void TileDataEditor::_call_tile_set_changed() { - _tile_set_changed(); +void TileDataEditor::_tile_set_changed_plan_update() { + _tile_set_changed_update_needed = true; + call_deferred("_tile_set_changed_deferred_update"); +} + +void TileDataEditor::_tile_set_changed_deferred_update() { + if (_tile_set_changed_update_needed) { + _tile_set_changed(); + _tile_set_changed_update_needed = false; + } } TileData *TileDataEditor::_get_tile_data(TileMapCell p_cell) { @@ -59,18 +67,20 @@ TileData *TileDataEditor::_get_tile_data(TileMapCell p_cell) { } void TileDataEditor::_bind_methods() { + ClassDB::bind_method(D_METHOD("_tile_set_changed_deferred_update"), &TileDataEditor::_tile_set_changed_deferred_update); + ADD_SIGNAL(MethodInfo("needs_redraw")); } void TileDataEditor::set_tile_set(Ref<TileSet> p_tile_set) { if (tile_set.is_valid()) { - tile_set->disconnect("changed", callable_mp(this, &TileDataEditor::_call_tile_set_changed)); + tile_set->disconnect("changed", callable_mp(this, &TileDataEditor::_tile_set_changed_plan_update)); } tile_set = p_tile_set; if (tile_set.is_valid()) { - tile_set->connect("changed", callable_mp(this, &TileDataEditor::_call_tile_set_changed)); + tile_set->connect("changed", callable_mp(this, &TileDataEditor::_tile_set_changed_plan_update)); } - _call_tile_set_changed(); + _tile_set_changed_plan_update(); } bool DummyObject::_set(const StringName &p_name, const Variant &p_value) { @@ -115,7 +125,14 @@ void GenericTilePolygonEditor::_base_control_draw() { Color grid_color = EditorSettings::get_singleton()->get("editors/tiles_editor/grid_color"); const Ref<Texture2D> handle = get_theme_icon(SNAME("EditorPathSharpHandle"), SNAME("EditorIcons")); const Ref<Texture2D> add_handle = get_theme_icon(SNAME("EditorHandleAdd"), SNAME("EditorIcons")); + const Ref<StyleBox> focus_stylebox = get_theme_stylebox(SNAME("Focus"), SNAME("EditorStyles")); + // Draw the focus rectangle. + if (base_control->has_focus()) { + base_control->draw_style_box(focus_stylebox, Rect2(Vector2(), base_control->get_size())); + } + + // Draw tile-related things. Size2 tile_size = tile_set->get_tile_size(); Transform2D xform; @@ -230,9 +247,10 @@ void GenericTilePolygonEditor::_zoom_changed() { } void GenericTilePolygonEditor::_advanced_menu_item_pressed(int p_item_pressed) { + UndoRedo *undo_redo = use_undo_redo ? editor_undo_redo : memnew(UndoRedo); switch (p_item_pressed) { case RESET_TO_DEFAULT_TILE: { - undo_redo->create_action(TTR("Edit Polygons")); + undo_redo->create_action(TTR("Reset Polygons")); undo_redo->add_do_method(this, "clear_polygons"); Vector<Vector2> polygon = tile_set->get_tile_shape_polygon(); for (int i = 0; i < polygon.size(); i++) { @@ -250,7 +268,7 @@ void GenericTilePolygonEditor::_advanced_menu_item_pressed(int p_item_pressed) { undo_redo->commit_action(true); } break; case CLEAR_TILE: { - undo_redo->create_action(TTR("Edit Polygons")); + undo_redo->create_action(TTR("Clear Polygons")); undo_redo->add_do_method(this, "clear_polygons"); undo_redo->add_do_method(base_control, "update"); undo_redo->add_do_method(this, "emit_signal", "polygons_changed"); @@ -262,9 +280,50 @@ void GenericTilePolygonEditor::_advanced_menu_item_pressed(int p_item_pressed) { undo_redo->add_undo_method(this, "emit_signal", "polygons_changed"); undo_redo->commit_action(true); } break; + case ROTATE_RIGHT: + case ROTATE_LEFT: + case FLIP_HORIZONTALLY: + case FLIP_VERTICALLY: { + undo_redo->create_action(TTR("Rotate Polygons Left")); + for (unsigned int i = 0; i < polygons.size(); i++) { + Vector<Point2> new_polygon; + for (int point_index = 0; point_index < polygons[i].size(); point_index++) { + Vector2 point = polygons[i][point_index]; + switch (p_item_pressed) { + case ROTATE_RIGHT: { + point = Vector2(-point.y, point.x); + } break; + case ROTATE_LEFT: { + point = Vector2(point.y, -point.x); + } break; + case FLIP_HORIZONTALLY: { + point = Vector2(-point.x, point.y); + } break; + case FLIP_VERTICALLY: { + point = Vector2(point.x, -point.y); + } break; + default: + break; + } + new_polygon.push_back(point); + } + undo_redo->add_do_method(this, "set_polygon", i, new_polygon); + } + undo_redo->add_do_method(base_control, "update"); + undo_redo->add_do_method(this, "emit_signal", "polygons_changed"); + for (unsigned int i = 0; i < polygons.size(); i++) { + undo_redo->add_undo_method(this, "set_polygon", polygons[i]); + } + undo_redo->add_undo_method(base_control, "update"); + undo_redo->add_undo_method(this, "emit_signal", "polygons_changed"); + undo_redo->commit_action(true); + } break; default: break; } + if (!use_undo_redo) { + memdelete(undo_redo); + } } void GenericTilePolygonEditor::_grab_polygon_point(Vector2 p_pos, const Transform2D &p_polygon_xform, int &r_polygon_index, int &r_point_index) { @@ -349,6 +408,7 @@ void GenericTilePolygonEditor::_snap_to_half_pixel(Point2 &r_point) { } void GenericTilePolygonEditor::_base_control_gui_input(Ref<InputEvent> p_event) { + UndoRedo *undo_redo = use_undo_redo ? editor_undo_redo : memnew(UndoRedo); real_t grab_threshold = EDITOR_GET("editors/polygon_editor/point_grab_radius"); hovered_polygon_index = -1; @@ -389,15 +449,15 @@ void GenericTilePolygonEditor::_base_control_gui_input(Ref<InputEvent> p_event) Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_ctrl_pressed()) { + if (mb->get_button_index() == MouseButton::WHEEL_UP && mb->is_ctrl_pressed()) { editor_zoom_widget->set_zoom_by_increments(1); _zoom_changed(); accept_event(); - } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_ctrl_pressed()) { + } else if (mb->get_button_index() == MouseButton::WHEEL_DOWN && mb->is_ctrl_pressed()) { editor_zoom_widget->set_zoom_by_increments(-1); _zoom_changed(); accept_event(); - } else if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + } else if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { if (tools_button_group->get_pressed_button() != button_create) { in_creation_polygon.clear(); @@ -456,7 +516,7 @@ void GenericTilePolygonEditor::_base_control_gui_input(Ref<InputEvent> p_event) _grab_polygon_point(mb->get_position(), xform, closest_polygon, closest_point); if (closest_polygon >= 0) { PackedVector2Array old_polygon = polygons[closest_polygon]; - polygons[closest_polygon].remove(closest_point); + polygons[closest_polygon].remove_at(closest_point); undo_redo->create_action(TTR("Edit Polygons")); if (polygons[closest_polygon].size() < 3) { remove_polygon(closest_polygon); @@ -494,7 +554,7 @@ void GenericTilePolygonEditor::_base_control_gui_input(Ref<InputEvent> p_event) drag_point_index = -1; } - } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) { + } else if (mb->get_button_index() == MouseButton::RIGHT) { if (mb->is_pressed()) { if (tools_button_group->get_pressed_button() == button_edit) { // Remove point or pan. @@ -503,7 +563,7 @@ void GenericTilePolygonEditor::_base_control_gui_input(Ref<InputEvent> p_event) _grab_polygon_point(mb->get_position(), xform, closest_polygon, closest_point); if (closest_polygon >= 0) { PackedVector2Array old_polygon = polygons[closest_polygon]; - polygons[closest_polygon].remove(closest_point); + polygons[closest_polygon].remove_at(closest_point); undo_redo->create_action(TTR("Edit Polygons")); if (polygons[closest_polygon].size() < 3) { remove_polygon(closest_polygon); @@ -528,7 +588,7 @@ void GenericTilePolygonEditor::_base_control_gui_input(Ref<InputEvent> p_event) } else { drag_type = DRAG_TYPE_NONE; } - } else if (mb->get_button_index() == MOUSE_BUTTON_MIDDLE) { + } else if (mb->get_button_index() == MouseButton::MIDDLE) { if (mb->is_pressed()) { drag_type = DRAG_TYPE_PAN; drag_last_pos = mb->get_position(); @@ -539,21 +599,47 @@ void GenericTilePolygonEditor::_base_control_gui_input(Ref<InputEvent> p_event) } base_control->update(); + + if (!use_undo_redo) { + memdelete(undo_redo); + } +} + +void GenericTilePolygonEditor::set_use_undo_redo(bool p_use_undo_redo) { + use_undo_redo = p_use_undo_redo; } void GenericTilePolygonEditor::set_tile_set(Ref<TileSet> p_tile_set) { - if (tile_set != p_tile_set) { - // Set the default tile shape - clear_polygons(); - if (p_tile_set.is_valid()) { - Vector<Vector2> polygon = p_tile_set->get_tile_shape_polygon(); - for (int i = 0; i < polygon.size(); i++) { - polygon.write[i] = polygon[i] * p_tile_set->get_tile_size(); - } - add_polygon(polygon); + ERR_FAIL_COND(!p_tile_set.is_valid()); + if (tile_set == p_tile_set) { + return; + } + + // Set the default tile shape + clear_polygons(); + if (p_tile_set.is_valid()) { + Vector<Vector2> polygon = p_tile_set->get_tile_shape_polygon(); + for (int i = 0; i < polygon.size(); i++) { + polygon.write[i] = polygon[i] * p_tile_set->get_tile_size(); } + add_polygon(polygon); } + tile_set = p_tile_set; + + // Set the default zoom value. + int default_control_y_size = 200 * EDSCALE; + Vector2 zoomed_tile = editor_zoom_widget->get_zoom() * tile_set->get_tile_size(); + while (zoomed_tile.y < default_control_y_size) { + editor_zoom_widget->set_zoom_by_increments(6, false); + zoomed_tile = editor_zoom_widget->get_zoom() * tile_set->get_tile_size(); + } + while (zoomed_tile.y > default_control_y_size) { + editor_zoom_widget->set_zoom_by_increments(-6, false); + zoomed_tile = editor_zoom_widget->get_zoom() * tile_set->get_tile_size(); + } + editor_zoom_widget->set_zoom_by_increments(-6, false); + _zoom_changed(); } void GenericTilePolygonEditor::set_background(Ref<Texture2D> p_texture, Rect2 p_region, Vector2 p_offset, bool p_flip_h, bool p_flip_v, bool p_transpose, Color p_modulate) { @@ -590,7 +676,7 @@ int GenericTilePolygonEditor::add_polygon(Vector<Point2> p_polygon, int p_index) void GenericTilePolygonEditor::remove_polygon(int p_index) { ERR_FAIL_INDEX(p_index, (int)polygons.size()); - polygons.remove(p_index); + polygons.remove_at(p_index); if (polygons.size() == 0) { button_create->set_pressed(true); @@ -634,6 +720,12 @@ void GenericTilePolygonEditor::_notification(int p_what) { button_center_view->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("CenterView"), SNAME("EditorIcons"))); button_pixel_snap->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Snap"), SNAME("EditorIcons"))); button_advanced_menu->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); + + PopupMenu *p = button_advanced_menu->get_popup(); + p->set_item_icon(p->get_item_index(ROTATE_RIGHT), get_theme_icon(SNAME("RotateRight"), SNAME("EditorIcons"))); + p->set_item_icon(p->get_item_index(ROTATE_LEFT), get_theme_icon(SNAME("RotateLeft"), SNAME("EditorIcons"))); + p->set_item_icon(p->get_item_index(FLIP_HORIZONTALLY), get_theme_icon(SNAME("MirrorX"), SNAME("EditorIcons"))); + p->set_item_icon(p->get_item_index(FLIP_VERTICALLY), get_theme_icon(SNAME("MirrorY"), SNAME("EditorIcons"))); break; } } @@ -660,18 +752,21 @@ GenericTilePolygonEditor::GenericTilePolygonEditor() { button_create->set_toggle_mode(true); button_create->set_button_group(tools_button_group); button_create->set_pressed(true); + button_create->set_tooltip(TTR("Add polygon tool")); toolbar->add_child(button_create); button_edit = memnew(Button); button_edit->set_flat(true); button_edit->set_toggle_mode(true); button_edit->set_button_group(tools_button_group); + button_edit->set_tooltip(TTR("Edit points tool")); toolbar->add_child(button_edit); button_delete = memnew(Button); button_delete->set_flat(true); button_delete->set_toggle_mode(true); button_delete->set_button_group(tools_button_group); + button_delete->set_tooltip(TTR("Delete points tool")); toolbar->add_child(button_delete); button_advanced_menu = memnew(MenuButton); @@ -679,7 +774,13 @@ GenericTilePolygonEditor::GenericTilePolygonEditor() { button_advanced_menu->set_toggle_mode(true); button_advanced_menu->get_popup()->add_item(TTR("Reset to default tile shape"), RESET_TO_DEFAULT_TILE); button_advanced_menu->get_popup()->add_item(TTR("Clear"), CLEAR_TILE); + button_advanced_menu->get_popup()->add_separator(); + button_advanced_menu->get_popup()->add_icon_item(get_theme_icon(SNAME("RotateRight"), SNAME("EditorIcons")), TTR("Rotate Right"), ROTATE_RIGHT); + button_advanced_menu->get_popup()->add_icon_item(get_theme_icon(SNAME("RotateLeft"), SNAME("EditorIcons")), TTR("Rotate Left"), ROTATE_LEFT); + button_advanced_menu->get_popup()->add_icon_item(get_theme_icon(SNAME("MirrorX"), SNAME("EditorIcons")), TTR("Flip Horizontally"), FLIP_HORIZONTALLY); + button_advanced_menu->get_popup()->add_icon_item(get_theme_icon(SNAME("MirrorY"), SNAME("EditorIcons")), TTR("Flip Vertically"), FLIP_VERTICALLY); button_advanced_menu->get_popup()->connect("id_pressed", callable_mp(this, &GenericTilePolygonEditor::_advanced_menu_item_pressed)); + button_advanced_menu->set_focus_mode(FOCUS_ALL); toolbar->add_child(button_advanced_menu); toolbar->add_child(memnew(VSeparator)); @@ -688,6 +789,7 @@ GenericTilePolygonEditor::GenericTilePolygonEditor() { button_pixel_snap->set_flat(true); button_pixel_snap->set_toggle_mode(true); button_pixel_snap->set_pressed(true); + button_pixel_snap->set_tooltip(TTR("Snap to half-pixel")); toolbar->add_child(button_pixel_snap); Control *root = memnew(Control); @@ -707,6 +809,7 @@ GenericTilePolygonEditor::GenericTilePolygonEditor() { base_control->connect("draw", callable_mp(this, &GenericTilePolygonEditor::_base_control_draw)); base_control->connect("gui_input", callable_mp(this, &GenericTilePolygonEditor::_base_control_gui_input)); base_control->set_clip_contents(true); + base_control->set_focus_mode(Control::FOCUS_CLICK); root->add_child(base_control); editor_zoom_widget = memnew(EditorZoomWidget); @@ -826,7 +929,7 @@ void TileDataDefaultEditor::forward_painting_atlas_gui_input(TileAtlasView *p_ti Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { if (picker_button->is_pressed()) { Vector2i coords = p_tile_atlas_view->get_atlas_tile_coords_at_pos(mb->get_position()); @@ -917,7 +1020,7 @@ void TileDataDefaultEditor::forward_painting_alternatives_gui_input(TileAtlasVie Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { if (picker_button->is_pressed()) { Vector3i tile = p_tile_atlas_view->get_alternative_tile_at_pos(mb->get_position()); @@ -977,6 +1080,7 @@ void TileDataDefaultEditor::draw_over_tile(CanvasItem *p_canvas_item, Transform2 p_canvas_item->draw_rect(rect, value); } else { Ref<Font> font = TileSetEditor::get_singleton()->get_theme_font(SNAME("bold"), SNAME("EditorFonts")); + int font_size = TileSetEditor::get_singleton()->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts")); String text; switch (value.get_type()) { case Variant::INT: @@ -1008,8 +1112,8 @@ void TileDataDefaultEditor::draw_over_tile(CanvasItem *p_canvas_item, Transform2 } } - Vector2 string_size = font->get_string_size(text); - p_canvas_item->draw_string(font, p_transform.get_origin() + Vector2i(-string_size.x / 2, string_size.y / 2), text, HALIGN_CENTER, string_size.x, -1, color, 1, Color(0, 0, 0, 1)); + Vector2 string_size = font->get_string_size(text, font_size); + p_canvas_item->draw_string(font, p_transform.get_origin() + Vector2i(-string_size.x / 2, string_size.y / 2), text, HALIGN_CENTER, string_size.x, font_size, color, 1, Color(0, 0, 0, 1)); } } @@ -1071,7 +1175,7 @@ TileDataDefaultEditor::TileDataDefaultEditor() { picker_button = memnew(Button); picker_button->set_flat(true); picker_button->set_toggle_mode(true); - picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", KEY_P)); + picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", Key::P)); toolbar->add_child(picker_button); } @@ -1421,7 +1525,7 @@ TileDataCollisionEditor::TileDataCollisionEditor() { angular_velocity_editor->connect("property_changed", callable_mp(this, &TileDataCollisionEditor::_property_value_changed).unbind(1)); angular_velocity_editor->update_property(); add_child(angular_velocity_editor); - property_editors["angular_velocity"] = linear_velocity_editor; + property_editors["angular_velocity"] = angular_velocity_editor; _polygons_changed(); } @@ -1572,6 +1676,7 @@ void TileDataTerrainsEditor::forward_draw_over_atlas(TileAtlasView *p_tile_atlas // Dim terrains with wrong terrain set. Ref<Font> font = TileSetEditor::get_singleton()->get_theme_font(SNAME("bold"), SNAME("EditorFonts")); + int font_size = TileSetEditor::get_singleton()->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts")); for (int i = 0; i < p_tile_set_atlas_source->get_tiles_count(); i++) { Vector2i coords = p_tile_set_atlas_source->get_tile_id(i); if (coords != hovered_coords) { @@ -1594,8 +1699,8 @@ void TileDataTerrainsEditor::forward_draw_over_atlas(TileAtlasView *p_tile_atlas } else { text = "-"; } - Vector2 string_size = font->get_string_size(text); - p_canvas_item->draw_string(font, p_transform.xform(position) + Vector2i(-string_size.x / 2, string_size.y / 2), text, HALIGN_CENTER, string_size.x, -1, color, 1, Color(0, 0, 0, 1)); + Vector2 string_size = font->get_string_size(text, font_size); + p_canvas_item->draw_string(font, p_transform.xform(position) + Vector2i(-string_size.x / 2, string_size.y / 2), text, HALIGN_CENTER, string_size.x, font_size, color, 1, Color(0, 0, 0, 1)); } } } @@ -1745,6 +1850,7 @@ void TileDataTerrainsEditor::forward_draw_over_alternatives(TileAtlasView *p_til // Dim terrains with wrong terrain set. Ref<Font> font = TileSetEditor::get_singleton()->get_theme_font(SNAME("bold"), SNAME("EditorFonts")); + int font_size = TileSetEditor::get_singleton()->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts")); for (int i = 0; i < p_tile_set_atlas_source->get_tiles_count(); i++) { Vector2i coords = p_tile_set_atlas_source->get_tile_id(i); for (int j = 1; j < p_tile_set_atlas_source->get_alternative_tiles_count(coords); j++) { @@ -1769,8 +1875,8 @@ void TileDataTerrainsEditor::forward_draw_over_alternatives(TileAtlasView *p_til } else { text = "-"; } - Vector2 string_size = font->get_string_size(text); - p_canvas_item->draw_string(font, p_transform.xform(position) + Vector2i(-string_size.x / 2, string_size.y / 2), text, HALIGN_CENTER, string_size.x, -1, color, 1, Color(0, 0, 0, 1)); + Vector2 string_size = font->get_string_size(text, font_size); + p_canvas_item->draw_string(font, p_transform.xform(position) + Vector2i(-string_size.x / 2, string_size.y / 2), text, HALIGN_CENTER, string_size.x, font_size, color, 1, Color(0, 0, 0, 1)); } } } @@ -1860,7 +1966,7 @@ void TileDataTerrainsEditor::forward_painting_atlas_gui_input(TileAtlasView *p_t Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { if (picker_button->is_pressed()) { Vector2i coords = p_tile_atlas_view->get_atlas_tile_coords_at_pos(mb->get_position()); @@ -2201,7 +2307,7 @@ void TileDataTerrainsEditor::forward_painting_alternatives_gui_input(TileAtlasVi Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { if (picker_button->is_pressed()) { Vector3i tile = p_tile_atlas_view->get_alternative_tile_at_pos(mb->get_position()); @@ -2372,7 +2478,7 @@ TileDataTerrainsEditor::TileDataTerrainsEditor() { picker_button = memnew(Button); picker_button->set_flat(true); picker_button->set_toggle_mode(true); - picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", KEY_P)); + picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", Key::P)); toolbar->add_child(picker_button); // Setup diff --git a/editor/plugins/tiles/tile_data_editors.h b/editor/plugins/tiles/tile_data_editors.h index 99998dc779..3fc5e738bb 100644 --- a/editor/plugins/tiles/tile_data_editors.h +++ b/editor/plugins/tiles/tile_data_editors.h @@ -45,7 +45,9 @@ class TileDataEditor : public VBoxContainer { GDCLASS(TileDataEditor, VBoxContainer); private: - void _call_tile_set_changed(); + bool _tile_set_changed_update_needed = false; + void _tile_set_changed_plan_update(); + void _tile_set_changed_deferred_update(); protected: Ref<TileSet> tile_set; @@ -92,7 +94,8 @@ private: LocalVector<Vector<Point2>> polygons; bool multiple_polygon_mode = false; - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + bool use_undo_redo = true; + UndoRedo *editor_undo_redo = EditorNode::get_undo_redo(); // UI int hovered_polygon_index = -1; @@ -106,7 +109,7 @@ private: DRAG_TYPE_CREATE_POINT, DRAG_TYPE_PAN, }; - DragType drag_type; + DragType drag_type = DRAG_TYPE_NONE; int drag_polygon_index; int drag_point_index; Vector2 drag_last_pos; @@ -141,6 +144,10 @@ private: enum AdvancedMenuOption { RESET_TO_DEFAULT_TILE, CLEAR_TILE, + ROTATE_RIGHT, + ROTATE_LEFT, + FLIP_HORIZONTALLY, + FLIP_VERTICALLY, }; void _base_control_draw(); @@ -159,6 +166,8 @@ protected: static void _bind_methods(); public: + void set_use_undo_redo(bool p_use_undo_redo); + void set_tile_set(Ref<TileSet> p_tile_set); void set_background(Ref<Texture2D> p_texture, Rect2 p_region = Rect2(), Vector2 p_offset = Vector2(), bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false, Color p_modulate = Color(1.0, 1.0, 1.0, 0.0)); diff --git a/editor/plugins/tiles/tile_map_editor.cpp b/editor/plugins/tiles/tile_map_editor.cpp index c2e86f8b43..fd2648a469 100644 --- a/editor/plugins/tiles/tile_map_editor.cpp +++ b/editor/plugins/tiles/tile_map_editor.cpp @@ -36,6 +36,7 @@ #include "editor/editor_scale.h" #include "editor/plugins/canvas_item_editor_plugin.h" +#include "scene/2d/camera_2d.h" #include "scene/gui/center_container.h" #include "scene/gui/split_container.h" @@ -43,31 +44,11 @@ #include "core/math/geometry_2d.h" #include "core/os/keyboard.h" -void TileMapEditorTilesPlugin::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: - select_tool_button->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); - paint_tool_button->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); - line_tool_button->set_icon(get_theme_icon(SNAME("CurveLinear"), SNAME("EditorIcons"))); - rect_tool_button->set_icon(get_theme_icon(SNAME("Rectangle"), SNAME("EditorIcons"))); - bucket_tool_button->set_icon(get_theme_icon(SNAME("Bucket"), SNAME("EditorIcons"))); - - picker_button->set_icon(get_theme_icon(SNAME("ColorPick"), SNAME("EditorIcons"))); - erase_button->set_icon(get_theme_icon(SNAME("Eraser"), SNAME("EditorIcons"))); - - missing_atlas_texture_icon = get_theme_icon(SNAME("TileSet"), SNAME("EditorIcons")); - break; - case NOTIFICATION_VISIBILITY_CHANGED: - _stop_dragging(); - break; - } -} - void TileMapEditorTilesPlugin::tile_set_changed() { _update_fix_selected_and_hovered(); _update_tile_set_sources_list(); - _update_bottom_panel(); + _update_source_display(); + _update_patterns_list(); } void TileMapEditorTilesPlugin::_on_random_tile_checkbox_toggled(bool p_pressed) { @@ -118,15 +99,26 @@ void TileMapEditorTilesPlugin::_update_toolbar() { picker_button->show(); erase_button->show(); tools_settings_vsep_2->show(); - bucket_continuous_checkbox->show(); + bucket_contiguous_checkbox->show(); random_tile_checkbox->show(); scatter_label->show(); scatter_spinbox->show(); } } -Control *TileMapEditorTilesPlugin::get_toolbar() const { - return toolbar; +Vector<TileMapEditorPlugin::TabData> TileMapEditorTilesPlugin::get_tabs() const { + Vector<TileMapEditorPlugin::TabData> tabs; + tabs.push_back({ toolbar, tiles_bottom_panel }); + tabs.push_back({ toolbar, patterns_bottom_panel }); + return tabs; +} + +void TileMapEditorTilesPlugin::_tab_changed() { + if (tiles_bottom_panel->is_visible_in_tree()) { + _update_selection_pattern_from_tileset_tiles_selection(); + } else if (patterns_bottom_panel->is_visible_in_tree()) { + _update_selection_pattern_from_tileset_pattern_selection(); + } } void TileMapEditorTilesPlugin::_update_tile_set_sources_list() { @@ -152,22 +144,31 @@ void TileMapEditorTilesPlugin::_update_tile_set_sources_list() { Ref<Texture2D> texture; String item_text; + // Common to all type of sources. + if (!source->get_name().is_empty()) { + item_text = vformat(TTR("%s (id:%d)"), source->get_name(), source_id); + } + // Atlas source. TileSetAtlasSource *atlas_source = Object::cast_to<TileSetAtlasSource>(source); if (atlas_source) { texture = atlas_source->get_texture(); - if (texture.is_valid()) { - item_text = vformat("%s (ID: %d)", texture->get_path().get_file(), source_id); - } else { - item_text = vformat("No Texture Atlas Source (ID: %d)", source_id); + if (item_text.is_empty()) { + if (texture.is_valid()) { + item_text = vformat("%s (ID: %d)", texture->get_path().get_file(), source_id); + } else { + item_text = vformat("No Texture Atlas Source (ID: %d)", source_id); + } } } // Scene collection source. TileSetScenesCollectionSource *scene_collection_source = Object::cast_to<TileSetScenesCollectionSource>(source); if (scene_collection_source) { - texture = get_theme_icon(SNAME("PackedScene"), SNAME("EditorIcons")); - item_text = vformat(TTR("Scene Collection Source (ID: %d)"), source_id); + texture = tiles_bottom_panel->get_theme_icon(SNAME("PackedScene"), SNAME("EditorIcons")); + if (item_text.is_empty()) { + item_text = vformat(TTR("Scene Collection Source (ID: %d)"), source_id); + } } // Use default if not valid. @@ -193,10 +194,10 @@ void TileMapEditorTilesPlugin::_update_tile_set_sources_list() { } // Synchronize - TilesEditor::get_singleton()->set_sources_lists_current(sources_list->get_current()); + TilesEditorPlugin::get_singleton()->set_sources_lists_current(sources_list->get_current()); } -void TileMapEditorTilesPlugin::_update_bottom_panel() { +void TileMapEditorTilesPlugin::_update_source_display() { // Update the atlas display. TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { @@ -243,6 +244,81 @@ void TileMapEditorTilesPlugin::_update_bottom_panel() { } } +void TileMapEditorTilesPlugin::_patterns_item_list_gui_input(const Ref<InputEvent> &p_event) { + TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); + if (!tile_map) { + return; + } + + Ref<TileSet> tile_set = tile_map->get_tileset(); + if (!tile_set.is_valid()) { + return; + } + + if (ED_IS_SHORTCUT("tiles_editor/paste", p_event) && p_event->is_pressed() && !p_event->is_echo()) { + select_last_pattern = true; + int new_pattern_index = tile_set->get_patterns_count(); + undo_redo->create_action(TTR("Add TileSet pattern")); + undo_redo->add_do_method(*tile_set, "add_pattern", tile_map_clipboard, new_pattern_index); + undo_redo->add_undo_method(*tile_set, "remove_pattern", new_pattern_index); + undo_redo->commit_action(); + patterns_item_list->accept_event(); + } + + if (ED_IS_SHORTCUT("tiles_editor/delete", p_event) && p_event->is_pressed() && !p_event->is_echo()) { + Vector<int> selected = patterns_item_list->get_selected_items(); + undo_redo->create_action(TTR("Remove TileSet patterns")); + for (int i = 0; i < selected.size(); i++) { + int pattern_index = selected[i]; + undo_redo->add_do_method(*tile_set, "remove_pattern", pattern_index); + undo_redo->add_undo_method(*tile_set, "add_pattern", tile_set->get_pattern(pattern_index), pattern_index); + } + undo_redo->commit_action(); + patterns_item_list->accept_event(); + } +} + +void TileMapEditorTilesPlugin::_pattern_preview_done(Ref<TileMapPattern> p_pattern, Ref<Texture2D> p_texture) { + // TODO optimize ? + for (int i = 0; i < patterns_item_list->get_item_count(); i++) { + if (patterns_item_list->get_item_metadata(i) == p_pattern) { + patterns_item_list->set_item_icon(i, p_texture); + break; + } + } +} + +void TileMapEditorTilesPlugin::_update_patterns_list() { + TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); + if (!tile_map) { + return; + } + + Ref<TileSet> tile_set = tile_map->get_tileset(); + if (!tile_set.is_valid()) { + return; + } + + // Recreate the items. + patterns_item_list->clear(); + for (int i = 0; i < tile_set->get_patterns_count(); i++) { + int id = patterns_item_list->add_item(""); + patterns_item_list->set_item_metadata(id, tile_set->get_pattern(i)); + TilesEditorPlugin::get_singleton()->queue_pattern_preview(tile_set, tile_set->get_pattern(i), callable_mp(this, &TileMapEditorTilesPlugin::_pattern_preview_done)); + } + + // Update the label visibility. + patterns_help_label->set_visible(patterns_item_list->get_item_count() == 0); + + // Added a new pattern, thus select the last one. + if (select_last_pattern) { + patterns_item_list->select(tile_set->get_patterns_count() - 1); + patterns_item_list->grab_focus(); + _update_selection_pattern_from_tileset_pattern_selection(); + } + select_last_pattern = false; +} + void TileMapEditorTilesPlugin::_update_atlas_view() { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { @@ -260,7 +336,7 @@ void TileMapEditorTilesPlugin::_update_atlas_view() { ERR_FAIL_COND(!atlas_source); tile_atlas_view->set_atlas_source(*tile_map->get_tileset(), atlas_source, source_id); - TilesEditor::get_singleton()->synchronize_atlas_view(tile_atlas_view); + TilesEditorPlugin::get_singleton()->synchronize_atlas_view(tile_atlas_view); tile_atlas_control->update(); } @@ -295,7 +371,7 @@ void TileMapEditorTilesPlugin::_update_scenes_collection_view() { Variant udata = i; EditorResourcePreview::get_singleton()->queue_edited_resource_preview(scene, this, "_scene_thumbnail_done", udata); } else { - item_index = scene_tiles_list->add_item(TTR("Tile with Invalid Scene"), get_theme_icon(SNAME("PackedScene"), SNAME("EditorIcons"))); + item_index = scene_tiles_list->add_item(TTR("Tile with Invalid Scene"), tiles_bottom_panel->get_theme_icon(SNAME("PackedScene"), SNAME("EditorIcons"))); } scene_tiles_list->set_item_metadata(item_index, scene_id); @@ -339,7 +415,7 @@ void TileMapEditorTilesPlugin::_scenes_list_multi_selected(int p_index, bool p_s TileMapCell selected = TileMapCell(source_id, Vector2i(), scene_id); // Clear the selection if shift is not pressed. - if (!Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (!Input::get_singleton()->is_key_pressed(Key::SHIFT)) { tile_set_selection.clear(); } @@ -351,19 +427,32 @@ void TileMapEditorTilesPlugin::_scenes_list_multi_selected(int p_index, bool p_s } } - _update_selection_pattern_from_tileset_selection(); + _update_selection_pattern_from_tileset_tiles_selection(); } void TileMapEditorTilesPlugin::_scenes_list_nothing_selected() { scene_tiles_list->deselect_all(); tile_set_selection.clear(); tile_map_selection.clear(); - selection_pattern->clear(); - _update_selection_pattern_from_tileset_selection(); + selection_pattern.instantiate(); + _update_selection_pattern_from_tileset_tiles_selection(); +} + +void TileMapEditorTilesPlugin::_update_theme() { + select_tool_button->set_icon(tiles_bottom_panel->get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); + paint_tool_button->set_icon(tiles_bottom_panel->get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); + line_tool_button->set_icon(tiles_bottom_panel->get_theme_icon(SNAME("CurveLinear"), SNAME("EditorIcons"))); + rect_tool_button->set_icon(tiles_bottom_panel->get_theme_icon(SNAME("Rectangle"), SNAME("EditorIcons"))); + bucket_tool_button->set_icon(tiles_bottom_panel->get_theme_icon(SNAME("Bucket"), SNAME("EditorIcons"))); + + picker_button->set_icon(tiles_bottom_panel->get_theme_icon(SNAME("ColorPick"), SNAME("EditorIcons"))); + erase_button->set_icon(tiles_bottom_panel->get_theme_icon(SNAME("Eraser"), SNAME("EditorIcons"))); + + missing_atlas_texture_icon = tiles_bottom_panel->get_theme_icon(SNAME("TileSet"), SNAME("EditorIcons")); } bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p_event) { - if (!is_visible_in_tree()) { + if (!(tiles_bottom_panel->is_visible_in_tree() || patterns_bottom_panel->is_visible_in_tree())) { // If the bottom editor is not visible, we ignore inputs. return false; } @@ -391,7 +480,7 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p if (ED_IS_SHORTCUT("tiles_editor/cut", p_event) || ED_IS_SHORTCUT("tiles_editor/copy", p_event)) { // Fill in the clipboard. if (!tile_map_selection.is_empty()) { - memdelete(tile_map_clipboard); + tile_map_clipboard.instantiate(); TypedArray<Vector2i> coords_array; for (Set<Vector2i>::Element *E = tile_map_selection.front(); E; E = E->next()) { coords_array.push_back(E->get()); @@ -454,9 +543,9 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p switch (drag_type) { case DRAG_TYPE_PAINT: { - Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, drag_last_mouse_pos, mpos); + Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, drag_last_mouse_pos, mpos, drag_erasing); for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { - if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) { + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { continue; } Vector2i coords = E.key; @@ -471,9 +560,9 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p Vector<Vector2i> line = TileMapEditor::get_line(tile_map, tile_map->world_to_map(drag_last_mouse_pos), tile_map->world_to_map(mpos)); for (int i = 0; i < line.size(); i++) { if (!drag_modified.has(line[i])) { - Map<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_continuous_checkbox->is_pressed()); + Map<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_contiguous_checkbox->is_pressed(), drag_erasing); for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { - if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) { + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { continue; } Vector2i coords = E.key; @@ -501,11 +590,18 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * tile_map->get_global_transform(); Vector2 mpos = xform.affine_inverse().xform(mb->get_position()); - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT || mb->get_button_index() == MouseButton::RIGHT) { if (mb->is_pressed()) { // Pressed + if (erase_button->is_pressed() || mb->get_button_index() == MouseButton::RIGHT) { + drag_erasing = true; + } + if (drag_type == DRAG_TYPE_CLIPBOARD_PASTE) { - // Do nothing. + // Cancel tile pasting on right-click + if (mb->get_button_index() == MouseButton::RIGHT) { + drag_type = DRAG_TYPE_NONE; + } } else if (tool_buttons_group->get_pressed_button() == select_tool_button) { drag_start_mouse_pos = mpos; if (tile_map_selection.has(tile_map->world_to_map(drag_start_mouse_pos)) && !mb->is_shift_pressed()) { @@ -524,18 +620,18 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p } } else { // Check if we are picking a tile. - if (picker_button->is_pressed()) { + if (picker_button->is_pressed() || (Input::get_singleton()->is_key_pressed(Key::CTRL) && !Input::get_singleton()->is_key_pressed(Key::SHIFT))) { drag_type = DRAG_TYPE_PICK; drag_start_mouse_pos = mpos; } else { // Paint otherwise. - if (tool_buttons_group->get_pressed_button() == paint_tool_button) { + if (tool_buttons_group->get_pressed_button() == paint_tool_button && !Input::get_singleton()->is_key_pressed(Key::CTRL) && !Input::get_singleton()->is_key_pressed(Key::SHIFT)) { drag_type = DRAG_TYPE_PAINT; drag_start_mouse_pos = mpos; drag_modified.clear(); - Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, mpos, mpos); + Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, mpos, mpos, drag_erasing); for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { - if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) { + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { continue; } Vector2i coords = E.key; @@ -545,11 +641,11 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); } _fix_invalid_tiles_in_tile_map_selection(); - } else if (tool_buttons_group->get_pressed_button() == line_tool_button) { + } else if (tool_buttons_group->get_pressed_button() == line_tool_button || (tool_buttons_group->get_pressed_button() == paint_tool_button && Input::get_singleton()->is_key_pressed(Key::SHIFT) && !Input::get_singleton()->is_key_pressed(Key::CTRL))) { drag_type = DRAG_TYPE_LINE; drag_start_mouse_pos = mpos; drag_modified.clear(); - } else if (tool_buttons_group->get_pressed_button() == rect_tool_button) { + } else if (tool_buttons_group->get_pressed_button() == rect_tool_button || (tool_buttons_group->get_pressed_button() == paint_tool_button && Input::get_singleton()->is_key_pressed(Key::SHIFT) && Input::get_singleton()->is_key_pressed(Key::CTRL))) { drag_type = DRAG_TYPE_RECT; drag_start_mouse_pos = mpos; drag_modified.clear(); @@ -560,9 +656,9 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p Vector<Vector2i> line = TileMapEditor::get_line(tile_map, tile_map->world_to_map(drag_last_mouse_pos), tile_map->world_to_map(mpos)); for (int i = 0; i < line.size(); i++) { if (!drag_modified.has(line[i])) { - Map<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_continuous_checkbox->is_pressed()); + Map<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_contiguous_checkbox->is_pressed(), drag_erasing); for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { - if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) { + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { continue; } Vector2i coords = E.key; @@ -581,6 +677,7 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p } else { // Released _stop_dragging(); + drag_erasing = false; } CanvasItemEditor::get_singleton()->update_viewport(); @@ -617,9 +714,9 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over Vector2i tile_shape_size = tile_set->get_tile_size(); // Draw the selection. - if (is_visible_in_tree() && tool_buttons_group->get_pressed_button() == select_tool_button) { + if ((tiles_bottom_panel->is_visible_in_tree() || patterns_bottom_panel->is_visible_in_tree()) && tool_buttons_group->get_pressed_button() == select_tool_button) { // In select mode, we only draw the current selection if we are modifying it (pressing control or shift). - if (drag_type == DRAG_TYPE_MOVE || (drag_type == DRAG_TYPE_SELECT && !Input::get_singleton()->is_key_pressed(KEY_CTRL) && !Input::get_singleton()->is_key_pressed(KEY_SHIFT))) { + if (drag_type == DRAG_TYPE_MOVE || (drag_type == DRAG_TYPE_SELECT && !Input::get_singleton()->is_key_pressed(Key::CTRL) && !Input::get_singleton()->is_key_pressed(Key::SHIFT))) { // Do nothing } else { Color grid_color = EditorSettings::get_singleton()->get("editors/tiles_editor/grid_color"); @@ -629,12 +726,12 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over } // Handle the preview of the tiles to be placed. - if (is_visible_in_tree() && has_mouse) { // Only if the tilemap editor is opened and the viewport is hovered. + if ((tiles_bottom_panel->is_visible_in_tree() || patterns_bottom_panel->is_visible_in_tree()) && has_mouse) { // Only if the tilemap editor is opened and the viewport is hovered. Map<Vector2i, TileMapCell> preview; Rect2i drawn_grid_rect; if (drag_type == DRAG_TYPE_PICK) { - // Draw the area being picvked. + // Draw the area being picked. Rect2i rect = Rect2i(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(drag_last_mouse_pos) - tile_map->world_to_map(drag_start_mouse_pos)).abs(); rect.size += Vector2i(1, 1); for (int x = rect.position.x; x < rect.get_end().x; x++) { @@ -663,21 +760,23 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over } tile_map->draw_cells_outline(p_overlay, to_draw, Color(1.0, 1.0, 1.0), xform); } else if (drag_type == DRAG_TYPE_MOVE) { - // Preview when moving. - Vector2i top_left; - if (!tile_map_selection.is_empty()) { - top_left = tile_map_selection.front()->get(); - } - for (Set<Vector2i>::Element *E = tile_map_selection.front(); E; E = E->next()) { - top_left = top_left.min(E->get()); - } - Vector2i offset = drag_start_mouse_pos - tile_map->map_to_world(top_left); - offset = tile_map->world_to_map(drag_last_mouse_pos - offset) - tile_map->world_to_map(drag_start_mouse_pos - offset); + if (!(patterns_item_list->is_visible_in_tree() && patterns_item_list->has_point(patterns_item_list->get_local_mouse_position()))) { + // Preview when moving. + Vector2i top_left; + if (!tile_map_selection.is_empty()) { + top_left = tile_map_selection.front()->get(); + } + for (Set<Vector2i>::Element *E = tile_map_selection.front(); E; E = E->next()) { + top_left = top_left.min(E->get()); + } + Vector2i offset = drag_start_mouse_pos - tile_map->map_to_world(top_left); + offset = tile_map->world_to_map(drag_last_mouse_pos - offset) - tile_map->world_to_map(drag_start_mouse_pos - offset); - TypedArray<Vector2i> selection_used_cells = selection_pattern->get_used_cells(); - for (int i = 0; i < selection_used_cells.size(); i++) { - Vector2i coords = tile_map->map_pattern(offset + top_left, selection_used_cells[i], selection_pattern); - preview[coords] = TileMapCell(selection_pattern->get_cell_source_id(selection_used_cells[i]), selection_pattern->get_cell_atlas_coords(selection_used_cells[i]), selection_pattern->get_cell_alternative_tile(selection_used_cells[i])); + TypedArray<Vector2i> selection_used_cells = selection_pattern->get_used_cells(); + for (int i = 0; i < selection_used_cells.size(); i++) { + Vector2i coords = tile_map->map_pattern(offset + top_left, selection_used_cells[i], selection_pattern); + preview[coords] = TileMapCell(selection_pattern->get_cell_source_id(selection_used_cells[i]), selection_pattern->get_cell_atlas_coords(selection_used_cells[i]), selection_pattern->get_cell_alternative_tile(selection_used_cells[i])); + } } } else if (drag_type == DRAG_TYPE_CLIPBOARD_PASTE) { // Preview when pasting. @@ -687,29 +786,29 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over Vector2i coords = tile_map->map_pattern(tile_map->world_to_map(drag_last_mouse_pos - mouse_offset), clipboard_used_cells[i], tile_map_clipboard); preview[coords] = TileMapCell(tile_map_clipboard->get_cell_source_id(clipboard_used_cells[i]), tile_map_clipboard->get_cell_atlas_coords(clipboard_used_cells[i]), tile_map_clipboard->get_cell_alternative_tile(clipboard_used_cells[i])); } - } else if (!picker_button->is_pressed()) { + } else if (!picker_button->is_pressed() && !(drag_type == DRAG_TYPE_NONE && Input::get_singleton()->is_key_pressed(Key::CTRL) && !Input::get_singleton()->is_key_pressed(Key::SHIFT))) { bool expand_grid = false; if (tool_buttons_group->get_pressed_button() == paint_tool_button && drag_type == DRAG_TYPE_NONE) { // Preview for a single pattern. - preview = _draw_line(drag_last_mouse_pos, drag_last_mouse_pos, drag_last_mouse_pos); + preview = _draw_line(drag_last_mouse_pos, drag_last_mouse_pos, drag_last_mouse_pos, erase_button->is_pressed()); expand_grid = true; - } else if (tool_buttons_group->get_pressed_button() == line_tool_button) { + } else if (tool_buttons_group->get_pressed_button() == line_tool_button || drag_type == DRAG_TYPE_LINE) { if (drag_type == DRAG_TYPE_NONE) { // Preview for a single pattern. - preview = _draw_line(drag_last_mouse_pos, drag_last_mouse_pos, drag_last_mouse_pos); + preview = _draw_line(drag_last_mouse_pos, drag_last_mouse_pos, drag_last_mouse_pos, erase_button->is_pressed()); expand_grid = true; } else if (drag_type == DRAG_TYPE_LINE) { // Preview for a line pattern. - preview = _draw_line(drag_start_mouse_pos, drag_start_mouse_pos, drag_last_mouse_pos); + preview = _draw_line(drag_start_mouse_pos, drag_start_mouse_pos, drag_last_mouse_pos, drag_erasing); expand_grid = true; } - } else if (tool_buttons_group->get_pressed_button() == rect_tool_button && drag_type == DRAG_TYPE_RECT) { - // Preview for a line pattern. - preview = _draw_rect(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(drag_last_mouse_pos)); + } else if (drag_type == DRAG_TYPE_RECT) { + // Preview for a rect pattern. + preview = _draw_rect(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(drag_last_mouse_pos), drag_erasing); expand_grid = true; } else if (tool_buttons_group->get_pressed_button() == bucket_tool_button && drag_type == DRAG_TYPE_NONE) { - // Preview for a line pattern. - preview = _draw_bucket_fill(tile_map->world_to_map(drag_last_mouse_pos), bucket_continuous_checkbox->is_pressed()); + // Preview for a fill pattern. + preview = _draw_bucket_fill(tile_map->world_to_map(drag_last_mouse_pos), bucket_contiguous_checkbox->is_pressed(), erase_button->is_pressed()); } // Expand the grid if needed @@ -757,7 +856,7 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over Transform2D tile_xform; tile_xform.set_origin(tile_map->map_to_world(E.key)); tile_xform.set_scale(tile_set->get_tile_size()); - if (!erase_button->is_pressed() && random_tile_checkbox->is_pressed()) { + if (!(drag_erasing || erase_button->is_pressed()) && random_tile_checkbox->is_pressed()) { tile_set->draw_tile_shape(p_overlay, xform * tile_xform, Color(1.0, 1.0, 1.0, 0.5), true); } else { if (tile_set->has_source(E.value.source_id)) { @@ -816,7 +915,7 @@ void TileMapEditorTilesPlugin::_mouse_exited_viewport() { CanvasItemEditor::get_singleton()->update_viewport(); } -TileMapCell TileMapEditorTilesPlugin::_pick_random_tile(const TileMapPattern *p_pattern) { +TileMapCell TileMapEditorTilesPlugin::_pick_random_tile(Ref<TileMapPattern> p_pattern) { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { return TileMapCell(); @@ -868,7 +967,7 @@ TileMapCell TileMapEditorTilesPlugin::_pick_random_tile(const TileMapPattern *p_ return TileMapCell(); } -Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_line(Vector2 p_start_drag_mouse_pos, Vector2 p_from_mouse_pos, Vector2 p_to_mouse_pos) { +Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_line(Vector2 p_start_drag_mouse_pos, Vector2 p_from_mouse_pos, Vector2 p_to_mouse_pos, bool p_erase) { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { return Map<Vector2i, TileMapCell>(); @@ -880,14 +979,15 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_line(Vector2 p_start_ } // Get or create the pattern. - TileMapPattern erase_pattern; - erase_pattern.set_cell(Vector2i(0, 0), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE); - TileMapPattern *pattern = erase_button->is_pressed() ? &erase_pattern : selection_pattern; + Ref<TileMapPattern> erase_pattern; + erase_pattern.instantiate(); + erase_pattern->set_cell(Vector2i(0, 0), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE); + Ref<TileMapPattern> pattern = p_erase ? erase_pattern : selection_pattern; Map<Vector2i, TileMapCell> output; if (!pattern->is_empty()) { // Paint the tiles on the tile map. - if (!erase_button->is_pressed() && random_tile_checkbox->is_pressed()) { + if (!p_erase && random_tile_checkbox->is_pressed()) { // Paint a random tile. Vector<Vector2i> line = TileMapEditor::get_line(tile_map, tile_map->world_to_map(p_from_mouse_pos), tile_map->world_to_map(p_to_mouse_pos)); for (int i = 0; i < line.size(); i++) { @@ -916,7 +1016,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_line(Vector2 p_start_ return output; } -Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_rect(Vector2i p_start_cell, Vector2i p_end_cell) { +Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_rect(Vector2i p_start_cell, Vector2i p_end_cell, bool p_erase) { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { return Map<Vector2i, TileMapCell>(); @@ -932,9 +1032,11 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_rect(Vector2i p_start rect.size += Vector2i(1, 1); // Get or create the pattern. - TileMapPattern erase_pattern; - erase_pattern.set_cell(Vector2i(0, 0), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE); - TileMapPattern *pattern = erase_button->is_pressed() ? &erase_pattern : selection_pattern; + Ref<TileMapPattern> erase_pattern; + erase_pattern.instantiate(); + erase_pattern->set_cell(Vector2i(0, 0), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE); + Ref<TileMapPattern> pattern = p_erase ? erase_pattern : selection_pattern; + Map<Vector2i, TileMapCell> err_output; ERR_FAIL_COND_V(pattern->is_empty(), err_output); @@ -945,7 +1047,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_rect(Vector2i p_start Map<Vector2i, TileMapCell> output; if (!pattern->is_empty()) { - if (!erase_button->is_pressed() && random_tile_checkbox->is_pressed()) { + if (!p_erase && random_tile_checkbox->is_pressed()) { // Paint a random tile. for (int x = 0; x < rect.size.x; x++) { for (int y = 0; y < rect.size.y; y++) { @@ -973,7 +1075,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_rect(Vector2i p_start return output; } -Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vector2i p_coords, bool p_contiguous) { +Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vector2i p_coords, bool p_contiguous, bool p_erase) { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { return Map<Vector2i, TileMapCell>(); @@ -991,16 +1093,17 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vector2i } // Get or create the pattern. - TileMapPattern erase_pattern; - erase_pattern.set_cell(Vector2i(0, 0), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE); - TileMapPattern *pattern = erase_button->is_pressed() ? &erase_pattern : selection_pattern; + Ref<TileMapPattern> erase_pattern; + erase_pattern.instantiate(); + erase_pattern->set_cell(Vector2i(0, 0), TileSet::INVALID_SOURCE, TileSetSource::INVALID_ATLAS_COORDS, TileSetSource::INVALID_TILE_ALTERNATIVE); + Ref<TileMapPattern> pattern = p_erase ? erase_pattern : selection_pattern; if (!pattern->is_empty()) { - TileMapCell source = tile_map->get_cell(tile_map_layer, p_coords); + TileMapCell source_cell = tile_map->get_cell(tile_map_layer, p_coords); // If we are filling empty tiles, compute the tilemap boundaries. Rect2i boundaries; - if (source.source_id == TileSet::INVALID_SOURCE) { + if (source_cell.source_id == TileSet::INVALID_SOURCE) { boundaries = tile_map->get_used_rect(); } @@ -1013,11 +1116,11 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vector2i Vector2i coords = to_check.back()->get(); to_check.pop_back(); if (!already_checked.has(coords)) { - if (source.source_id == tile_map->get_cell_source_id(tile_map_layer, coords) && - source.get_atlas_coords() == tile_map->get_cell_atlas_coords(tile_map_layer, coords) && - source.alternative_tile == tile_map->get_cell_alternative_tile(tile_map_layer, coords) && - (source.source_id != TileSet::INVALID_SOURCE || boundaries.has_point(coords))) { - if (!erase_button->is_pressed() && random_tile_checkbox->is_pressed()) { + if (source_cell.source_id == tile_map->get_cell_source_id(tile_map_layer, coords) && + source_cell.get_atlas_coords() == tile_map->get_cell_atlas_coords(tile_map_layer, coords) && + source_cell.alternative_tile == tile_map->get_cell_alternative_tile(tile_map_layer, coords) && + (source_cell.source_id != TileSet::INVALID_SOURCE || boundaries.has_point(coords))) { + if (!p_erase && random_tile_checkbox->is_pressed()) { // Paint a random tile. output.insert(coords, _pick_random_tile(pattern)); } else { @@ -1044,7 +1147,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vector2i } else { // Replace all tiles like the source. TypedArray<Vector2i> to_check; - if (source.source_id == TileSet::INVALID_SOURCE) { + if (source_cell.source_id == TileSet::INVALID_SOURCE) { Rect2i rect = tile_map->get_used_rect(); if (rect.has_no_area()) { rect = Rect2i(p_coords, Vector2i(1, 1)); @@ -1059,11 +1162,11 @@ Map<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vector2i } for (int i = 0; i < to_check.size(); i++) { Vector2i coords = to_check[i]; - if (source.source_id == tile_map->get_cell_source_id(tile_map_layer, coords) && - source.get_atlas_coords() == tile_map->get_cell_atlas_coords(tile_map_layer, coords) && - source.alternative_tile == tile_map->get_cell_alternative_tile(tile_map_layer, coords) && - (source.source_id != TileSet::INVALID_SOURCE || boundaries.has_point(coords))) { - if (!erase_button->is_pressed() && random_tile_checkbox->is_pressed()) { + if (source_cell.source_id == tile_map->get_cell_source_id(tile_map_layer, coords) && + source_cell.get_atlas_coords() == tile_map->get_cell_atlas_coords(tile_map_layer, coords) && + source_cell.alternative_tile == tile_map->get_cell_alternative_tile(tile_map_layer, coords) && + (source_cell.source_id != TileSet::INVALID_SOURCE || boundaries.has_point(coords))) { + if (!p_erase && random_tile_checkbox->is_pressed()) { // Paint a random tile. output.insert(coords, _pick_random_tile(pattern)); } else { @@ -1112,14 +1215,14 @@ void TileMapEditorTilesPlugin::_stop_dragging() { undo_redo->create_action(TTR("Change selection")); undo_redo->add_undo_method(this, "_set_tile_map_selection", _get_tile_map_selection()); - if (!Input::get_singleton()->is_key_pressed(KEY_SHIFT) && !Input::get_singleton()->is_key_pressed(KEY_CTRL)) { + if (!Input::get_singleton()->is_key_pressed(Key::SHIFT) && !Input::get_singleton()->is_key_pressed(Key::CTRL)) { tile_map_selection.clear(); } Rect2i rect = Rect2i(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(mpos) - tile_map->world_to_map(drag_start_mouse_pos)).abs(); for (int x = rect.position.x; x <= rect.get_end().x; x++) { for (int y = rect.position.y; y <= rect.get_end().y; y++) { Vector2i coords = Vector2i(x, y); - if (Input::get_singleton()->is_key_pressed(KEY_CTRL)) { + if (Input::get_singleton()->is_key_pressed(Key::CTRL)) { if (tile_map_selection.has(coords)) { tile_map_selection.erase(coords); } @@ -1137,60 +1240,80 @@ void TileMapEditorTilesPlugin::_stop_dragging() { _update_tileset_selection_from_selection_pattern(); } break; case DRAG_TYPE_MOVE: { - Vector2i top_left; - if (!tile_map_selection.is_empty()) { - top_left = tile_map_selection.front()->get(); - } - for (Set<Vector2i>::Element *E = tile_map_selection.front(); E; E = E->next()) { - top_left = top_left.min(E->get()); - } + if (patterns_item_list->is_visible_in_tree() && patterns_item_list->has_point(patterns_item_list->get_local_mouse_position())) { + // Restore the cells. + for (KeyValue<Vector2i, TileMapCell> kv : drag_modified) { + tile_map->set_cell(tile_map_layer, kv.key, kv.value.source_id, kv.value.get_atlas_coords(), kv.value.alternative_tile); + } + + // Creating a pattern in the pattern list. + select_last_pattern = true; + int new_pattern_index = tile_set->get_patterns_count(); + undo_redo->create_action(TTR("Add TileSet pattern")); + undo_redo->add_do_method(*tile_set, "add_pattern", selection_pattern, new_pattern_index); + undo_redo->add_undo_method(*tile_set, "remove_pattern", new_pattern_index); + undo_redo->commit_action(); + } else { + // Get the top-left cell. + Vector2i top_left; + if (!tile_map_selection.is_empty()) { + top_left = tile_map_selection.front()->get(); + } + for (Set<Vector2i>::Element *E = tile_map_selection.front(); E; E = E->next()) { + top_left = top_left.min(E->get()); + } - Vector2i offset = drag_start_mouse_pos - tile_map->map_to_world(top_left); - offset = tile_map->world_to_map(mpos - offset) - tile_map->world_to_map(drag_start_mouse_pos - offset); + // Get the offset from the mouse. + Vector2i offset = drag_start_mouse_pos - tile_map->map_to_world(top_left); + offset = tile_map->world_to_map(mpos - offset) - tile_map->world_to_map(drag_start_mouse_pos - offset); - TypedArray<Vector2i> selection_used_cells = selection_pattern->get_used_cells(); + TypedArray<Vector2i> selection_used_cells = selection_pattern->get_used_cells(); - Vector2i coords; - Map<Vector2i, TileMapCell> cells_undo; - for (int i = 0; i < selection_used_cells.size(); i++) { - coords = tile_map->map_pattern(top_left, selection_used_cells[i], selection_pattern); - cells_undo[coords] = TileMapCell(drag_modified[coords].source_id, drag_modified[coords].get_atlas_coords(), drag_modified[coords].alternative_tile); - coords = tile_map->map_pattern(top_left + offset, selection_used_cells[i], selection_pattern); - cells_undo[coords] = TileMapCell(tile_map->get_cell_source_id(tile_map_layer, coords), tile_map->get_cell_atlas_coords(tile_map_layer, coords), tile_map->get_cell_alternative_tile(tile_map_layer, coords)); - } + // Build the list of cells to undo. + Vector2i coords; + Map<Vector2i, TileMapCell> cells_undo; + for (int i = 0; i < selection_used_cells.size(); i++) { + coords = tile_map->map_pattern(top_left, selection_used_cells[i], selection_pattern); + cells_undo[coords] = TileMapCell(drag_modified[coords].source_id, drag_modified[coords].get_atlas_coords(), drag_modified[coords].alternative_tile); + coords = tile_map->map_pattern(top_left + offset, selection_used_cells[i], selection_pattern); + cells_undo[coords] = TileMapCell(tile_map->get_cell_source_id(tile_map_layer, coords), tile_map->get_cell_atlas_coords(tile_map_layer, coords), tile_map->get_cell_alternative_tile(tile_map_layer, coords)); + } - Map<Vector2i, TileMapCell> cells_do; - for (int i = 0; i < selection_used_cells.size(); i++) { - coords = tile_map->map_pattern(top_left, selection_used_cells[i], selection_pattern); - cells_do[coords] = TileMapCell(); - } - for (int i = 0; i < selection_used_cells.size(); i++) { - coords = tile_map->map_pattern(top_left + offset, selection_used_cells[i], selection_pattern); - cells_do[coords] = TileMapCell(selection_pattern->get_cell_source_id(selection_used_cells[i]), selection_pattern->get_cell_atlas_coords(selection_used_cells[i]), selection_pattern->get_cell_alternative_tile(selection_used_cells[i])); - } - undo_redo->create_action(TTR("Move tiles")); - // Move the tiles. - for (const KeyValue<Vector2i, TileMapCell> &E : cells_do) { - undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); - } - for (const KeyValue<Vector2i, TileMapCell> &E : cells_undo) { - undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); - } + // Build the list of cells to do. + Map<Vector2i, TileMapCell> cells_do; + for (int i = 0; i < selection_used_cells.size(); i++) { + coords = tile_map->map_pattern(top_left, selection_used_cells[i], selection_pattern); + cells_do[coords] = TileMapCell(); + } + for (int i = 0; i < selection_used_cells.size(); i++) { + coords = tile_map->map_pattern(top_left + offset, selection_used_cells[i], selection_pattern); + cells_do[coords] = TileMapCell(selection_pattern->get_cell_source_id(selection_used_cells[i]), selection_pattern->get_cell_atlas_coords(selection_used_cells[i]), selection_pattern->get_cell_alternative_tile(selection_used_cells[i])); + } - // Update the selection. - undo_redo->add_undo_method(this, "_set_tile_map_selection", _get_tile_map_selection()); - tile_map_selection.clear(); - for (int i = 0; i < selection_used_cells.size(); i++) { - coords = tile_map->map_pattern(top_left + offset, selection_used_cells[i], selection_pattern); - tile_map_selection.insert(coords); + // Move the tiles. + undo_redo->create_action(TTR("Move tiles")); + for (Map<Vector2i, TileMapCell>::Element *E = cells_do.front(); E; E = E->next()) { + undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile); + } + for (Map<Vector2i, TileMapCell>::Element *E = cells_undo.front(); E; E = E->next()) { + undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E->key(), E->get().source_id, E->get().get_atlas_coords(), E->get().alternative_tile); + } + + // Update the selection. + undo_redo->add_undo_method(this, "_set_tile_map_selection", _get_tile_map_selection()); + tile_map_selection.clear(); + for (int i = 0; i < selection_used_cells.size(); i++) { + coords = tile_map->map_pattern(top_left + offset, selection_used_cells[i], selection_pattern); + tile_map_selection.insert(coords); + } + undo_redo->add_do_method(this, "_set_tile_map_selection", _get_tile_map_selection()); + undo_redo->commit_action(); } - undo_redo->add_do_method(this, "_set_tile_map_selection", _get_tile_map_selection()); - undo_redo->commit_action(); } break; case DRAG_TYPE_PICK: { Rect2i rect = Rect2i(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(mpos) - tile_map->world_to_map(drag_start_mouse_pos)).abs(); rect.size += Vector2i(1, 1); - memdelete(selection_pattern); + TypedArray<Vector2i> coords_array; for (int x = rect.position.x; x < rect.get_end().x; x++) { for (int y = rect.position.y; y < rect.get_end().y; y++) { @@ -1200,11 +1323,10 @@ void TileMapEditorTilesPlugin::_stop_dragging() { } } } - selection_pattern = tile_map->get_pattern(tile_map_layer, coords_array); - if (!selection_pattern->is_empty()) { + Ref<TileMapPattern> new_selection_pattern = tile_map->get_pattern(tile_map_layer, coords_array); + if (!new_selection_pattern->is_empty()) { + selection_pattern = new_selection_pattern; _update_tileset_selection_from_selection_pattern(); - } else { - _update_selection_pattern_from_tileset_selection(); } picker_button->set_pressed(false); } break; @@ -1217,10 +1339,10 @@ void TileMapEditorTilesPlugin::_stop_dragging() { undo_redo->commit_action(false); } break; case DRAG_TYPE_LINE: { - Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, drag_start_mouse_pos, mpos); + Map<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, drag_start_mouse_pos, mpos, drag_erasing); undo_redo->create_action(TTR("Paint tiles")); for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { - if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) { + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { continue; } undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); @@ -1229,10 +1351,10 @@ void TileMapEditorTilesPlugin::_stop_dragging() { undo_redo->commit_action(); } break; case DRAG_TYPE_RECT: { - Map<Vector2i, TileMapCell> to_draw = _draw_rect(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(mpos)); + Map<Vector2i, TileMapCell> to_draw = _draw_rect(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(mpos), drag_erasing); undo_redo->create_action(TTR("Paint tiles")); for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { - if (!erase_button->is_pressed() && E.value.source_id == TileSet::INVALID_SOURCE) { + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { continue; } undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); @@ -1272,8 +1394,9 @@ void TileMapEditorTilesPlugin::_update_fix_selected_and_hovered() { hovered_tile.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS); hovered_tile.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE; tile_set_selection.clear(); + patterns_item_list->deselect_all(); tile_map_selection.clear(); - selection_pattern->clear(); + selection_pattern.instantiate(); return; } @@ -1283,8 +1406,9 @@ void TileMapEditorTilesPlugin::_update_fix_selected_and_hovered() { hovered_tile.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS); hovered_tile.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE; tile_set_selection.clear(); + patterns_item_list->deselect_all(); tile_map_selection.clear(); - selection_pattern->clear(); + selection_pattern.instantiate(); return; } @@ -1294,8 +1418,9 @@ void TileMapEditorTilesPlugin::_update_fix_selected_and_hovered() { hovered_tile.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS); hovered_tile.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE; tile_set_selection.clear(); + patterns_item_list->deselect_all(); tile_map_selection.clear(); - selection_pattern->clear(); + selection_pattern.instantiate(); return; } @@ -1323,8 +1448,10 @@ void TileMapEditorTilesPlugin::_update_fix_selected_and_hovered() { if (!tile_map_selection.is_empty()) { _update_selection_pattern_from_tilemap_selection(); + } else if (tiles_bottom_panel->is_visible_in_tree()) { + _update_selection_pattern_from_tileset_tiles_selection(); } else { - _update_selection_pattern_from_tileset_selection(); + _update_selection_pattern_from_tileset_pattern_selection(); } } @@ -1353,9 +1480,14 @@ void TileMapEditorTilesPlugin::_update_selection_pattern_from_tilemap_selection( return; } + Ref<TileSet> tile_set = tile_map->get_tileset(); + if (!tile_set.is_valid()) { + return; + } + ERR_FAIL_INDEX(tile_map_layer, tile_map->get_layers_count()); - memdelete(selection_pattern); + selection_pattern.instantiate(); TypedArray<Vector2i> coords_array; for (Set<Vector2i>::Element *E = tile_map_selection.front(); E; E = E->next()) { @@ -1364,7 +1496,7 @@ void TileMapEditorTilesPlugin::_update_selection_pattern_from_tilemap_selection( selection_pattern = tile_map->get_pattern(tile_map_layer, coords_array); } -void TileMapEditorTilesPlugin::_update_selection_pattern_from_tileset_selection() { +void TileMapEditorTilesPlugin::_update_selection_pattern_from_tileset_tiles_selection() { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { return; @@ -1379,7 +1511,7 @@ void TileMapEditorTilesPlugin::_update_selection_pattern_from_tileset_selection( tile_map_selection.clear(); // Clear the selected pattern. - selection_pattern->clear(); + selection_pattern.instantiate(); // Group per source. Map<int, List<const TileMapCell *>> per_source; @@ -1437,6 +1569,30 @@ void TileMapEditorTilesPlugin::_update_selection_pattern_from_tileset_selection( CanvasItemEditor::get_singleton()->update_viewport(); } +void TileMapEditorTilesPlugin::_update_selection_pattern_from_tileset_pattern_selection() { + TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); + if (!tile_map) { + return; + } + + Ref<TileSet> tile_set = tile_map->get_tileset(); + if (!tile_set.is_valid()) { + return; + } + + // Clear the tilemap selection. + tile_map_selection.clear(); + + // Clear the selected pattern. + selection_pattern.instantiate(); + + if (patterns_item_list->get_selected_items().size() >= 1) { + selection_pattern = patterns_item_list->get_item_metadata(patterns_item_list->get_selected_items()[0]); + } + + CanvasItemEditor::get_singleton()->update_viewport(); +} + void TileMapEditorTilesPlugin::_update_tileset_selection_from_selection_pattern() { tile_set_selection.clear(); TypedArray<Vector2i> used_cells = selection_pattern->get_used_cells(); @@ -1446,7 +1602,7 @@ void TileMapEditorTilesPlugin::_update_tileset_selection_from_selection_pattern( tile_set_selection.insert(TileMapCell(selection_pattern->get_cell_source_id(coords), selection_pattern->get_cell_atlas_coords(coords), selection_pattern->get_cell_alternative_tile(coords))); } } - _update_bottom_panel(); + _update_source_display(); tile_atlas_control->update(); alternative_tiles_control->update(); } @@ -1581,7 +1737,7 @@ void TileMapEditorTilesPlugin::_tile_atlas_control_gui_input(const Ref<InputEven } Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { // Pressed tile_set_dragging_selection = true; tile_set_drag_start_mouse_pos = tile_atlas_control->get_local_mouse_position(); @@ -1596,7 +1752,7 @@ void TileMapEditorTilesPlugin::_tile_atlas_control_gui_input(const Ref<InputEven tile_set_selection.insert(TileMapCell(source_id, hovered_tile.get_atlas_coords(), 0)); } } - _update_selection_pattern_from_tileset_selection(); + _update_selection_pattern_from_tileset_tiles_selection(); } else { // Released if (tile_set_dragging_selection) { if (!mb->is_shift_pressed()) { @@ -1633,7 +1789,7 @@ void TileMapEditorTilesPlugin::_tile_atlas_control_gui_input(const Ref<InputEven } } } - _update_selection_pattern_from_tileset_selection(); + _update_selection_pattern_from_tileset_tiles_selection(); } tile_set_dragging_selection = false; } @@ -1739,7 +1895,7 @@ void TileMapEditorTilesPlugin::_tile_alternatives_control_gui_input(const Ref<In } Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { // Pressed // Left click pressed. if (!mb->is_shift_pressed()) { @@ -1753,7 +1909,7 @@ void TileMapEditorTilesPlugin::_tile_alternatives_control_gui_input(const Ref<In tile_set_selection.insert(TileMapCell(source_id, hovered_tile.get_atlas_coords(), hovered_tile.alternative_tile)); } } - _update_selection_pattern_from_tileset_selection(); + _update_selection_pattern_from_tileset_tiles_selection(); } tile_atlas_control->update(); alternative_tiles_control->update(); @@ -1786,8 +1942,9 @@ void TileMapEditorTilesPlugin::edit(ObjectID p_tile_map_id, int p_tile_map_layer // Clear the selection. tile_set_selection.clear(); + patterns_item_list->deselect_all(); tile_map_selection.clear(); - selection_pattern->clear(); + selection_pattern.instantiate(); } tile_map_layer = p_tile_map_layer; @@ -1803,15 +1960,19 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { CanvasItemEditor::get_singleton()->get_viewport_control()->connect("mouse_exited", callable_mp(this, &TileMapEditorTilesPlugin::_mouse_exited_viewport)); // --- Shortcuts --- - ED_SHORTCUT("tiles_editor/cut", TTR("Cut"), KEY_MASK_CMD | KEY_X); - ED_SHORTCUT("tiles_editor/copy", TTR("Copy"), KEY_MASK_CMD | KEY_C); - ED_SHORTCUT("tiles_editor/paste", TTR("Paste"), KEY_MASK_CMD | KEY_V); - ED_SHORTCUT("tiles_editor/cancel", TTR("Cancel"), KEY_ESCAPE); - ED_SHORTCUT("tiles_editor/delete", TTR("Delete"), KEY_DELETE); + ED_SHORTCUT("tiles_editor/cut", TTR("Cut"), KeyModifierMask::CMD | Key::X); + ED_SHORTCUT("tiles_editor/copy", TTR("Copy"), KeyModifierMask::CMD | Key::C); + ED_SHORTCUT("tiles_editor/paste", TTR("Paste"), KeyModifierMask::CMD | Key::V); + ED_SHORTCUT("tiles_editor/cancel", TTR("Cancel"), Key::ESCAPE); + ED_SHORTCUT("tiles_editor/delete", TTR("Delete"), Key::KEY_DELETE); + + // --- Initialize references --- + tile_map_clipboard.instantiate(); + selection_pattern.instantiate(); // --- Toolbar --- toolbar = memnew(HBoxContainer); - toolbar->set_h_size_flags(SIZE_EXPAND_FILL); + toolbar->set_h_size_flags(Control::SIZE_EXPAND_FILL); HBoxContainer *tilemap_tiles_tools_buttons = memnew(HBoxContainer); @@ -1821,7 +1982,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { select_tool_button->set_flat(true); select_tool_button->set_toggle_mode(true); select_tool_button->set_button_group(tool_buttons_group); - select_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/selection_tool", "Selection", KEY_S)); + select_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/selection_tool", "Selection", Key::S)); select_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(select_tool_button); @@ -1829,7 +1990,8 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { paint_tool_button->set_flat(true); paint_tool_button->set_toggle_mode(true); paint_tool_button->set_button_group(tool_buttons_group); - paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", "Paint", KEY_D)); + paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", "Paint", Key::D)); + paint_tool_button->set_tooltip(TTR("Shift: Draw line.") + "\n" + TTR("Shift+Ctrl: Draw rectangle.")); paint_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(paint_tool_button); @@ -1837,7 +1999,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { line_tool_button->set_flat(true); line_tool_button->set_toggle_mode(true); line_tool_button->set_button_group(tool_buttons_group); - line_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/line_tool", "Line", KEY_L)); + line_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/line_tool", "Line", Key::L)); line_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(line_tool_button); @@ -1845,7 +2007,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { rect_tool_button->set_flat(true); rect_tool_button->set_toggle_mode(true); rect_tool_button->set_button_group(tool_buttons_group); - rect_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/rect_tool", "Rect", KEY_R)); + rect_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/rect_tool", "Rect", Key::R)); rect_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(rect_tool_button); @@ -1853,7 +2015,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { bucket_tool_button->set_flat(true); bucket_tool_button->set_toggle_mode(true); bucket_tool_button->set_button_group(tool_buttons_group); - bucket_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/bucket_tool", "Bucket", KEY_B)); + bucket_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/bucket_tool", "Bucket", Key::B)); bucket_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(bucket_tool_button); toolbar->add_child(tilemap_tiles_tools_buttons); @@ -1869,7 +2031,8 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { picker_button = memnew(Button); picker_button->set_flat(true); picker_button->set_toggle_mode(true); - picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", KEY_P)); + picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", Key::P)); + picker_button->set_tooltip(TTR("Alternatively hold Ctrl with other tools to pick tile.")); picker_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport)); tools_settings->add_child(picker_button); @@ -1877,7 +2040,8 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { erase_button = memnew(Button); erase_button->set_flat(true); erase_button->set_toggle_mode(true); - erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", "Eraser", KEY_E)); + erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", "Eraser", Key::E)); + erase_button->set_tooltip(TTR("Alternatively use RMB to erase tiles.")); erase_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport)); tools_settings->add_child(erase_button); @@ -1886,10 +2050,11 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { tools_settings->add_child(tools_settings_vsep_2); // Continuous checkbox. - bucket_continuous_checkbox = memnew(CheckBox); - bucket_continuous_checkbox->set_flat(true); - bucket_continuous_checkbox->set_text(TTR("Contiguous")); - tools_settings->add_child(bucket_continuous_checkbox); + bucket_contiguous_checkbox = memnew(CheckBox); + bucket_contiguous_checkbox->set_flat(true); + bucket_contiguous_checkbox->set_text(TTR("Contiguous")); + bucket_contiguous_checkbox->set_pressed(true); + tools_settings->add_child(bucket_contiguous_checkbox); // Random tile checkbox. random_tile_checkbox = memnew(CheckBox); @@ -1919,42 +2084,47 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { paint_tool_button->set_pressed(true); _update_toolbar(); - // --- Bottom panel --- - set_name("Tiles"); + // --- Bottom panel tiles --- + tiles_bottom_panel = memnew(VBoxContainer); + tiles_bottom_panel->connect("tree_entered", callable_mp(this, &TileMapEditorTilesPlugin::_update_theme)); + tiles_bottom_panel->connect("theme_changed", callable_mp(this, &TileMapEditorTilesPlugin::_update_theme)); + tiles_bottom_panel->connect("visibility_changed", callable_mp(this, &TileMapEditorTilesPlugin::_stop_dragging)); + tiles_bottom_panel->connect("visibility_changed", callable_mp(this, &TileMapEditorTilesPlugin::_tab_changed)); + tiles_bottom_panel->set_name(TTR("Tiles")); missing_source_label = memnew(Label); missing_source_label->set_text(TTR("This TileMap's TileSet has no source configured. Edit the TileSet resource to add one.")); - missing_source_label->set_h_size_flags(SIZE_EXPAND_FILL); - missing_source_label->set_v_size_flags(SIZE_EXPAND_FILL); + missing_source_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); + missing_source_label->set_v_size_flags(Control::SIZE_EXPAND_FILL); missing_source_label->set_align(Label::ALIGN_CENTER); missing_source_label->set_valign(Label::VALIGN_CENTER); missing_source_label->hide(); - add_child(missing_source_label); + tiles_bottom_panel->add_child(missing_source_label); atlas_sources_split_container = memnew(HSplitContainer); - atlas_sources_split_container->set_h_size_flags(SIZE_EXPAND_FILL); - atlas_sources_split_container->set_v_size_flags(SIZE_EXPAND_FILL); - add_child(atlas_sources_split_container); + atlas_sources_split_container->set_h_size_flags(Control::SIZE_EXPAND_FILL); + atlas_sources_split_container->set_v_size_flags(Control::SIZE_EXPAND_FILL); + tiles_bottom_panel->add_child(atlas_sources_split_container); sources_list = memnew(ItemList); sources_list->set_fixed_icon_size(Size2i(60, 60) * EDSCALE); - sources_list->set_h_size_flags(SIZE_EXPAND_FILL); + sources_list->set_h_size_flags(Control::SIZE_EXPAND_FILL); sources_list->set_stretch_ratio(0.25); sources_list->set_custom_minimum_size(Size2i(70, 0) * EDSCALE); sources_list->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); sources_list->connect("item_selected", callable_mp(this, &TileMapEditorTilesPlugin::_update_fix_selected_and_hovered).unbind(1)); - sources_list->connect("item_selected", callable_mp(this, &TileMapEditorTilesPlugin::_update_bottom_panel).unbind(1)); - sources_list->connect("item_selected", callable_mp(TilesEditor::get_singleton(), &TilesEditor::set_sources_lists_current)); - sources_list->connect("visibility_changed", callable_mp(TilesEditor::get_singleton(), &TilesEditor::synchronize_sources_list), varray(sources_list)); + sources_list->connect("item_selected", callable_mp(this, &TileMapEditorTilesPlugin::_update_source_display).unbind(1)); + sources_list->connect("item_selected", callable_mp(TilesEditorPlugin::get_singleton(), &TilesEditorPlugin::set_sources_lists_current)); + sources_list->connect("visibility_changed", callable_mp(TilesEditorPlugin::get_singleton(), &TilesEditorPlugin::synchronize_sources_list), varray(sources_list)); atlas_sources_split_container->add_child(sources_list); // Tile atlas source. tile_atlas_view = memnew(TileAtlasView); - tile_atlas_view->set_h_size_flags(SIZE_EXPAND_FILL); - tile_atlas_view->set_v_size_flags(SIZE_EXPAND_FILL); + tile_atlas_view->set_h_size_flags(Control::SIZE_EXPAND_FILL); + tile_atlas_view->set_v_size_flags(Control::SIZE_EXPAND_FILL); tile_atlas_view->set_texture_grid_visible(false); tile_atlas_view->set_tile_shape_grid_visible(false); - tile_atlas_view->connect("transform_changed", callable_mp(TilesEditor::get_singleton(), &TilesEditor::set_atlas_view_transform)); + tile_atlas_view->connect("transform_changed", callable_mp(TilesEditorPlugin::get_singleton(), &TilesEditorPlugin::set_atlas_view_transform)); atlas_sources_split_container->add_child(tile_atlas_view); tile_atlas_control = memnew(Control); @@ -1971,8 +2141,8 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { // Scenes collection source. scene_tiles_list = memnew(ItemList); - scene_tiles_list->set_h_size_flags(SIZE_EXPAND_FILL); - scene_tiles_list->set_v_size_flags(SIZE_EXPAND_FILL); + scene_tiles_list->set_h_size_flags(Control::SIZE_EXPAND_FILL); + scene_tiles_list->set_v_size_flags(Control::SIZE_EXPAND_FILL); scene_tiles_list->set_drag_forwarding(this); scene_tiles_list->set_select_mode(ItemList::SELECT_MULTI); scene_tiles_list->connect("multi_selected", callable_mp(this, &TileMapEditorTilesPlugin::_scenes_list_multi_selected)); @@ -1983,30 +2153,42 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { // Invalid source label. invalid_source_label = memnew(Label); invalid_source_label->set_text(TTR("Invalid source selected.")); - invalid_source_label->set_h_size_flags(SIZE_EXPAND_FILL); - invalid_source_label->set_v_size_flags(SIZE_EXPAND_FILL); + invalid_source_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); + invalid_source_label->set_v_size_flags(Control::SIZE_EXPAND_FILL); invalid_source_label->set_align(Label::ALIGN_CENTER); invalid_source_label->set_valign(Label::VALIGN_CENTER); invalid_source_label->hide(); atlas_sources_split_container->add_child(invalid_source_label); - _update_bottom_panel(); + // --- Bottom panel patterns --- + patterns_bottom_panel = memnew(VBoxContainer); + patterns_bottom_panel->set_name(TTR("Patterns")); + patterns_bottom_panel->connect("visibility_changed", callable_mp(this, &TileMapEditorTilesPlugin::_tab_changed)); + + int thumbnail_size = 64; + patterns_item_list = memnew(ItemList); + patterns_item_list->set_max_columns(0); + patterns_item_list->set_icon_mode(ItemList::ICON_MODE_TOP); + patterns_item_list->set_fixed_column_width(thumbnail_size * 3 / 2); + patterns_item_list->set_max_text_lines(2); + patterns_item_list->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size)); + patterns_item_list->set_v_size_flags(Control::SIZE_EXPAND_FILL); + patterns_item_list->connect("gui_input", callable_mp(this, &TileMapEditorTilesPlugin::_patterns_item_list_gui_input)); + patterns_item_list->connect("item_selected", callable_mp(this, &TileMapEditorTilesPlugin::_update_selection_pattern_from_tileset_pattern_selection).unbind(1)); + patterns_item_list->connect("item_activated", callable_mp(this, &TileMapEditorTilesPlugin::_update_selection_pattern_from_tileset_pattern_selection)); + patterns_item_list->connect("nothing_selected", callable_mp(this, &TileMapEditorTilesPlugin::_update_selection_pattern_from_tileset_pattern_selection)); + patterns_bottom_panel->add_child(patterns_item_list); + + patterns_help_label = memnew(Label); + patterns_help_label->set_text(TTR("Drag and drop or paste a TileMap selection here to store a pattern.")); + patterns_help_label->set_anchors_and_offsets_preset(Control::PRESET_CENTER); + patterns_item_list->add_child(patterns_help_label); + + // Update. + _update_source_display(); } TileMapEditorTilesPlugin::~TileMapEditorTilesPlugin() { - memdelete(selection_pattern); - memdelete(tile_map_clipboard); -} - -void TileMapEditorTerrainsPlugin::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: - paint_tool_button->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); - picker_button->set_icon(get_theme_icon(SNAME("ColorPick"), SNAME("EditorIcons"))); - erase_button->set_icon(get_theme_icon(SNAME("Eraser"), SNAME("EditorIcons"))); - break; - } } void TileMapEditorTerrainsPlugin::tile_set_changed() { @@ -2026,681 +2208,342 @@ void TileMapEditorTerrainsPlugin::_update_toolbar() { tools_settings_vsep->show(); picker_button->show(); erase_button->show(); + tools_settings_vsep_2->hide(); + bucket_contiguous_checkbox->hide(); + } else if (tool_buttons_group->get_pressed_button() == line_tool_button) { + tools_settings_vsep->show(); + picker_button->show(); + erase_button->show(); + tools_settings_vsep_2->hide(); + bucket_contiguous_checkbox->hide(); + } else if (tool_buttons_group->get_pressed_button() == rect_tool_button) { + tools_settings_vsep->show(); + picker_button->show(); + erase_button->show(); + tools_settings_vsep_2->hide(); + bucket_contiguous_checkbox->hide(); + } else if (tool_buttons_group->get_pressed_button() == bucket_tool_button) { + tools_settings_vsep->show(); + picker_button->show(); + erase_button->show(); + tools_settings_vsep_2->show(); + bucket_contiguous_checkbox->show(); } } -Control *TileMapEditorTerrainsPlugin::get_toolbar() const { - return toolbar; -} - -Map<Vector2i, TileSet::CellNeighbor> TileMapEditorTerrainsPlugin::Constraint::get_overlapping_coords_and_peering_bits() const { - Map<Vector2i, TileSet::CellNeighbor> output; - Ref<TileSet> tile_set = tile_map->get_tileset(); - ERR_FAIL_COND_V(!tile_set.is_valid(), output); - - TileSet::TileShape shape = tile_set->get_tile_shape(); - if (shape == TileSet::TILE_SHAPE_SQUARE) { - switch (bit) { - case 0: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_RIGHT_SIDE; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_LEFT_SIDE; - break; - case 1: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER)] = TileSet::CELL_NEIGHBOR_TOP_LEFT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_RIGHT_CORNER; - break; - case 2: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_SIDE; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_SIDE; - break; - case 3: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_LEFT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_CORNER)] = TileSet::CELL_NEIGHBOR_TOP_RIGHT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_LEFT_SIDE)] = TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER; - break; - default: - ERR_FAIL_V(output); - } - } else if (shape == TileSet::TILE_SHAPE_ISOMETRIC) { - switch (bit) { - case 0: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_RIGHT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_BOTTOM_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_RIGHT_CORNER)] = TileSet::CELL_NEIGHBOR_LEFT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_CORNER; - break; - case 1: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE; - break; - case 2: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_LEFT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_CORNER)] = TileSet::CELL_NEIGHBOR_TOP_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE)] = TileSet::CELL_NEIGHBOR_RIGHT_CORNER; - break; - case 3: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE; - break; - default: - ERR_FAIL_V(output); - } - } else { - // Half offset shapes. - TileSet::TileOffsetAxis offset_axis = tile_set->get_tile_offset_axis(); - if (offset_axis == TileSet::TILE_OFFSET_AXIS_HORIZONTAL) { - switch (bit) { - case 0: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_RIGHT_SIDE; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_LEFT_SIDE; - break; - case 1: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_CORNER; - break; - case 2: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE; - break; - case 3: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_LEFT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_RIGHT_CORNER; - break; - case 4: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE; - break; - default: - ERR_FAIL_V(output); - } - } else { - switch (bit) { - case 0: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_RIGHT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_LEFT_CORNER; - break; - case 1: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE; - break; - case 2: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE)] = TileSet::CELL_NEIGHBOR_LEFT_CORNER; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_LEFT_CORNER; - break; - case 3: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_SIDE; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_SIDE; - break; - case 4: - output[base_cell_coords] = TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE; - output[tile_map->get_neighbor_cell(base_cell_coords, TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE)] = TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE; - break; - default: - ERR_FAIL_V(output); - } - } - } - return output; -} - -TileMapEditorTerrainsPlugin::Constraint::Constraint(const TileMap *p_tile_map, const Vector2i &p_position, const TileSet::CellNeighbor &p_bit, int p_terrain) { - // The way we build the constraint make it easy to detect conflicting constraints. - tile_map = p_tile_map; - - Ref<TileSet> tile_set = tile_map->get_tileset(); - ERR_FAIL_COND(!tile_set.is_valid()); - - TileSet::TileShape shape = tile_set->get_tile_shape(); - if (shape == TileSet::TILE_SHAPE_SQUARE || shape == TileSet::TILE_SHAPE_ISOMETRIC) { - switch (p_bit) { - case TileSet::CELL_NEIGHBOR_RIGHT_SIDE: - case TileSet::CELL_NEIGHBOR_RIGHT_CORNER: - bit = 0; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER: - case TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE: - bit = 1; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_SIDE: - case TileSet::CELL_NEIGHBOR_BOTTOM_CORNER: - bit = 2; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_CORNER: - case TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE: - bit = 3; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_LEFT_SIDE: - case TileSet::CELL_NEIGHBOR_LEFT_CORNER: - bit = 0; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, p_bit); - break; - case TileSet::CELL_NEIGHBOR_TOP_LEFT_CORNER: - case TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE: - bit = 1; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, p_bit); - break; - case TileSet::CELL_NEIGHBOR_TOP_SIDE: - case TileSet::CELL_NEIGHBOR_TOP_CORNER: - bit = 2; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, p_bit); - break; - case TileSet::CELL_NEIGHBOR_TOP_RIGHT_CORNER: - case TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE: - bit = 3; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, p_bit); - break; - default: - ERR_FAIL(); - break; - } - } else { - // Half-offset shapes - TileSet::TileOffsetAxis offset_axis = tile_set->get_tile_offset_axis(); - if (offset_axis == TileSet::TILE_OFFSET_AXIS_HORIZONTAL) { - switch (p_bit) { - case TileSet::CELL_NEIGHBOR_RIGHT_SIDE: - bit = 0; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER: - bit = 1; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE: - bit = 2; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_CORNER: - bit = 3; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE: - bit = 4; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_CORNER: - bit = 1; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_LEFT_SIDE); - break; - case TileSet::CELL_NEIGHBOR_LEFT_SIDE: - bit = 0; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_LEFT_SIDE); - break; - case TileSet::CELL_NEIGHBOR_TOP_LEFT_CORNER: - bit = 3; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE); - break; - case TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE: - bit = 2; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE); - break; - case TileSet::CELL_NEIGHBOR_TOP_CORNER: - bit = 1; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE); - break; - case TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE: - bit = 4; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE); - break; - case TileSet::CELL_NEIGHBOR_TOP_RIGHT_CORNER: - bit = 3; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE); - break; - default: - ERR_FAIL(); - break; - } - } else { - switch (p_bit) { - case TileSet::CELL_NEIGHBOR_RIGHT_CORNER: - bit = 0; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE: - bit = 1; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER: - bit = 2; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_SIDE: - bit = 3; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_CORNER: - bit = 0; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE); - break; - case TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE: - bit = 4; - base_cell_coords = p_position; - break; - case TileSet::CELL_NEIGHBOR_LEFT_CORNER: - bit = 2; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE); - break; - case TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE: - bit = 1; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE); - break; - case TileSet::CELL_NEIGHBOR_TOP_LEFT_CORNER: - bit = 0; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE); - break; - case TileSet::CELL_NEIGHBOR_TOP_SIDE: - bit = 3; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_TOP_SIDE); - break; - case TileSet::CELL_NEIGHBOR_TOP_RIGHT_CORNER: - bit = 2; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_TOP_SIDE); - break; - case TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE: - bit = 4; - base_cell_coords = p_tile_map->get_neighbor_cell(p_position, TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE); - break; - default: - ERR_FAIL(); - break; - } - } - } - terrain = p_terrain; +Vector<TileMapEditorPlugin::TabData> TileMapEditorTerrainsPlugin::get_tabs() const { + Vector<TileMapEditorPlugin::TabData> tabs; + tabs.push_back({ toolbar, main_vbox_container }); + return tabs; } -Set<TileMapEditorTerrainsPlugin::TerrainsTilePattern> TileMapEditorTerrainsPlugin::_get_valid_terrains_tile_patterns_for_constraints(int p_terrain_set, const Vector2i &p_position, Set<Constraint> p_constraints) const { +Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_terrains(const Map<Vector2i, TileSet::TerrainsPattern> &p_to_paint, int p_terrain_set) const { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { - return Set<TerrainsTilePattern>(); + return Map<Vector2i, TileMapCell>(); } Ref<TileSet> tile_set = tile_map->get_tileset(); if (!tile_set.is_valid()) { - return Set<TerrainsTilePattern>(); - } - - // Returns all tiles compatible with the given constraints. - Set<TerrainsTilePattern> compatible_terrain_tile_patterns; - for (const KeyValue<TerrainsTilePattern, Set<TileMapCell>> &E : per_terrain_terrains_tile_patterns_tiles[p_terrain_set]) { - int valid = true; - int in_pattern_count = 0; - for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { - TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); - if (tile_set->is_valid_peering_bit_terrain(p_terrain_set, bit)) { - // Check if the bit is compatible with the constraints. - Constraint terrain_bit_constraint = Constraint(tile_map, p_position, bit, E.key[in_pattern_count]); - - Set<Constraint>::Element *in_set_constraint_element = p_constraints.find(terrain_bit_constraint); - if (in_set_constraint_element && in_set_constraint_element->get().get_terrain() != terrain_bit_constraint.get_terrain()) { - valid = false; - break; - } - in_pattern_count++; - } - } - - if (valid) { - compatible_terrain_tile_patterns.insert(E.key); - } + return Map<Vector2i, TileMapCell>(); } - return compatible_terrain_tile_patterns; -} + Map<Vector2i, TileMapCell> output; -Set<TileMapEditorTerrainsPlugin::Constraint> TileMapEditorTerrainsPlugin::_get_constraints_from_removed_cells_list(const Set<Vector2i> &p_to_replace, int p_terrain_set) const { - TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); - if (!tile_map) { - return Set<Constraint>(); - } + // Add the constraints from the added tiles. + Set<TileMap::TerrainConstraint> added_tiles_constraints_set; + for (const KeyValue<Vector2i, TileSet::TerrainsPattern> &E_to_paint : p_to_paint) { + Vector2i coords = E_to_paint.key; + TileSet::TerrainsPattern terrains_pattern = E_to_paint.value; - Ref<TileSet> tile_set = tile_map->get_tileset(); - if (!tile_set.is_valid()) { - return Set<Constraint>(); + Set<TileMap::TerrainConstraint> cell_constraints = tile_map->get_terrain_constraints_from_added_tile(coords, p_terrain_set, terrains_pattern); + for (Set<TileMap::TerrainConstraint>::Element *E = cell_constraints.front(); E; E = E->next()) { + added_tiles_constraints_set.insert(E->get()); + } } - ERR_FAIL_INDEX_V(p_terrain_set, tile_set->get_terrain_sets_count(), Set<Constraint>()); - ERR_FAIL_INDEX_V(tile_map_layer, tile_map->get_layers_count(), Set<Constraint>()); - - // Build a set of dummy constraints get the constrained points. - Set<Constraint> dummy_constraints; - for (Set<Vector2i>::Element *E = p_to_replace.front(); E; E = E->next()) { - for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { // Iterates over sides. - TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); - if (tile_set->is_valid_peering_bit_terrain(p_terrain_set, bit)) { - dummy_constraints.insert(Constraint(tile_map, E->get(), bit, -1)); + // Build the list of potential tiles to replace. + Set<Vector2i> potential_to_replace; + for (const KeyValue<Vector2i, TileSet::TerrainsPattern> &E_to_paint : p_to_paint) { + Vector2i coords = E_to_paint.key; + for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { + if (tile_map->is_existing_neighbor(TileSet::CellNeighbor(i))) { + Vector2i neighbor = tile_map->get_neighbor_cell(coords, TileSet::CellNeighbor(i)); + if (!p_to_paint.has(neighbor)) { + potential_to_replace.insert(neighbor); + } } } } - // For each constrained point, we get all overlapping tiles, and select the most adequate terrain for it. - Set<Constraint> constraints; - for (Set<Constraint>::Element *E = dummy_constraints.front(); E; E = E->next()) { - Constraint c = E->get(); + // Set of tiles to replace + Set<Vector2i> to_replace; - Map<int, int> terrain_count; + // Add the central tiles to the one to replace. + for (const KeyValue<Vector2i, TileSet::TerrainsPattern> &E_to_paint : p_to_paint) { + to_replace.insert(E_to_paint.key); + } - // Count the number of occurrences per terrain. - Map<Vector2i, TileSet::CellNeighbor> overlapping_terrain_bits = c.get_overlapping_coords_and_peering_bits(); - for (const KeyValue<Vector2i, TileSet::CellNeighbor> &E_overlapping : overlapping_terrain_bits) { - if (!p_to_replace.has(E_overlapping.key)) { - TileMapCell neighbor_cell = tile_map->get_cell(tile_map_layer, E_overlapping.key); - TileData *neighbor_tile_data = nullptr; - if (terrain_tiles.has(neighbor_cell) && terrain_tiles[neighbor_cell]->get_terrain_set() == p_terrain_set) { - neighbor_tile_data = terrain_tiles[neighbor_cell]; - } + // Add the constraints from the surroundings of the modified areas. + Set<TileMap::TerrainConstraint> removed_cells_constraints_set; + bool to_replace_modified = true; + while (to_replace_modified) { + // Get the constraints from the removed cells. + removed_cells_constraints_set = tile_map->get_terrain_constraints_from_removed_cells_list(tile_map_layer, to_replace, p_terrain_set); - int terrain = neighbor_tile_data ? neighbor_tile_data->get_peering_bit_terrain(TileSet::CellNeighbor(E_overlapping.value)) : -1; - if (terrain_count.has(terrain)) { - terrain_count[terrain] = 0; + // Filter the sources to make sure they are in the potential_to_replace. + Map<TileMap::TerrainConstraint, Set<Vector2i>> per_constraint_tiles; + for (Set<TileMap::TerrainConstraint>::Element *E = removed_cells_constraints_set.front(); E; E = E->next()) { + Map<Vector2i, TileSet::CellNeighbor> sources_of_constraint = E->get().get_overlapping_coords_and_peering_bits(); + for (const KeyValue<Vector2i, TileSet::CellNeighbor> &E_source_tile_of_constraint : sources_of_constraint) { + if (potential_to_replace.has(E_source_tile_of_constraint.key)) { + per_constraint_tiles[E->get()].insert(E_source_tile_of_constraint.key); } - terrain_count[terrain] += 1; } } - // Get the terrain with the max number of occurrences. - int max = 0; - int max_terrain = -1; - for (const KeyValue<int, int> &E_terrain_count : terrain_count) { - if (E_terrain_count.value > max) { - max = E_terrain_count.value; - max_terrain = E_terrain_count.key; + to_replace_modified = false; + for (Set<TileMap::TerrainConstraint>::Element *E = added_tiles_constraints_set.front(); E; E = E->next()) { + TileMap::TerrainConstraint c = E->get(); + // Check if we have a conflict in constraints. + if (removed_cells_constraints_set.has(c) && removed_cells_constraints_set.find(c)->get().get_terrain() != c.get_terrain()) { + // If we do, we search for a neighbor to remove. + if (per_constraint_tiles.has(c) && !per_constraint_tiles[c].is_empty()) { + // Remove it. + Vector2i to_add_to_remove = per_constraint_tiles[c].front()->get(); + potential_to_replace.erase(to_add_to_remove); + to_replace.insert(to_add_to_remove); + to_replace_modified = true; + for (KeyValue<TileMap::TerrainConstraint, Set<Vector2i>> &E_source_tiles_of_constraint : per_constraint_tiles) { + E_source_tiles_of_constraint.value.erase(to_add_to_remove); + } + break; + } } } - - // Set the adequate terrain. - if (max > 0) { - c.set_terrain(max_terrain); - constraints.insert(c); - } } - return constraints; -} + // Combine all constraints together. + Set<TileMap::TerrainConstraint> constraints = removed_cells_constraints_set; + for (Set<TileMap::TerrainConstraint>::Element *E = added_tiles_constraints_set.front(); E; E = E->next()) { + constraints.insert(E->get()); + } -Set<TileMapEditorTerrainsPlugin::Constraint> TileMapEditorTerrainsPlugin::_get_constraints_from_added_tile(Vector2i p_position, int p_terrain_set, TerrainsTilePattern p_terrains_tile_pattern) const { - TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); - if (!tile_map) { - return Set<TileMapEditorTerrainsPlugin::Constraint>(); + // Remove the central tiles from the ones to replace. + for (const KeyValue<Vector2i, TileSet::TerrainsPattern> &E_to_paint : p_to_paint) { + to_replace.erase(E_to_paint.key); } - Ref<TileSet> tile_set = tile_map->get_tileset(); - if (!tile_set.is_valid()) { - return Set<TileMapEditorTerrainsPlugin::Constraint>(); + // Run WFC to fill the holes with the constraints. + Map<Vector2i, TileSet::TerrainsPattern> wfc_output = tile_map->terrain_wave_function_collapse(to_replace, p_terrain_set, constraints); + + // Actually paint the tiles. + for (const KeyValue<Vector2i, TileSet::TerrainsPattern> &E_to_paint : p_to_paint) { + output[E_to_paint.key] = tile_set->get_random_tile_from_terrains_pattern(p_terrain_set, E_to_paint.value); } - // Compute the constraints needed from the surrounding tiles. - Set<TileMapEditorTerrainsPlugin::Constraint> output; - int in_pattern_count = 0; - for (uint32_t i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { - TileSet::CellNeighbor side = TileSet::CellNeighbor(i); - if (tile_set->is_valid_peering_bit_terrain(p_terrain_set, side)) { - Constraint c = Constraint(tile_map, p_position, side, p_terrains_tile_pattern[in_pattern_count]); - output.insert(c); - in_pattern_count++; - } + // Use the WFC run for the output. + for (const KeyValue<Vector2i, TileSet::TerrainsPattern> &E : wfc_output) { + output[E.key] = tile_set->get_random_tile_from_terrains_pattern(p_terrain_set, E.value); } return output; } -Map<Vector2i, TileMapEditorTerrainsPlugin::TerrainsTilePattern> TileMapEditorTerrainsPlugin::_wave_function_collapse(const Set<Vector2i> &p_to_replace, int p_terrain_set, const Set<TileMapEditorTerrainsPlugin::Constraint> p_constraints) const { +Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_line(Vector2i p_start_cell, Vector2i p_end_cell, bool p_erase) { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { - return Map<Vector2i, TerrainsTilePattern>(); + return Map<Vector2i, TileMapCell>(); } Ref<TileSet> tile_set = tile_map->get_tileset(); if (!tile_set.is_valid()) { - return Map<Vector2i, TileMapEditorTerrainsPlugin::TerrainsTilePattern>(); + return Map<Vector2i, TileMapCell>(); } - // Copy the constraints set. - Set<TileMapEditorTerrainsPlugin::Constraint> constraints = p_constraints; - - // Compute all acceptable tiles for each cell. - Map<Vector2i, Set<TerrainsTilePattern>> per_cell_acceptable_tiles; - for (Set<Vector2i>::Element *E = p_to_replace.front(); E; E = E->next()) { - per_cell_acceptable_tiles[E->get()] = _get_valid_terrains_tile_patterns_for_constraints(p_terrain_set, E->get(), constraints); + TileSet::TerrainsPattern terrains_pattern; + if (p_erase) { + terrains_pattern = TileSet::TerrainsPattern(*tile_set, selected_terrain_set); + } else { + terrains_pattern = selected_terrains_pattern; } - // Output map. - Map<Vector2i, TerrainsTilePattern> output; - - // Add all positions to a set. - Set<Vector2i> to_replace = Set<Vector2i>(p_to_replace); - while (!to_replace.is_empty()) { - // Compute the minimum number of tile possibilities for each cell. - int min_nb_possibilities = 100000000; - for (const KeyValue<Vector2i, Set<TerrainsTilePattern>> &E : per_cell_acceptable_tiles) { - min_nb_possibilities = MIN(min_nb_possibilities, E.value.size()); - } - - // Get the set of possible cells to fill. - LocalVector<Vector2i> to_choose_from; - for (const KeyValue<Vector2i, Set<TerrainsTilePattern>> &E : per_cell_acceptable_tiles) { - if (E.value.size() == min_nb_possibilities) { - to_choose_from.push_back(E.key); - } - } - - // Randomly pick a tile out of the most constrained. - Vector2i selected_cell_to_replace = to_choose_from[Math::random(0, to_choose_from.size() - 1)]; - - // Randomly select a tile out of them the put it in the grid. - Set<TerrainsTilePattern> valid_tiles = per_cell_acceptable_tiles[selected_cell_to_replace]; - if (valid_tiles.is_empty()) { - // No possibilities :/ - break; - } - int random_terrain_tile_pattern_index = Math::random(0, valid_tiles.size() - 1); - Set<TerrainsTilePattern>::Element *E = valid_tiles.front(); - for (int i = 0; i < random_terrain_tile_pattern_index; i++) { - E = E->next(); - } - TerrainsTilePattern selected_terrain_tile_pattern = E->get(); - - // Set the selected cell into the output. - output[selected_cell_to_replace] = selected_terrain_tile_pattern; - to_replace.erase(selected_cell_to_replace); - per_cell_acceptable_tiles.erase(selected_cell_to_replace); - - // Add the new constraints from the added tiles. - Set<TileMapEditorTerrainsPlugin::Constraint> new_constraints = _get_constraints_from_added_tile(selected_cell_to_replace, p_terrain_set, selected_terrain_tile_pattern); - for (Set<TileMapEditorTerrainsPlugin::Constraint>::Element *E_constraint = new_constraints.front(); E_constraint; E_constraint = E_constraint->next()) { - constraints.insert(E_constraint->get()); - } - - // Compute valid tiles again for neighbors. - for (uint32_t i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { - TileSet::CellNeighbor side = TileSet::CellNeighbor(i); - if (tile_map->is_existing_neighbor(side)) { - Vector2i neighbor = tile_map->get_neighbor_cell(selected_cell_to_replace, side); - if (to_replace.has(neighbor)) { - per_cell_acceptable_tiles[neighbor] = _get_valid_terrains_tile_patterns_for_constraints(p_terrain_set, neighbor, constraints); - } - } - } + Vector<Vector2i> line = TileMapEditor::get_line(tile_map, p_start_cell, p_end_cell); + Map<Vector2i, TileSet::TerrainsPattern> to_draw; + for (int i = 0; i < line.size(); i++) { + to_draw[line[i]] = terrains_pattern; } - return output; + return _draw_terrains(to_draw, selected_terrain_set); } -TileMapCell TileMapEditorTerrainsPlugin::_get_random_tile_from_pattern(int p_terrain_set, TerrainsTilePattern p_terrain_tile_pattern) const { +Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_rect(Vector2i p_start_cell, Vector2i p_end_cell, bool p_erase) { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { - return TileMapCell(); + return Map<Vector2i, TileMapCell>(); } Ref<TileSet> tile_set = tile_map->get_tileset(); if (!tile_set.is_valid()) { - return TileMapCell(); + return Map<Vector2i, TileMapCell>(); } - // Count the sum of probabilities. - double sum = 0.0; - Set<TileMapCell> set = per_terrain_terrains_tile_patterns_tiles[p_terrain_set][p_terrain_tile_pattern]; - for (Set<TileMapCell>::Element *E = set.front(); E; E = E->next()) { - if (E->get().source_id >= 0) { - Ref<TileSetSource> source = tile_set->get_source(E->get().source_id); - - Ref<TileSetAtlasSource> atlas_source = source; - if (atlas_source.is_valid()) { - TileData *tile_data = Object::cast_to<TileData>(atlas_source->get_tile_data(E->get().get_atlas_coords(), E->get().alternative_tile)); - sum += tile_data->get_probability(); - } else { - sum += 1.0; - } - } else { - sum += 1.0; - } + TileSet::TerrainsPattern terrains_pattern; + if (p_erase) { + terrains_pattern = TileSet::TerrainsPattern(*tile_set, selected_terrain_set); + } else { + terrains_pattern = selected_terrains_pattern; } - // Generate a random number. - double count = 0.0; - double picked = Math::random(0.0, sum); - - // Pick the tile. - for (Set<TileMapCell>::Element *E = set.front(); E; E = E->next()) { - if (E->get().source_id >= 0) { - Ref<TileSetSource> source = tile_set->get_source(E->get().source_id); + Rect2i rect; + rect.set_position(p_start_cell); + rect.set_end(p_end_cell); + rect = rect.abs(); - Ref<TileSetAtlasSource> atlas_source = source; - if (atlas_source.is_valid()) { - TileData *tile_data = Object::cast_to<TileData>(atlas_source->get_tile_data(E->get().get_atlas_coords(), E->get().alternative_tile)); - count += tile_data->get_probability(); - } else { - count += 1.0; - } - } else { - count += 1.0; - } - - if (count >= picked) { - return E->get(); + Map<Vector2i, TileSet::TerrainsPattern> to_draw; + for (int x = rect.position.x; x <= rect.get_end().x; x++) { + for (int y = rect.position.y; y <= rect.get_end().y; y++) { + to_draw[Vector2i(x, y)] = terrains_pattern; } } - - ERR_FAIL_V(TileMapCell()); + return _draw_terrains(to_draw, selected_terrain_set); } -Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_terrains(const Map<Vector2i, TerrainsTilePattern> &p_to_paint, int p_terrain_set) const { +Set<Vector2i> TileMapEditorTerrainsPlugin::_get_cells_for_bucket_fill(Vector2i p_coords, bool p_contiguous) { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { - return Map<Vector2i, TileMapCell>(); + return Set<Vector2i>(); } Ref<TileSet> tile_set = tile_map->get_tileset(); if (!tile_set.is_valid()) { - return Map<Vector2i, TileMapCell>(); + return Set<Vector2i>(); } - Map<Vector2i, TileMapCell> output; + TileMapCell source_cell = tile_map->get_cell(tile_map_layer, p_coords); - // Add the constraints from the added tiles. - Set<TileMapEditorTerrainsPlugin::Constraint> added_tiles_constraints_set; - for (const KeyValue<Vector2i, TerrainsTilePattern> &E_to_paint : p_to_paint) { - Vector2i coords = E_to_paint.key; - TerrainsTilePattern terrains_tile_pattern = E_to_paint.value; + TileSet::TerrainsPattern source_pattern(*tile_set, selected_terrain_set); + if (source_cell.source_id != TileSet::INVALID_SOURCE) { + TileData *tile_data = nullptr; + Ref<TileSetSource> source = tile_set->get_source(source_cell.source_id); + Ref<TileSetAtlasSource> atlas_source = source; + if (atlas_source.is_valid()) { + tile_data = Object::cast_to<TileData>(atlas_source->get_tile_data(source_cell.get_atlas_coords(), source_cell.alternative_tile)); + } + if (!tile_data) { + return Set<Vector2i>(); + } + source_pattern = tile_data->get_terrains_pattern(); + } + + // If we are filling empty tiles, compute the tilemap boundaries. + Rect2i boundaries; + if (source_cell.source_id == TileSet::INVALID_SOURCE) { + boundaries = tile_map->get_used_rect(); + } + + Set<Vector2i> output; + if (p_contiguous) { + // Replace continuous tiles like the source. + Set<Vector2i> already_checked; + List<Vector2i> to_check; + to_check.push_back(p_coords); + while (!to_check.is_empty()) { + Vector2i coords = to_check.back()->get(); + to_check.pop_back(); + if (!already_checked.has(coords)) { + // Get the candidate cell pattern. + TileSet::TerrainsPattern candidate_pattern(*tile_set, selected_terrain_set); + if (tile_map->get_cell_source_id(tile_map_layer, coords) != TileSet::INVALID_SOURCE) { + TileData *tile_data = nullptr; + Ref<TileSetSource> source = tile_set->get_source(tile_map->get_cell_source_id(tile_map_layer, coords)); + Ref<TileSetAtlasSource> atlas_source = source; + if (atlas_source.is_valid()) { + tile_data = Object::cast_to<TileData>(atlas_source->get_tile_data(tile_map->get_cell_atlas_coords(tile_map_layer, coords), tile_map->get_cell_alternative_tile(tile_map_layer, coords))); + } + if (tile_data) { + candidate_pattern = tile_data->get_terrains_pattern(); + } + } - Set<TileMapEditorTerrainsPlugin::Constraint> cell_constraints = _get_constraints_from_added_tile(coords, p_terrain_set, terrains_tile_pattern); - for (Set<TileMapEditorTerrainsPlugin::Constraint>::Element *E = cell_constraints.front(); E; E = E->next()) { - added_tiles_constraints_set.insert(E->get()); - } - } + // Draw. + if (candidate_pattern == source_pattern && (!source_pattern.is_erase_pattern() || boundaries.has_point(coords))) { + output.insert(coords); - // Build the list of potential tiles to replace. - Set<Vector2i> potential_to_replace; - for (const KeyValue<Vector2i, TerrainsTilePattern> &E_to_paint : p_to_paint) { - Vector2i coords = E_to_paint.key; - for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { - if (tile_map->is_existing_neighbor(TileSet::CellNeighbor(i))) { - Vector2i neighbor = tile_map->get_neighbor_cell(coords, TileSet::CellNeighbor(i)); - if (!p_to_paint.has(neighbor)) { - potential_to_replace.insert(neighbor); + // Get surrounding tiles (handles different tile shapes). + TypedArray<Vector2i> around = tile_map->get_surrounding_tiles(coords); + for (int i = 0; i < around.size(); i++) { + to_check.push_back(around[i]); + } } + already_checked.insert(coords); } } - } - - // Set of tiles to replace - Set<Vector2i> to_replace; - - // Add the central tiles to the one to replace. TODO: maybe change that. - for (const KeyValue<Vector2i, TerrainsTilePattern> &E_to_paint : p_to_paint) { - to_replace.insert(E_to_paint.key); - } - - // Add the constraints from the surroundings of the modified areas. - Set<TileMapEditorTerrainsPlugin::Constraint> removed_cells_constraints_set; - bool to_replace_modified = true; - while (to_replace_modified) { - // Get the constraints from the removed cells. - removed_cells_constraints_set = _get_constraints_from_removed_cells_list(to_replace, p_terrain_set); - - // Filter the sources to make sure they are in the potential_to_replace. - Map<Constraint, Set<Vector2i>> source_tiles_of_constraint; - for (Set<Constraint>::Element *E = removed_cells_constraints_set.front(); E; E = E->next()) { - Map<Vector2i, TileSet::CellNeighbor> sources_of_constraint = E->get().get_overlapping_coords_and_peering_bits(); - for (const KeyValue<Vector2i, TileSet::CellNeighbor> &E_source_tile_of_constraint : sources_of_constraint) { - if (potential_to_replace.has(E_source_tile_of_constraint.key)) { - source_tiles_of_constraint[E->get()].insert(E_source_tile_of_constraint.key); + } else { + // Replace all tiles like the source. + TypedArray<Vector2i> to_check; + if (source_cell.source_id == TileSet::INVALID_SOURCE) { + Rect2i rect = tile_map->get_used_rect(); + if (rect.has_no_area()) { + rect = Rect2i(p_coords, Vector2i(1, 1)); + } + for (int x = boundaries.position.x; x < boundaries.get_end().x; x++) { + for (int y = boundaries.position.y; y < boundaries.get_end().y; y++) { + to_check.append(Vector2i(x, y)); } } - } - - to_replace_modified = false; - for (Set<TileMapEditorTerrainsPlugin::Constraint>::Element *E = added_tiles_constraints_set.front(); E; E = E->next()) { - Constraint c = E->get(); - // Check if we have a conflict in constraints. - if (removed_cells_constraints_set.has(c) && removed_cells_constraints_set.find(c)->get().get_terrain() != c.get_terrain()) { - // If we do, we search for a neighbor to remove. - if (source_tiles_of_constraint.has(c) && !source_tiles_of_constraint[c].is_empty()) { - // Remove it. - Vector2i to_add_to_remove = source_tiles_of_constraint[c].front()->get(); - potential_to_replace.erase(to_add_to_remove); - to_replace.insert(to_add_to_remove); - to_replace_modified = true; - for (KeyValue<Constraint, Set<Vector2i>> &E_source_tiles_of_constraint : source_tiles_of_constraint) { - E_source_tiles_of_constraint.value.erase(to_add_to_remove); - } - break; + } else { + to_check = tile_map->get_used_cells(tile_map_layer); + } + for (int i = 0; i < to_check.size(); i++) { + Vector2i coords = to_check[i]; + // Get the candidate cell pattern. + TileSet::TerrainsPattern candidate_pattern; + if (tile_map->get_cell_source_id(tile_map_layer, coords) != TileSet::INVALID_SOURCE) { + TileData *tile_data = nullptr; + Ref<TileSetSource> source = tile_set->get_source(tile_map->get_cell_source_id(tile_map_layer, coords)); + Ref<TileSetAtlasSource> atlas_source = source; + if (atlas_source.is_valid()) { + tile_data = Object::cast_to<TileData>(atlas_source->get_tile_data(tile_map->get_cell_atlas_coords(tile_map_layer, coords), tile_map->get_cell_alternative_tile(tile_map_layer, coords))); } + if (tile_data) { + candidate_pattern = tile_data->get_terrains_pattern(); + } + } + + // Draw. + if (candidate_pattern == source_pattern && (!source_pattern.is_erase_pattern() || boundaries.has_point(coords))) { + output.insert(coords); } } } + return output; +} - // Combine all constraints together. - Set<TileMapEditorTerrainsPlugin::Constraint> constraints = removed_cells_constraints_set; - for (Set<TileMapEditorTerrainsPlugin::Constraint>::Element *E = added_tiles_constraints_set.front(); E; E = E->next()) { - constraints.insert(E->get()); +Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_bucket_fill(Vector2i p_coords, bool p_contiguous, bool p_erase) { + TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); + if (!tile_map) { + return Map<Vector2i, TileMapCell>(); } - // Run WFC to fill the holes with the constraints. - Map<Vector2i, TerrainsTilePattern> wfc_output = _wave_function_collapse(to_replace, p_terrain_set, constraints); + Ref<TileSet> tile_set = tile_map->get_tileset(); + if (!tile_set.is_valid()) { + return Map<Vector2i, TileMapCell>(); + } - // Use the WFC run for the output. - for (const KeyValue<Vector2i, TerrainsTilePattern> &E : wfc_output) { - output[E.key] = _get_random_tile_from_pattern(p_terrain_set, E.value); + TileSet::TerrainsPattern terrains_pattern; + if (p_erase) { + terrains_pattern = TileSet::TerrainsPattern(*tile_set, selected_terrain_set); + } else { + terrains_pattern = selected_terrains_pattern; } - // Override the WFC results to make sure at least the painted tiles are actually painted. - for (const KeyValue<Vector2i, TerrainsTilePattern> &E_to_paint : p_to_paint) { - output[E_to_paint.key] = _get_random_tile_from_pattern(p_terrain_set, E_to_paint.value); + Set<Vector2i> cells_to_draw = _get_cells_for_bucket_fill(p_coords, p_contiguous); + Map<Vector2i, TileSet::TerrainsPattern> to_draw; + for (const Vector2i &coords : cells_to_draw) { + to_draw[coords] = terrains_pattern; } - return output; + return _draw_terrains(to_draw, selected_terrain_set); } void TileMapEditorTerrainsPlugin::_stop_dragging() { @@ -2709,26 +2552,40 @@ void TileMapEditorTerrainsPlugin::_stop_dragging() { return; } + Ref<TileSet> tile_set = tile_map->get_tileset(); + if (!tile_set.is_valid()) { + return; + } + Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * tile_map->get_global_transform(); Vector2 mpos = xform.affine_inverse().xform(CanvasItemEditor::get_singleton()->get_viewport_control()->get_local_mouse_position()); switch (drag_type) { case DRAG_TYPE_PICK: { Vector2i coords = tile_map->world_to_map(mpos); - TileMapCell tile = tile_map->get_cell(tile_map_layer, coords); + TileMapCell cell = tile_map->get_cell(tile_map_layer, coords); + TileData *tile_data = nullptr; - if (terrain_tiles.has(tile)) { - Array terrains_tile_pattern = _build_terrains_tile_pattern(terrain_tiles[tile]); + Ref<TileSetSource> source = tile_set->get_source(cell.source_id); + Ref<TileSetAtlasSource> atlas_source = source; + if (atlas_source.is_valid()) { + tile_data = Object::cast_to<TileData>(atlas_source->get_tile_data(cell.get_atlas_coords(), cell.alternative_tile)); + } + + if (tile_data) { + TileSet::TerrainsPattern terrains_pattern = tile_data->get_terrains_pattern(); // Find the tree item for the right terrain set. bool need_tree_item_switch = true; TreeItem *tree_item = terrains_tree->get_selected(); + int new_terrain_set = -1; if (tree_item) { Dictionary metadata_dict = tree_item->get_metadata(0); if (metadata_dict.has("terrain_set") && metadata_dict.has("terrain_id")) { int terrain_set = metadata_dict["terrain_set"]; int terrain_id = metadata_dict["terrain_id"]; - if (per_terrain_terrains_tile_patterns[terrain_set][terrain_id].has(terrains_tile_pattern)) { + if (per_terrain_terrains_patterns[terrain_set][terrain_id].has(terrains_pattern)) { + new_terrain_set = terrain_set; need_tree_item_switch = false; } } @@ -2740,8 +2597,9 @@ void TileMapEditorTerrainsPlugin::_stop_dragging() { if (metadata_dict.has("terrain_set") && metadata_dict.has("terrain_id")) { int terrain_set = metadata_dict["terrain_set"]; int terrain_id = metadata_dict["terrain_id"]; - if (per_terrain_terrains_tile_patterns[terrain_set][terrain_id].has(terrains_tile_pattern)) { + if (per_terrain_terrains_patterns[terrain_set][terrain_id].has(terrains_pattern)) { // Found + new_terrain_set = terrain_set; tree_item->select(0); _update_tiles_list(); break; @@ -2754,15 +2612,9 @@ void TileMapEditorTerrainsPlugin::_stop_dragging() { if (tree_item) { for (int i = 0; i < terrains_tile_list->get_item_count(); i++) { Dictionary metadata_dict = terrains_tile_list->get_item_metadata(i); - TerrainsTilePattern in_meta_terrains_tile_pattern = metadata_dict["terrains_tile_pattern"]; - bool equals = true; - for (int j = 0; j < terrains_tile_pattern.size(); j++) { - if (terrains_tile_pattern[j] != in_meta_terrains_tile_pattern[j]) { - equals = false; - break; - } - } - if (equals) { + TileSet::TerrainsPattern in_meta_terrains_pattern(*tile_set, new_terrain_set); + in_meta_terrains_pattern.set_terrains_from_array(metadata_dict["terrains_pattern"]); + if (in_meta_terrains_pattern == terrains_pattern) { terrains_tile_list->select(i); break; } @@ -2781,14 +2633,84 @@ void TileMapEditorTerrainsPlugin::_stop_dragging() { } undo_redo->commit_action(false); } break; + case DRAG_TYPE_LINE: { + Map<Vector2i, TileMapCell> to_draw = _draw_line(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(mpos), drag_erasing); + undo_redo->create_action(TTR("Paint terrain")); + for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { + continue; + } + undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); + undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E.key, tile_map->get_cell_source_id(tile_map_layer, E.key), tile_map->get_cell_atlas_coords(tile_map_layer, E.key), tile_map->get_cell_alternative_tile(tile_map_layer, E.key)); + } + undo_redo->commit_action(); + } break; + case DRAG_TYPE_RECT: { + Map<Vector2i, TileMapCell> to_draw = _draw_rect(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(mpos), drag_erasing); + undo_redo->create_action(TTR("Paint terrain")); + for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { + continue; + } + undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); + undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E.key, tile_map->get_cell_source_id(tile_map_layer, E.key), tile_map->get_cell_atlas_coords(tile_map_layer, E.key), tile_map->get_cell_alternative_tile(tile_map_layer, E.key)); + } + undo_redo->commit_action(); + } break; + case DRAG_TYPE_BUCKET: { + undo_redo->create_action(TTR("Paint terrain")); + for (const KeyValue<Vector2i, TileMapCell> &E : drag_modified) { + undo_redo->add_do_method(tile_map, "set_cell", tile_map_layer, E.key, tile_map->get_cell_source_id(tile_map_layer, E.key), tile_map->get_cell_atlas_coords(tile_map_layer, E.key), tile_map->get_cell_alternative_tile(tile_map_layer, E.key)); + undo_redo->add_undo_method(tile_map, "set_cell", tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); + } + undo_redo->commit_action(false); + } break; + default: break; } drag_type = DRAG_TYPE_NONE; } +void TileMapEditorTerrainsPlugin::_mouse_exited_viewport() { + has_mouse = false; + CanvasItemEditor::get_singleton()->update_viewport(); +} + +void TileMapEditorTerrainsPlugin::_update_selection() { + TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); + if (!tile_map) { + return; + } + + Ref<TileSet> tile_set = tile_map->get_tileset(); + if (!tile_set.is_valid()) { + return; + } + + // Get the selected terrain. + selected_terrains_pattern = TileSet::TerrainsPattern(); + selected_terrain_set = -1; + + TreeItem *selected_tree_item = terrains_tree->get_selected(); + if (selected_tree_item && selected_tree_item->get_metadata(0)) { + Dictionary metadata_dict = selected_tree_item->get_metadata(0); + // Selected terrain + selected_terrain_set = metadata_dict["terrain_set"]; + + // Selected tile + if (erase_button->is_pressed()) { + selected_terrains_pattern = TileSet::TerrainsPattern(*tile_set, selected_terrain_set); + } else if (terrains_tile_list->is_anything_selected()) { + metadata_dict = terrains_tile_list->get_item_metadata(terrains_tile_list->get_selected_items()[0]); + selected_terrains_pattern = TileSet::TerrainsPattern(*tile_set, selected_terrain_set); + selected_terrains_pattern.set_terrains_from_array(metadata_dict["terrains_pattern"]); + } + } +} + bool TileMapEditorTerrainsPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p_event) { - if (!is_visible_in_tree()) { + if (!main_vbox_container->is_visible_in_tree()) { // If the bottom editor is not visible, we ignore inputs. return false; } @@ -2812,46 +2734,19 @@ bool TileMapEditorTerrainsPlugin::forward_canvas_gui_input(const Ref<InputEvent> } ERR_FAIL_COND_V(tile_map_layer >= tile_map->get_layers_count(), false); - // Get the selected terrain. - TerrainsTilePattern selected_terrains_tile_pattern; - int selected_terrain_set = -1; - - TreeItem *selected_tree_item = terrains_tree->get_selected(); - if (selected_tree_item && selected_tree_item->get_metadata(0)) { - Dictionary metadata_dict = selected_tree_item->get_metadata(0); - // Selected terrain - selected_terrain_set = metadata_dict["terrain_set"]; - - // Selected tile - if (erase_button->is_pressed()) { - selected_terrains_tile_pattern.clear(); - for (uint32_t i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { - TileSet::CellNeighbor side = TileSet::CellNeighbor(i); - if (tile_set->is_valid_peering_bit_terrain(selected_terrain_set, side)) { - selected_terrains_tile_pattern.push_back(-1); - } - } - } else if (terrains_tile_list->is_anything_selected()) { - metadata_dict = terrains_tile_list->get_item_metadata(terrains_tile_list->get_selected_items()[0]); - selected_terrains_tile_pattern = metadata_dict["terrains_tile_pattern"]; - } - } + _update_selection(); Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { + has_mouse = true; Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * tile_map->get_global_transform(); Vector2 mpos = xform.affine_inverse().xform(mm->get_position()); switch (drag_type) { case DRAG_TYPE_PAINT: { if (selected_terrain_set >= 0) { - Vector<Vector2i> line = TileMapEditor::get_line(tile_map, tile_map->world_to_map(drag_last_mouse_pos), tile_map->world_to_map(mpos)); - Map<Vector2i, TerrainsTilePattern> to_draw; - for (int i = 0; i < line.size(); i++) { - to_draw[line[i]] = selected_terrains_tile_pattern; - } - Map<Vector2i, TileMapCell> modified = _draw_terrains(to_draw, selected_terrain_set); - for (const KeyValue<Vector2i, TileMapCell> &E : modified) { + Map<Vector2i, TileMapCell> to_draw = _draw_line(tile_map->world_to_map(drag_last_mouse_pos), tile_map->world_to_map(mpos), drag_erasing); + for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { if (!drag_modified.has(E.key)) { drag_modified[E.key] = tile_map->get_cell(tile_map_layer, E.key); } @@ -2870,35 +2765,79 @@ bool TileMapEditorTerrainsPlugin::forward_canvas_gui_input(const Ref<InputEvent> Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { + has_mouse = true; Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * tile_map->get_global_transform(); Vector2 mpos = xform.affine_inverse().xform(mb->get_position()); - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT || mb->get_button_index() == MouseButton::RIGHT) { if (mb->is_pressed()) { // Pressed + if (erase_button->is_pressed() || mb->get_button_index() == MouseButton::RIGHT) { + drag_erasing = true; + } + if (picker_button->is_pressed()) { drag_type = DRAG_TYPE_PICK; } else { // Paint otherwise. - if (selected_terrain_set >= 0 && !selected_terrains_tile_pattern.is_empty() && tool_buttons_group->get_pressed_button() == paint_tool_button) { + if (tool_buttons_group->get_pressed_button() == paint_tool_button && !Input::get_singleton()->is_key_pressed(Key::CTRL) && !Input::get_singleton()->is_key_pressed(Key::SHIFT)) { + if (selected_terrain_set < 0 || !selected_terrains_pattern.is_valid()) { + return true; + } + drag_type = DRAG_TYPE_PAINT; drag_start_mouse_pos = mpos; drag_modified.clear(); - - Map<Vector2i, TerrainsTilePattern> terrains_to_draw; - terrains_to_draw[tile_map->world_to_map(mpos)] = selected_terrains_tile_pattern; - - Map<Vector2i, TileMapCell> to_draw = _draw_terrains(terrains_to_draw, selected_terrain_set); + Vector2i cell = tile_map->world_to_map(mpos); + Map<Vector2i, TileMapCell> to_draw = _draw_line(cell, cell, drag_erasing); for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { drag_modified[E.key] = tile_map->get_cell(tile_map_layer, E.key); tile_map->set_cell(tile_map_layer, E.key, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); } + } else if (tool_buttons_group->get_pressed_button() == line_tool_button || (tool_buttons_group->get_pressed_button() == paint_tool_button && Input::get_singleton()->is_key_pressed(Key::SHIFT) && !Input::get_singleton()->is_key_pressed(Key::CTRL))) { + if (selected_terrain_set < 0 || !selected_terrains_pattern.is_valid()) { + return true; + } + drag_type = DRAG_TYPE_LINE; + drag_start_mouse_pos = mpos; + drag_modified.clear(); + } else if (tool_buttons_group->get_pressed_button() == rect_tool_button || (tool_buttons_group->get_pressed_button() == paint_tool_button && Input::get_singleton()->is_key_pressed(Key::SHIFT) && Input::get_singleton()->is_key_pressed(Key::CTRL))) { + if (selected_terrain_set < 0 || !selected_terrains_pattern.is_valid()) { + return true; + } + drag_type = DRAG_TYPE_RECT; + drag_start_mouse_pos = mpos; + drag_modified.clear(); + } else if (tool_buttons_group->get_pressed_button() == bucket_tool_button) { + if (selected_terrain_set < 0 || !selected_terrains_pattern.is_valid()) { + return true; + } + drag_type = DRAG_TYPE_BUCKET; + drag_start_mouse_pos = mpos; + drag_modified.clear(); + Vector<Vector2i> line = TileMapEditor::get_line(tile_map, tile_map->world_to_map(drag_last_mouse_pos), tile_map->world_to_map(mpos)); + for (int i = 0; i < line.size(); i++) { + if (!drag_modified.has(line[i])) { + Map<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_contiguous_checkbox->is_pressed(), drag_erasing); + for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { + continue; + } + Vector2i coords = E.key; + if (!drag_modified.has(coords)) { + drag_modified.insert(coords, tile_map->get_cell(tile_map_layer, coords)); + } + tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); + } + } + } } } } else { // Released _stop_dragging(); + drag_erasing = false; } CanvasItemEditor::get_singleton()->update_viewport(); @@ -2911,24 +2850,133 @@ bool TileMapEditorTerrainsPlugin::forward_canvas_gui_input(const Ref<InputEvent> return false; } -TileMapEditorTerrainsPlugin::TerrainsTilePattern TileMapEditorTerrainsPlugin::_build_terrains_tile_pattern(TileData *p_tile_data) { +void TileMapEditorTerrainsPlugin::forward_canvas_draw_over_viewport(Control *p_overlay) { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (!tile_map) { - return TerrainsTilePattern(); + return; } + if (tile_map_layer < 0) { + return; + } + ERR_FAIL_INDEX(tile_map_layer, tile_map->get_layers_count()); + Ref<TileSet> tile_set = tile_map->get_tileset(); if (!tile_set.is_valid()) { - return TerrainsTilePattern(); + return; + } + + if (!tile_map->is_visible_in_tree()) { + return; } - TerrainsTilePattern output; - for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { - if (tile_set->is_valid_peering_bit_terrain(p_tile_data->get_terrain_set(), TileSet::CellNeighbor(i))) { - output.push_back(p_tile_data->get_peering_bit_terrain(TileSet::CellNeighbor(i))); + Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * tile_map->get_global_transform(); + Vector2i tile_shape_size = tile_set->get_tile_size(); + + // Handle the preview of the tiles to be placed. + if (main_vbox_container->is_visible_in_tree() && has_mouse) { // Only if the tilemap editor is opened and the viewport is hovered. + Set<Vector2i> preview; + Rect2i drawn_grid_rect; + + if (drag_type == DRAG_TYPE_PICK) { + // Draw the area being picked. + Vector2i coords = tile_map->world_to_map(drag_last_mouse_pos); + if (tile_map->get_cell_source_id(tile_map_layer, coords) != TileSet::INVALID_SOURCE) { + Transform2D tile_xform; + tile_xform.set_origin(tile_map->map_to_world(coords)); + tile_xform.set_scale(tile_shape_size); + tile_set->draw_tile_shape(p_overlay, xform * tile_xform, Color(1.0, 1.0, 1.0), false); + } + } else if (!picker_button->is_pressed() && !(drag_type == DRAG_TYPE_NONE && Input::get_singleton()->is_key_pressed(Key::CTRL) && !Input::get_singleton()->is_key_pressed(Key::SHIFT))) { + bool expand_grid = false; + if (tool_buttons_group->get_pressed_button() == paint_tool_button && drag_type == DRAG_TYPE_NONE) { + // Preview for a single tile. + preview.insert(tile_map->world_to_map(drag_last_mouse_pos)); + expand_grid = true; + } else if (tool_buttons_group->get_pressed_button() == line_tool_button || drag_type == DRAG_TYPE_LINE) { + if (drag_type == DRAG_TYPE_NONE) { + // Preview for a single tile. + preview.insert(tile_map->world_to_map(drag_last_mouse_pos)); + } else if (drag_type == DRAG_TYPE_LINE) { + // Preview for a line. + Vector<Vector2i> line = TileMapEditor::get_line(tile_map, tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(drag_last_mouse_pos)); + for (int i = 0; i < line.size(); i++) { + preview.insert(line[i]); + } + expand_grid = true; + } + } else if (drag_type == DRAG_TYPE_RECT) { + // Preview for a rect. + Rect2i rect; + rect.set_position(tile_map->world_to_map(drag_start_mouse_pos)); + rect.set_end(tile_map->world_to_map(drag_last_mouse_pos)); + rect = rect.abs(); + + Map<Vector2i, TileSet::TerrainsPattern> to_draw; + for (int x = rect.position.x; x <= rect.get_end().x; x++) { + for (int y = rect.position.y; y <= rect.get_end().y; y++) { + preview.insert(Vector2i(x, y)); + } + } + expand_grid = true; + } else if (tool_buttons_group->get_pressed_button() == bucket_tool_button && drag_type == DRAG_TYPE_NONE) { + // Preview for a fill. + preview = _get_cells_for_bucket_fill(tile_map->world_to_map(drag_last_mouse_pos), bucket_contiguous_checkbox->is_pressed()); + } + + // Expand the grid if needed + if (expand_grid && !preview.is_empty()) { + drawn_grid_rect = Rect2i(preview.front()->get(), Vector2i(1, 1)); + for (const Vector2i &E : preview) { + drawn_grid_rect.expand_to(E); + } + } + } + + if (!preview.is_empty()) { + const int fading = 5; + + // Draw the lines of the grid behind the preview. + bool display_grid = EditorSettings::get_singleton()->get("editors/tiles_editor/display_grid"); + if (display_grid) { + Color grid_color = EditorSettings::get_singleton()->get("editors/tiles_editor/grid_color"); + if (drawn_grid_rect.size.x > 0 && drawn_grid_rect.size.y > 0) { + drawn_grid_rect = drawn_grid_rect.grow(fading); + for (int x = drawn_grid_rect.position.x; x < (drawn_grid_rect.position.x + drawn_grid_rect.size.x); x++) { + for (int y = drawn_grid_rect.position.y; y < (drawn_grid_rect.position.y + drawn_grid_rect.size.y); y++) { + Vector2i pos_in_rect = Vector2i(x, y) - drawn_grid_rect.position; + + // Fade out the border of the grid. + float left_opacity = CLAMP(Math::inverse_lerp(0.0f, (float)fading, (float)pos_in_rect.x), 0.0f, 1.0f); + float right_opacity = CLAMP(Math::inverse_lerp((float)drawn_grid_rect.size.x, (float)(drawn_grid_rect.size.x - fading), (float)pos_in_rect.x), 0.0f, 1.0f); + float top_opacity = CLAMP(Math::inverse_lerp(0.0f, (float)fading, (float)pos_in_rect.y), 0.0f, 1.0f); + float bottom_opacity = CLAMP(Math::inverse_lerp((float)drawn_grid_rect.size.y, (float)(drawn_grid_rect.size.y - fading), (float)pos_in_rect.y), 0.0f, 1.0f); + float opacity = CLAMP(MIN(left_opacity, MIN(right_opacity, MIN(top_opacity, bottom_opacity))) + 0.1, 0.0f, 1.0f); + + Transform2D tile_xform; + tile_xform.set_origin(tile_map->map_to_world(Vector2(x, y))); + tile_xform.set_scale(tile_shape_size); + Color color = grid_color; + color.a = color.a * opacity; + tile_set->draw_tile_shape(p_overlay, xform * tile_xform, color, false); + } + } + } + } + + // Draw the preview. + for (const Vector2i &E : preview) { + Transform2D tile_xform; + tile_xform.set_origin(tile_map->map_to_world(E)); + tile_xform.set_scale(tile_set->get_tile_size()); + if (drag_erasing || erase_button->is_pressed()) { + tile_set->draw_tile_shape(p_overlay, xform * tile_xform, Color(0.0, 0.0, 0.0, 0.5), true); + } else { + tile_set->draw_tile_shape(p_overlay, xform * tile_xform, Color(1.0, 1.0, 1.0, 0.5), true); + } + } } } - return output; } void TileMapEditorTerrainsPlugin::_update_terrains_cache() { @@ -2942,45 +2990,12 @@ void TileMapEditorTerrainsPlugin::_update_terrains_cache() { return; } - // Compute the tile sides. - tile_sides.clear(); - TileSet::TileShape shape = tile_set->get_tile_shape(); - if (shape == TileSet::TILE_SHAPE_SQUARE) { - tile_sides.push_back(TileSet::CELL_NEIGHBOR_RIGHT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_BOTTOM_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_LEFT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_TOP_SIDE); - } else if (shape == TileSet::TILE_SHAPE_ISOMETRIC) { - tile_sides.push_back(TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE); - } else { - if (tile_set->get_tile_offset_axis() == TileSet::TILE_OFFSET_AXIS_HORIZONTAL) { - tile_sides.push_back(TileSet::CELL_NEIGHBOR_RIGHT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_LEFT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE); - } else { - tile_sides.push_back(TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_BOTTOM_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_TOP_SIDE); - tile_sides.push_back(TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE); - } - } - // Organizes tiles into structures. - per_terrain_terrains_tile_patterns_tiles.resize(tile_set->get_terrain_sets_count()); - per_terrain_terrains_tile_patterns.resize(tile_set->get_terrain_sets_count()); + per_terrain_terrains_patterns.resize(tile_set->get_terrain_sets_count()); for (int i = 0; i < tile_set->get_terrain_sets_count(); i++) { - per_terrain_terrains_tile_patterns_tiles[i].clear(); - per_terrain_terrains_tile_patterns[i].resize(tile_set->get_terrains_count(i)); - for (int j = 0; j < (int)per_terrain_terrains_tile_patterns[i].size(); j++) { - per_terrain_terrains_tile_patterns[i][j].clear(); + per_terrain_terrains_patterns[i].resize(tile_set->get_terrains_count(i)); + for (int j = 0; j < (int)per_terrain_terrains_patterns[i].size(); j++) { + per_terrain_terrains_patterns[i][j].clear(); } } @@ -2998,22 +3013,22 @@ void TileMapEditorTerrainsPlugin::_update_terrains_cache() { TileData *tile_data = Object::cast_to<TileData>(atlas_source->get_tile_data(tile_id, alternative_id)); int terrain_set = tile_data->get_terrain_set(); if (terrain_set >= 0) { - ERR_FAIL_INDEX(terrain_set, (int)per_terrain_terrains_tile_patterns.size()); + ERR_FAIL_INDEX(terrain_set, (int)per_terrain_terrains_patterns.size()); TileMapCell cell; cell.source_id = source_id; cell.set_atlas_coords(tile_id); cell.alternative_tile = alternative_id; - TerrainsTilePattern terrains_tile_pattern = _build_terrains_tile_pattern(tile_data); - + TileSet::TerrainsPattern terrains_pattern = tile_data->get_terrains_pattern(); // Terrain bits. - for (int i = 0; i < terrains_tile_pattern.size(); i++) { - int terrain = terrains_tile_pattern[i]; - if (terrain >= 0 && terrain < (int)per_terrain_terrains_tile_patterns[terrain_set].size()) { - per_terrain_terrains_tile_patterns[terrain_set][terrain].insert(terrains_tile_pattern); - terrain_tiles[cell] = tile_data; - per_terrain_terrains_tile_patterns_tiles[terrain_set][terrains_tile_pattern].insert(cell); + for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { + TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); + if (tile_set->is_valid_peering_bit_terrain(terrain_set, bit)) { + int terrain = terrains_pattern.get_terrain(bit); + if (terrain >= 0 && terrain < (int)per_terrain_terrains_patterns[terrain_set].size()) { + per_terrain_terrains_patterns[terrain_set][terrain].insert(terrains_pattern); + } } } } @@ -3021,22 +3036,6 @@ void TileMapEditorTerrainsPlugin::_update_terrains_cache() { } } } - - // Add the empty cell in the possible patterns and cells. - for (int i = 0; i < tile_set->get_terrain_sets_count(); i++) { - TerrainsTilePattern empty_pattern; - for (int j = 0; j < TileSet::CELL_NEIGHBOR_MAX; j++) { - if (tile_set->is_valid_peering_bit_terrain(i, TileSet::CellNeighbor(j))) { - empty_pattern.push_back(-1); - } - } - - TileMapCell empty_cell; - empty_cell.source_id = TileSet::INVALID_SOURCE; - empty_cell.set_atlas_coords(TileSetSource::INVALID_ATLAS_COORDS); - empty_cell.alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE; - per_terrain_terrains_tile_patterns_tiles[i][empty_pattern].insert(empty_cell); - } } void TileMapEditorTerrainsPlugin::_update_terrains_tree() { @@ -3060,13 +3059,13 @@ void TileMapEditorTerrainsPlugin::_update_terrains_tree() { TreeItem *terrain_set_tree_item = terrains_tree->create_item(); String matches; if (tile_set->get_terrain_set_mode(terrain_set_index) == TileSet::TERRAIN_MODE_MATCH_CORNERS_AND_SIDES) { - terrain_set_tree_item->set_icon(0, get_theme_icon(SNAME("TerrainMatchCornersAndSides"), SNAME("EditorIcons"))); + terrain_set_tree_item->set_icon(0, main_vbox_container->get_theme_icon(SNAME("TerrainMatchCornersAndSides"), SNAME("EditorIcons"))); matches = String(TTR("Matches Corners and Sides")); } else if (tile_set->get_terrain_set_mode(terrain_set_index) == TileSet::TERRAIN_MODE_MATCH_CORNERS) { - terrain_set_tree_item->set_icon(0, get_theme_icon(SNAME("TerrainMatchCorners"), SNAME("EditorIcons"))); + terrain_set_tree_item->set_icon(0, main_vbox_container->get_theme_icon(SNAME("TerrainMatchCorners"), SNAME("EditorIcons"))); matches = String(TTR("Matches Corners Only")); } else { - terrain_set_tree_item->set_icon(0, get_theme_icon(SNAME("TerrainMatchSides"), SNAME("EditorIcons"))); + terrain_set_tree_item->set_icon(0, main_vbox_container->get_theme_icon(SNAME("TerrainMatchSides"), SNAME("EditorIcons"))); matches = String(TTR("Matches Sides Only")); } terrain_set_tree_item->set_text(0, vformat("Terrain Set %d (%s)", terrain_set_index, matches)); @@ -3105,26 +3104,28 @@ void TileMapEditorTerrainsPlugin::_update_tiles_list() { Dictionary metadata_dict = selected_tree_item->get_metadata(0); int selected_terrain_set = metadata_dict["terrain_set"]; int selected_terrain_id = metadata_dict["terrain_id"]; - ERR_FAIL_INDEX(selected_terrain_set, (int)per_terrain_terrains_tile_patterns.size()); - ERR_FAIL_INDEX(selected_terrain_id, (int)per_terrain_terrains_tile_patterns[selected_terrain_set].size()); + ERR_FAIL_INDEX(selected_terrain_set, tile_set->get_terrain_sets_count()); + ERR_FAIL_INDEX(selected_terrain_id, tile_set->get_terrains_count(selected_terrain_set)); // Sort the items in a map by the number of corresponding terrains. - Map<int, Set<TerrainsTilePattern>> sorted; - for (Set<TerrainsTilePattern>::Element *E = per_terrain_terrains_tile_patterns[selected_terrain_set][selected_terrain_id].front(); E; E = E->next()) { + Map<int, Set<TileSet::TerrainsPattern>> sorted; + + for (Set<TileSet::TerrainsPattern>::Element *E = per_terrain_terrains_patterns[selected_terrain_set][selected_terrain_id].front(); E; E = E->next()) { // Count the number of matching sides/terrains. int count = 0; - for (int i = 0; i < E->get().size(); i++) { - if (int(E->get()[i]) == selected_terrain_id) { + for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { + TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); + if (tile_set->is_valid_peering_bit_terrain(selected_terrain_set, bit) && E->get().get_terrain(bit) == selected_terrain_id) { count++; } } sorted[count].insert(E->get()); } - for (Map<int, Set<TerrainsTilePattern>>::Element *E_set = sorted.back(); E_set; E_set = E_set->prev()) { - for (Set<TerrainsTilePattern>::Element *E = E_set->get().front(); E; E = E->next()) { - TerrainsTilePattern terrains_tile_pattern = E->get(); + for (Map<int, Set<TileSet::TerrainsPattern>>::Element *E_set = sorted.back(); E_set; E_set = E_set->prev()) { + for (Set<TileSet::TerrainsPattern>::Element *E = E_set->get().front(); E; E = E->next()) { + TileSet::TerrainsPattern terrains_pattern = E->get(); // Get the icon. Ref<Texture2D> icon; @@ -3132,15 +3133,15 @@ void TileMapEditorTerrainsPlugin::_update_tiles_list() { bool transpose = false; double max_probability = -1.0; - for (Set<TileMapCell>::Element *E_tile_map_cell = per_terrain_terrains_tile_patterns_tiles[selected_terrain_set][terrains_tile_pattern].front(); E_tile_map_cell; E_tile_map_cell = E_tile_map_cell->next()) { - Ref<TileSetSource> source = tile_set->get_source(E_tile_map_cell->get().source_id); + for (const TileMapCell &cell : tile_set->get_tiles_for_terrains_pattern(selected_terrain_set, terrains_pattern)) { + Ref<TileSetSource> source = tile_set->get_source(cell.source_id); Ref<TileSetAtlasSource> atlas_source = source; if (atlas_source.is_valid()) { - TileData *tile_data = Object::cast_to<TileData>(atlas_source->get_tile_data(E_tile_map_cell->get().get_atlas_coords(), E_tile_map_cell->get().alternative_tile)); + TileData *tile_data = Object::cast_to<TileData>(atlas_source->get_tile_data(cell.get_atlas_coords(), cell.alternative_tile)); if (tile_data->get_probability() > max_probability) { icon = atlas_source->get_texture(); - region = atlas_source->get_tile_texture_region(E_tile_map_cell->get().get_atlas_coords()); + region = atlas_source->get_tile_texture_region(cell.get_atlas_coords()); if (tile_data->get_flip_h()) { region.position.x += region.size.x; region.size.x = -region.size.x; @@ -3161,7 +3162,7 @@ void TileMapEditorTerrainsPlugin::_update_tiles_list() { terrains_tile_list->set_item_icon_region(item_index, region); terrains_tile_list->set_item_icon_transposed(item_index, transpose); Dictionary list_metadata_dict; - list_metadata_dict["terrains_tile_pattern"] = terrains_tile_pattern; + list_metadata_dict["terrains_pattern"] = terrains_pattern.get_terrains_as_array(); terrains_tile_list->set_item_metadata(item_index, list_metadata_dict); } } @@ -3171,6 +3172,16 @@ void TileMapEditorTerrainsPlugin::_update_tiles_list() { } } +void TileMapEditorTerrainsPlugin::_update_theme() { + paint_tool_button->set_icon(main_vbox_container->get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); + line_tool_button->set_icon(main_vbox_container->get_theme_icon(SNAME("CurveLinear"), SNAME("EditorIcons"))); + rect_tool_button->set_icon(main_vbox_container->get_theme_icon(SNAME("Rectangle"), SNAME("EditorIcons"))); + bucket_tool_button->set_icon(main_vbox_container->get_theme_icon(SNAME("Bucket"), SNAME("EditorIcons"))); + + picker_button->set_icon(main_vbox_container->get_theme_icon(SNAME("ColorPick"), SNAME("EditorIcons"))); + erase_button->set_icon(main_vbox_container->get_theme_icon(SNAME("Eraser"), SNAME("EditorIcons"))); +} + void TileMapEditorTerrainsPlugin::edit(ObjectID p_tile_map_id, int p_tile_map_layer) { _stop_dragging(); // Avoids staying in a wrong drag state. @@ -3183,15 +3194,18 @@ void TileMapEditorTerrainsPlugin::edit(ObjectID p_tile_map_id, int p_tile_map_la } TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { - set_name("Terrains"); + main_vbox_container = memnew(VBoxContainer); + main_vbox_container->connect("tree_entered", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_theme)); + main_vbox_container->connect("theme_changed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_theme)); + main_vbox_container->set_name("Terrains"); HSplitContainer *tilemap_tab_terrains = memnew(HSplitContainer); - tilemap_tab_terrains->set_h_size_flags(SIZE_EXPAND_FILL); - tilemap_tab_terrains->set_v_size_flags(SIZE_EXPAND_FILL); - add_child(tilemap_tab_terrains); + tilemap_tab_terrains->set_h_size_flags(Control::SIZE_EXPAND_FILL); + tilemap_tab_terrains->set_v_size_flags(Control::SIZE_EXPAND_FILL); + main_vbox_container->add_child(tilemap_tab_terrains); terrains_tree = memnew(Tree); - terrains_tree->set_h_size_flags(SIZE_EXPAND_FILL); + terrains_tree->set_h_size_flags(Control::SIZE_EXPAND_FILL); terrains_tree->set_stretch_ratio(0.25); terrains_tree->set_custom_minimum_size(Size2i(70, 0) * EDSCALE); terrains_tree->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); @@ -3200,7 +3214,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { tilemap_tab_terrains->add_child(terrains_tree); terrains_tile_list = memnew(ItemList); - terrains_tile_list->set_h_size_flags(SIZE_EXPAND_FILL); + terrains_tile_list->set_h_size_flags(Control::SIZE_EXPAND_FILL); terrains_tile_list->set_max_columns(0); terrains_tile_list->set_same_column_width(true); terrains_tile_list->set_fixed_icon_size(Size2(30, 30) * EDSCALE); @@ -3219,10 +3233,34 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { paint_tool_button->set_toggle_mode(true); paint_tool_button->set_button_group(tool_buttons_group); paint_tool_button->set_pressed(true); - paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", "Paint", KEY_D)); + paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", "Paint", Key::D)); paint_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(paint_tool_button); + line_tool_button = memnew(Button); + line_tool_button->set_flat(true); + line_tool_button->set_toggle_mode(true); + line_tool_button->set_button_group(tool_buttons_group); + line_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/line_tool", "Line", Key::L)); + line_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar)); + tilemap_tiles_tools_buttons->add_child(line_tool_button); + + rect_tool_button = memnew(Button); + rect_tool_button->set_flat(true); + rect_tool_button->set_toggle_mode(true); + rect_tool_button->set_button_group(tool_buttons_group); + rect_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/rect_tool", "Rect", Key::R)); + rect_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar)); + tilemap_tiles_tools_buttons->add_child(rect_tool_button); + + bucket_tool_button = memnew(Button); + bucket_tool_button->set_flat(true); + bucket_tool_button->set_toggle_mode(true); + bucket_tool_button->set_button_group(tool_buttons_group); + bucket_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/bucket_tool", "Bucket", Key::B)); + bucket_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar)); + tilemap_tiles_tools_buttons->add_child(bucket_tool_button); + toolbar->add_child(tilemap_tiles_tools_buttons); // -- TileMap tool settings -- @@ -3236,7 +3274,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { picker_button = memnew(Button); picker_button->set_flat(true); picker_button->set_toggle_mode(true); - picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", KEY_P)); + picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", Key::P)); picker_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport)); tools_settings->add_child(picker_button); @@ -3244,9 +3282,20 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { erase_button = memnew(Button); erase_button->set_flat(true); erase_button->set_toggle_mode(true); - erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", "Eraser", KEY_E)); + erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", "Eraser", Key::E)); erase_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport)); tools_settings->add_child(erase_button); + + // Separator 2. + tools_settings_vsep_2 = memnew(VSeparator); + tools_settings->add_child(tools_settings_vsep_2); + + // Continuous checkbox. + bucket_contiguous_checkbox = memnew(CheckBox); + bucket_contiguous_checkbox->set_flat(true); + bucket_contiguous_checkbox->set_text(TTR("Contiguous")); + bucket_contiguous_checkbox->set_pressed(true); + tools_settings->add_child(bucket_contiguous_checkbox); } TileMapEditorTerrainsPlugin::~TileMapEditorTerrainsPlugin() { @@ -3267,7 +3316,7 @@ void TileMapEditor::_notification(int p_what) { if (is_visible_in_tree() && tileset_changed_needs_update) { _update_bottom_panel(); _update_layers_selection(); - tile_map_editor_plugins[tabs->get_current_tab()]->tile_set_changed(); + tabs_plugins[tabs_bar->get_current_tab()]->tile_set_changed(); CanvasItemEditor::get_singleton()->update_viewport(); tileset_changed_needs_update = false; } @@ -3313,7 +3362,11 @@ void TileMapEditor::_layers_selection_button_draw() { clr = get_theme_color(SNAME("font_disabled_color")); break; default: - clr = get_theme_color(SNAME("font_color")); + if (layers_selection_button->has_focus()) { + clr = get_theme_color(SNAME("font_focus_color")); + } else { + clr = get_theme_color(SNAME("font_color")); + } } } @@ -3391,14 +3444,11 @@ void TileMapEditor::_update_bottom_panel() { // Update the visibility of controls. missing_tileset_label->set_visible(!tile_set.is_valid()); - if (!tile_set.is_valid()) { - for (int i = 0; i < tile_map_editor_plugins.size(); i++) { - tile_map_editor_plugins[i]->hide(); - } - } else { - for (int i = 0; i < tile_map_editor_plugins.size(); i++) { - tile_map_editor_plugins[i]->set_visible(i == tabs->get_current_tab()); - } + for (unsigned int tab_index = 0; tab_index < tabs_data.size(); tab_index++) { + tabs_data[tab_index].panel->hide(); + } + if (tile_set.is_valid()) { + tabs_data[tabs_bar->get_current_tab()].panel->show(); } } @@ -3481,27 +3531,25 @@ void TileMapEditor::_tile_map_changed() { void TileMapEditor::_tab_changed(int p_tab_id) { // Make the plugin edit the correct tilemap. - tile_map_editor_plugins[tabs->get_current_tab()]->edit(tile_map_id, tile_map_layer); + tabs_plugins[tabs_bar->get_current_tab()]->edit(tile_map_id, tile_map_layer); // Update toolbar. - for (int i = 0; i < tile_map_editor_plugins.size(); i++) { - tile_map_editor_plugins[i]->get_toolbar()->set_visible(i == p_tab_id); + for (unsigned int tab_index = 0; tab_index < tabs_data.size(); tab_index++) { + tabs_data[tab_index].toolbar->hide(); } + tabs_data[p_tab_id].toolbar->show(); // Update visible panel. TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); - if (!tile_map || !tile_map->get_tileset().is_valid()) { - for (int i = 0; i < tile_map_editor_plugins.size(); i++) { - tile_map_editor_plugins[i]->hide(); - } - } else { - for (int i = 0; i < tile_map_editor_plugins.size(); i++) { - tile_map_editor_plugins[i]->set_visible(i == tabs->get_current_tab()); - } + for (unsigned int tab_index = 0; tab_index < tabs_data.size(); tab_index++) { + tabs_data[tab_index].panel->hide(); + } + if (tile_map && tile_map->get_tileset().is_valid()) { + tabs_data[tabs_bar->get_current_tab()].panel->show(); } // Graphical update. - tile_map_editor_plugins[tabs->get_current_tab()]->update(); + tabs_data[tabs_bar->get_current_tab()].panel->update(); CanvasItemEditor::get_singleton()->update_viewport(); } @@ -3588,7 +3636,7 @@ void TileMapEditor::_update_layers_selection() { layers_selection_button->set_custom_minimum_size(min_button_size); layers_selection_button->update(); - tile_map_editor_plugins[tabs->get_current_tab()]->edit(tile_map_id, tile_map_layer); + tabs_plugins[tabs_bar->get_current_tab()]->edit(tile_map_id, tile_map_layer); } void TileMapEditor::_move_tile_map_array_element(Object *p_undo_redo, Object *p_edited, String p_array_prefix, int p_from_index, int p_to_pos) { @@ -3674,7 +3722,7 @@ bool TileMapEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return true; } - return tile_map_editor_plugins[tabs->get_current_tab()]->forward_canvas_gui_input(p_event); + return tabs_plugins[tabs_bar->get_current_tab()]->forward_canvas_gui_input(p_event); } void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) { @@ -3738,7 +3786,7 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) { } // Draw the warning icon. - int min_axis = missing_tile_texture->get_size().min_axis(); + Vector2::Axis min_axis = missing_tile_texture->get_size().min_axis_index(); Vector2 icon_size; icon_size[min_axis] = tile_set->get_tile_size()[min_axis] / 3; icon_size[(min_axis + 1) % 2] = (icon_size[min_axis] * missing_tile_texture->get_size()[(min_axis + 1) % 2] / missing_tile_texture->get_size()[min_axis]); @@ -3809,7 +3857,7 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) { }*/ // Draw the plugins. - tile_map_editor_plugins[tabs->get_current_tab()]->forward_canvas_draw_over_viewport(p_overlay); + tabs_plugins[tabs_bar->get_current_tab()]->forward_canvas_draw_over_viewport(p_overlay); } void TileMapEditor::edit(TileMap *p_tile_map) { @@ -3843,7 +3891,7 @@ void TileMapEditor::edit(TileMap *p_tile_map) { _update_layers_selection(); // Call the plugins. - tile_map_editor_plugins[tabs->get_current_tab()]->edit(tile_map_id, tile_map_layer); + tabs_plugins[tabs_bar->get_current_tab()]->edit(tile_map_id, tile_map_layer); _tile_map_changed(); } @@ -3852,32 +3900,40 @@ TileMapEditor::TileMapEditor() { set_process_internal(true); // Shortcuts. - ED_SHORTCUT("tiles_editor/select_next_layer", TTR("Select Next Tile Map Layer"), KEY_PAGEUP); - ED_SHORTCUT("tiles_editor/select_previous_layer", TTR("Select Previous Tile Map Layer"), KEY_PAGEDOWN); + ED_SHORTCUT("tiles_editor/select_next_layer", TTR("Select Next Tile Map Layer"), Key::PAGEUP); + ED_SHORTCUT("tiles_editor/select_previous_layer", TTR("Select Previous Tile Map Layer"), Key::PAGEDOWN); // TileMap editor plugins tile_map_editor_plugins.push_back(memnew(TileMapEditorTilesPlugin)); tile_map_editor_plugins.push_back(memnew(TileMapEditorTerrainsPlugin)); - // Tabs. - tabs = memnew(Tabs); - tabs->set_clip_tabs(false); - for (int i = 0; i < tile_map_editor_plugins.size(); i++) { - tabs->add_tab(tile_map_editor_plugins[i]->get_name()); + // TabBar. + tabs_bar = memnew(TabBar); + tabs_bar->set_clip_tabs(false); + for (int plugin_index = 0; plugin_index < tile_map_editor_plugins.size(); plugin_index++) { + Vector<TileMapEditorPlugin::TabData> tabs_vector = tile_map_editor_plugins[plugin_index]->get_tabs(); + for (int tab_index = 0; tab_index < tabs_vector.size(); tab_index++) { + tabs_bar->add_tab(tabs_vector[tab_index].panel->get_name()); + tabs_data.push_back(tabs_vector[tab_index]); + tabs_plugins.push_back(tile_map_editor_plugins[plugin_index]); + } } - tabs->connect("tab_changed", callable_mp(this, &TileMapEditor::_tab_changed)); + tabs_bar->connect("tab_changed", callable_mp(this, &TileMapEditor::_tab_changed)); // --- TileMap toolbar --- tile_map_toolbar = memnew(HBoxContainer); tile_map_toolbar->set_h_size_flags(SIZE_EXPAND_FILL); + add_child(tile_map_toolbar); // Tabs. - tile_map_toolbar->add_child(tabs); + tile_map_toolbar->add_child(tabs_bar); // Tabs toolbars. - for (int i = 0; i < tile_map_editor_plugins.size(); i++) { - tile_map_editor_plugins[i]->get_toolbar()->hide(); - tile_map_toolbar->add_child(tile_map_editor_plugins[i]->get_toolbar()); + for (unsigned int tab_index = 0; tab_index < tabs_data.size(); tab_index++) { + tabs_data[tab_index].toolbar->hide(); + if (!tabs_data[tab_index].toolbar->get_parent()) { + tile_map_toolbar->add_child(tabs_data[tab_index].toolbar); + } } // Wide empty separation control. @@ -3933,11 +3989,11 @@ TileMapEditor::TileMapEditor() { missing_tileset_label->hide(); add_child(missing_tileset_label); - for (int i = 0; i < tile_map_editor_plugins.size(); i++) { - add_child(tile_map_editor_plugins[i]); - tile_map_editor_plugins[i]->set_h_size_flags(SIZE_EXPAND_FILL); - tile_map_editor_plugins[i]->set_v_size_flags(SIZE_EXPAND_FILL); - tile_map_editor_plugins[i]->set_visible(i == 0); + for (unsigned int tab_index = 0; tab_index < tabs_data.size(); tab_index++) { + add_child(tabs_data[tab_index].panel); + tabs_data[tab_index].panel->set_v_size_flags(SIZE_EXPAND_FILL); + tabs_data[tab_index].panel->set_visible(tab_index == 0); + tabs_data[tab_index].panel->set_h_size_flags(SIZE_EXPAND_FILL); } _tab_changed(0); @@ -3947,4 +4003,7 @@ TileMapEditor::TileMapEditor() { } TileMapEditor::~TileMapEditor() { + for (int i = 0; i < tile_map_editor_plugins.size(); i++) { + memdelete(tile_map_editor_plugins[i]); + } } diff --git a/editor/plugins/tiles/tile_map_editor.h b/editor/plugins/tiles/tile_map_editor.h index a1ab3db318..f462119727 100644 --- a/editor/plugins/tiles/tile_map_editor.h +++ b/editor/plugins/tiles/tile_map_editor.h @@ -33,17 +33,24 @@ #include "tile_atlas_view.h" +#include "core/os/thread.h" #include "core/typedefs.h" #include "editor/editor_node.h" #include "scene/2d/tile_map.h" #include "scene/gui/box_container.h" -#include "scene/gui/tabs.h" +#include "scene/gui/tab_bar.h" -class TileMapEditorPlugin : public VBoxContainer { +class TileMapEditorPlugin : public Object { public: - virtual Control *get_toolbar() const { - return memnew(Control); + struct TabData { + Control *toolbar; + Control *panel; }; + + virtual Vector<TabData> get_tabs() const { + return Vector<TabData>(); + }; + virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return false; }; virtual void forward_canvas_draw_over_viewport(Control *p_overlay){}; virtual void tile_set_changed(){}; @@ -68,14 +75,15 @@ private: Button *line_tool_button; Button *rect_tool_button; Button *bucket_tool_button; - Button *picker_button; HBoxContainer *tools_settings; + VSeparator *tools_settings_vsep; + Button *picker_button; Button *erase_button; - CheckBox *bucket_continuous_checkbox; VSeparator *tools_settings_vsep_2; + CheckBox *bucket_contiguous_checkbox; CheckBox *random_tile_checkbox; float scattering = 0.0; Label *scatter_label; @@ -101,32 +109,38 @@ private: DRAG_TYPE_CLIPBOARD_PASTE, }; DragType drag_type = DRAG_TYPE_NONE; + bool drag_erasing = false; Vector2 drag_start_mouse_pos; Vector2 drag_last_mouse_pos; Map<Vector2i, TileMapCell> drag_modified; - TileMapCell _pick_random_tile(const TileMapPattern *p_pattern); - Map<Vector2i, TileMapCell> _draw_line(Vector2 p_start_drag_mouse_pos, Vector2 p_from_mouse_pos, Vector2 p_to_mouse_pos); - Map<Vector2i, TileMapCell> _draw_rect(Vector2i p_start_cell, Vector2i p_end_cell); - Map<Vector2i, TileMapCell> _draw_bucket_fill(Vector2i p_coords, bool p_contiguous); + TileMapCell _pick_random_tile(Ref<TileMapPattern> p_pattern); + Map<Vector2i, TileMapCell> _draw_line(Vector2 p_start_drag_mouse_pos, Vector2 p_from_mouse_pos, Vector2 p_to_mouse_pos, bool p_erase); + Map<Vector2i, TileMapCell> _draw_rect(Vector2i p_start_cell, Vector2i p_end_cell, bool p_erase); + Map<Vector2i, TileMapCell> _draw_bucket_fill(Vector2i p_coords, bool p_contiguous, bool p_erase); void _stop_dragging(); ///// Selection system. ///// Set<Vector2i> tile_map_selection; - TileMapPattern *tile_map_clipboard = memnew(TileMapPattern); - TileMapPattern *selection_pattern = memnew(TileMapPattern); + Ref<TileMapPattern> tile_map_clipboard; + Ref<TileMapPattern> selection_pattern; void _set_tile_map_selection(const TypedArray<Vector2i> &p_selection); TypedArray<Vector2i> _get_tile_map_selection() const; Set<TileMapCell> tile_set_selection; void _update_selection_pattern_from_tilemap_selection(); - void _update_selection_pattern_from_tileset_selection(); + void _update_selection_pattern_from_tileset_tiles_selection(); + void _update_selection_pattern_from_tileset_pattern_selection(); void _update_tileset_selection_from_selection_pattern(); void _update_fix_selected_and_hovered(); void _fix_invalid_tiles_in_tile_map_selection(); - ///// Bottom panel. ////. + ///// Bottom panel common //// + void _tab_changed(); + + ///// Bottom panel tiles //// + VBoxContainer *tiles_bottom_panel; Label *missing_source_label; Label *invalid_source_label; @@ -135,7 +149,7 @@ private: Ref<Texture2D> missing_atlas_texture_icon; void _update_tile_set_sources_list(); - void _update_bottom_panel(); + void _update_source_display(); // Atlas sources. TileMapCell hovered_tile; @@ -165,15 +179,26 @@ private: void _scenes_list_multi_selected(int p_index, bool p_selected); void _scenes_list_nothing_selected(); + ///// Bottom panel patterns //// + VBoxContainer *patterns_bottom_panel; + ItemList *patterns_item_list; + Label *patterns_help_label; + void _patterns_item_list_gui_input(const Ref<InputEvent> &p_event); + void _pattern_preview_done(Ref<TileMapPattern> p_pattern, Ref<Texture2D> p_texture); + bool select_last_pattern = false; + void _update_patterns_list(); + + // General + void _update_theme(); + // Update callback virtual void tile_set_changed() override; protected: - void _notification(int p_what); static void _bind_methods(); public: - virtual Control *get_toolbar() const override; + virtual Vector<TabData> get_tabs() const override; virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override; virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override; @@ -195,102 +220,73 @@ private: Ref<ButtonGroup> tool_buttons_group; Button *paint_tool_button; + Button *line_tool_button; + Button *rect_tool_button; + Button *bucket_tool_button; HBoxContainer *tools_settings; + VSeparator *tools_settings_vsep; Button *picker_button; Button *erase_button; + VSeparator *tools_settings_vsep_2; + CheckBox *bucket_contiguous_checkbox; void _update_toolbar(); + // Main vbox. + VBoxContainer *main_vbox_container; + // TileMap editing. + bool has_mouse = false; + void _mouse_exited_viewport(); + enum DragType { DRAG_TYPE_NONE = 0, DRAG_TYPE_PAINT, + DRAG_TYPE_LINE, + DRAG_TYPE_RECT, + DRAG_TYPE_BUCKET, DRAG_TYPE_PICK, }; DragType drag_type = DRAG_TYPE_NONE; + bool drag_erasing = false; Vector2 drag_start_mouse_pos; Vector2 drag_last_mouse_pos; Map<Vector2i, TileMapCell> drag_modified; // Painting - class Constraint { - private: - const TileMap *tile_map; - Vector2i base_cell_coords = Vector2i(); - int bit = -1; - int terrain = -1; - - public: - // TODO implement difference operator. - bool operator<(const Constraint &p_other) const { - if (base_cell_coords == p_other.base_cell_coords) { - return bit < p_other.bit; - } - return base_cell_coords < p_other.base_cell_coords; - } - - String to_string() const { - return vformat("Constraint {pos:%s, bit:%d, terrain:%d}", base_cell_coords, bit, terrain); - } - - Vector2i get_base_cell_coords() const { - return base_cell_coords; - } - - Map<Vector2i, TileSet::CellNeighbor> get_overlapping_coords_and_peering_bits() const; - - void set_terrain(int p_terrain) { - terrain = p_terrain; - } - - int get_terrain() const { - return terrain; - } - - Constraint(const TileMap *p_tile_map, const Vector2i &p_position, const TileSet::CellNeighbor &p_bit, int p_terrain); - Constraint() {} - }; - - typedef Array TerrainsTilePattern; - - Set<TerrainsTilePattern> _get_valid_terrains_tile_patterns_for_constraints(int p_terrain_set, const Vector2i &p_position, Set<TileMapEditorTerrainsPlugin::Constraint> p_constraints) const; - Set<TileMapEditorTerrainsPlugin::Constraint> _get_constraints_from_removed_cells_list(const Set<Vector2i> &p_to_replace, int p_terrain_set) const; - Set<TileMapEditorTerrainsPlugin::Constraint> _get_constraints_from_added_tile(Vector2i p_position, int p_terrain_set, TerrainsTilePattern p_terrains_tile_pattern) const; - Map<Vector2i, TerrainsTilePattern> _wave_function_collapse(const Set<Vector2i> &p_to_replace, int p_terrain_set, const Set<TileMapEditorTerrainsPlugin::Constraint> p_constraints) const; - TileMapCell _get_random_tile_from_pattern(int p_terrain_set, TerrainsTilePattern p_terrain_tile_pattern) const; - Map<Vector2i, TileMapCell> _draw_terrains(const Map<Vector2i, TerrainsTilePattern> &p_to_paint, int p_terrain_set) const; + Map<Vector2i, TileMapCell> _draw_terrains(const Map<Vector2i, TileSet::TerrainsPattern> &p_to_paint, int p_terrain_set) const; + Map<Vector2i, TileMapCell> _draw_line(Vector2i p_start_cell, Vector2i p_end_cell, bool p_erase); + Map<Vector2i, TileMapCell> _draw_rect(Vector2i p_start_cell, Vector2i p_end_cell, bool p_erase); + Set<Vector2i> _get_cells_for_bucket_fill(Vector2i p_coords, bool p_contiguous); + Map<Vector2i, TileMapCell> _draw_bucket_fill(Vector2i p_coords, bool p_contiguous, bool p_erase); void _stop_dragging(); - // Cached data. - TerrainsTilePattern _build_terrains_tile_pattern(TileData *p_tile_data); - LocalVector<Map<TerrainsTilePattern, Set<TileMapCell>>> per_terrain_terrains_tile_patterns_tiles; - LocalVector<LocalVector<Set<TerrainsTilePattern>>> per_terrain_terrains_tile_patterns; - - Map<TileMapCell, TileData *> terrain_tiles; - LocalVector<TileSet::CellNeighbor> tile_sides; + int selected_terrain_set = -1; + TileSet::TerrainsPattern selected_terrains_pattern; + void _update_selection(); // Bottom panel. Tree *terrains_tree; ItemList *terrains_tile_list; + // Cache. + LocalVector<LocalVector<Set<TileSet::TerrainsPattern>>> per_terrain_terrains_patterns; + // Update functions. void _update_terrains_cache(); void _update_terrains_tree(); void _update_tiles_list(); + void _update_theme(); // Update callback virtual void tile_set_changed() override; -protected: - void _notification(int p_what); - // static void _bind_methods(); - public: - virtual Control *get_toolbar() const override; + virtual Vector<TabData> get_tabs() const override; virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override; - //virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override; + virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override; TileMapEditorTerrainsPlugin(); ~TileMapEditorTerrainsPlugin(); @@ -326,7 +322,9 @@ private: // Bottom panel. Label *missing_tileset_label; - Tabs *tabs; + TabBar *tabs_bar; + LocalVector<TileMapEditorPlugin::TabData> tabs_data; + LocalVector<TileMapEditorPlugin *> tabs_plugins; void _update_bottom_panel(); // TileMap. @@ -353,7 +351,6 @@ public: void forward_canvas_draw_over_viewport(Control *p_overlay); void edit(TileMap *p_tile_map); - Control *get_toolbar() { return tile_map_toolbar; }; TileMapEditor(); ~TileMapEditor(); diff --git a/editor/plugins/tiles/tile_proxies_manager_dialog.cpp b/editor/plugins/tiles/tile_proxies_manager_dialog.cpp index 9e47a44b34..60a66ab954 100644 --- a/editor/plugins/tiles/tile_proxies_manager_dialog.cpp +++ b/editor/plugins/tiles/tile_proxies_manager_dialog.cpp @@ -34,7 +34,7 @@ void TileProxiesManagerDialog::_right_clicked(int p_item, Vector2 p_local_mouse_pos, Object *p_item_list) { ItemList *item_list = Object::cast_to<ItemList>(p_item_list); - popup_menu->set_size(Vector2(1, 1)); + popup_menu->reset_size(); popup_menu->set_position(get_position() + item_list->get_global_mouse_position()); popup_menu->popup(); } diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp index 3fbd315aec..a48c0e795c 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp @@ -66,10 +66,15 @@ int TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::get_id() { } bool TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_set(const StringName &p_name, const Variant &p_value) { + String name = p_name; + if (name == "name") { + // Use the resource_name property to store the source's name. + name = "resource_name"; + } bool valid = false; - tile_set_atlas_source->set(p_name, p_value, &valid); + tile_set_atlas_source->set(name, p_value, &valid); if (valid) { - emit_signal(SNAME("changed"), String(p_name).utf8().get_data()); + emit_signal(SNAME("changed"), String(name).utf8().get_data()); } return valid; } @@ -78,16 +83,23 @@ bool TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get(const StringN if (!tile_set_atlas_source) { return false; } + String name = p_name; + if (name == "name") { + // Use the resource_name property to store the source's name. + name = "resource_name"; + } bool valid = false; - r_ret = tile_set_atlas_source->get(p_name, &valid); + r_ret = tile_set_atlas_source->get(name, &valid); return valid; } void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get_property_list(List<PropertyInfo> *p_list) const { + p_list->push_back(PropertyInfo(Variant::STRING, "name", PROPERTY_HINT_NONE, "")); p_list->push_back(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D")); p_list->push_back(PropertyInfo(Variant::VECTOR2I, "margins", PROPERTY_HINT_NONE, "")); p_list->push_back(PropertyInfo(Variant::VECTOR2I, "separation", PROPERTY_HINT_NONE, "")); p_list->push_back(PropertyInfo(Variant::VECTOR2I, "texture_region_size", PROPERTY_HINT_NONE, "")); + p_list->push_back(PropertyInfo(Variant::BOOL, "use_texture_padding", PROPERTY_HINT_NONE, "")); } void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_bind_methods() { @@ -106,6 +118,10 @@ void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::edit(Ref<TileSet> ERR_FAIL_COND(p_source_id < 0); ERR_FAIL_COND(p_tile_set->get_source(p_source_id) != p_tile_set_atlas_source); + if (p_tile_set == tile_set && p_tile_set_atlas_source == tile_set_atlas_source && p_source_id == source_id) { + return; + } + // Disconnect to changes. if (tile_set_atlas_source) { tile_set_atlas_source->disconnect(CoreStringNames::get_singleton()->property_list_changed, callable_mp((Object *)this, &Object::notify_property_list_changed)); @@ -157,7 +173,7 @@ bool TileSetAtlasSourceEditor::AtlasTileProxyObject::_set(const StringName &p_na } else if (p_name == "size_in_atlas") { Vector2i as_vector2i = Vector2i(p_value); bool has_room_for_tile = tile_set_atlas_source->has_room_for_tile(coords, as_vector2i, tile_set_atlas_source->get_tile_animation_columns(coords), tile_set_atlas_source->get_tile_animation_separation(coords), tile_set_atlas_source->get_tile_animation_frames_count(coords), coords); - ERR_FAIL_COND_V(!has_room_for_tile, false); + ERR_FAIL_COND_V_EDMSG(!has_room_for_tile, false, "Invalid size or not enough room in the atlas for the tile."); tile_set_atlas_source->move_tile_in_atlas(coords, TileSetSource::INVALID_ATLAS_COORDS, as_vector2i); emit_signal(SNAME("changed"), "size_in_atlas"); return true; @@ -520,9 +536,6 @@ void TileSetAtlasSourceEditor::_update_tile_id_label() { void TileSetAtlasSourceEditor::_update_source_inspector() { // Update the proxy object. atlas_source_proxy_object->edit(tile_set, tile_set_atlas_source, tile_set_atlas_source_id); - - // Update the "clear outside texture" button. - tool_advanced_menu_buttom->get_popup()->set_item_disabled(0, !tile_set_atlas_source->has_tiles_outside_texture()); } void TileSetAtlasSourceEditor::_update_fix_selected_and_hovered_tiles() { @@ -763,7 +776,11 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { // Update visibility. bool is_visible = tools_button_group->get_pressed_button() == tool_paint_button; tile_data_editor_dropdown_button->set_visible(is_visible); - tile_data_editor_dropdown_button->set_text(TTR("Select a property editor")); + if (tile_data_editors_tree->get_selected()) { + tile_data_editor_dropdown_button->set_text(tile_data_editors_tree->get_selected()->get_text(0)); + } else { + tile_data_editor_dropdown_button->set_text(TTR("Select a property editor")); + } tile_data_editors_label->set_visible(is_visible); } @@ -825,7 +842,11 @@ void TileSetAtlasSourceEditor::_tile_data_editor_dropdown_button_draw() { clr = get_theme_color(SNAME("font_disabled_color")); break; default: - clr = get_theme_color(SNAME("font_color")); + if (tile_data_editor_dropdown_button->has_focus()) { + clr = get_theme_color(SNAME("font_focus_color")); + } else { + clr = get_theme_color(SNAME("font_color")); + } } } @@ -908,7 +929,7 @@ void TileSetAtlasSourceEditor::_update_atlas_view() { tile_atlas_view->update(); // Synchronize atlas view. - TilesEditor::get_singleton()->synchronize_atlas_view(tile_atlas_view); + TilesEditorPlugin::get_singleton()->synchronize_atlas_view(tile_atlas_view); } void TileSetAtlasSourceEditor::_update_toolbar() { @@ -959,7 +980,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_gui_input(const Ref<InputEven current_tile_data_editor->forward_painting_atlas_gui_input(tile_atlas_view, tile_set_atlas_source, p_event); } // Update only what's needed. - tile_set_atlas_source_changed_needs_update = false; + tile_set_changed_needs_update = false; tile_atlas_control->update(); tile_atlas_control_unscaled->update(); @@ -1061,7 +1082,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_gui_input(const Ref<InputEven drag_current_tile = coords; // Update only what's needed. - tile_set_atlas_source_changed_needs_update = false; + tile_set_changed_needs_update = false; _update_tile_inspector(); _update_atlas_view(); _update_tile_id_label(); @@ -1101,7 +1122,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_gui_input(const Ref<InputEven drag_current_tile = new_rect.position; // Update only what's needed. - tile_set_atlas_source_changed_needs_update = false; + tile_set_changed_needs_update = false; _update_tile_inspector(); _update_atlas_view(); _update_tile_id_label(); @@ -1121,7 +1142,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_gui_input(const Ref<InputEven Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { Vector2 mouse_local_pos = tile_atlas_control->get_local_mouse_position(); - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { // Left click pressed. if (tools_button_group->get_pressed_button() == tool_setup_atlas_source_button) { @@ -1267,7 +1288,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_gui_input(const Ref<InputEven alternative_tiles_control_unscaled->update(); tile_atlas_view->update(); return; - } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) { + } else if (mb->get_button_index() == MouseButton::RIGHT) { // Right click pressed. if (mb->is_pressed()) { drag_type = DRAG_TYPE_MAY_POPUP_MENU; @@ -1406,7 +1427,7 @@ void TileSetAtlasSourceEditor::_end_dragging() { // Determine if we clear, then add or remove to the selection. bool add_to_selection = true; - if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) { Vector2i coords = tile_set_atlas_source->get_tile_at_coords(start_base_tiles_coords); if (coords != TileSetSource::INVALID_ATLAS_COORDS) { if (selection.has({ coords, 0 })) { @@ -1600,9 +1621,6 @@ void TileSetAtlasSourceEditor::_menu_option(int p_option) { undo_redo->commit_action(); _update_tile_id_label(); } break; - case ADVANCED_CLEANUP_TILES_OUTSIDE_TEXTURE: { - tile_set_atlas_source->clear_tiles_outside_texture(); - } break; case ADVANCED_AUTO_CREATE_TILES: { _auto_create_tiles(); } break; @@ -1874,7 +1892,7 @@ void TileSetAtlasSourceEditor::_tile_alternatives_control_gui_input(const Ref<In drag_type = DRAG_TYPE_NONE; Vector2 mouse_local_pos = alternative_tiles_control->get_local_mouse_position(); - if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { // Left click pressed. if (tools_button_group->get_pressed_button() == tool_select_button) { @@ -1890,7 +1908,7 @@ void TileSetAtlasSourceEditor::_tile_alternatives_control_gui_input(const Ref<In _update_tile_id_label(); } } - } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) { + } else if (mb->get_button_index() == MouseButton::RIGHT) { if (mb->is_pressed()) { // Right click pressed Vector3 tile = tile_atlas_view->get_alternative_tile_at_pos(mouse_local_pos); @@ -2012,12 +2030,12 @@ void TileSetAtlasSourceEditor::_tile_alternatives_control_unscaled_draw() { } } -void TileSetAtlasSourceEditor::_tile_set_atlas_source_changed() { - tile_set_atlas_source_changed_needs_update = true; +void TileSetAtlasSourceEditor::_tile_set_changed() { + tile_set_changed_needs_update = true; } void TileSetAtlasSourceEditor::_tile_proxy_object_changed(String p_what) { - tile_set_atlas_source_changed_needs_update = false; // Avoid updating too many things. + tile_set_changed_needs_update = false; // Avoid updating too many things. _update_atlas_view(); } @@ -2035,30 +2053,66 @@ void TileSetAtlasSourceEditor::_undo_redo_inspector_callback(Object *p_undo_redo #define ADD_UNDO(obj, property) undo_redo->add_undo_property(obj, property, obj->get(property)); - AtlasTileProxyObject *tile_data = Object::cast_to<AtlasTileProxyObject>(p_edited); - if (tile_data) { + undo_redo->start_force_keep_in_merge_ends(); + AtlasTileProxyObject *tile_data_proxy = Object::cast_to<AtlasTileProxyObject>(p_edited); + if (tile_data_proxy) { Vector<String> components = String(p_property).split("/", true, 2); if (components.size() == 2 && components[1] == "polygons_count") { int layer_index = components[0].trim_prefix("physics_layer_").to_int(); int new_polygons_count = p_new_value; - int old_polygons_count = tile_data->get(vformat("physics_layer_%d/polygons_count", layer_index)); + int old_polygons_count = tile_data_proxy->get(vformat("physics_layer_%d/polygons_count", layer_index)); if (new_polygons_count < old_polygons_count) { - for (int i = new_polygons_count - 1; i < old_polygons_count; i++) { - ADD_UNDO(tile_data, vformat("physics_layer_%d/polygon_%d/points", layer_index, i)); - ADD_UNDO(tile_data, vformat("physics_layer_%d/polygon_%d/one_way", layer_index, i)); - ADD_UNDO(tile_data, vformat("physics_layer_%d/polygon_%d/one_way_margin", layer_index, i)); + for (int i = new_polygons_count; i < old_polygons_count; i++) { + ADD_UNDO(tile_data_proxy, vformat("physics_layer_%d/polygon_%d/points", layer_index, i)); + ADD_UNDO(tile_data_proxy, vformat("physics_layer_%d/polygon_%d/one_way", layer_index, i)); + ADD_UNDO(tile_data_proxy, vformat("physics_layer_%d/polygon_%d/one_way_margin", layer_index, i)); } } } else if (p_property == "terrain_set") { - int current_terrain_set = tile_data->get("terrain_set"); + int current_terrain_set = tile_data_proxy->get("terrain_set"); for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); if (tile_set->is_valid_peering_bit_terrain(current_terrain_set, bit)) { - ADD_UNDO(tile_data, "terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i])); + ADD_UNDO(tile_data_proxy, "terrains_peering_bit/" + String(TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i])); } } } } + + TileSetAtlasSourceProxyObject *atlas_source_proxy = Object::cast_to<TileSetAtlasSourceProxyObject>(p_edited); + if (atlas_source_proxy) { + TileSetAtlasSource *atlas_source = atlas_source_proxy->get_edited(); + ERR_FAIL_COND(!atlas_source); + + PackedVector2Array arr; + if (p_property == "texture") { + arr = atlas_source->get_tiles_to_be_removed_on_change(p_new_value, atlas_source->get_margins(), atlas_source->get_separation(), atlas_source->get_texture_region_size()); + } else if (p_property == "margins") { + arr = atlas_source->get_tiles_to_be_removed_on_change(atlas_source->get_texture(), p_new_value, atlas_source->get_separation(), atlas_source->get_texture_region_size()); + } else if (p_property == "separation") { + arr = atlas_source->get_tiles_to_be_removed_on_change(atlas_source->get_texture(), atlas_source->get_margins(), p_new_value, atlas_source->get_texture_region_size()); + } else if (p_property == "texture_region_size") { + arr = atlas_source->get_tiles_to_be_removed_on_change(atlas_source->get_texture(), atlas_source->get_margins(), atlas_source->get_separation(), p_new_value); + } + + if (!arr.is_empty()) { + // Get all properties assigned to a tile. + List<PropertyInfo> properties; + atlas_source->get_property_list(&properties); + + for (int i = 0; i < arr.size(); i++) { + Vector2i coords = arr[i]; + String prefix = vformat("%d:%d/", coords.x, coords.y); + for (PropertyInfo pi : properties) { + if (pi.name.begins_with(prefix)) { + ADD_UNDO(atlas_source, pi.name); + } + } + } + } + } + undo_redo->end_force_keep_in_merge_ends(); + #undef ADD_UNDO } @@ -2073,8 +2127,8 @@ void TileSetAtlasSourceEditor::edit(Ref<TileSet> p_tile_set, TileSetAtlasSource } // Remove listener for old objects. - if (tile_set_atlas_source) { - tile_set_atlas_source->disconnect("changed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_set_atlas_source_changed)); + if (tile_set.is_valid()) { + tile_set->disconnect("changed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_set_changed)); } // Clear the selection. @@ -2086,8 +2140,8 @@ void TileSetAtlasSourceEditor::edit(Ref<TileSet> p_tile_set, TileSetAtlasSource tile_set_atlas_source_id = p_source_id; // Add the listener again. - if (tile_set_atlas_source) { - tile_set_atlas_source->connect("changed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_set_atlas_source_changed)); + if (tile_set.is_valid()) { + tile_set->connect("changed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_set_changed)); } // Update everything. @@ -2228,7 +2282,7 @@ void TileSetAtlasSourceEditor::_notification(int p_what) { resize_handle_disabled = get_theme_icon(SNAME("EditorHandleDisabled"), SNAME("EditorIcons")); break; case NOTIFICATION_INTERNAL_PROCESS: - if (tile_set_atlas_source_changed_needs_update) { + if (tile_set_changed_needs_update) { // Update everything. _update_source_inspector(); @@ -2241,7 +2295,7 @@ void TileSetAtlasSourceEditor::_notification(int p_what) { _update_tile_data_editors(); _update_current_tile_data_editor(); - tile_set_atlas_source_changed_needs_update = false; + tile_set_changed_needs_update = false; } break; default: @@ -2400,14 +2454,12 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { tools_settings_erase_button = memnew(Button); tools_settings_erase_button->set_flat(true); tools_settings_erase_button->set_toggle_mode(true); - tools_settings_erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", "Eraser", KEY_E)); + tools_settings_erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", "Eraser", Key::E)); tools_settings_erase_button->set_shortcut_context(this); tool_settings->add_child(tools_settings_erase_button); tool_advanced_menu_buttom = memnew(MenuButton); tool_advanced_menu_buttom->set_flat(true); - tool_advanced_menu_buttom->get_popup()->add_item(TTR("Cleanup Tiles Outside Texture"), ADVANCED_CLEANUP_TILES_OUTSIDE_TEXTURE); - tool_advanced_menu_buttom->get_popup()->set_item_disabled(0, true); tool_advanced_menu_buttom->get_popup()->add_item(TTR("Create Tiles in Non-Transparent Texture Regions"), ADVANCED_AUTO_CREATE_TILES); tool_advanced_menu_buttom->get_popup()->add_item(TTR("Remove Tiles in Fully Transparent Texture Regions"), ADVANCED_AUTO_REMOVE_TILES); tool_advanced_menu_buttom->get_popup()->connect("id_pressed", callable_mp(this, &TileSetAtlasSourceEditor::_menu_option)); @@ -2429,12 +2481,12 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { tile_atlas_view = memnew(TileAtlasView); tile_atlas_view->set_h_size_flags(SIZE_EXPAND_FILL); tile_atlas_view->set_v_size_flags(SIZE_EXPAND_FILL); - tile_atlas_view->connect("transform_changed", callable_mp(TilesEditor::get_singleton(), &TilesEditor::set_atlas_view_transform)); + tile_atlas_view->connect("transform_changed", callable_mp(TilesEditorPlugin::get_singleton(), &TilesEditorPlugin::set_atlas_view_transform)); tile_atlas_view->connect("transform_changed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_atlas_view_transform_changed).unbind(2)); right_panel->add_child(tile_atlas_view); base_tile_popup_menu = memnew(PopupMenu); - base_tile_popup_menu->add_shortcut(ED_SHORTCUT("tiles_editor/delete", TTR("Delete"), KEY_DELETE), TILE_DELETE); + base_tile_popup_menu->add_shortcut(ED_SHORTCUT("tiles_editor/delete", TTR("Delete"), Key::KEY_DELETE), TILE_DELETE); base_tile_popup_menu->add_item(TTR("Create an Alternative Tile"), TILE_CREATE_ALTERNATIVE); base_tile_popup_menu->connect("id_pressed", callable_mp(this, &TileSetAtlasSourceEditor::_menu_option)); tile_atlas_view->add_child(base_tile_popup_menu); @@ -2457,7 +2509,7 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { tile_atlas_control_unscaled->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); alternative_tile_popup_menu = memnew(PopupMenu); - alternative_tile_popup_menu->add_shortcut(ED_SHORTCUT("tiles_editor/delete_tile", TTR("Delete"), KEY_DELETE), TILE_DELETE); + alternative_tile_popup_menu->add_shortcut(ED_SHORTCUT("tiles_editor/delete_tile", TTR("Delete"), Key::KEY_DELETE), TILE_DELETE); alternative_tile_popup_menu->connect("id_pressed", callable_mp(this, &TileSetAtlasSourceEditor::_menu_option)); tile_atlas_view->add_child(alternative_tile_popup_menu); @@ -2481,9 +2533,196 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { tile_atlas_view_missing_source_label->set_v_size_flags(SIZE_EXPAND_FILL); tile_atlas_view_missing_source_label->hide(); right_panel->add_child(tile_atlas_view_missing_source_label); + + EditorNode::get_singleton()->get_editor_data().add_undo_redo_inspector_hook_callback(callable_mp(this, &TileSetAtlasSourceEditor::_undo_redo_inspector_callback)); + + // Inspector plugin. + Ref<EditorInspectorPluginTileData> tile_data_inspector_plugin; + tile_data_inspector_plugin.instantiate(); + EditorInspector::add_inspector_plugin(tile_data_inspector_plugin); } TileSetAtlasSourceEditor::~TileSetAtlasSourceEditor() { memdelete(tile_proxy_object); memdelete(atlas_source_proxy_object); } + +////// EditorPropertyTilePolygon ////// + +void EditorPropertyTilePolygon::_add_focusable_children(Node *p_node) { + Control *control = Object::cast_to<Control>(p_node); + if (control && control->get_focus_mode() != Control::FOCUS_NONE) { + add_focusable(control); + } + for (int i = 0; i < p_node->get_child_count(); i++) { + _add_focusable_children(p_node->get_child(i)); + } +} + +void EditorPropertyTilePolygon::_polygons_changed() { + if (String(count_property).is_empty()) { + if (base_type == "OccluderPolygon2D") { + // Single OccluderPolygon2D. + Ref<OccluderPolygon2D> occluder; + if (generic_tile_polygon_editor->get_polygon_count() >= 1) { + occluder.instantiate(); + occluder->set_polygon(generic_tile_polygon_editor->get_polygon(0)); + } + emit_changed(get_edited_property(), occluder); + } else if (base_type == "NavigationPolygon") { + Ref<NavigationPolygon> navigation_polygon; + if (generic_tile_polygon_editor->get_polygon_count() >= 1) { + navigation_polygon.instantiate(); + for (int i = 0; i < generic_tile_polygon_editor->get_polygon_count(); i++) { + Vector<Vector2> polygon = generic_tile_polygon_editor->get_polygon(i); + navigation_polygon->add_outline(polygon); + } + navigation_polygon->make_polygons_from_outlines(); + } + emit_changed(get_edited_property(), navigation_polygon); + } + } else { + if (base_type.is_empty()) { + // Multiple array of vertices. + Vector<String> changed_properties; + Array values; + int count = generic_tile_polygon_editor->get_polygon_count(); + changed_properties.push_back(count_property); + values.push_back(count); + for (int i = 0; i < count; i++) { + changed_properties.push_back(vformat(element_pattern, i)); + values.push_back(generic_tile_polygon_editor->get_polygon(i)); + } + emit_signal("multiple_properties_changed", changed_properties, values, false); + } + } +} + +void EditorPropertyTilePolygon::update_property() { + TileSetAtlasSourceEditor::AtlasTileProxyObject *atlas_tile_proxy_object = Object::cast_to<TileSetAtlasSourceEditor::AtlasTileProxyObject>(get_edited_object()); + ERR_FAIL_COND(!atlas_tile_proxy_object); + ERR_FAIL_COND(atlas_tile_proxy_object->get_edited_tiles().is_empty()); + + TileSetAtlasSource *tile_set_atlas_source = atlas_tile_proxy_object->get_edited_tile_set_atlas_source(); + generic_tile_polygon_editor->set_tile_set(Ref<TileSet>(tile_set_atlas_source->get_tile_set())); + + // Set the background + Vector2i coords = atlas_tile_proxy_object->get_edited_tiles().front()->get().tile; + int alternative = atlas_tile_proxy_object->get_edited_tiles().front()->get().alternative; + TileData *tile_data = Object::cast_to<TileData>(tile_set_atlas_source->get_tile_data(coords, alternative)); + generic_tile_polygon_editor->set_background(tile_set_atlas_source->get_texture(), tile_set_atlas_source->get_tile_texture_region(coords), tile_set_atlas_source->get_tile_effective_texture_offset(coords, alternative), tile_data->get_flip_h(), tile_data->get_flip_v(), tile_data->get_transpose(), tile_data->get_modulate()); + + // Reset the polygons. + generic_tile_polygon_editor->clear_polygons(); + + if (String(count_property).is_empty()) { + if (base_type == "OccluderPolygon2D") { + // Single OccluderPolygon2D. + Ref<OccluderPolygon2D> occluder = get_edited_object()->get(get_edited_property()); + generic_tile_polygon_editor->clear_polygons(); + if (occluder.is_valid()) { + generic_tile_polygon_editor->add_polygon(occluder->get_polygon()); + } + } else if (base_type == "NavigationPolygon") { + // Single OccluderPolygon2D. + Ref<NavigationPolygon> navigation_polygon = get_edited_object()->get(get_edited_property()); + generic_tile_polygon_editor->clear_polygons(); + if (navigation_polygon.is_valid()) { + for (int i = 0; i < navigation_polygon->get_outline_count(); i++) { + generic_tile_polygon_editor->add_polygon(navigation_polygon->get_outline(i)); + } + } + } + } else { + int count = get_edited_object()->get(count_property); + if (base_type.is_empty()) { + // Multiple array of vertices. + generic_tile_polygon_editor->clear_polygons(); + for (int i = 0; i < count; i++) { + generic_tile_polygon_editor->add_polygon(get_edited_object()->get(vformat(element_pattern, i))); + } + } + } +} + +void EditorPropertyTilePolygon::setup_single_mode(const StringName &p_property, const String &p_base_type) { + set_object_and_property(nullptr, p_property); + base_type = p_base_type; + + generic_tile_polygon_editor->set_multiple_polygon_mode(false); +} + +void EditorPropertyTilePolygon::setup_multiple_mode(const StringName &p_property, const StringName &p_count_property, const String &p_element_pattern, const String &p_base_type) { + set_object_and_property(nullptr, p_property); + count_property = p_count_property; + element_pattern = p_element_pattern; + base_type = p_base_type; + + generic_tile_polygon_editor->set_multiple_polygon_mode(true); +} + +EditorPropertyTilePolygon::EditorPropertyTilePolygon() { + // Setup the polygon editor. + generic_tile_polygon_editor = memnew(GenericTilePolygonEditor); + generic_tile_polygon_editor->set_use_undo_redo(false); + generic_tile_polygon_editor->clear_polygons(); + add_child(generic_tile_polygon_editor); + generic_tile_polygon_editor->connect("polygons_changed", callable_mp(this, &EditorPropertyTilePolygon::_polygons_changed)); + + // Add all focussable children of generic_tile_polygon_editor as focussable. + _add_focusable_children(generic_tile_polygon_editor); +} + +////// EditorInspectorPluginTileData ////// + +bool EditorInspectorPluginTileData::can_handle(Object *p_object) { + return Object::cast_to<TileSetAtlasSourceEditor::AtlasTileProxyObject>(p_object) != nullptr; +} + +bool EditorInspectorPluginTileData::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { + Vector<String> components = String(p_path).split("/", true, 2); + if (components.size() == 2 && components[0].begins_with("occlusion_layer_") && components[0].trim_prefix("occlusion_layer_").is_valid_int()) { + // Occlusion layers. + int layer_index = components[0].trim_prefix("occlusion_layer_").to_int(); + ERR_FAIL_COND_V(layer_index < 0, false); + if (components[1] == "polygon") { + EditorPropertyTilePolygon *ep = memnew(EditorPropertyTilePolygon); + ep->setup_single_mode(p_path, "OccluderPolygon2D"); + add_property_editor(p_path, ep); + return true; + } + } else if (components.size() >= 2 && components[0].begins_with("physics_layer_") && components[0].trim_prefix("physics_layer_").is_valid_int()) { + // Physics layers. + int layer_index = components[0].trim_prefix("physics_layer_").to_int(); + ERR_FAIL_COND_V(layer_index < 0, false); + if (components[1] == "polygons_count") { + EditorPropertyTilePolygon *ep = memnew(EditorPropertyTilePolygon); + ep->setup_multiple_mode(vformat("physics_layer_%d/polygons", layer_index), vformat("physics_layer_%d/polygons_count", layer_index), vformat("physics_layer_%d/polygon_%%d/points", layer_index), ""); + Vector<String> properties; + properties.push_back(p_path); + int count = p_object->get(vformat("physics_layer_%d/polygons_count", layer_index)); + for (int i = 0; i < count; i++) { + properties.push_back(vformat(vformat("physics_layer_%d/polygon_%d/points", layer_index, i))); + } + add_property_editor_for_multiple_properties("Polygons", properties, ep); + return true; + } else if (components.size() == 3 && components[1].begins_with("polygon_") && components[1].trim_prefix("polygon_").is_valid_int()) { + int polygon_index = components[1].trim_prefix("polygon_").to_int(); + ERR_FAIL_COND_V(polygon_index < 0, false); + if (components[2] == "points") { + return true; + } + } + } else if (components.size() == 2 && components[0].begins_with("navigation_layer_") && components[0].trim_prefix("navigation_layer_").is_valid_int()) { + // Navigation layers. + int layer_index = components[0].trim_prefix("navigation_layer_").to_int(); + ERR_FAIL_COND_V(layer_index < 0, false); + if (components[1] == "polygon") { + EditorPropertyTilePolygon *ep = memnew(EditorPropertyTilePolygon); + ep->setup_single_mode(p_path, "NavigationPolygon"); + add_property_editor(p_path, ep); + return true; + } + } + return false; +} diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.h b/editor/plugins/tiles/tile_set_atlas_source_editor.h index 6448b55feb..bd1fd2e7d0 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.h +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.h @@ -43,7 +43,7 @@ class TileSet; class TileSetAtlasSourceEditor : public HBoxContainer { GDCLASS(TileSetAtlasSourceEditor, HBoxContainer); -private: +public: // A class to store which tiles are selected. struct TileSelection { Vector2i tile = TileSetSource::INVALID_ATLAS_COORDS; @@ -78,6 +78,7 @@ private: int get_id(); void edit(Ref<TileSet> p_tile_set, TileSetAtlasSource *p_tile_set_atlas_source, int p_source_id); + TileSetAtlasSource *get_edited() { return tile_set_atlas_source; }; }; // -- Proxy object for a tile, needed by the inspector -- @@ -98,6 +99,9 @@ private: static void _bind_methods(); public: + TileSetAtlasSource *get_edited_tile_set_atlas_source() const { return tile_set_atlas_source; }; + Set<TileSelection> get_edited_tiles() const { return tiles; }; + // Update the proxyed object. void edit(TileSetAtlasSource *p_tile_set_atlas_source, Set<TileSelection> p_tiles = Set<TileSelection>()); @@ -106,13 +110,14 @@ private: } }; +private: Ref<TileSet> tile_set; TileSetAtlasSource *tile_set_atlas_source = nullptr; int tile_set_atlas_source_id = TileSet::INVALID_SOURCE; UndoRedo *undo_redo = EditorNode::get_undo_redo(); - bool tile_set_atlas_source_changed_needs_update = false; + bool tile_set_changed_needs_update = false; // -- Properties painting -- VBoxContainer *tile_data_painting_editor_container; @@ -189,7 +194,6 @@ private: TILE_CREATE_ALTERNATIVE, TILE_DELETE, - ADVANCED_CLEANUP_TILES_OUTSIDE_TEXTURE, ADVANCED_AUTO_CREATE_TILES, ADVANCED_AUTO_REMOVE_TILES, }; @@ -263,7 +267,7 @@ private: void _auto_remove_tiles(); AcceptDialog *confirm_auto_create_tiles; - void _tile_set_atlas_source_changed(); + void _tile_set_changed(); void _tile_proxy_object_changed(String p_what); void _atlas_source_proxy_object_changed(String p_what); @@ -281,4 +285,34 @@ public: ~TileSetAtlasSourceEditor(); }; +class EditorPropertyTilePolygon : public EditorProperty { + GDCLASS(EditorPropertyTilePolygon, EditorProperty); + + StringName count_property; + String element_pattern; + String base_type; + + void _add_focusable_children(Node *p_node); + + GenericTilePolygonEditor *generic_tile_polygon_editor; + void _polygons_changed(); + +public: + virtual void update_property() override; + void setup_single_mode(const StringName &p_property, const String &p_base_type); + void setup_multiple_mode(const StringName &p_property, const StringName &p_count_property, const String &p_element_pattern, const String &p_base_type); + EditorPropertyTilePolygon(); +}; + +class EditorInspectorPluginTileData : public EditorInspectorPlugin { + GDCLASS(EditorInspectorPluginTileData, EditorInspectorPlugin); + + void _occlusion_polygon_set_callback(); + void _polygons_changed(Object *p_generic_tile_polygon_editor, Object *p_object, const String &p_path); + +public: + virtual bool can_handle(Object *p_object) override; + virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; +}; + #endif // TILE_SET_ATLAS_SOURCE_EDITOR_H diff --git a/editor/plugins/tiles/tile_set_editor.cpp b/editor/plugins/tiles/tile_set_editor.cpp index 48d0d9b333..915ce50836 100644 --- a/editor/plugins/tiles/tile_set_editor.cpp +++ b/editor/plugins/tiles/tile_set_editor.cpp @@ -41,10 +41,10 @@ TileSetEditor *TileSetEditor::singleton = nullptr; -void TileSetEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { +void TileSetEditor::_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { ERR_FAIL_COND(!tile_set.is_valid()); - if (!can_drop_data_fw(p_point, p_data, p_from)) { + if (!_can_drop_data_fw(p_point, p_data, p_from)) { return; } @@ -81,7 +81,7 @@ void TileSetEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, C } } -bool TileSetEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { +bool TileSetEditor::_can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { ERR_FAIL_COND_V(!tile_set.is_valid(), false); if (p_from == sources_list) { @@ -145,14 +145,21 @@ void TileSetEditor::_update_sources_list(int force_selected_id) { Ref<Texture2D> texture; String item_text; + // Common to all type of sources. + if (!source->get_name().is_empty()) { + item_text = vformat(TTR("%s (id:%d)"), source->get_name(), source_id); + } + // Atlas source. TileSetAtlasSource *atlas_source = Object::cast_to<TileSetAtlasSource>(source); if (atlas_source) { texture = atlas_source->get_texture(); - if (texture.is_valid()) { - item_text = vformat("%s (id:%d)", texture->get_path().get_file(), source_id); - } else { - item_text = vformat(TTR("No Texture Atlas Source (id:%d)"), source_id); + if (item_text.is_empty()) { + if (texture.is_valid()) { + item_text = vformat("%s (ID:%d)", texture->get_path().get_file(), source_id); + } else { + item_text = vformat(TTR("No Texture Atlas Source (ID:%d)"), source_id); + } } } @@ -160,12 +167,14 @@ void TileSetEditor::_update_sources_list(int force_selected_id) { TileSetScenesCollectionSource *scene_collection_source = Object::cast_to<TileSetScenesCollectionSource>(source); if (scene_collection_source) { texture = get_theme_icon(SNAME("PackedScene"), SNAME("EditorIcons")); - item_text = vformat(TTR("Scene Collection Source (id:%d)"), source_id); + if (item_text.is_empty()) { + item_text = vformat(TTR("Scene Collection Source (ID:%d)"), source_id); + } } // Use default if not valid. if (item_text.is_empty()) { - item_text = vformat(TTR("Unknown Type Source (id:%d)"), source_id); + item_text = vformat(TTR("Unknown Type Source (ID:%d)"), source_id); } if (!texture.is_valid()) { texture = missing_texture_texture; @@ -200,7 +209,7 @@ void TileSetEditor::_update_sources_list(int force_selected_id) { _source_selected(sources_list->get_current()); // Synchronize the lists. - TilesEditor::get_singleton()->set_sources_lists_current(sources_list->get_current()); + TilesEditorPlugin::get_singleton()->set_sources_lists_current(sources_list->get_current()); } void TileSetEditor::_source_selected(int p_source_index) { @@ -318,6 +327,7 @@ void TileSetEditor::_notification(int p_what) { tile_set->set_edited(true); } _update_sources_list(); + _update_patterns_list(); tile_set_changed_needs_update = false; } break; @@ -326,10 +336,56 @@ void TileSetEditor::_notification(int p_what) { } } +void TileSetEditor::_patterns_item_list_gui_input(const Ref<InputEvent> &p_event) { + ERR_FAIL_COND(!tile_set.is_valid()); + + if (ED_IS_SHORTCUT("tiles_editor/delete", p_event) && p_event->is_pressed() && !p_event->is_echo()) { + Vector<int> selected = patterns_item_list->get_selected_items(); + undo_redo->create_action(TTR("Remove TileSet patterns")); + for (int i = 0; i < selected.size(); i++) { + int pattern_index = selected[i]; + undo_redo->add_do_method(*tile_set, "remove_pattern", pattern_index); + undo_redo->add_undo_method(*tile_set, "add_pattern", tile_set->get_pattern(pattern_index), pattern_index); + } + undo_redo->commit_action(); + patterns_item_list->accept_event(); + } +} + +void TileSetEditor::_pattern_preview_done(Ref<TileMapPattern> p_pattern, Ref<Texture2D> p_texture) { + // TODO optimize ? + for (int i = 0; i < patterns_item_list->get_item_count(); i++) { + if (patterns_item_list->get_item_metadata(i) == p_pattern) { + patterns_item_list->set_item_icon(i, p_texture); + break; + } + } +} + +void TileSetEditor::_update_patterns_list() { + ERR_FAIL_COND(!tile_set.is_valid()); + + // Recreate the items. + patterns_item_list->clear(); + for (int i = 0; i < tile_set->get_patterns_count(); i++) { + int id = patterns_item_list->add_item(""); + patterns_item_list->set_item_metadata(id, tile_set->get_pattern(i)); + TilesEditorPlugin::get_singleton()->queue_pattern_preview(tile_set, tile_set->get_pattern(i), callable_mp(this, &TileSetEditor::_pattern_preview_done)); + } + + // Update the label visibility. + patterns_help_label->set_visible(patterns_item_list->get_item_count() == 0); +} + void TileSetEditor::_tile_set_changed() { tile_set_changed_needs_update = true; } +void TileSetEditor::_tab_changed(int p_tab_changed) { + split_container->set_visible(p_tab_changed == 0); + patterns_item_list->set_visible(p_tab_changed == 1); +} + void TileSetEditor::_move_tile_set_array_element(Object *p_undo_redo, Object *p_edited, String p_array_prefix, int p_from_index, int p_to_pos) { UndoRedo *undo_redo = Object::cast_to<UndoRedo>(p_undo_redo); ERR_FAIL_COND(!undo_redo); @@ -552,8 +608,8 @@ void TileSetEditor::_undo_redo_inspector_callback(Object *p_undo_redo, Object *p } void TileSetEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_can_drop_data_fw"), &TileSetEditor::can_drop_data_fw); - ClassDB::bind_method(D_METHOD("_drop_data_fw"), &TileSetEditor::drop_data_fw); + ClassDB::bind_method(D_METHOD("_can_drop_data_fw"), &TileSetEditor::_can_drop_data_fw); + ClassDB::bind_method(D_METHOD("_drop_data_fw"), &TileSetEditor::_drop_data_fw); } void TileSetEditor::edit(Ref<TileSet> p_tile_set) { @@ -573,6 +629,7 @@ void TileSetEditor::edit(Ref<TileSet> p_tile_set) { if (tile_set.is_valid()) { tile_set->connect("changed", callable_mp(this, &TileSetEditor::_tile_set_changed)); _update_sources_list(); + _update_patterns_list(); } tile_set_atlas_source_editor->hide(); @@ -585,8 +642,21 @@ TileSetEditor::TileSetEditor() { set_process_internal(true); + // TabBar. + tabs_bar = memnew(TabBar); + tabs_bar->set_clip_tabs(false); + tabs_bar->add_tab(TTR("Tiles")); + tabs_bar->add_tab(TTR("Patterns")); + tabs_bar->connect("tab_changed", callable_mp(this, &TileSetEditor::_tab_changed)); + + tile_set_toolbar = memnew(HBoxContainer); + tile_set_toolbar->set_h_size_flags(SIZE_EXPAND_FILL); + tile_set_toolbar->add_child(tabs_bar); + add_child(tile_set_toolbar); + + //// Tiles //// // Split container. - HSplitContainer *split_container = memnew(HSplitContainer); + split_container = memnew(HSplitContainer); split_container->set_name(TTR("Tiles")); split_container->set_h_size_flags(SIZE_EXPAND_FILL); split_container->set_v_size_flags(SIZE_EXPAND_FILL); @@ -605,8 +675,8 @@ TileSetEditor::TileSetEditor() { sources_list->set_h_size_flags(SIZE_EXPAND_FILL); sources_list->set_v_size_flags(SIZE_EXPAND_FILL); sources_list->connect("item_selected", callable_mp(this, &TileSetEditor::_source_selected)); - sources_list->connect("item_selected", callable_mp(TilesEditor::get_singleton(), &TilesEditor::set_sources_lists_current)); - sources_list->connect("visibility_changed", callable_mp(TilesEditor::get_singleton(), &TilesEditor::synchronize_sources_list), varray(sources_list)); + sources_list->connect("item_selected", callable_mp(TilesEditorPlugin::get_singleton(), &TilesEditorPlugin::set_sources_lists_current)); + sources_list->connect("visibility_changed", callable_mp(TilesEditorPlugin::get_singleton(), &TilesEditorPlugin::synchronize_sources_list), varray(sources_list)); sources_list->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); sources_list->set_drag_forwarding(this); split_container_left_side->add_child(sources_list); @@ -672,6 +742,24 @@ TileSetEditor::TileSetEditor() { split_container_right_side->add_child(tile_set_scenes_collection_source_editor); tile_set_scenes_collection_source_editor->hide(); + //// Patterns //// + int thumbnail_size = 64; + patterns_item_list = memnew(ItemList); + patterns_item_list->set_max_columns(0); + patterns_item_list->set_icon_mode(ItemList::ICON_MODE_TOP); + patterns_item_list->set_fixed_column_width(thumbnail_size * 3 / 2); + patterns_item_list->set_max_text_lines(2); + patterns_item_list->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size)); + patterns_item_list->set_v_size_flags(Control::SIZE_EXPAND_FILL); + patterns_item_list->connect("gui_input", callable_mp(this, &TileSetEditor::_patterns_item_list_gui_input)); + add_child(patterns_item_list); + patterns_item_list->hide(); + + patterns_help_label = memnew(Label); + patterns_help_label->set_text(TTR("Add new patterns in the TileMap editing mode.")); + patterns_help_label->set_anchors_and_offsets_preset(Control::PRESET_CENTER); + patterns_item_list->add_child(patterns_help_label); + // Registers UndoRedo inspector callback. EditorNode::get_singleton()->get_editor_data().add_move_array_element_function(SNAME("TileSet"), callable_mp(this, &TileSetEditor::_move_tile_set_array_element)); EditorNode::get_singleton()->get_editor_data().add_undo_redo_inspector_hook_callback(callable_mp(this, &TileSetEditor::_undo_redo_inspector_callback)); diff --git a/editor/plugins/tiles/tile_set_editor.h b/editor/plugins/tiles/tile_set_editor.h index fe854b2281..58312ce3df 100644 --- a/editor/plugins/tiles/tile_set_editor.h +++ b/editor/plugins/tiles/tile_set_editor.h @@ -46,13 +46,22 @@ class TileSetEditor : public VBoxContainer { private: Ref<TileSet> tile_set; bool tile_set_changed_needs_update = false; + HSplitContainer *split_container; + // TabBar. + HBoxContainer *tile_set_toolbar; + TabBar *tabs_bar; + + // Tiles. Label *no_source_selected_label; TileSetAtlasSourceEditor *tile_set_atlas_source_editor; TileSetScenesCollectionSourceEditor *tile_set_scenes_collection_source_editor; UndoRedo *undo_redo = EditorNode::get_undo_redo(); + void _drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); + bool _can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; + void _update_sources_list(int force_selected_id = -1); // Sources management. @@ -69,7 +78,16 @@ private: AtlasMergingDialog *atlas_merging_dialog; TileProxiesManagerDialog *tile_proxies_manager_dialog; + // Patterns. + ItemList *patterns_item_list; + Label *patterns_help_label; + void _patterns_item_list_gui_input(const Ref<InputEvent> &p_event); + void _pattern_preview_done(Ref<TileMapPattern> p_pattern, Ref<Texture2D> p_texture); + bool select_last_pattern = false; + void _update_patterns_list(); + void _tile_set_changed(); + void _tab_changed(int p_tab_changed); void _move_tile_set_array_element(Object *p_undo_redo, Object *p_edited, String p_array_prefix, int p_from_index, int p_to_pos); void _undo_redo_inspector_callback(Object *p_undo_redo, Object *p_edited, String p_property, Variant p_new_value); @@ -82,8 +100,6 @@ public: _FORCE_INLINE_ static TileSetEditor *get_singleton() { return singleton; } void edit(Ref<TileSet> p_tile_set); - void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); - bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; TileSetEditor(); ~TileSetEditor(); diff --git a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp index f74b3bf9c2..d687d9651d 100644 --- a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp @@ -56,10 +56,15 @@ int TileSetScenesCollectionSourceEditor::TileSetScenesCollectionProxyObject::get } bool TileSetScenesCollectionSourceEditor::TileSetScenesCollectionProxyObject::_set(const StringName &p_name, const Variant &p_value) { + String name = p_name; + if (name == "name") { + // Use the resource_name property to store the source's name. + name = "resource_name"; + } bool valid = false; - tile_set_scenes_collection_source->set(p_name, p_value, &valid); + tile_set_scenes_collection_source->set(name, p_value, &valid); if (valid) { - emit_signal(SNAME("changed"), String(p_name).utf8().get_data()); + emit_signal(SNAME("changed"), String(name).utf8().get_data()); } return valid; } @@ -68,11 +73,20 @@ bool TileSetScenesCollectionSourceEditor::TileSetScenesCollectionProxyObject::_g if (!tile_set_scenes_collection_source) { return false; } + String name = p_name; + if (name == "name") { + // Use the resource_name property to store the source's name. + name = "resource_name"; + } bool valid = false; - r_ret = tile_set_scenes_collection_source->get(p_name, &valid); + r_ret = tile_set_scenes_collection_source->get(name, &valid); return valid; } +void TileSetScenesCollectionSourceEditor::TileSetScenesCollectionProxyObject::_get_property_list(List<PropertyInfo> *p_list) const { + p_list->push_back(PropertyInfo(Variant::STRING, "name", PROPERTY_HINT_NONE, "")); +} + void TileSetScenesCollectionSourceEditor::TileSetScenesCollectionProxyObject::_bind_methods() { // -- Shape and layout -- ClassDB::bind_method(D_METHOD("set_id", "id"), &TileSetScenesCollectionSourceEditor::TileSetScenesCollectionProxyObject::set_id); @@ -89,6 +103,10 @@ void TileSetScenesCollectionSourceEditor::TileSetScenesCollectionProxyObject::ed ERR_FAIL_COND(p_source_id < 0); ERR_FAIL_COND(p_tile_set->get_source(p_source_id) != p_tile_set_scenes_collection_source); + if (tile_set == p_tile_set && tile_set_scenes_collection_source == p_tile_set_scenes_collection_source && source_id == p_source_id) { + return; + } + // Disconnect to changes. if (tile_set_scenes_collection_source) { tile_set_scenes_collection_source->disconnect(CoreStringNames::get_singleton()->property_list_changed, callable_mp((Object *)this, &Object::notify_property_list_changed)); @@ -174,6 +192,10 @@ void TileSetScenesCollectionSourceEditor::SceneTileProxyObject::edit(TileSetScen ERR_FAIL_COND(!p_tile_set_scenes_collection_source); ERR_FAIL_COND(!p_tile_set_scenes_collection_source->has_scene_tile_id(p_scene_id)); + if (tile_set_scenes_collection_source == p_tile_set_scenes_collection_source && scene_id == p_scene_id) { + return; + } + tile_set_scenes_collection_source = p_tile_set_scenes_collection_source; scene_id = p_scene_id; @@ -363,8 +385,8 @@ void TileSetScenesCollectionSourceEditor::edit(Ref<TileSet> p_tile_set, TileSetS _update_tile_inspector(); } -void TileSetScenesCollectionSourceEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { - if (!can_drop_data_fw(p_point, p_data, p_from)) { +void TileSetScenesCollectionSourceEditor::_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { + if (!_can_drop_data_fw(p_point, p_data, p_from)) { return; } @@ -390,7 +412,7 @@ void TileSetScenesCollectionSourceEditor::drop_data_fw(const Point2 &p_point, co } } -bool TileSetScenesCollectionSourceEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { +bool TileSetScenesCollectionSourceEditor::_can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { if (p_from == scene_tiles_list) { Dictionary d = p_data; @@ -425,8 +447,8 @@ void TileSetScenesCollectionSourceEditor::_bind_methods() { ADD_SIGNAL(MethodInfo("source_id_changed", PropertyInfo(Variant::INT, "source_id"))); ClassDB::bind_method(D_METHOD("_scene_thumbnail_done"), &TileSetScenesCollectionSourceEditor::_scene_thumbnail_done); - ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &TileSetScenesCollectionSourceEditor::can_drop_data_fw); - ClassDB::bind_method(D_METHOD("drop_data_fw"), &TileSetScenesCollectionSourceEditor::drop_data_fw); + ClassDB::bind_method(D_METHOD("_can_drop_data_fw"), &TileSetScenesCollectionSourceEditor::_can_drop_data_fw); + ClassDB::bind_method(D_METHOD("_drop_data_fw"), &TileSetScenesCollectionSourceEditor::_drop_data_fw); } TileSetScenesCollectionSourceEditor::TileSetScenesCollectionSourceEditor() { diff --git a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.h b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.h index 195aa79bc4..4e33128be5 100644 --- a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.h +++ b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.h @@ -51,6 +51,7 @@ private: protected: bool _set(const StringName &p_name, const Variant &p_value); bool _get(const StringName &p_name, Variant &r_ret) const; + void _get_property_list(List<PropertyInfo> *p_list) const; static void _bind_methods(); public: @@ -124,14 +125,15 @@ private: void _update_scenes_list(); void _update_action_buttons(); + void _drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); + bool _can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; + protected: void _notification(int p_what); static void _bind_methods(); public: void edit(Ref<TileSet> p_tile_set, TileSetScenesCollectionSource *p_tile_set_scenes_collection_source, int p_source_id); - void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); - bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; TileSetScenesCollectionSourceEditor(); ~TileSetScenesCollectionSourceEditor(); }; diff --git a/editor/plugins/tiles/tiles_editor_plugin.cpp b/editor/plugins/tiles/tiles_editor_plugin.cpp index d0d01a8d49..47dfc57b0f 100644 --- a/editor/plugins/tiles/tiles_editor_plugin.cpp +++ b/editor/plugins/tiles/tiles_editor_plugin.cpp @@ -30,99 +30,184 @@ #include "tiles_editor_plugin.h" +#include "core/os/mutex.h" + #include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/plugins/canvas_item_editor_plugin.h" #include "scene/2d/tile_map.h" -#include "scene/resources/tile_set.h" - #include "scene/gui/box_container.h" #include "scene/gui/button.h" #include "scene/gui/control.h" #include "scene/gui/separator.h" +#include "scene/resources/tile_set.h" #include "tile_set_editor.h" -TilesEditor *TilesEditor::singleton = nullptr; +TilesEditorPlugin *TilesEditorPlugin::singleton = nullptr; + +void TilesEditorPlugin::_preview_frame_started() { + RS::get_singleton()->request_frame_drawn_callback(callable_mp(const_cast<TilesEditorPlugin *>(this), &TilesEditorPlugin::_pattern_preview_done)); +} + +void TilesEditorPlugin::_pattern_preview_done() { + pattern_preview_done.post(); +} + +void TilesEditorPlugin::_thread_func(void *ud) { + TilesEditorPlugin *te = (TilesEditorPlugin *)ud; + te->_thread(); +} + +void TilesEditorPlugin::_thread() { + pattern_thread_exited.clear(); + while (!pattern_thread_exit.is_set()) { + pattern_preview_sem.wait(); + + pattern_preview_mutex.lock(); + if (pattern_preview_queue.size()) { + QueueItem item = pattern_preview_queue.front()->get(); + pattern_preview_queue.pop_front(); + pattern_preview_mutex.unlock(); + + int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size"); + thumbnail_size *= EDSCALE; + Vector2 thumbnail_size2 = Vector2(thumbnail_size, thumbnail_size); + + if (item.pattern.is_valid() && !item.pattern->is_empty()) { + // Generate the pattern preview + SubViewport *viewport = memnew(SubViewport); + viewport->set_size(thumbnail_size2); + viewport->set_disable_input(true); + viewport->set_transparent_background(true); + viewport->set_update_mode(SubViewport::UPDATE_ONCE); + + TileMap *tile_map = memnew(TileMap); + tile_map->set_tileset(item.tile_set); + tile_map->set_pattern(0, Vector2(), item.pattern); + viewport->add_child(tile_map); + + TypedArray<Vector2i> used_cells = tile_map->get_used_cells(0); + + Rect2 encompassing_rect = Rect2(); + encompassing_rect.set_position(tile_map->map_to_world(used_cells[0])); + for (int i = 0; i < used_cells.size(); i++) { + Vector2i cell = used_cells[i]; + Vector2 world_pos = tile_map->map_to_world(cell); + encompassing_rect.expand_to(world_pos); + + // Texture. + Ref<TileSetAtlasSource> atlas_source = tile_set->get_source(tile_map->get_cell_source_id(0, cell)); + if (atlas_source.is_valid()) { + Vector2i coords = tile_map->get_cell_atlas_coords(0, cell); + int alternative = tile_map->get_cell_alternative_tile(0, cell); + + Vector2 center = world_pos - atlas_source->get_tile_effective_texture_offset(coords, alternative); + encompassing_rect.expand_to(center - atlas_source->get_tile_texture_region(coords).size / 2); + encompassing_rect.expand_to(center + atlas_source->get_tile_texture_region(coords).size / 2); + } + } + + Vector2 scale = thumbnail_size2 / MAX(encompassing_rect.size.x, encompassing_rect.size.y); + tile_map->set_scale(scale); + tile_map->set_position(-(scale * encompassing_rect.get_center()) + thumbnail_size2 / 2); + + // Add the viewport at the lasst moment to avoid rendering too early. + EditorNode::get_singleton()->add_child(viewport); -void TilesEditor::_notification(int p_what) { + RS::get_singleton()->connect(SNAME("frame_pre_draw"), callable_mp(const_cast<TilesEditorPlugin *>(this), &TilesEditorPlugin::_preview_frame_started), Vector<Variant>(), Object::CONNECT_ONESHOT); + + pattern_preview_done.wait(); + + Ref<Image> image = viewport->get_texture()->get_image(); + Ref<ImageTexture> image_texture; + image_texture.instantiate(); + image_texture->create_from_image(image); + + // Find the index for the given pattern. TODO: optimize. + Variant args[] = { item.pattern, image_texture }; + const Variant *args_ptr[] = { &args[0], &args[1] }; + Variant r; + Callable::CallError error; + item.callback.call(args_ptr, 2, r, error); + + viewport->queue_delete(); + } else { + pattern_preview_mutex.unlock(); + } + } + } + pattern_thread_exited.set(); +} + +void TilesEditorPlugin::_tile_map_changed() { + tile_map_changed_needs_update = true; +} + +void TilesEditorPlugin::_update_editors() { + // If tile_map is not edited, we change the edited only if we are not editing a tile_set. + tileset_editor->edit(tile_set); + TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); + if (tile_map) { + tilemap_editor->edit(tile_map); + } else { + tilemap_editor->edit(nullptr); + } + + // Update the viewport. + CanvasItemEditor::get_singleton()->update_viewport(); +} + +void TilesEditorPlugin::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: { - tileset_tilemap_switch_button->set_icon(get_theme_icon(SNAME("TileSet"), SNAME("EditorIcons"))); - } break; case NOTIFICATION_INTERNAL_PROCESS: { if (tile_map_changed_needs_update) { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (tile_map) { tile_set = tile_map->get_tileset(); } - _update_switch_button(); _update_editors(); + tile_map_changed_needs_update = false; } } break; } } -void TilesEditor::_tile_map_changed() { - tile_map_changed_needs_update = true; -} - -void TilesEditor::_update_switch_button() { - // Force the buttons status if needed. - TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); - if (tile_map && !tile_set.is_valid()) { - tileset_tilemap_switch_button->set_pressed(false); - } else if (!tile_map && tile_set.is_valid()) { - tileset_tilemap_switch_button->set_pressed(true); - } -} - -void TilesEditor::_update_editors() { - // Set editors visibility. - tilemap_toolbar->set_visible(!tileset_tilemap_switch_button->is_pressed()); - tilemap_editor->set_visible(!tileset_tilemap_switch_button->is_pressed()); - tileset_editor->set_visible(tileset_tilemap_switch_button->is_pressed()); - - // Enable/disable the switch button. - if (!tileset_tilemap_switch_button->is_pressed()) { - if (!tile_set.is_valid()) { - tileset_tilemap_switch_button->set_disabled(true); - tileset_tilemap_switch_button->set_tooltip(TTR("This TileMap has no assigned TileSet, assign a TileSet to this TileMap to edit it.")); - } else { - tileset_tilemap_switch_button->set_disabled(false); - tileset_tilemap_switch_button->set_tooltip(TTR("Switch between TileSet/TileMap editor.")); - } - } else { +void TilesEditorPlugin::make_visible(bool p_visible) { + if (p_visible) { + // Disable and hide invalid editors. TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); - if (!tile_map) { - tileset_tilemap_switch_button->set_disabled(true); - tileset_tilemap_switch_button->set_tooltip(TTR("You are editing a TileSet resource. Select a TileMap node to paint.")); + tileset_editor_button->set_visible(tile_set.is_valid()); + tilemap_editor_button->set_visible(tile_map); + if (tile_map) { + editor_node->make_bottom_panel_item_visible(tilemap_editor); } else { - tileset_tilemap_switch_button->set_disabled(false); - tileset_tilemap_switch_button->set_tooltip(TTR("Switch between TileSet/TileMap editor.")); + editor_node->make_bottom_panel_item_visible(tileset_editor); } - } - // If tile_map is not edited, we change the edited only if we are not editing a tile_set. - TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); - if (tile_map) { - tilemap_editor->edit(tile_map); } else { - tilemap_editor->edit(nullptr); + tileset_editor_button->hide(); + tilemap_editor_button->hide(); + editor_node->hide_bottom_panel(); } - tileset_editor->edit(tile_set); +} - // Update the viewport - CanvasItemEditor::get_singleton()->update_viewport(); +void TilesEditorPlugin::queue_pattern_preview(Ref<TileSet> p_tile_set, Ref<TileMapPattern> p_pattern, Callable p_callback) { + ERR_FAIL_COND(!p_tile_set.is_valid()); + ERR_FAIL_COND(!p_pattern.is_valid()); + { + MutexLock lock(pattern_preview_mutex); + pattern_preview_queue.push_back({ p_tile_set, p_pattern, p_callback }); + } + pattern_preview_sem.post(); } -void TilesEditor::set_sources_lists_current(int p_current) { +void TilesEditorPlugin::set_sources_lists_current(int p_current) { atlas_sources_lists_current = p_current; } -void TilesEditor::synchronize_sources_list(Object *p_current) { +void TilesEditorPlugin::synchronize_sources_list(Object *p_current) { ItemList *item_list = Object::cast_to<ItemList>(p_current); ERR_FAIL_COND(!item_list); @@ -136,12 +221,12 @@ void TilesEditor::synchronize_sources_list(Object *p_current) { } } -void TilesEditor::set_atlas_view_transform(float p_zoom, Vector2 p_scroll) { +void TilesEditorPlugin::set_atlas_view_transform(float p_zoom, Vector2 p_scroll) { atlas_view_zoom = p_zoom; atlas_view_scroll = p_scroll; } -void TilesEditor::synchronize_atlas_view(Object *p_current) { +void TilesEditorPlugin::synchronize_atlas_view(Object *p_current) { TileAtlasView *tile_atlas_view = Object::cast_to<TileAtlasView>(p_current); ERR_FAIL_COND(!tile_atlas_view); @@ -150,11 +235,11 @@ void TilesEditor::synchronize_atlas_view(Object *p_current) { } } -void TilesEditor::edit(Object *p_object) { +void TilesEditorPlugin::edit(Object *p_object) { // Disconnect to changes. TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (tile_map) { - tile_map->disconnect("changed", callable_mp(this, &TilesEditor::_tile_map_changed)); + tile_map->disconnect("changed", callable_mp(this, &TilesEditorPlugin::_tile_map_changed)); } // Update edited objects. @@ -164,112 +249,75 @@ void TilesEditor::edit(Object *p_object) { tile_map_id = p_object->get_instance_id(); tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); tile_set = tile_map->get_tileset(); + editor_node->make_bottom_panel_item_visible(tilemap_editor); } else if (p_object->is_class("TileSet")) { tile_set = Ref<TileSet>(p_object); if (tile_map) { - if (tile_map->get_tileset() != tile_set) { + if (tile_map->get_tileset() != tile_set || !tile_map->is_inside_tree()) { tile_map = nullptr; + tile_map_id = ObjectID(); } } - } - - // Update pressed status button. - if (p_object->is_class("TileMap")) { - tileset_tilemap_switch_button->set_pressed(false); - } else if (p_object->is_class("TileSet")) { - tileset_tilemap_switch_button->set_pressed(true); + editor_node->make_bottom_panel_item_visible(tileset_editor); } } // Update the editors. - _update_switch_button(); _update_editors(); // Add change listener. if (tile_map) { - tile_map->connect("changed", callable_mp(this, &TilesEditor::_tile_map_changed)); + tile_map->connect("changed", callable_mp(this, &TilesEditorPlugin::_tile_map_changed)); } } -void TilesEditor::_bind_methods() { +bool TilesEditorPlugin::handles(Object *p_object) const { + return p_object->is_class("TileMap") || p_object->is_class("TileSet"); } -TilesEditor::TilesEditor(EditorNode *p_editor) { +TilesEditorPlugin::TilesEditorPlugin(EditorNode *p_node) { set_process_internal(true); // Update the singleton. singleton = this; - // Toolbar. - HBoxContainer *toolbar = memnew(HBoxContainer); - toolbar->set_h_size_flags(SIZE_EXPAND_FILL); - add_child(toolbar); + editor_node = p_node; - // Switch button. - tileset_tilemap_switch_button = memnew(Button); - tileset_tilemap_switch_button->set_flat(true); - tileset_tilemap_switch_button->set_toggle_mode(true); - tileset_tilemap_switch_button->connect("toggled", callable_mp(this, &TilesEditor::_update_editors).unbind(1)); - toolbar->add_child(tileset_tilemap_switch_button); + // Tileset editor. + tileset_editor = memnew(TileSetEditor); + tileset_editor->set_h_size_flags(Control::SIZE_EXPAND_FILL); + tileset_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); + tileset_editor->set_custom_minimum_size(Size2(0, 200) * EDSCALE); + tileset_editor->hide(); // Tilemap editor. tilemap_editor = memnew(TileMapEditor); - tilemap_editor->set_h_size_flags(SIZE_EXPAND_FILL); - tilemap_editor->set_v_size_flags(SIZE_EXPAND_FILL); + tilemap_editor->set_h_size_flags(Control::SIZE_EXPAND_FILL); + tilemap_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); + tilemap_editor->set_custom_minimum_size(Size2(0, 200) * EDSCALE); tilemap_editor->hide(); - add_child(tilemap_editor); - tilemap_toolbar = tilemap_editor->get_toolbar(); - toolbar->add_child(tilemap_toolbar); + // Pattern preview generation thread. + pattern_preview_thread.start(_thread_func, this); - // Tileset editor. - tileset_editor = memnew(TileSetEditor); - tileset_editor->set_h_size_flags(SIZE_EXPAND_FILL); - tileset_editor->set_v_size_flags(SIZE_EXPAND_FILL); - tileset_editor->hide(); - add_child(tileset_editor); + // Bottom buttons. + tileset_editor_button = p_node->add_bottom_panel_item(TTR("TileSet"), tileset_editor); + tileset_editor_button->hide(); + tilemap_editor_button = p_node->add_bottom_panel_item(TTR("TileMap"), tilemap_editor); + tilemap_editor_button->hide(); // Initialization. - _update_switch_button(); _update_editors(); } -TilesEditor::~TilesEditor() { -} - -/////////////////////////////////////////////////////////////// - -void TilesEditorPlugin::_notification(int p_what) { -} - -void TilesEditorPlugin::make_visible(bool p_visible) { - if (p_visible) { - tiles_editor_button->show(); - editor_node->make_bottom_panel_item_visible(tiles_editor); - } else { - editor_node->hide_bottom_panel(); - tiles_editor_button->hide(); - } -} - -void TilesEditorPlugin::edit(Object *p_object) { - tiles_editor->edit(p_object); -} - -bool TilesEditorPlugin::handles(Object *p_object) const { - return p_object->is_class("TileMap") || p_object->is_class("TileSet"); -} - -TilesEditorPlugin::TilesEditorPlugin(EditorNode *p_node) { - editor_node = p_node; - - tiles_editor = memnew(TilesEditor(p_node)); - tiles_editor->set_custom_minimum_size(Size2(0, 200) * EDSCALE); - tiles_editor->hide(); - - tiles_editor_button = p_node->add_bottom_panel_item(TTR("Tiles"), tiles_editor); - tiles_editor_button->hide(); -} - TilesEditorPlugin::~TilesEditorPlugin() { + if (pattern_preview_thread.is_started()) { + pattern_thread_exit.set(); + pattern_preview_sem.post(); + while (!pattern_thread_exited.is_set()) { + OS::get_singleton()->delay_usec(10000); + RenderingServer::get_singleton()->sync(); //sync pending stuff, as thread may be blocked on visual server + } + pattern_preview_thread.wait_to_finish(); + } } diff --git a/editor/plugins/tiles/tiles_editor_plugin.h b/editor/plugins/tiles/tiles_editor_plugin.h index f976d68938..33493040f6 100644 --- a/editor/plugins/tiles/tiles_editor_plugin.h +++ b/editor/plugins/tiles/tiles_editor_plugin.h @@ -38,24 +38,24 @@ #include "tile_map_editor.h" #include "tile_set_editor.h" -class TilesEditor : public VBoxContainer { - GDCLASS(TilesEditor, VBoxContainer); +class TilesEditorPlugin : public EditorPlugin { + GDCLASS(TilesEditorPlugin, EditorPlugin); - static TilesEditor *singleton; + static TilesEditorPlugin *singleton; private: + EditorNode *editor_node; + bool tile_map_changed_needs_update = false; ObjectID tile_map_id; Ref<TileSet> tile_set; - Button *tileset_tilemap_switch_button; - - Control *tilemap_toolbar; + Button *tilemap_editor_button; TileMapEditor *tilemap_editor; + Button *tileset_editor_button; TileSetEditor *tileset_editor; - void _update_switch_button(); void _update_editors(); // For synchronization. @@ -65,15 +65,35 @@ private: void _tile_map_changed(); + // Patterns preview generation. + struct QueueItem { + Ref<TileSet> tile_set; + Ref<TileMapPattern> pattern; + Callable callback; + }; + List<QueueItem> pattern_preview_queue; + Mutex pattern_preview_mutex; + Semaphore pattern_preview_sem; + Thread pattern_preview_thread; + SafeFlag pattern_thread_exit; + SafeFlag pattern_thread_exited; + Semaphore pattern_preview_done; + void _preview_frame_started(); + void _pattern_preview_done(); + static void _thread_func(void *ud); + void _thread(); + protected: void _notification(int p_what); - static void _bind_methods(); public: - _FORCE_INLINE_ static TilesEditor *get_singleton() { return singleton; } + _FORCE_INLINE_ static TilesEditorPlugin *get_singleton() { return singleton; } - bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return tilemap_editor->forward_canvas_gui_input(p_event); } - void forward_canvas_draw_over_viewport(Control *p_overlay) { tilemap_editor->forward_canvas_draw_over_viewport(p_overlay); } + virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override { return tilemap_editor->forward_canvas_gui_input(p_event); } + virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override { tilemap_editor->forward_canvas_draw_over_viewport(p_overlay); } + + // Pattern preview API. + void queue_pattern_preview(Ref<TileSet> p_tile_set, Ref<TileMapPattern> p_pattern, Callable p_callback); // To synchronize the atlas sources lists. void set_sources_lists_current(int p_current); @@ -82,27 +102,6 @@ public: void set_atlas_view_transform(float p_zoom, Vector2 p_scroll); void synchronize_atlas_view(Object *p_current); - void edit(Object *p_object); - - TilesEditor(EditorNode *p_editor); - ~TilesEditor(); -}; - -class TilesEditorPlugin : public EditorPlugin { - GDCLASS(TilesEditorPlugin, EditorPlugin); - -private: - EditorNode *editor_node; - TilesEditor *tiles_editor; - Button *tiles_editor_button; - -protected: - void _notification(int p_what); - -public: - virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override { return tiles_editor->forward_canvas_gui_input(p_event); } - virtual void forward_canvas_draw_over_viewport(Control *p_overlay) override { tiles_editor->forward_canvas_draw_over_viewport(p_overlay); } - virtual void edit(Object *p_object) override; virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; diff --git a/editor/plugins/version_control_editor_plugin.cpp b/editor/plugins/version_control_editor_plugin.cpp index aaa29bcb7a..28352d25eb 100644 --- a/editor/plugins/version_control_editor_plugin.cpp +++ b/editor/plugins/version_control_editor_plugin.cpp @@ -49,6 +49,11 @@ void VersionControlEditorPlugin::_bind_methods() { BIND_ENUM_CONSTANT(CHANGE_TYPE_TYPECHANGE); } +void VersionControlEditorPlugin::_create_vcs_metadata_files() { + String dir = "res://"; + EditorVCSInterface::create_vcs_metadata_files(EditorVCSInterface::VCSMetadata(metadata_selection->get_selected()), dir); +} + void VersionControlEditorPlugin::_selected_a_vcs(int p_id) { List<StringName> available_addons = get_available_vcs_names(); const StringName selected_vcs = set_up_choice->get_item_text(p_id); @@ -71,6 +76,10 @@ VersionControlEditorPlugin *VersionControlEditorPlugin::get_singleton() { return singleton ? singleton : memnew(VersionControlEditorPlugin); } +void VersionControlEditorPlugin::popup_vcs_metadata_dialog() { + metadata_dialog->popup_centered(); +} + void VersionControlEditorPlugin::popup_vcs_set_up_dialog(const Control *p_gui_base) { fetch_available_vcs_addon_names(); List<StringName> available_addons = get_available_vcs_names(); @@ -374,6 +383,30 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { version_control_actions = memnew(PopupMenu); + metadata_dialog = memnew(ConfirmationDialog); + metadata_dialog->set_title(TTR("Create Version Control Metadata")); + metadata_dialog->set_min_size(Size2(200, 40)); + version_control_actions->add_child(metadata_dialog); + + VBoxContainer *metadata_vb = memnew(VBoxContainer); + HBoxContainer *metadata_hb = memnew(HBoxContainer); + metadata_hb->set_custom_minimum_size(Size2(200, 20)); + Label *l = memnew(Label); + l->set_text(TTR("Create VCS metadata files for:")); + metadata_hb->add_child(l); + metadata_selection = memnew(OptionButton); + metadata_selection->set_custom_minimum_size(Size2(100, 20)); + metadata_selection->add_item("None", (int)EditorVCSInterface::VCSMetadata::NONE); + metadata_selection->add_item("Git", (int)EditorVCSInterface::VCSMetadata::GIT); + metadata_selection->select((int)EditorVCSInterface::VCSMetadata::GIT); + metadata_dialog->get_ok_button()->connect("pressed", callable_mp(this, &VersionControlEditorPlugin::_create_vcs_metadata_files)); + metadata_hb->add_child(metadata_selection); + metadata_vb->add_child(metadata_hb); + l = memnew(Label); + l->set_text(TTR("Existing VCS metadata files will be overwritten.")); + metadata_vb->add_child(l); + metadata_dialog->add_child(metadata_vb); + set_up_dialog = memnew(AcceptDialog); set_up_dialog->set_title(TTR("Set Up Version Control")); set_up_dialog->set_min_size(Size2(400, 100)); @@ -488,7 +521,7 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { commit_message->connect("text_changed", callable_mp(this, &VersionControlEditorPlugin::_update_commit_button)); commit_message->connect("gui_input", callable_mp(this, &VersionControlEditorPlugin::_commit_message_gui_input)); commit_box_vbc->add_child(commit_message); - ED_SHORTCUT("version_control/commit", TTR("Commit"), KEY_MASK_CMD | KEY_ENTER); + ED_SHORTCUT("version_control/commit", TTR("Commit"), KeyModifierMask::CMD | Key::ENTER); commit_button = memnew(Button); commit_button->set_text(TTR("Commit Changes")); diff --git a/editor/plugins/version_control_editor_plugin.h b/editor/plugins/version_control_editor_plugin.h index d2ba63c86c..2782c1d9dc 100644 --- a/editor/plugins/version_control_editor_plugin.h +++ b/editor/plugins/version_control_editor_plugin.h @@ -57,6 +57,8 @@ private: List<StringName> available_addons; PopupMenu *version_control_actions; + ConfirmationDialog *metadata_dialog; + OptionButton *metadata_selection; AcceptDialog *set_up_dialog; VBoxContainer *set_up_vbc; HBoxContainer *set_up_hbc; @@ -98,6 +100,7 @@ private: RichTextLabel *diff; void _populate_available_vcs_names(); + void _create_vcs_metadata_files(); void _selected_a_vcs(int p_id); void _initialize_vcs(); void _send_commit_msg(); @@ -121,6 +124,7 @@ protected: public: static VersionControlEditorPlugin *get_singleton(); + void popup_vcs_metadata_dialog(); void popup_vcs_set_up_dialog(const Control *p_gui_base); void set_version_control_tool_button(Button *p_button) { version_control_dock_button = p_button; } diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index b1b64564bb..44f2eaa2a1 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -31,6 +31,7 @@ #include "visual_shader_editor_plugin.h" #include "core/config/project_settings.h" +#include "core/core_string_names.h" #include "core/input/input.h" #include "core/io/resource_loader.h" #include "core/math/math_defs.h" @@ -103,7 +104,6 @@ void VisualShaderGraphPlugin::_bind_methods() { ClassDB::bind_method("connect_nodes", &VisualShaderGraphPlugin::connect_nodes); ClassDB::bind_method("disconnect_nodes", &VisualShaderGraphPlugin::disconnect_nodes); ClassDB::bind_method("set_node_position", &VisualShaderGraphPlugin::set_node_position); - ClassDB::bind_method("set_node_size", &VisualShaderGraphPlugin::set_node_size); ClassDB::bind_method("update_node", &VisualShaderGraphPlugin::update_node); ClassDB::bind_method("update_node_deferred", &VisualShaderGraphPlugin::update_node_deferred); ClassDB::bind_method("set_input_port_default_value", &VisualShaderGraphPlugin::set_input_port_default_value); @@ -132,7 +132,7 @@ void VisualShaderGraphPlugin::show_port_preview(VisualShader::Type p_type, int p if (links[p_node_id].preview_visible && !is_dirty() && links[p_node_id].preview_box != nullptr) { links[p_node_id].graph_node->remove_child(links[p_node_id].preview_box); memdelete(links[p_node_id].preview_box); - links[p_node_id].graph_node->set_size(Vector2(-1, -1)); + links[p_node_id].graph_node->reset_size(); links[p_node_id].preview_visible = false; } @@ -212,19 +212,27 @@ void VisualShaderGraphPlugin::set_uniform_name(VisualShader::Type p_type, int p_ void VisualShaderGraphPlugin::update_curve(int p_node_id) { if (links.has(p_node_id) && links[p_node_id].curve_editors[0]) { - if (((VisualShaderNodeCurveTexture *)links[p_node_id].visual_node)->get_texture().is_valid()) { - links[p_node_id].curve_editors[0]->set_curve(((VisualShaderNodeCurveTexture *)links[p_node_id].visual_node)->get_texture()->get_curve()); + Ref<VisualShaderNodeCurveTexture> tex = Object::cast_to<VisualShaderNodeCurveTexture>(links[p_node_id].visual_node); + ERR_FAIL_COND(!tex.is_valid()); + + if (tex->get_texture().is_valid()) { + links[p_node_id].curve_editors[0]->set_curve(tex->get_texture()->get_curve()); } + tex->emit_signal(CoreStringNames::get_singleton()->changed); } } void VisualShaderGraphPlugin::update_curve_xyz(int p_node_id) { if (links.has(p_node_id) && links[p_node_id].curve_editors[0] && links[p_node_id].curve_editors[1] && links[p_node_id].curve_editors[2]) { - if (((VisualShaderNodeCurveXYZTexture *)links[p_node_id].visual_node)->get_texture().is_valid()) { - links[p_node_id].curve_editors[0]->set_curve(((VisualShaderNodeCurveXYZTexture *)links[p_node_id].visual_node)->get_texture()->get_curve_x()); - links[p_node_id].curve_editors[1]->set_curve(((VisualShaderNodeCurveXYZTexture *)links[p_node_id].visual_node)->get_texture()->get_curve_y()); - links[p_node_id].curve_editors[2]->set_curve(((VisualShaderNodeCurveXYZTexture *)links[p_node_id].visual_node)->get_texture()->get_curve_z()); + Ref<VisualShaderNodeCurveXYZTexture> tex = Object::cast_to<VisualShaderNodeCurveXYZTexture>(links[p_node_id].visual_node); + ERR_FAIL_COND(!tex.is_valid()); + + if (tex->get_texture().is_valid()) { + links[p_node_id].curve_editors[0]->set_curve(tex->get_texture()->get_curve_x()); + links[p_node_id].curve_editors[1]->set_curve(tex->get_texture()->get_curve_y()); + links[p_node_id].curve_editors[2]->set_curve(tex->get_texture()->get_curve_z()); } + tex->emit_signal(CoreStringNames::get_singleton()->changed); } } @@ -248,7 +256,7 @@ void VisualShaderGraphPlugin::update_node_size(int p_node_id) { if (!links.has(p_node_id)) { return; } - links[p_node_id].graph_node->set_size(Size2(-1, -1)); + links[p_node_id].graph_node->reset_size(); } void VisualShaderGraphPlugin::register_default_input_button(int p_node_id, int p_port_id, Button *p_button) { @@ -283,12 +291,6 @@ void VisualShaderGraphPlugin::set_node_position(VisualShader::Type p_type, int p } } -void VisualShaderGraphPlugin::set_node_size(VisualShader::Type p_type, int p_id, const Vector2 &p_size) { - if (visual_shader->get_shader_type() == p_type && links.has(p_id)) { - links[p_id].graph_node->set_size(p_size); - } -} - bool VisualShaderGraphPlugin::is_preview_visible(int p_id) const { return links[p_id].preview_visible; } @@ -491,6 +493,35 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { bool is_curve = curve.is_valid() || curve_xyz.is_valid(); if (is_curve) { + // a default value handling + { + Variant default_value; + bool port_left_used = false; + + for (const VisualShader::Connection &E : connections) { + if (E.to_node == p_id && E.to_port == 0) { + port_left_used = true; + break; + } + } + + if (!port_left_used) { + default_value = vsnode->get_input_port_default_value(0); + } + + Button *button = memnew(Button); + custom_editor->add_child(button); + register_default_input_button(p_id, 0, button); + custom_editor->move_child(button, 0); + + button->connect("pressed", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_edit_port_default_input), varray(button, p_id, 0)); + if (default_value.get_type() != Variant::NIL) { + set_input_port_default_value(p_type, p_id, 0, default_value); + } else { + button->hide(); + } + } + VisualShaderEditor::get_singleton()->graph->add_child(node); VisualShaderEditor::get_singleton()->_update_created_node(node); @@ -643,6 +674,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { for (const VisualShader::Connection &E : connections) { if (E.to_node == p_id && E.to_port == j) { port_left_used = true; + break; } } } @@ -777,7 +809,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { expand->connect("pressed", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_expand_output_port), varray(p_id, i, !vsnode->_is_output_port_expanded(i)), CONNECT_DEFERRED); hb->add_child(expand); } - if (visual_shader->get_shader_type() == VisualShader::TYPE_FRAGMENT && port_right != VisualShaderNode::PORT_TYPE_TRANSFORM && port_right != VisualShaderNode::PORT_TYPE_SAMPLER) { + if (vsnode->has_output_port_preview(i) && port_right != VisualShaderNode::PORT_TYPE_TRANSFORM && port_right != VisualShaderNode::PORT_TYPE_SAMPLER) { TextureButton *preview = memnew(TextureButton); preview->set_toggle_mode(true); preview->set_normal_texture(VisualShaderEditor::get_singleton()->get_theme_icon(SNAME("GuiVisibilityHidden"), SNAME("EditorIcons"))); @@ -1008,7 +1040,6 @@ void VisualShaderEditor::edit(VisualShader *p_visual_shader) { hide(); } else { if (changed) { // to avoid tree collapse - _clear_buffer(); _update_options_menu(); _update_preview(); _update_graph(); @@ -1030,7 +1061,7 @@ void VisualShaderEditor::remove_plugin(const Ref<VisualShaderNodePlugin> &p_plug void VisualShaderEditor::clear_custom_types() { for (int i = 0; i < add_options.size(); i++) { if (add_options[i].is_custom) { - add_options.remove(i); + add_options.remove_at(i); i--; } } @@ -1207,7 +1238,7 @@ void VisualShaderEditor::_update_options_menu() { Color unsupported_color = get_theme_color(SNAME("error_color"), SNAME("Editor")); Color supported_color = get_theme_color(SNAME("warning_color"), SNAME("Editor")); - static bool low_driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name") == "GLES2"; + static bool low_driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name") == "opengl3"; Map<String, TreeItem *> folders; @@ -1387,13 +1418,23 @@ void VisualShaderEditor::_set_mode(int p_which) { edit_type_standard->set_visible(false); edit_type_particles->set_visible(false); edit_type_sky->set_visible(true); + edit_type_fog->set_visible(false); edit_type = edit_type_sky; custom_mode_box->set_visible(false); mode = MODE_FLAGS_SKY; + } else if (p_which == VisualShader::MODE_FOG) { + edit_type_standard->set_visible(false); + edit_type_particles->set_visible(false); + edit_type_sky->set_visible(false); + edit_type_fog->set_visible(true); + edit_type = edit_type_fog; + custom_mode_box->set_visible(false); + mode = MODE_FLAGS_FOG; } else if (p_which == VisualShader::MODE_PARTICLES) { edit_type_standard->set_visible(false); edit_type_particles->set_visible(true); edit_type_sky->set_visible(false); + edit_type_fog->set_visible(false); edit_type = edit_type_particles; if ((edit_type->get_selected() + 3) > VisualShader::TYPE_PROCESS) { custom_mode_box->set_visible(false); @@ -1405,6 +1446,7 @@ void VisualShaderEditor::_set_mode(int p_which) { edit_type_particles->set_visible(false); edit_type_standard->set_visible(true); edit_type_sky->set_visible(false); + edit_type_fog->set_visible(false); edit_type = edit_type_standard; custom_mode_box->set_visible(false); mode = MODE_FLAGS_SPATIAL_CANVASITEM; @@ -1562,6 +1604,8 @@ VisualShader::Type VisualShaderEditor::get_current_shader_type() const { type = VisualShader::Type(edit_type->get_selected() + 3 + (custom_mode_enabled ? 3 : 0)); } else if (mode & MODE_FLAGS_SKY) { type = VisualShader::Type(edit_type->get_selected() + 8); + } else if (mode & MODE_FLAGS_FOG) { + type = VisualShader::Type(edit_type->get_selected() + 9); } else { type = VisualShader::Type(edit_type->get_selected()); } @@ -1932,7 +1976,7 @@ void VisualShaderEditor::_set_node_size(int p_type, int p_node, const Vector2 &p } gn->set_custom_minimum_size(size); - gn->set_size(Size2(1, 1)); + gn->reset_size(); if (!expression_node.is_null() && text_box) { Size2 box_size = size; @@ -1946,7 +1990,7 @@ void VisualShaderEditor::_set_node_size(int p_type, int p_node, const Vector2 &p box_size.y -= text_box->get_offset(SIDE_TOP); box_size.y -= 28 * EDSCALE; text_box->set_custom_minimum_size(box_size); - text_box->set_size(Size2(1, 1)); + text_box->reset_size(); } } } @@ -1994,8 +2038,8 @@ void VisualShaderEditor::_comment_title_popup_show(const Point2 &p_position, int } void VisualShaderEditor::_comment_title_text_changed(const String &p_new_text) { - comment_title_change_edit->set_size(Size2(-1, -1)); - comment_title_change_popup->set_size(Size2(-1, -1)); + comment_title_change_edit->reset_size(); + comment_title_change_popup->reset_size(); } void VisualShaderEditor::_comment_title_text_submitted(const String &p_new_text) { @@ -2039,8 +2083,8 @@ void VisualShaderEditor::_comment_desc_popup_show(const Point2 &p_position, int } void VisualShaderEditor::_comment_desc_text_changed() { - comment_desc_change_edit->set_size(Size2(-1, -1)); - comment_desc_change_popup->set_size(Size2(-1, -1)); + comment_desc_change_edit->reset_size(); + comment_desc_change_popup->reset_size(); } void VisualShaderEditor::_comment_desc_confirm() { @@ -2713,9 +2757,6 @@ void VisualShaderEditor::_delete_nodes(int p_type, const List<int> &p_nodes) { undo_redo->add_undo_method(visual_shader.ptr(), "add_node", type, node, visual_shader->get_node_position(type, F), F); undo_redo->add_undo_method(graph_plugin.ptr(), "add_node", type, F); - undo_redo->add_do_method(this, "_clear_buffer"); - undo_redo->add_undo_method(this, "_clear_buffer"); - // restore size, inputs and outputs if node is group VisualShaderNodeGroupBase *group = Object::cast_to<VisualShaderNodeGroupBase>(node.ptr()); if (group) { @@ -3010,7 +3051,7 @@ void VisualShaderEditor::_graph_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; VisualShader::Type type = get_current_shader_type(); - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) { selected_constants.clear(); selected_uniforms.clear(); selected_comment = -1; @@ -3051,13 +3092,15 @@ void VisualShaderEditor::_graph_gui_input(const Ref<InputEvent> &p_event) { selected_float_constant = -1; } - if (to_change.is_empty() && copy_nodes_buffer.is_empty()) { + if (to_change.is_empty() && copy_items_buffer.is_empty()) { _show_members_dialog(true); } else { + popup_menu->set_item_disabled(NodeMenuOptions::CUT, to_change.is_empty()); popup_menu->set_item_disabled(NodeMenuOptions::COPY, to_change.is_empty()); - popup_menu->set_item_disabled(NodeMenuOptions::PASTE, copy_nodes_buffer.is_empty()); + popup_menu->set_item_disabled(NodeMenuOptions::PASTE, copy_items_buffer.is_empty()); popup_menu->set_item_disabled(NodeMenuOptions::DELETE, to_change.is_empty()); popup_menu->set_item_disabled(NodeMenuOptions::DUPLICATE, to_change.is_empty()); + popup_menu->set_item_disabled(NodeMenuOptions::CLEAR_COPY_BUFFER, copy_items_buffer.is_empty()); int temp = popup_menu->get_item_index(NodeMenuOptions::SEPARATOR2); if (temp != -1) { @@ -3124,7 +3167,7 @@ void VisualShaderEditor::_graph_gui_input(const Ref<InputEvent> &p_event) { menu_point = graph->get_local_mouse_position(); Point2 gpos = Input::get_singleton()->get_mouse_position(); popup_menu->set_position(gpos); - popup_menu->set_size(Size2(-1, -1)); + popup_menu->reset_size(); popup_menu->popup(); } } @@ -3168,10 +3211,7 @@ void VisualShaderEditor::_show_members_dialog(bool at_mouse_pos, VisualShaderNod void VisualShaderEditor::_sbox_input(const Ref<InputEvent> &p_ie) { Ref<InputEventKey> ie = p_ie; - if (ie.is_valid() && (ie->get_keycode() == KEY_UP || - ie->get_keycode() == KEY_DOWN || - ie->get_keycode() == KEY_ENTER || - ie->get_keycode() == KEY_KP_ENTER)) { + if (ie.is_valid() && (ie->get_keycode() == Key::UP || ie->get_keycode() == Key::DOWN || ie->get_keycode() == Key::ENTER || ie->get_keycode() == Key::KP_ENTER)) { members->gui_input(ie); node_filter->accept_event(); } @@ -3280,69 +3320,88 @@ void VisualShaderEditor::_node_changed(int p_id) { } } -void VisualShaderEditor::_dup_update_excluded(int p_type, Set<int> &r_excluded) { - r_excluded.clear(); - VisualShader::Type type = (VisualShader::Type)p_type; - - for (int i = 0; i < graph->get_child_count(); i++) { - GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i)); - if (gn) { - int id = String(gn->get_name()).to_int(); - Ref<VisualShaderNode> node = visual_shader->get_node(type, id); - Ref<VisualShaderNodeOutput> output = node; - if (output.is_valid()) { - r_excluded.insert(id); - continue; - } - r_excluded.insert(id); - } - } -} - -void VisualShaderEditor::_dup_copy_nodes(int p_type, List<int> &r_nodes, Set<int> &r_excluded) { +void VisualShaderEditor::_dup_copy_nodes(int p_type, List<CopyItem> &r_items, List<VisualShader::Connection> &r_connections) { VisualShader::Type type = (VisualShader::Type)p_type; selection_center.x = 0.0f; selection_center.y = 0.0f; + Set<int> nodes; + for (int i = 0; i < graph->get_child_count(); i++) { GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i)); if (gn) { int id = String(gn->get_name()).to_int(); + Ref<VisualShaderNode> node = visual_shader->get_node(type, id); Ref<VisualShaderNodeOutput> output = node; if (output.is_valid()) { // can't duplicate output - r_excluded.insert(id); continue; } + if (node.is_valid() && gn->is_selected()) { Vector2 pos = visual_shader->get_node_position(type, id); selection_center += pos; - r_nodes.push_back(id); + + CopyItem item; + item.id = id; + item.node = visual_shader->get_node(type, id)->duplicate(); + item.position = visual_shader->get_node_position(type, id); + + Ref<VisualShaderNodeResizableBase> resizable_base = node; + if (resizable_base.is_valid()) { + item.size = resizable_base->get_size(); + } + + Ref<VisualShaderNodeGroupBase> group = node; + if (group.is_valid()) { + item.group_inputs = group->get_inputs(); + item.group_outputs = group->get_outputs(); + } + + Ref<VisualShaderNodeExpression> expression = node; + if (expression.is_valid()) { + item.expression = expression->get_expression(); + } + + r_items.push_back(item); + + nodes.insert(id); } - r_excluded.insert(id); } } - selection_center /= (float)r_nodes.size(); + List<VisualShader::Connection> connections; + visual_shader->get_node_connections(type, &connections); + + for (const VisualShader::Connection &E : connections) { + if (nodes.has(E.from_node) && nodes.has(E.to_node)) { + r_connections.push_back(E); + } + } + + selection_center /= (float)r_items.size(); } -void VisualShaderEditor::_dup_paste_nodes(int p_type, int p_pasted_type, List<int> &r_nodes, Set<int> &r_excluded, const Vector2 &p_offset, bool p_select) { +void VisualShaderEditor::_dup_paste_nodes(int p_type, List<CopyItem> &r_items, const List<VisualShader::Connection> &p_connections, const Vector2 &p_offset, bool p_duplicate) { + if (p_duplicate) { + undo_redo->create_action(TTR("Duplicate VisualShader Node(s)")); + } else { + undo_redo->create_action(TTR("Paste VisualShader Node(s)")); + } + VisualShader::Type type = (VisualShader::Type)p_type; - VisualShader::Type pasted_type = (VisualShader::Type)p_pasted_type; int base_id = visual_shader->get_valid_node_id(type); int id_from = base_id; Map<int, int> connection_remap; Set<int> unsupported_set; + Set<int> added_set; - for (int &E : r_nodes) { - connection_remap[E] = id_from; - Ref<VisualShaderNode> node = visual_shader->get_node(pasted_type, E); - + for (CopyItem &item : r_items) { bool unsupported = false; for (int i = 0; i < add_options.size(); i++) { - if (add_options[i].type == node->get_class_name()) { + if (add_options[i].type == item.node->get_class_name()) { if (!_is_available(add_options[i].mode)) { unsupported = true; } @@ -3350,48 +3409,47 @@ void VisualShaderEditor::_dup_paste_nodes(int p_type, int p_pasted_type, List<in } } if (unsupported) { - unsupported_set.insert(E); + unsupported_set.insert(item.id); continue; } + connection_remap[item.id] = id_from; + Ref<VisualShaderNode> node = item.node->duplicate(); - Ref<VisualShaderNode> dupli = node->duplicate(); - - undo_redo->add_do_method(visual_shader.ptr(), "add_node", type, dupli, visual_shader->get_node_position(pasted_type, E) + p_offset, id_from); - undo_redo->add_do_method(graph_plugin.ptr(), "add_node", type, id_from); + Ref<VisualShaderNodeResizableBase> resizable_base = Object::cast_to<VisualShaderNodeResizableBase>(node.ptr()); + if (resizable_base.is_valid()) { + undo_redo->add_do_method(node.ptr(), "set_size", item.size); + } - // duplicate size, inputs and outputs if node is group Ref<VisualShaderNodeGroupBase> group = Object::cast_to<VisualShaderNodeGroupBase>(node.ptr()); - if (!group.is_null()) { - undo_redo->add_do_method(dupli.ptr(), "set_size", group->get_size()); - undo_redo->add_do_method(graph_plugin.ptr(), "set_node_size", type, id_from, group->get_size()); - undo_redo->add_do_method(dupli.ptr(), "set_inputs", group->get_inputs()); - undo_redo->add_do_method(dupli.ptr(), "set_outputs", group->get_outputs()); + if (group.is_valid()) { + undo_redo->add_do_method(node.ptr(), "set_inputs", item.group_inputs); + undo_redo->add_do_method(node.ptr(), "set_outputs", item.group_outputs); } - // duplicate expression text if node is expression + Ref<VisualShaderNodeExpression> expression = Object::cast_to<VisualShaderNodeExpression>(node.ptr()); - if (!expression.is_null()) { - undo_redo->add_do_method(dupli.ptr(), "set_expression", expression->get_expression()); + if (expression.is_valid()) { + undo_redo->add_do_method(node.ptr(), "set_expression", item.expression); } + undo_redo->add_do_method(visual_shader.ptr(), "add_node", type, node, item.position + p_offset, id_from); + undo_redo->add_do_method(graph_plugin.ptr(), "add_node", type, id_from); + + added_set.insert(id_from); id_from++; } - List<VisualShader::Connection> conns; - visual_shader->get_node_connections(pasted_type, &conns); - - for (const VisualShader::Connection &E : conns) { + for (const VisualShader::Connection &E : p_connections) { if (unsupported_set.has(E.from_node) || unsupported_set.has(E.to_node)) { continue; } - if (connection_remap.has(E.from_node) && connection_remap.has(E.to_node)) { - undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes", type, connection_remap[E.from_node], E.from_port, connection_remap[E.to_node], E.to_port); - undo_redo->add_do_method(graph_plugin.ptr(), "connect_nodes", type, connection_remap[E.from_node], E.from_port, connection_remap[E.to_node], E.to_port); - undo_redo->add_undo_method(graph_plugin.ptr(), "disconnect_nodes", type, connection_remap[E.from_node], E.from_port, connection_remap[E.to_node], E.to_port); - } + + undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes", type, connection_remap[E.from_node], E.from_port, connection_remap[E.to_node], E.to_port); + undo_redo->add_do_method(graph_plugin.ptr(), "connect_nodes", type, connection_remap[E.from_node], E.from_port, connection_remap[E.to_node], E.to_port); + undo_redo->add_undo_method(graph_plugin.ptr(), "disconnect_nodes", type, connection_remap[E.from_node], E.from_port, connection_remap[E.to_node], E.to_port); } id_from = base_id; - for (int i = 0; i < r_nodes.size(); i++) { + for (int i = 0; i < r_items.size(); i++) { undo_redo->add_undo_method(visual_shader.ptr(), "remove_node", type, id_from); undo_redo->add_undo_method(graph_plugin.ptr(), "remove_node", type, id_from); id_from++; @@ -3399,54 +3457,61 @@ void VisualShaderEditor::_dup_paste_nodes(int p_type, int p_pasted_type, List<in undo_redo->commit_action(); - if (p_select) { - // reselect duplicated nodes by excluding the other ones - for (int i = 0; i < graph->get_child_count(); i++) { - GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i)); - if (gn) { - int id = String(gn->get_name()).to_int(); - if (!r_excluded.has(id)) { - gn->set_selected(true); - } else { - gn->set_selected(false); - } + // reselect nodes by excluding the other ones + for (int i = 0; i < graph->get_child_count(); i++) { + GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i)); + if (gn) { + int id = String(gn->get_name()).to_int(); + if (added_set.has(id)) { + gn->set_selected(true); + } else { + gn->set_selected(false); } } } } -void VisualShaderEditor::_clear_buffer() { - copy_nodes_buffer.clear(); - copy_nodes_excluded_buffer.clear(); +void VisualShaderEditor::_clear_copy_buffer() { + copy_items_buffer.clear(); + copy_connections_buffer.clear(); } void VisualShaderEditor::_duplicate_nodes() { int type = get_current_shader_type(); - List<int> nodes; - Set<int> excluded; + List<CopyItem> items; + List<VisualShader::Connection> connections; - _dup_copy_nodes(type, nodes, excluded); + _dup_copy_nodes(type, items, connections); - if (nodes.is_empty()) { + if (items.is_empty()) { return; } - undo_redo->create_action(TTR("Duplicate VisualShader Node(s)")); - - _dup_paste_nodes(type, type, nodes, excluded, Vector2(10, 10) * EDSCALE, true); + _dup_paste_nodes(type, items, connections, Vector2(10, 10) * EDSCALE, true); } -void VisualShaderEditor::_copy_nodes() { - copy_type = get_current_shader_type(); +void VisualShaderEditor::_copy_nodes(bool p_cut) { + _clear_copy_buffer(); - _clear_buffer(); + _dup_copy_nodes(get_current_shader_type(), copy_items_buffer, copy_connections_buffer); + + if (p_cut) { + undo_redo->create_action(TTR("Cut VisualShader Node(s)")); + + List<int> ids; + for (const CopyItem &E : copy_items_buffer) { + ids.push_back(E.id); + } - _dup_copy_nodes(copy_type, copy_nodes_buffer, copy_nodes_excluded_buffer); + _delete_nodes(get_current_shader_type(), ids); + + undo_redo->commit_action(); + } } void VisualShaderEditor::_paste_nodes(bool p_use_custom_position, const Vector2 &p_custom_position) { - if (copy_nodes_buffer.is_empty()) { + if (copy_items_buffer.is_empty()) { return; } @@ -3461,11 +3526,7 @@ void VisualShaderEditor::_paste_nodes(bool p_use_custom_position, const Vector2 mpos = graph->get_local_mouse_position(); } - undo_redo->create_action(TTR("Paste VisualShader Node(s)")); - - _dup_paste_nodes(type, copy_type, copy_nodes_buffer, copy_nodes_excluded_buffer, (graph->get_scroll_ofs() / scale + mpos / scale - selection_center), false); - - _dup_update_excluded(type, copy_nodes_excluded_buffer); // to prevent selection of previous copies at new paste + _dup_paste_nodes(type, copy_items_buffer, copy_connections_buffer, graph->get_scroll_ofs() / scale + mpos / scale - selection_center, false); } void VisualShaderEditor::_mode_selected(int p_id) { @@ -3484,11 +3545,15 @@ void VisualShaderEditor::_mode_selected(int p_id) { } } else if (mode & MODE_FLAGS_SKY) { offset = 8; + } else if (mode & MODE_FLAGS_FOG) { + offset = 9; } visual_shader->set_shader_type(VisualShader::Type(p_id + offset)); _update_options_menu(); _update_graph(); + + graph->grab_focus(); } void VisualShaderEditor::_custom_mode_toggled(bool p_enabled) { @@ -3691,8 +3756,11 @@ void VisualShaderEditor::_node_menu_id_pressed(int p_idx) { case NodeMenuOptions::ADD: _show_members_dialog(true); break; + case NodeMenuOptions::CUT: + _copy_nodes(true); + break; case NodeMenuOptions::COPY: - _copy_nodes(); + _copy_nodes(false); break; case NodeMenuOptions::PASTE: _paste_nodes(true, menu_point); @@ -3703,6 +3771,9 @@ void VisualShaderEditor::_node_menu_id_pressed(int p_idx) { case NodeMenuOptions::DUPLICATE: _duplicate_nodes(); break; + case NodeMenuOptions::CLEAR_COPY_BUFFER: + _clear_copy_buffer(); + break; case NodeMenuOptions::CONVERT_CONSTANTS_TO_UNIFORMS: _convert_constants_to_uniforms(false); break; @@ -3917,7 +3988,7 @@ void VisualShaderEditor::_bind_methods() { ClassDB::bind_method("_input_select_item", &VisualShaderEditor::_input_select_item); ClassDB::bind_method("_uniform_select_item", &VisualShaderEditor::_uniform_select_item); ClassDB::bind_method("_set_node_size", &VisualShaderEditor::_set_node_size); - ClassDB::bind_method("_clear_buffer", &VisualShaderEditor::_clear_buffer); + ClassDB::bind_method("_clear_copy_buffer", &VisualShaderEditor::_clear_copy_buffer); ClassDB::bind_method("_update_uniforms", &VisualShaderEditor::_update_uniforms); ClassDB::bind_method("_set_mode", &VisualShaderEditor::_set_mode); ClassDB::bind_method("_nodes_dragged", &VisualShaderEditor::_nodes_dragged); @@ -3971,7 +4042,7 @@ VisualShaderEditor::VisualShaderEditor() { graph->connect("node_selected", callable_mp(this, &VisualShaderEditor::_node_selected)); graph->connect("scroll_offset_changed", callable_mp(this, &VisualShaderEditor::_scroll_changed)); graph->connect("duplicate_nodes_request", callable_mp(this, &VisualShaderEditor::_duplicate_nodes)); - graph->connect("copy_nodes_request", callable_mp(this, &VisualShaderEditor::_copy_nodes)); + graph->connect("copy_nodes_request", callable_mp(this, &VisualShaderEditor::_copy_nodes), varray(false)); graph->connect("paste_nodes_request", callable_mp(this, &VisualShaderEditor::_paste_nodes), varray(false, Point2())); graph->connect("delete_nodes_request", callable_mp(this, &VisualShaderEditor::_delete_nodes_request)); graph->connect("gui_input", callable_mp(this, &VisualShaderEditor::_graph_gui_input)); @@ -4026,6 +4097,11 @@ VisualShaderEditor::VisualShaderEditor() { edit_type_sky->select(0); edit_type_sky->connect("item_selected", callable_mp(this, &VisualShaderEditor::_mode_selected)); + edit_type_fog = memnew(OptionButton); + edit_type_fog->add_item(TTR("Fog")); + edit_type_fog->select(0); + edit_type_fog->connect("item_selected", callable_mp(this, &VisualShaderEditor::_mode_selected)); + edit_type = edit_type_standard; graph->get_zoom_hbox()->add_child(custom_mode_box); @@ -4036,6 +4112,8 @@ VisualShaderEditor::VisualShaderEditor() { graph->get_zoom_hbox()->move_child(edit_type_particles, 0); graph->get_zoom_hbox()->add_child(edit_type_sky); graph->get_zoom_hbox()->move_child(edit_type_sky, 0); + graph->get_zoom_hbox()->add_child(edit_type_fog); + graph->get_zoom_hbox()->move_child(edit_type_fog, 0); add_node = memnew(Button); add_node->set_flat(true); @@ -4090,10 +4168,12 @@ VisualShaderEditor::VisualShaderEditor() { add_child(popup_menu); popup_menu->add_item(TTR("Add Node"), NodeMenuOptions::ADD); popup_menu->add_separator(); + popup_menu->add_item(TTR("Cut"), NodeMenuOptions::CUT); popup_menu->add_item(TTR("Copy"), NodeMenuOptions::COPY); popup_menu->add_item(TTR("Paste"), NodeMenuOptions::PASTE); popup_menu->add_item(TTR("Delete"), NodeMenuOptions::DELETE); popup_menu->add_item(TTR("Duplicate"), NodeMenuOptions::DUPLICATE); + popup_menu->add_item(TTR("Clear Copy Buffer"), NodeMenuOptions::CLEAR_COPY_BUFFER); popup_menu->connect("id_pressed", callable_mp(this, &VisualShaderEditor::_node_menu_id_pressed)); /////////////////////////////////////// @@ -4178,8 +4258,8 @@ VisualShaderEditor::VisualShaderEditor() { comment_title_change_edit->connect("text_changed", callable_mp(this, &VisualShaderEditor::_comment_title_text_changed)); comment_title_change_edit->connect("text_submitted", callable_mp(this, &VisualShaderEditor::_comment_title_text_submitted)); comment_title_change_popup->add_child(comment_title_change_edit); - comment_title_change_edit->set_size(Size2(-1, -1)); - comment_title_change_popup->set_size(Size2(-1, -1)); + comment_title_change_edit->reset_size(); + comment_title_change_popup->reset_size(); comment_title_change_popup->connect("focus_exited", callable_mp(this, &VisualShaderEditor::_comment_title_popup_focus_out)); comment_title_change_popup->connect("popup_hide", callable_mp(this, &VisualShaderEditor::_comment_title_popup_hide)); add_child(comment_title_change_popup); @@ -4191,8 +4271,8 @@ VisualShaderEditor::VisualShaderEditor() { comment_desc_change_edit->connect("text_changed", callable_mp(this, &VisualShaderEditor::_comment_desc_text_changed)); comment_desc_vbox->add_child(comment_desc_change_edit); comment_desc_change_edit->set_custom_minimum_size(Size2(300 * EDSCALE, 150 * EDSCALE)); - comment_desc_change_edit->set_size(Size2(-1, -1)); - comment_desc_change_popup->set_size(Size2(-1, -1)); + comment_desc_change_edit->reset_size(); + comment_desc_change_popup->reset_size(); comment_desc_change_popup->connect("focus_exited", callable_mp(this, &VisualShaderEditor::_comment_desc_confirm)); comment_desc_change_popup->connect("popup_hide", callable_mp(this, &VisualShaderEditor::_comment_desc_popup_hide)); Button *comment_desc_confirm_button = memnew(Button); @@ -4304,6 +4384,7 @@ VisualShaderEditor::VisualShaderEditor() { const String input_param_for_fragment_and_light_shader_modes = TTR("'%s' input parameter for fragment and light shader modes."); const String input_param_for_fragment_shader_mode = TTR("'%s' input parameter for fragment shader mode."); const String input_param_for_sky_shader_mode = TTR("'%s' input parameter for sky shader mode."); + const String input_param_for_fog_shader_mode = TTR("'%s' input parameter for fog shader mode."); const String input_param_for_light_shader_mode = TTR("'%s' input parameter for light shader mode."); const String input_param_for_vertex_shader_mode = TTR("'%s' input parameter for vertex shader mode."); const String input_param_for_start_shader_mode = TTR("'%s' input parameter for start shader mode."); @@ -4423,6 +4504,16 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("SkyCoords", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "sky_coords"), "sky_coords", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("Time", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "time"), "time", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + // FOG INPUTS + + add_options.push_back(AddOption("WorldPosition", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "world_position"), "world_position", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("ObjectPosition", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "object_position"), "object_position", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("UVW", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "uvw"), "uvw", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("Extents", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "extents"), "extents", VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("Transform", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "transform"), "transform", VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("SDF", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "sdf"), "sdf", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("Time", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "time"), "time", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + // PARTICLES INPUTS add_options.push_back(AddOption("CollisionDepth", "Input", "Collide", "VisualShaderNodeInput", vformat(input_param_for_collide_shader_mode, "collision_depth"), "collision_depth", VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); @@ -4436,6 +4527,7 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("MultiplyByAxisAngle", "Particles", "Transform", "VisualShaderNodeParticleMultiplyByAxisAngle", "A node for help to multiply a position input vector by rotation using specific axis. Intended to work with emitters.", -1, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT | TYPE_FLAGS_PROCESS | TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); add_options.push_back(AddOption("BoxEmitter", "Particles", "Emitters", "VisualShaderNodeParticleBoxEmitter", "", -1, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("MeshEmitter", "Particles", "Emitters", "VisualShaderNodeParticleMeshEmitter", "", -1, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); add_options.push_back(AddOption("RingEmitter", "Particles", "Emitters", "VisualShaderNodeParticleRingEmitter", "", -1, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); add_options.push_back(AddOption("SphereEmitter", "Particles", "Emitters", "VisualShaderNodeParticleSphereEmitter", "", -1, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); @@ -4464,6 +4556,7 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("ATan", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the arc-tangent of the parameter."), VisualShaderNodeFloatFunc::FUNC_ATAN, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("ATan2", "Scalar", "Functions", "VisualShaderNodeFloatOp", TTR("Returns the arc-tangent of the parameters."), VisualShaderNodeFloatOp::OP_ATAN2, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("ATanH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), VisualShaderNodeFloatFunc::FUNC_ATANH, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("BitwiseNOT", "Scalar", "Functions", "VisualShaderNodeIntFunc", TTR("Returns the result of bitwise NOT (~a) operation on the integer."), VisualShaderNodeIntFunc::FUNC_BITWISE_NOT, VisualShaderNode::PORT_TYPE_SCALAR_INT)); add_options.push_back(AddOption("Ceil", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), VisualShaderNodeFloatFunc::FUNC_CEIL, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Clamp", "Scalar", "Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), VisualShaderNodeClamp::OP_TYPE_FLOAT, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Clamp", "Scalar", "Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), VisualShaderNodeClamp::OP_TYPE_INT, VisualShaderNode::PORT_TYPE_SCALAR_INT)); @@ -4503,6 +4596,11 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Add", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Sums two floating-point scalars."), VisualShaderNodeFloatOp::OP_ADD, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Add", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Sums two integer scalars."), VisualShaderNodeIntOp::OP_ADD, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("BitwiseAND", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise AND (a & b) operation for two integers."), VisualShaderNodeIntOp::OP_BITWISE_AND, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("BitwiseLeftShift", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise left shift (a << b) operation on the integer."), VisualShaderNodeIntOp::OP_BITWISE_LEFT_SHIFT, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("BitwiseOR", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise OR (a | b) operation for two integers."), VisualShaderNodeIntOp::OP_BITWISE_OR, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("BitwiseRightShift", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise right shift (a >> b) operation on the integer."), VisualShaderNodeIntOp::OP_BITWISE_RIGHT_SHIFT, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("BitwiseXOR", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise XOR (a ^ b) operation on the integer."), VisualShaderNodeIntOp::OP_BITWISE_XOR, VisualShaderNode::PORT_TYPE_SCALAR_INT)); add_options.push_back(AddOption("Divide", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Divides two floating-point scalars."), VisualShaderNodeFloatOp::OP_DIV, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Divide", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Divides two integer scalars."), VisualShaderNodeIntOp::OP_DIV, VisualShaderNode::PORT_TYPE_SCALAR_INT)); add_options.push_back(AddOption("Multiply", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Multiplies two floating-point scalars."), VisualShaderNodeFloatOp::OP_MUL, VisualShaderNode::PORT_TYPE_SCALAR)); @@ -4886,7 +4984,7 @@ public: } } - void setup(Ref<Resource> p_parent_resource, Vector<EditorProperty *> p_properties, const Vector<StringName> &p_names, Ref<VisualShaderNode> p_node) { + void setup(Ref<Resource> p_parent_resource, Vector<EditorProperty *> p_properties, const Vector<StringName> &p_names, const Map<StringName, String> &p_overrided_names, Ref<VisualShaderNode> p_node) { parent_resource = p_parent_resource; updating = false; node = p_node; @@ -4902,7 +5000,11 @@ public: Label *prop_name = memnew(Label); String prop_name_str = p_names[i]; - prop_name_str = prop_name_str.capitalize() + ":"; + if (p_overrided_names.has(p_names[i])) { + prop_name_str = p_overrided_names[p_names[i]] + ":"; + } else { + prop_name_str = prop_name_str.capitalize() + ":"; + } prop_name->set_text(prop_name_str); prop_name->set_visible(false); hbox->add_child(prop_name); @@ -4994,7 +5096,7 @@ Control *VisualShaderNodePluginDefault::create_editor(const Ref<Resource> &p_par properties.push_back(pinfo[i].name); } VisualShaderNodePluginDefaultEditor *editor = memnew(VisualShaderNodePluginDefaultEditor); - editor->setup(p_parent_resource, editors, properties, p_node); + editor->setup(p_parent_resource, editors, properties, p_node->get_editable_properties_names(), p_node); return editor; } @@ -5091,11 +5193,7 @@ EditorPropertyShaderMode::EditorPropertyShaderMode() { } bool EditorInspectorShaderModePlugin::can_handle(Object *p_object) { - return true; //can handle everything -} - -void EditorInspectorShaderModePlugin::parse_begin(Object *p_object) { - //do none + return true; // Can handle everything. } bool EditorInspectorShaderModePlugin::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { @@ -5108,11 +5206,7 @@ bool EditorInspectorShaderModePlugin::parse_property(Object *p_object, const Var return true; } - return false; //can be overridden, although it will most likely be last anyway -} - -void EditorInspectorShaderModePlugin::parse_end() { - //do none + return false; } ////////////////////////////////// @@ -5129,7 +5223,9 @@ void VisualShaderNodePortPreview::_shader_changed() { preview_shader.instantiate(); preview_shader->set_code(shader_code); for (int i = 0; i < default_textures.size(); i++) { - preview_shader->set_default_texture_param(default_textures[i].name, default_textures[i].param); + for (int j = 0; j < default_textures[i].params.size(); j++) { + preview_shader->set_default_texture_param(default_textures[i].name, default_textures[i].params[j], j); + } } Ref<ShaderMaterial> material; diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index 9f24c5af72..74ccda3c9a 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -111,7 +111,6 @@ public: void disconnect_nodes(VisualShader::Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port); void show_port_preview(VisualShader::Type p_type, int p_node_id, int p_port_id); void set_node_position(VisualShader::Type p_type, int p_id, const Vector2 &p_position); - void set_node_size(VisualShader::Type p_type, int p_id, const Vector2 &p_size); void refresh_node_ports(VisualShader::Type p_type, int p_node); void set_input_port_default_value(VisualShader::Type p_type, int p_node_id, int p_port_id, Variant p_value); void update_uniform_refs(); @@ -145,6 +144,7 @@ class VisualShaderEditor : public VBoxContainer { OptionButton *edit_type_standard; OptionButton *edit_type_particles; OptionButton *edit_type_sky; + OptionButton *edit_type_fog; CheckBox *custom_mode_box; bool custom_mode_enabled = false; @@ -180,7 +180,8 @@ class VisualShaderEditor : public VBoxContainer { enum ShaderModeFlags { MODE_FLAGS_SPATIAL_CANVASITEM = 1, MODE_FLAGS_SKY = 2, - MODE_FLAGS_PARTICLES = 4 + MODE_FLAGS_PARTICLES = 4, + MODE_FLAGS_FOG = 8, }; int mode = MODE_FLAGS_SPATIAL_CANVASITEM; @@ -203,6 +204,10 @@ class VisualShaderEditor : public VBoxContainer { TYPE_FLAGS_SKY = 1, }; + enum FogTypeFlags { + TYPE_FLAGS_FOG = 1, + }; + enum ToolsMenuOptions { EXPAND_ALL, COLLAPSE_ALL @@ -211,10 +216,12 @@ class VisualShaderEditor : public VBoxContainer { enum NodeMenuOptions { ADD, SEPARATOR, // ignore + CUT, COPY, PASTE, DELETE, DUPLICATE, + CLEAR_COPY_BUFFER, SEPARATOR2, // ignore FLOAT_CONSTANTS, CONVERT_CONSTANTS_TO_UNIFORMS, @@ -335,8 +342,6 @@ class VisualShaderEditor : public VBoxContainer { void _delete_node_request(int p_type, int p_node); void _delete_nodes_request(); - void _removed_from_graph(); - void _node_changed(int p_id); void _edit_port_default_input(Object *p_button, int p_node, int p_port); @@ -376,19 +381,27 @@ class VisualShaderEditor : public VBoxContainer { void _port_name_focus_out(Object *line_edit, int p_node_id, int p_port_id, bool p_output); - void _dup_copy_nodes(int p_type, List<int> &r_nodes, Set<int> &r_excluded); - void _dup_update_excluded(int p_type, Set<int> &r_excluded); - void _dup_paste_nodes(int p_type, int p_pasted_type, List<int> &r_nodes, Set<int> &r_excluded, const Vector2 &p_offset, bool p_select); + struct CopyItem { + int id; + Ref<VisualShaderNode> node; + Vector2 position; + Vector2 size; + String group_inputs; + String group_outputs; + String expression; + }; + + void _dup_copy_nodes(int p_type, List<CopyItem> &r_nodes, List<VisualShader::Connection> &r_connections); + void _dup_paste_nodes(int p_type, List<CopyItem> &r_items, const List<VisualShader::Connection> &p_connections, const Vector2 &p_offset, bool p_duplicate); void _duplicate_nodes(); Vector2 selection_center; - int copy_type; // shader type - List<int> copy_nodes_buffer; - Set<int> copy_nodes_excluded_buffer; + List<CopyItem> copy_items_buffer; + List<VisualShader::Connection> copy_connections_buffer; - void _clear_buffer(); - void _copy_nodes(); + void _clear_copy_buffer(); + void _copy_nodes(bool p_cut); void _paste_nodes(bool p_use_custom_position = false, const Vector2 &p_custom_position = Vector2()); Vector<Ref<VisualShaderNodePlugin>> plugins; @@ -510,9 +523,7 @@ class EditorInspectorShaderModePlugin : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object) override; - virtual void parse_begin(Object *p_object) override; virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; - virtual void parse_end() override; }; class VisualShaderNodePortPreview : public Control { diff --git a/editor/plugins/voxel_gi_editor_plugin.cpp b/editor/plugins/voxel_gi_editor_plugin.cpp index 9a44d40dcb..4f3cb9e189 100644 --- a/editor/plugins/voxel_gi_editor_plugin.cpp +++ b/editor/plugins/voxel_gi_editor_plugin.cpp @@ -67,31 +67,36 @@ void VoxelGIEditorPlugin::_notification(int p_what) { return; } + // Set information tooltip on the Bake button. This information is useful + // to optimize performance (video RAM size) and reduce light leaking (individual cell size). + const Vector3i size = voxel_gi->get_estimated_cell_size(); - String text = vformat(String::utf8("%d × %d × %d"), size.x, size.y, size.z); + + const Vector3 extents = voxel_gi->get_extents(); + const int data_size = 4; const double size_mb = size.x * size.y * size.z * data_size / (1024.0 * 1024.0); - text += " - " + vformat(TTR("VRAM Size: %s MB"), String::num(size_mb, 2)); - - if (bake_info->get_text() == text) { - return; + // Add a qualitative measurement to help the user assess whether a VoxelGI node is using a lot of VRAM. + String size_quality; + if (size_mb < 16.0) { + size_quality = TTR("Low"); + } else if (size_mb < 64.0) { + size_quality = TTR("Moderate"); + } else { + size_quality = TTR("High"); } - // Color the label depending on the estimated performance level. - Color color; - if (size_mb <= 16.0 + CMP_EPSILON) { - // Fast. - color = bake_info->get_theme_color(SNAME("success_color"), SNAME("Editor")); - } else if (size_mb <= 64.0 + CMP_EPSILON) { - // Medium. - color = bake_info->get_theme_color(SNAME("warning_color"), SNAME("Editor")); - } else { - // Slow. - color = bake_info->get_theme_color(SNAME("error_color"), SNAME("Editor")); + String text; + text += vformat(TTR("Subdivisions: %s"), vformat(String::utf8("%d × %d × %d"), size.x, size.y, size.z)) + "\n"; + text += vformat(TTR("Cell size: %s"), vformat(String::utf8("%.3f × %.3f × %.3f"), extents.x / size.x, extents.y / size.y, extents.z / size.z)) + "\n"; + text += vformat(TTR("Video RAM size: %s MB (%s)"), String::num(size_mb, 2), size_quality); + + // Only update the tooltip when needed to avoid constant redrawing. + if (bake->get_tooltip(Point2()) == text) { + return; } - bake_info->add_theme_color_override("font_color", color); - bake_info->set_text(text); + bake->set_tooltip(text); } } @@ -147,10 +152,6 @@ VoxelGIEditorPlugin::VoxelGIEditorPlugin(EditorNode *p_node) { bake->set_text(TTR("Bake GI Probe")); bake->connect("pressed", callable_mp(this, &VoxelGIEditorPlugin::_bake)); bake_hb->add_child(bake); - bake_info = memnew(Label); - bake_info->set_h_size_flags(Control::SIZE_EXPAND_FILL); - bake_info->set_clip_text(true); - bake_hb->add_child(bake_info); add_control_to_container(CONTAINER_SPATIAL_EDITOR_MENU, bake_hb); voxel_gi = nullptr; diff --git a/editor/plugins/voxel_gi_editor_plugin.h b/editor/plugins/voxel_gi_editor_plugin.h index 4d3cfe90f6..ed66728557 100644 --- a/editor/plugins/voxel_gi_editor_plugin.h +++ b/editor/plugins/voxel_gi_editor_plugin.h @@ -42,7 +42,6 @@ class VoxelGIEditorPlugin : public EditorPlugin { VoxelGI *voxel_gi; HBoxContainer *bake_hb; - Label *bake_info; Button *bake; EditorNode *editor; diff --git a/editor/project_export.cpp b/editor/project_export.cpp index ad9c81458f..a97d38323e 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -38,6 +38,7 @@ #include "core/io/resource_saver.h" #include "core/os/os.h" #include "core/string/optimized_translation.h" +#include "core/version_generated.gen.h" #include "editor_data.h" #include "editor_node.h" #include "editor_scale.h" @@ -456,7 +457,7 @@ void ProjectExportDialog::_enc_filters_changed(const String &p_filters) { } void ProjectExportDialog::_open_key_help_link() { - OS::get_singleton()->shell_open("https://docs.godotengine.org/en/latest/development/compiling/compiling_with_script_encryption_key.html"); + OS::get_singleton()->shell_open(vformat("%s/development/compiling/compiling_with_script_encryption_key.html", VERSION_DOCS_URL)); } void ProjectExportDialog::_enc_pck_changed(bool p_pressed) { @@ -1276,11 +1277,13 @@ ProjectExportDialog::ProjectExportDialog() { export_debug = memnew(CheckBox); export_debug->set_text(TTR("Export With Debug")); export_debug->set_pressed(true); + export_debug->set_h_size_flags(Control::SIZE_SHRINK_CENTER); export_project->get_vbox()->add_child(export_debug); export_pck_zip_debug = memnew(CheckBox); export_pck_zip_debug->set_text(TTR("Export With Debug")); export_pck_zip_debug->set_pressed(true); + export_pck_zip_debug->set_h_size_flags(Control::SIZE_SHRINK_CENTER); export_pck_zip->get_vbox()->add_child(export_pck_zip_debug); set_hide_on_ok(false); diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index e8fd3070c2..7ae03b3072 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -41,6 +41,7 @@ #include "core/string/translation.h" #include "core/version.h" #include "core/version_hash.gen.h" +#include "editor/editor_vcs_interface.h" #include "editor_scale.h" #include "editor_settings.h" #include "editor_themes.h" @@ -52,6 +53,7 @@ #include "scene/gui/texture_rect.h" #include "scene/main/window.h" #include "servers/display_server.h" +#include "servers/navigation_server_3d.h" static inline String get_project_key_from_path(const String &dir) { return dir.replace("/", "::"); @@ -66,19 +68,19 @@ public: MODE_NEW, MODE_IMPORT, MODE_INSTALL, - MODE_RENAME + MODE_RENAME, }; private: enum MessageType { MESSAGE_ERROR, MESSAGE_WARNING, - MESSAGE_SUCCESS + MESSAGE_SUCCESS, }; enum InputType { PROJECT_PATH, - INSTALL_PATH + INSTALL_PATH, }; Mode mode; @@ -89,6 +91,7 @@ private: Container *path_container; Container *install_path_container; Container *rasterizer_container; + HBoxContainer *default_files_container; Ref<ButtonGroup> rasterizer_button_group; Label *msg; LineEdit *project_path; @@ -98,6 +101,7 @@ private: TextureRect *install_status_rect; FileDialog *fdialog; FileDialog *fdialog_install; + OptionButton *vcs_metadata_selection; String zip_path; String zip_title; AcceptDialog *dialog_error; @@ -473,32 +477,29 @@ private: cd->grab_focus(); return; } + PackedStringArray project_features = ProjectSettings::get_required_features(); ProjectSettings::CustomMap initial_settings; - initial_settings["rendering/vulkan/rendering/back_end"] = rasterizer_button_group->get_pressed_button()->get_meta(SNAME("driver_name")); + // Be sure to change this code if/when renderers are changed. + int renderer_type = rasterizer_button_group->get_pressed_button()->get_meta(SNAME("driver_name")); + initial_settings["rendering/vulkan/rendering/back_end"] = renderer_type; + if (renderer_type == 0) { + project_features.push_back("Vulkan Clustered"); + } else if (renderer_type == 1) { + project_features.push_back("Vulkan Mobile"); + } else { + WARN_PRINT("Unknown renderer type. Please report this as a bug on GitHub."); + } + project_features.sort(); + initial_settings["application/config/features"] = project_features; initial_settings["application/config/name"] = project_name->get_text().strip_edges(); initial_settings["application/config/icon"] = "res://icon.png"; - initial_settings["rendering/environment/defaults/default_environment"] = "res://default_env.tres"; if (ProjectSettings::get_singleton()->save_custom(dir.plus_file("project.godot"), initial_settings, Vector<String>(), false) != OK) { set_message(TTR("Couldn't create project.godot in project path."), MESSAGE_ERROR); } else { ResourceSaver::save(dir.plus_file("icon.png"), create_unscaled_default_project_icon()); - - FileAccess *f = FileAccess::open(dir.plus_file("default_env.tres"), FileAccess::WRITE); - if (!f) { - set_message(TTR("Couldn't create project.godot in project path."), MESSAGE_ERROR); - } else { - f->store_line("[gd_resource type=\"Environment\" load_steps=2 format=3]"); - f->store_line(""); - f->store_line("[sub_resource type=\"Sky\" id=\"1\"]"); - f->store_line(""); - f->store_line("[resource]"); - f->store_line("background_mode = 2"); - f->store_line("sky = SubResource( \"1\" )"); - memdelete(f); - } + EditorVCSInterface::create_vcs_metadata_files(EditorVCSInterface::VCSMetadata(vcs_metadata_selection->get_selected()), dir); } - } else if (mode == MODE_INSTALL) { if (project_path->get_text().ends_with(".zip")) { dir = install_path->get_text(); @@ -693,6 +694,7 @@ public: install_path_container->hide(); install_status_rect->hide(); rasterizer_container->hide(); + default_files_container->hide(); get_ok_button()->set_disabled(false); ProjectSettings *current = memnew(ProjectSettings); @@ -744,6 +746,7 @@ public: name_container->hide(); install_path_container->hide(); rasterizer_container->hide(); + default_files_container->hide(); project_path->grab_focus(); } else if (mode == MODE_NEW) { @@ -752,6 +755,7 @@ public: name_container->show(); install_path_container->hide(); rasterizer_container->show(); + default_files_container->show(); project_name->call_deferred(SNAME("grab_focus")); project_name->call_deferred(SNAME("select_all")); @@ -762,6 +766,7 @@ public: name_container->show(); install_path_container->hide(); rasterizer_container->hide(); + default_files_container->hide(); project_path->grab_focus(); } @@ -904,6 +909,21 @@ public: l->set_modulate(Color(1, 1, 1, 0.7)); rasterizer_container->add_child(l); + default_files_container = memnew(HBoxContainer); + vb->add_child(default_files_container); + l = memnew(Label); + l->set_text(TTR("Version Control Metadata:")); + default_files_container->add_child(l); + vcs_metadata_selection = memnew(OptionButton); + vcs_metadata_selection->set_custom_minimum_size(Size2(100, 20)); + vcs_metadata_selection->add_item("None", (int)EditorVCSInterface::VCSMetadata::NONE); + vcs_metadata_selection->add_item("Git", (int)EditorVCSInterface::VCSMetadata::GIT); + vcs_metadata_selection->select((int)EditorVCSInterface::VCSMetadata::GIT); + default_files_container->add_child(vcs_metadata_selection); + Control *spacer = memnew(Control); + spacer->set_h_size_flags(Control::SIZE_EXPAND_FILL); + default_files_container->add_child(spacer); + fdialog = memnew(FileDialog); fdialog->set_access(FileDialog::ACCESS_FILESYSTEM); fdialog_install = memnew(FileDialog); @@ -985,6 +1005,7 @@ public: String path; String icon; String main_scene; + PackedStringArray unsupported_features; uint64_t last_edited = 0; bool favorite = false; bool grayed = false; @@ -1001,6 +1022,7 @@ public: const String &p_path, const String &p_icon, const String &p_main_scene, + const PackedStringArray &p_unsupported_features, uint64_t p_last_edited, bool p_favorite, bool p_grayed, @@ -1012,6 +1034,7 @@ public: path = p_path; icon = p_icon; main_scene = p_main_scene; + unsupported_features = p_unsupported_features; last_edited = p_last_edited; favorite = p_favorite; grayed = p_grayed; @@ -1063,8 +1086,7 @@ private: 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); + static Item load_project_data(const String &p_property_key, bool p_favorite); String _search_term; FilterOption _order_option; @@ -1155,7 +1177,8 @@ void ProjectList::load_project_icon(int p_index) { item.control->icon_needs_reload = false; } -void ProjectList::load_project_data(const String &p_property_key, Item &p_item, bool p_favorite) { +// Load project data from p_property_key and return it in a ProjectList::Item. p_favorite is passed directly into the Item. +ProjectList::Item ProjectList::load_project_data(const String &p_property_key, bool p_favorite) { String path = EditorSettings::get_singleton()->get(p_property_key); String conf = path.plus_file("project.godot"); bool grayed = false; @@ -1175,13 +1198,16 @@ void ProjectList::load_project_data(const String &p_property_key, Item &p_item, } if (config_version > ProjectSettings::CONFIG_VERSION) { - // Comes from an incompatible (more recent) Godot version, grey it out + // Comes from an incompatible (more recent) Godot version, gray it out. grayed = true; } - String description = cf->get_value("application", "config/description", ""); - String icon = cf->get_value("application", "config/icon", ""); - String main_scene = cf->get_value("application", "run/main_scene", ""); + const String description = cf->get_value("application", "config/description", ""); + const String icon = cf->get_value("application", "config/icon", ""); + const String main_scene = cf->get_value("application", "run/main_scene", ""); + + PackedStringArray project_features = cf->get_value("application", "config/features", PackedStringArray()); + PackedStringArray unsupported_features = ProjectSettings::get_unsupported_features(project_features); uint64_t last_edited = 0; if (FileAccess::exists(conf)) { @@ -1203,9 +1229,9 @@ void ProjectList::load_project_data(const String &p_property_key, Item &p_item, print_line("Project is missing: " + conf); } - String project_key = p_property_key.get_slice("/", 1); + const String project_key = p_property_key.get_slice("/", 1); - p_item = Item(project_key, project_name, description, path, icon, main_scene, last_edited, p_favorite, grayed, missing, config_version); + return Item(project_key, project_name, description, path, icon, main_scene, unsupported_features, last_edited, p_favorite, grayed, missing, config_version); } void ProjectList::load_projects() { @@ -1248,8 +1274,7 @@ void ProjectList::load_projects() { 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); + Item item = load_project_data(property_key, favorite); _projects.push_back(item); } @@ -1297,8 +1322,7 @@ void ProjectList::update_dock_menu() { void ProjectList::_global_menu_new_window(const Variant &p_tag) { List<String> args; args.push_back("-p"); - String exec = OS::get_singleton()->get_executable_path(); - OS::get_singleton()->create_process(exec, args); + OS::get_singleton()->create_instance(args); } void ProjectList::_global_menu_open_project(const Variant &p_tag) { @@ -1308,8 +1332,7 @@ void ProjectList::_global_menu_open_project(const Variant &p_tag) { String conf = _projects[idx].path.plus_file("project.godot"); List<String> args; args.push_back(conf); - String exec = OS::get_singleton()->get_executable_path(); - OS::get_singleton()->create_process(exec, args); + OS::get_singleton()->create_instance(args); } } @@ -1334,7 +1357,7 @@ void ProjectList::create_project_item_control(int p_index) { TextureButton *favorite = memnew(TextureButton); favorite->set_name("FavoriteButton"); favorite->set_normal_texture(favorite_icon); - // This makes the project's "hover" style display correctly when hovering the favorite icon + // This makes the project's "hover" style display correctly when hovering the favorite icon. favorite->set_mouse_filter(MOUSE_FILTER_PASS); favorite->connect("pressed", callable_mp(this, &ProjectList::_favorite_pressed), varray(hb)); favorite_box->add_child(favorite); @@ -1364,40 +1387,65 @@ void ProjectList::create_project_item_control(int p_index) { ec->set_custom_minimum_size(Size2(0, 1)); ec->set_mouse_filter(MOUSE_FILTER_PASS); vb->add_child(ec); - Label *title = memnew(Label(!item.missing ? item.project_name : TTR("Missing Project"))); - title->add_theme_font_override("font", get_theme_font(SNAME("title"), SNAME("EditorFonts"))); - title->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("title_size"), SNAME("EditorFonts"))); - title->add_theme_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(Control::SIZE_EXPAND_FILL); - vb->add_child(path_hb); - - Button *show = memnew(Button); - // Display a folder icon if the project directory can be opened, or a "broken file" icon if it can't. - show->set_icon(get_theme_icon(!item.missing ? "Load" : "FileBroken", "EditorIcons")); - if (!item.grayed) { - // Don't make the icon less prominent if the parent is already grayed out. - show->set_modulate(Color(1, 1, 1, 0.5)); - } - path_hb->add_child(show); - - if (!item.missing) { - show->connect("pressed", callable_mp(this, &ProjectList::_show_project), varray(item.path)); - show->set_tooltip(TTR("Show in File Manager")); - } else { - show->set_tooltip(TTR("Error: Project is missing on the filesystem.")); - } - Label *fpath = memnew(Label(item.path)); - fpath->set_structured_text_bidi_override(Control::STRUCTURED_TEXT_FILE); - path_hb->add_child(fpath); - fpath->set_h_size_flags(Control::SIZE_EXPAND_FILL); - fpath->set_modulate(Color(1, 1, 1, 0.5)); - fpath->add_theme_color_override("font_color", font_color); - fpath->set_clip_text(true); + { // Top half, title and unsupported features labels. + HBoxContainer *title_hb = memnew(HBoxContainer); + vb->add_child(title_hb); + + Label *title = memnew(Label(!item.missing ? item.project_name : TTR("Missing Project"))); + title->set_h_size_flags(Control::SIZE_EXPAND_FILL); + title->add_theme_font_override("font", get_theme_font(SNAME("title"), SNAME("EditorFonts"))); + title->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("title_size"), SNAME("EditorFonts"))); + title->add_theme_color_override("font_color", font_color); + title->set_clip_text(true); + title_hb->add_child(title); + + String unsupported_features_str = Variant(item.unsupported_features).operator String().trim_prefix("[").trim_suffix("]"); + int length = unsupported_features_str.length(); + if (length > 0) { + Label *unsupported_label = memnew(Label(unsupported_features_str)); + unsupported_label->set_custom_minimum_size(Size2(length * 15, 10) * EDSCALE); + unsupported_label->add_theme_font_override("font", get_theme_font(SNAME("title"), SNAME("EditorFonts"))); + unsupported_label->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + unsupported_label->set_clip_text(true); + unsupported_label->set_align(Label::ALIGN_RIGHT); + title_hb->add_child(unsupported_label); + Control *spacer = memnew(Control()); + spacer->set_custom_minimum_size(Size2(10, 10)); + title_hb->add_child(spacer); + } + } + + { // Bottom half, containing the path and view folder button. + HBoxContainer *path_hb = memnew(HBoxContainer); + path_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL); + vb->add_child(path_hb); + + Button *show = memnew(Button); + // Display a folder icon if the project directory can be opened, or a "broken file" icon if it can't. + show->set_icon(get_theme_icon(!item.missing ? "Load" : "FileBroken", "EditorIcons")); + show->set_flat(true); + if (!item.grayed) { + // Don't make the icon less prominent if the parent is already grayed out. + show->set_modulate(Color(1, 1, 1, 0.5)); + } + path_hb->add_child(show); + + if (!item.missing) { + show->connect("pressed", callable_mp(this, &ProjectList::_show_project), varray(item.path)); + show->set_tooltip(TTR("Show in File Manager")); + } else { + show->set_tooltip(TTR("Error: Project is missing on the filesystem.")); + } + + Label *fpath = memnew(Label(item.path)); + fpath->set_structured_text_bidi_override(Control::STRUCTURED_TEXT_FILE); + path_hb->add_child(fpath); + fpath->set_h_size_flags(Control::SIZE_EXPAND_FILL); + fpath->set_modulate(Color(1, 1, 1, 0.5)); + fpath->add_theme_color_override("font_color", font_color); + fpath->set_clip_text(true); + } _scroll_children->add_child(hb); item.control = hb; @@ -1511,7 +1559,7 @@ void ProjectList::remove_project(int p_index, bool p_update_settings) { } memdelete(item.control); - _projects.remove(p_index); + _projects.remove_at(p_index); if (p_update_settings) { EditorSettings::get_singleton()->erase("projects/" + item.project_key); @@ -1602,8 +1650,7 @@ int ProjectList::refresh_project(const String &dir_path) { if (should_be_in_list) { // Recreate it with updated info - Item item; - load_project_data(property_key, item, is_favourite); + Item item = load_project_data(property_key, is_favourite); _projects.push_back(item); create_project_item_control(_projects.size() - 1); @@ -1701,7 +1748,7 @@ void ProjectList::erase_selected_projects(bool p_delete_project_contents) { } memdelete(item.control); - _projects.remove(i); + _projects.remove_at(i); --i; } } @@ -1737,7 +1784,7 @@ void ProjectList::_panel_input(const Ref<InputEvent> &p_ev, Node *p_hb) { 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() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { if (mb->is_shift_pressed() && _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) { @@ -1901,7 +1948,7 @@ void ProjectManager::unhandled_key_input(const Ref<InputEvent> &p_ev) { // This is handled by the platform implementation on macOS, // so only define the shortcut on other platforms #ifndef OSX_ENABLED - if (k->get_keycode_with_modifiers() == (KEY_MASK_CMD | KEY_Q)) { + if (k->get_keycode_with_modifiers() == (KeyModifierMask::CMD | Key::Q)) { _dim_window(); get_tree()->quit(); } @@ -1914,24 +1961,24 @@ void ProjectManager::unhandled_key_input(const Ref<InputEvent> &p_ev) { bool keycode_handled = true; switch (k->get_keycode()) { - case KEY_ENTER: { + case Key::ENTER: { _open_selected_projects_ask(); } break; - case KEY_HOME: { + case Key::HOME: { if (_project_list->get_project_count() > 0) { _project_list->select_project(0); _update_project_buttons(); } } break; - case KEY_END: { + 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: { + case Key::UP: { if (k->is_shift_pressed()) { break; } @@ -1945,7 +1992,7 @@ void ProjectManager::unhandled_key_input(const Ref<InputEvent> &p_ev) { break; } - case KEY_DOWN: { + case Key::DOWN: { if (k->is_shift_pressed()) { break; } @@ -1958,7 +2005,7 @@ void ProjectManager::unhandled_key_input(const Ref<InputEvent> &p_ev) { } } break; - case KEY_F: { + case Key::F: { if (k->is_command_pressed()) { this->search_box->grab_focus(); } else { @@ -2055,8 +2102,7 @@ void ProjectManager::_open_selected_projects() { args.push_back("--single-window"); } - String exec = OS::get_singleton()->get_executable_path(); - Error err = OS::get_singleton()->create_process(exec, args); + Error err = OS::get_singleton()->create_instance(args); ERR_FAIL_COND(err); } @@ -2083,8 +2129,12 @@ void ProjectManager::_open_selected_projects_ask() { } // Update the project settings or don't open - String conf = project.path.plus_file("project.godot"); - int config_version = project.version; + const String conf = project.path.plus_file("project.godot"); + const int config_version = project.version; + PackedStringArray unsupported_features = project.unsupported_features; + + Label *ask_update_label = ask_update_settings->get_label(); + ask_update_label->set_align(Label::ALIGN_LEFT); // Reset in case of previous center align. // Check if the config_version property was empty or 0 if (config_version == 0) { @@ -2104,6 +2154,35 @@ void ProjectManager::_open_selected_projects_ask() { dialog_error->popup_centered(); return; } + // Check if the project is using features not supported by this build of Godot. + if (!unsupported_features.is_empty()) { + String warning_message = ""; + for (int i = 0; i < unsupported_features.size(); i++) { + String feature = unsupported_features[i]; + if (feature == "Double Precision") { + warning_message += TTR("Warning: This project uses double precision floats, but this version of\nGodot uses single precision floats. Opening this project may cause data loss.\n\n"); + unsupported_features.remove_at(i); + i--; + } else if (feature == "C#") { + warning_message += TTR("Warning: This project uses C#, but this build of Godot does not have\nthe Mono module. If you proceed you will not be able to use any C# scripts.\n\n"); + unsupported_features.remove_at(i); + i--; + } else if (feature.substr(0, 3).is_numeric()) { + warning_message += vformat(TTR("Warning: This project was built in Godot %s.\nOpening will upgrade or downgrade the project to Godot %s.\n\n"), Variant(feature), Variant(VERSION_BRANCH)); + unsupported_features.remove_at(i); + i--; + } + } + if (!unsupported_features.is_empty()) { + String unsupported_features_str = Variant(unsupported_features).operator String().trim_prefix("[").trim_suffix("]"); + warning_message += vformat(TTR("Warning: This project uses the following features not supported by this build of Godot:\n\n%s\n\n"), unsupported_features_str); + } + warning_message += TTR("Open anyway? Project will be modified."); + ask_update_label->set_align(Label::ALIGN_CENTER); + ask_update_settings->set_text(warning_message); + ask_update_settings->popup_centered(); + return; + } // Open if the project is up-to-date _open_selected_projects(); @@ -2141,8 +2220,7 @@ void ProjectManager::_run_project_confirm() { args.push_back("--disable-crash-handler"); } - String exec = OS::get_singleton()->get_executable_path(); - Error err = OS::get_singleton()->create_process(exec, args); + Error err = OS::get_singleton()->create_instance(args); ERR_FAIL_COND(err); } } @@ -2271,8 +2349,7 @@ void ProjectManager::_language_selected(int p_id) { void ProjectManager::_restart_confirm() { List<String> args = OS::get_singleton()->get_cmdline_args(); - String exec = OS::get_singleton()->get_executable_path(); - Error err = OS::get_singleton()->create_process(exec, args); + Error err = OS::get_singleton()->create_instance(args); ERR_FAIL_COND(err); _dim_window(); @@ -2387,6 +2464,11 @@ ProjectManager::ProjectManager() { EditorSettings::create(); } + // Turn off some servers we aren't going to be using in the Project Manager. + NavigationServer3D::get_singleton()->set_active(false); + PhysicsServer3D::get_singleton()->set_active(false); + PhysicsServer2D::get_singleton()->set_active(false); + EditorSettings::get_singleton()->set_optimize_save(false); //just write settings as they came { @@ -2525,19 +2607,19 @@ ProjectManager::ProjectManager() { Button *create = memnew(Button); create->set_text(TTR("New Project")); - create->set_shortcut(ED_SHORTCUT("project_manager/new_project", TTR("New Project"), KEY_MASK_CMD | KEY_N)); + create->set_shortcut(ED_SHORTCUT("project_manager/new_project", TTR("New Project"), KeyModifierMask::CMD | Key::N)); create->connect("pressed", callable_mp(this, &ProjectManager::_new_project)); tree_vb->add_child(create); Button *import = memnew(Button); import->set_text(TTR("Import")); - import->set_shortcut(ED_SHORTCUT("project_manager/import_project", TTR("Import Project"), KEY_MASK_CMD | KEY_I)); + import->set_shortcut(ED_SHORTCUT("project_manager/import_project", TTR("Import Project"), KeyModifierMask::CMD | Key::I)); import->connect("pressed", callable_mp(this, &ProjectManager::_import_project)); tree_vb->add_child(import); Button *scan = memnew(Button); scan->set_text(TTR("Scan")); - scan->set_shortcut(ED_SHORTCUT("project_manager/scan_projects", TTR("Scan Projects"), KEY_MASK_CMD | KEY_S)); + scan->set_shortcut(ED_SHORTCUT("project_manager/scan_projects", TTR("Scan Projects"), KeyModifierMask::CMD | Key::S)); scan->connect("pressed", callable_mp(this, &ProjectManager::_scan_projects)); tree_vb->add_child(scan); @@ -2545,25 +2627,26 @@ ProjectManager::ProjectManager() { open_btn = memnew(Button); open_btn->set_text(TTR("Edit")); - open_btn->set_shortcut(ED_SHORTCUT("project_manager/edit_project", TTR("Edit Project"), KEY_MASK_CMD | KEY_E)); + open_btn->set_shortcut(ED_SHORTCUT("project_manager/edit_project", TTR("Edit Project"), KeyModifierMask::CMD | Key::E)); open_btn->connect("pressed", callable_mp(this, &ProjectManager::_open_selected_projects_ask)); tree_vb->add_child(open_btn); run_btn = memnew(Button); run_btn->set_text(TTR("Run")); - run_btn->set_shortcut(ED_SHORTCUT("project_manager/run_project", TTR("Run Project"), KEY_MASK_CMD | KEY_R)); + run_btn->set_shortcut(ED_SHORTCUT("project_manager/run_project", TTR("Run Project"), KeyModifierMask::CMD | Key::R)); run_btn->connect("pressed", callable_mp(this, &ProjectManager::_run_project)); tree_vb->add_child(run_btn); rename_btn = memnew(Button); rename_btn->set_text(TTR("Rename")); - rename_btn->set_shortcut(ED_SHORTCUT("project_manager/rename_project", TTR("Rename Project"), KEY_F2)); + // The F2 shortcut isn't overridden with Enter on macOS as Enter is already used to edit a project. + rename_btn->set_shortcut(ED_SHORTCUT("project_manager/rename_project", TTR("Rename Project"), Key::F2)); rename_btn->connect("pressed", callable_mp(this, &ProjectManager::_rename_project)); tree_vb->add_child(rename_btn); erase_btn = memnew(Button); erase_btn->set_text(TTR("Remove")); - erase_btn->set_shortcut(ED_SHORTCUT("project_manager/remove_project", TTR("Remove Project"), KEY_DELETE)); + erase_btn->set_shortcut(ED_SHORTCUT("project_manager/remove_project", TTR("Remove Project"), Key::KEY_DELETE)); erase_btn->connect("pressed", callable_mp(this, &ProjectManager::_erase_project)); tree_vb->add_child(erase_btn); @@ -2634,7 +2717,7 @@ ProjectManager::ProjectManager() { for (int i = 0; i < editor_languages.size(); i++) { String lang = editor_languages[i]; String lang_name = TranslationServer::get_singleton()->get_locale_name(lang); - language_btn->add_item(lang_name + " [" + lang + "]", i); + language_btn->add_item(vformat("[%s] %s", lang, lang_name), i); language_btn->set_item_metadata(i, lang); if (current_lang == lang) { language_btn->select(i); diff --git a/editor/project_settings_editor.h b/editor/project_settings_editor.h index eb6c300d5b..f90db02c46 100644 --- a/editor/project_settings_editor.h +++ b/editor/project_settings_editor.h @@ -100,8 +100,6 @@ class ProjectSettingsEditor : public AcceptDialog { void _action_reordered(const String &p_action_name, const String &p_relative_to, bool p_before); void _update_action_map_editor(); - ProjectSettingsEditor(); - protected: void _notification(int p_what); static void _bind_methods(); diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 6ea9b9dfae..061f4d218a 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -312,7 +312,7 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: spinbox->hide(); slider->hide(); menu->clear(); - menu->set_size(Size2(1, 1) * EDSCALE); + menu->reset_size(); for (int i = 0; i < MAX_VALUE_EDITORS; i++) { if (i < MAX_VALUE_EDITORS / 4) { @@ -407,11 +407,11 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: return false; } else if (hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || - hint == PROPERTY_HINT_LAYERS_2D_RENDER || - hint == PROPERTY_HINT_LAYERS_2D_NAVIGATION || - hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || - hint == PROPERTY_HINT_LAYERS_3D_RENDER || - hint == PROPERTY_HINT_LAYERS_3D_NAVIGATION) { + hint == PROPERTY_HINT_LAYERS_2D_RENDER || + hint == PROPERTY_HINT_LAYERS_2D_NAVIGATION || + hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || + hint == PROPERTY_HINT_LAYERS_3D_RENDER || + hint == PROPERTY_HINT_LAYERS_3D_NAVIGATION) { String basename; switch (hint) { case PROPERTY_HINT_LAYERS_2D_RENDER: @@ -1343,7 +1343,7 @@ void CustomPropertyEditor::_action_pressed(int p_which) { void CustomPropertyEditor::_drag_easing(const Ref<InputEvent> &p_ev) { Ref<InputEventMouseMotion> mm = p_ev; - if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { float rel = mm->get_relative().x; if (rel == 0) { return; @@ -1628,7 +1628,7 @@ real_t CustomPropertyEditor::_parse_real_expression(String text) { } void CustomPropertyEditor::_emit_changed_whole_or_field() { - if (!Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (!Input::get_singleton()->is_key_pressed(Key::SHIFT)) { emit_signal(SNAME("variant_changed")); } else { emit_signal(SNAME("variant_field_changed"), field_names[focused_value_editor]); @@ -1671,7 +1671,7 @@ void CustomPropertyEditor::_focus_exit() { } void CustomPropertyEditor::config_action_buttons(const List<String> &p_strings) { - Ref<StyleBox> sb = action_buttons[0]->get_theme_stylebox(SNAME("panel")); + Ref<StyleBox> sb = action_buttons[0]->get_theme_stylebox(SNAME("button")); int margin_top = sb->get_margin(SIDE_TOP); int margin_left = sb->get_margin(SIDE_LEFT); int margin_bottom = sb->get_margin(SIDE_BOTTOM); @@ -1804,26 +1804,18 @@ CustomPropertyEditor::CustomPropertyEditor() { } text_edit = memnew(TextEdit); - add_child(text_edit); + value_vbox->add_child(text_edit); text_edit->set_anchors_and_offsets_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 5); + text_edit->set_v_size_flags(Control::SIZE_EXPAND_FILL); text_edit->set_offset(SIDE_BOTTOM, -30); text_edit->hide(); text_edit->connect("text_changed", callable_mp(this, &CustomPropertyEditor::_text_edit_changed)); - for (int i = 0; i < MAX_ACTION_BUTTONS; i++) { - action_buttons[i] = memnew(Button); - action_buttons[i]->hide(); - add_child(action_buttons[i]); - Vector<Variant> binds; - binds.push_back(i); - action_buttons[i]->connect("pressed", callable_mp(this, &CustomPropertyEditor::_action_pressed), binds); - } - color_picker = nullptr; file = memnew(EditorFileDialog); - add_child(file); + value_vbox->add_child(file); file->hide(); file->connect("file_selected", callable_mp(this, &CustomPropertyEditor::_file_selected)); @@ -1831,46 +1823,58 @@ CustomPropertyEditor::CustomPropertyEditor() { error = memnew(ConfirmationDialog); error->set_title(TTR("Error!")); - add_child(error); + value_vbox->add_child(error); scene_tree = memnew(SceneTreeDialog); - add_child(scene_tree); + value_vbox->add_child(scene_tree); scene_tree->connect("selected", callable_mp(this, &CustomPropertyEditor::_node_path_selected)); scene_tree->get_scene_tree()->set_show_enabled_subscene(true); texture_preview = memnew(TextureRect); - add_child(texture_preview); + value_vbox->add_child(texture_preview); texture_preview->hide(); easing_draw = memnew(Control); - add_child(easing_draw); + value_vbox->add_child(easing_draw); easing_draw->hide(); easing_draw->connect("draw", callable_mp(this, &CustomPropertyEditor::_draw_easing)); easing_draw->connect("gui_input", callable_mp(this, &CustomPropertyEditor::_drag_easing)); easing_draw->set_default_cursor_shape(Control::CURSOR_MOVE); type_button = memnew(MenuButton); - add_child(type_button); + value_vbox->add_child(type_button); type_button->hide(); type_button->get_popup()->connect("id_pressed", callable_mp(this, &CustomPropertyEditor::_type_create_selected)); menu = memnew(PopupMenu); // menu->set_pass_on_modal_close_click(false); - add_child(menu); + value_vbox->add_child(menu); menu->connect("id_pressed", callable_mp(this, &CustomPropertyEditor::_menu_option)); evaluator = nullptr; spinbox = memnew(SpinBox); - add_child(spinbox); + value_vbox->add_child(spinbox); spinbox->set_anchors_and_offsets_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 5); spinbox->connect("value_changed", callable_mp(this, &CustomPropertyEditor::_range_modified)); slider = memnew(HSlider); - add_child(slider); + value_vbox->add_child(slider); slider->set_anchors_and_offsets_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 5); slider->connect("value_changed", callable_mp(this, &CustomPropertyEditor::_range_modified)); + action_hboxes = memnew(HBoxContainer); + action_hboxes->set_alignment(BoxContainer::ALIGN_CENTER); + value_vbox->add_child(action_hboxes); + for (int i = 0; i < MAX_ACTION_BUTTONS; i++) { + action_buttons[i] = memnew(Button); + action_buttons[i]->hide(); + action_hboxes->add_child(action_buttons[i]); + Vector<Variant> binds; + binds.push_back(i); + action_buttons[i]->connect("pressed", callable_mp(this, &CustomPropertyEditor::_action_pressed), binds); + } + create_dialog = nullptr; property_select = nullptr; } diff --git a/editor/property_editor.h b/editor/property_editor.h index 23771b7494..2565c6ee27 100644 --- a/editor/property_editor.h +++ b/editor/property_editor.h @@ -110,6 +110,7 @@ class CustomPropertyEditor : public PopupPanel { int focused_value_editor; Label *value_label[MAX_VALUE_EDITORS]; HScrollBar *scroll[4]; + HBoxContainer *action_hboxes; Button *action_buttons[MAX_ACTION_BUTTONS]; MenuButton *type_button; Vector<String> inheritors_array; diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp index f167ded4e7..877b4552c1 100644 --- a/editor/property_selector.cpp +++ b/editor/property_selector.cpp @@ -44,10 +44,10 @@ void PropertySelector::_sbox_input(const Ref<InputEvent> &p_ie) { if (k.is_valid()) { switch (k->get_keycode()) { - case KEY_UP: - case KEY_DOWN: - case KEY_PAGEUP: - case KEY_PAGEDOWN: { + case Key::UP: + case Key::DOWN: + case Key::PAGEUP: + case Key::PAGEDOWN: { search_options->gui_input(k); search_box->accept_event(); diff --git a/editor/quick_open.cpp b/editor/quick_open.cpp index fc3abbb87e..7868414d89 100644 --- a/editor/quick_open.cpp +++ b/editor/quick_open.cpp @@ -55,16 +55,23 @@ void EditorQuickOpen::_build_search_cache(EditorFileSystemDirectory *p_efsd) { _build_search_cache(p_efsd->get_subdir(i)); } + Vector<String> base_types = String(base_type).split(String(",")); for (int i = 0; i < p_efsd->get_file_count(); i++) { String file_type = p_efsd->get_file_type(i); - if (ClassDB::is_parent_class(file_type, base_type)) { - String file = p_efsd->get_file_path(i); - files.push_back(file.substr(6, file.length())); - - // Store refs to used icons. - String ext = file.get_extension(); - if (!icons.has(ext)) { - icons.insert(ext, get_theme_icon((has_theme_icon(file_type, SNAME("EditorIcons")) ? file_type : String("Object")), SNAME("EditorIcons"))); + // Iterate all possible base types. + for (String &parent_type : base_types) { + if (ClassDB::is_parent_class(file_type, parent_type)) { + String file = p_efsd->get_file_path(i); + files.push_back(file.substr(6, file.length())); + + // Store refs to used icons. + String ext = file.get_extension(); + if (!icons.has(ext)) { + icons.insert(ext, get_theme_icon((has_theme_icon(file_type, SNAME("EditorIcons")) ? file_type : String("Object")), SNAME("EditorIcons"))); + } + + // Stop testing base types as soon as we got a match. + break; } } } @@ -160,10 +167,10 @@ void EditorQuickOpen::_sbox_input(const Ref<InputEvent> &p_ie) { Ref<InputEventKey> k = p_ie; if (k.is_valid()) { switch (k->get_keycode()) { - case KEY_UP: - case KEY_DOWN: - case KEY_PAGEUP: - case KEY_PAGEDOWN: { + case Key::UP: + case Key::DOWN: + case Key::PAGEUP: + case Key::PAGEDOWN: { search_options->gui_input(k); search_box->accept_event(); diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp index 9063b5c6f8..eb73f88e61 100644 --- a/editor/rename_dialog.cpp +++ b/editor/rename_dialog.cpp @@ -30,6 +30,7 @@ #include "rename_dialog.h" +#include "modules/modules_enabled.gen.h" // For regex. #ifdef MODULE_REGEX_ENABLED #include "core/string/print_string.h" @@ -459,9 +460,9 @@ String RenameDialog::_substitute(const String &subject, const Node *node, int co return result; } -void RenameDialog::_error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, ErrorHandlerType p_type) { +void RenameDialog::_error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, bool p_editor_notify, ErrorHandlerType p_type) { RenameDialog *self = (RenameDialog *)p_self; - String source_file(p_file); + String source_file = String::utf8(p_file); // Only show first error that is related to "regex" if (self->has_errors || source_file.find("regex") < 0) { @@ -470,9 +471,9 @@ void RenameDialog::_error_handler(void *p_self, const char *p_func, const char * String err_str; if (p_errorexp && p_errorexp[0]) { - err_str = p_errorexp; + err_str = String::utf8(p_errorexp); } else { - err_str = p_error; + err_str = String::utf8(p_error); } self->has_errors = true; @@ -626,7 +627,7 @@ void RenameDialog::reset() { bool RenameDialog::_is_main_field(LineEdit *line_edit) { return line_edit && - (line_edit == lne_search || line_edit == lne_replace || line_edit == lne_prefix || line_edit == lne_suffix); + (line_edit == lne_search || line_edit == lne_replace || line_edit == lne_prefix || line_edit == lne_suffix); } void RenameDialog::_insert_text(String text) { diff --git a/editor/rename_dialog.h b/editor/rename_dialog.h index 7990862b37..f383877eb2 100644 --- a/editor/rename_dialog.h +++ b/editor/rename_dialog.h @@ -31,17 +31,16 @@ #ifndef RENAME_DIALOG_H #define RENAME_DIALOG_H -#include "modules/modules_enabled.gen.h" +#include "modules/modules_enabled.gen.h" // For regex. #ifdef MODULE_REGEX_ENABLED +#include "core/object/undo_redo.h" +#include "editor/scene_tree_editor.h" #include "scene/gui/check_box.h" #include "scene/gui/dialogs.h" #include "scene/gui/option_button.h" #include "scene/gui/spin_box.h" -#include "core/object/undo_redo.h" -#include "editor/scene_tree_editor.h" - /** @author Blazej Floch */ @@ -63,7 +62,7 @@ class RenameDialog : public ConfirmationDialog { String _postprocess(const String &subject); void _update_preview(String new_text = ""); void _update_preview_int(int new_value = 0); - static void _error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, ErrorHandlerType p_type); + static void _error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, bool p_editor_notify, ErrorHandlerType p_type); SceneTreeEditor *scene_tree_editor; UndoRedo *undo_redo; diff --git a/editor/reparent_dialog.h b/editor/reparent_dialog.h index 5c3a65a522..3fcdda7bed 100644 --- a/editor/reparent_dialog.h +++ b/editor/reparent_dialog.h @@ -46,7 +46,6 @@ class ReparentDialog : public ConfirmationDialog { SceneTreeEditor *tree; CheckBox *keep_transform; - void update_tree(); void _reparent(); void _cancel(); @@ -56,7 +55,6 @@ protected: public: void set_current(const Set<Node *> &p_selection); - String get_selected_type(); ReparentDialog(); ~ReparentDialog(); diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 4a59eb4fb3..b36275322a 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -47,10 +47,13 @@ #include "editor/plugins/script_editor_plugin.h" #include "editor/shader_create_dialog.h" #include "scene/main/window.h" +#include "scene/property_utils.h" #include "scene/resources/packed_scene.h" #include "servers/display_server.h" #include "servers/rendering_server.h" +#include "modules/modules_enabled.gen.h" // For regex. + void SceneTreeDock::_nodes_drag_begin() { if (restore_script_editor_on_drag) { EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT); @@ -67,7 +70,7 @@ void SceneTreeDock::input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { restore_script_editor_on_drag = false; //lost chance } } @@ -213,7 +216,7 @@ void SceneTreeDock::_perform_instantiate_scenes(const Vector<String> &p_files, N for (int i = 0; i < instances.size(); i++) { Node *instantiated_scene = instances[i]; - editor_data->get_undo_redo().add_do_method(parent, "add_child", instantiated_scene); + editor_data->get_undo_redo().add_do_method(parent, "add_child", instantiated_scene, true); if (p_pos >= 0) { editor_data->get_undo_redo().add_do_method(parent, "move_child", instantiated_scene, p_pos + i); } @@ -258,8 +261,8 @@ void SceneTreeDock::_replace_with_branch_scene(const String &p_file, Node *base) int pos = base->get_index(); undo_redo->add_do_method(parent, "remove_child", base); undo_redo->add_undo_method(parent, "remove_child", instantiated_scene); - undo_redo->add_do_method(parent, "add_child", instantiated_scene); - undo_redo->add_undo_method(parent, "add_child", base); + undo_redo->add_do_method(parent, "add_child", instantiated_scene, true); + undo_redo->add_undo_method(parent, "add_child", base, true); undo_redo->add_do_method(parent, "move_child", instantiated_scene, pos); undo_redo->add_undo_method(parent, "move_child", base, pos); @@ -416,6 +419,9 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { if (!selected_item) { selected_item = tree->get_root(); + if (!selected_item) { + break; + } } bool collapsed = _is_collapsed_recursive(selected_item); @@ -511,7 +517,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { ERR_CONTINUE(!dup); - editor_data->get_undo_redo().add_do_method(paste_parent, "add_child", dup); + editor_data->get_undo_redo().add_do_method(paste_parent, "add_child", dup, true); for (KeyValue<const Node *, Node *> &E2 : duplimap) { Node *d = E2.value; @@ -813,7 +819,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { editor_data->get_undo_redo().create_action(TTR("Make node as Root")); editor_data->get_undo_redo().add_do_method(node->get_parent(), "remove_child", node); editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", node); - editor_data->get_undo_redo().add_do_method(node, "add_child", root); + editor_data->get_undo_redo().add_do_method(node, "add_child", root, true); editor_data->get_undo_redo().add_do_method(node, "set_scene_file_path", root->get_scene_file_path()); editor_data->get_undo_redo().add_do_method(root, "set_scene_file_path", String()); editor_data->get_undo_redo().add_do_method(node, "set_owner", (Object *)nullptr); @@ -824,7 +830,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { editor_data->get_undo_redo().add_undo_method(node, "set_scene_file_path", String()); editor_data->get_undo_redo().add_undo_method(node, "remove_child", root); editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", root); - editor_data->get_undo_redo().add_undo_method(node->get_parent(), "add_child", node); + editor_data->get_undo_redo().add_undo_method(node->get_parent(), "add_child", node, true); editor_data->get_undo_redo().add_undo_method(node->get_parent(), "move_child", node, node->get_index()); editor_data->get_undo_redo().add_undo_method(root, "set_owner", (Object *)nullptr); editor_data->get_undo_redo().add_undo_method(node, "set_owner", root); @@ -896,7 +902,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { // Resize the dialog to its minimum size. // This prevents the dialog from being too wide after displaying // a deletion confirmation for a node with a long name. - delete_dialog->set_size(Size2()); + delete_dialog->reset_size(); delete_dialog->popup_centered(); } @@ -1192,7 +1198,7 @@ void SceneTreeDock::_node_collapsed(Object *p_obj) { return; } - if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) { _set_collapsed_recursive(ti, ti->is_collapsed()); } } @@ -1303,6 +1309,7 @@ void SceneTreeDock::_notification(int p_what) { button_instance->set_icon(get_theme_icon(SNAME("Instance"), SNAME("EditorIcons"))); button_create_script->set_icon(get_theme_icon(SNAME("ScriptCreate"), SNAME("EditorIcons"))); button_detach_script->set_icon(get_theme_icon(SNAME("ScriptRemove"), SNAME("EditorIcons"))); + button_tree_menu->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); button_2d->set_icon(get_theme_icon(SNAME("Node2D"), SNAME("EditorIcons"))); button_3d->set_icon(get_theme_icon(SNAME("Node3D"), SNAME("EditorIcons"))); button_ui->set_icon(get_theme_icon(SNAME("Control"), SNAME("EditorIcons"))); @@ -1785,7 +1792,7 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V } editor_data->get_undo_redo().add_do_method(node->get_parent(), "remove_child", node); - editor_data->get_undo_redo().add_do_method(new_parent, "add_child", node); + editor_data->get_undo_redo().add_do_method(new_parent, "add_child", node, true); if (p_position_in_parent >= 0) { editor_data->get_undo_redo().add_do_method(new_parent, "move_child", node, p_position_in_parent + inc); @@ -1858,7 +1865,7 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V int child_pos = node->get_index(); - editor_data->get_undo_redo().add_undo_method(node->get_parent(), "add_child", node); + editor_data->get_undo_redo().add_undo_method(node->get_parent(), "add_child", node, true); editor_data->get_undo_redo().add_undo_method(node->get_parent(), "move_child", node, child_pos); editor_data->get_undo_redo().add_undo_method(this, "_set_owners", edited_scene, owners); if (AnimationPlayerEditor::get_singleton()->get_track_editor()->get_root() == node) { @@ -2071,7 +2078,7 @@ void SceneTreeDock::_delete_confirm(bool p_cut) { } editor_data->get_undo_redo().add_do_method(n->get_parent(), "remove_child", n); - editor_data->get_undo_redo().add_undo_method(n->get_parent(), "add_child", n); + editor_data->get_undo_redo().add_undo_method(n->get_parent(), "add_child", n, true); editor_data->get_undo_redo().add_undo_method(n->get_parent(), "move_child", n, n->get_index()); if (AnimationPlayerEditor::get_singleton()->get_track_editor()->get_root() == n) { editor_data->get_undo_redo().add_undo_method(AnimationPlayerEditor::get_singleton()->get_track_editor(), "set_root", n); @@ -2153,7 +2160,7 @@ void SceneTreeDock::_do_create(Node *p_parent) { editor_data->get_undo_redo().create_action(TTR("Create Node")); if (edited_scene) { - editor_data->get_undo_redo().add_do_method(p_parent, "add_child", child); + editor_data->get_undo_redo().add_do_method(p_parent, "add_child", child, true); editor_data->get_undo_redo().add_do_method(child, "set_owner", edited_scene); editor_data->get_undo_redo().add_do_method(editor_selection, "clear"); editor_data->get_undo_redo().add_do_method(editor_selection, "add_node", child); @@ -2572,7 +2579,7 @@ void SceneTreeDock::_files_dropped(Vector<String> p_files, NodePath p_to, int p_ menu_properties->set_item_metadata(menu_properties->get_item_count() - 1, p); } - menu_properties->set_size(Size2(1, 1)); + menu_properties->reset_size(); menu_properties->set_position(get_screen_position() + get_local_mouse_position()); menu_properties->popup(); } else if (!valid_properties.is_empty()) { @@ -2615,7 +2622,7 @@ void SceneTreeDock::_nodes_dragged(Array p_nodes, NodePath p_to, int p_type) { int to_pos = -1; _normalize_drop(to_node, to_pos, p_type); - _do_reparent(to_node, to_pos, nodes, !Input::get_singleton()->is_key_pressed(KEY_SHIFT)); + _do_reparent(to_node, to_pos, nodes, !Input::get_singleton()->is_key_pressed(Key::SHIFT)); } void SceneTreeDock::_add_children_to_popup(Object *p_obj, int p_depth) { @@ -2664,7 +2671,7 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { menu->add_icon_shortcut(get_theme_icon(SNAME("Instance"), SNAME("EditorIcons")), ED_GET_SHORTCUT("scene_tree/instance_scene"), TOOL_INSTANTIATE); } - menu->set_size(Size2(1, 1)); + menu->reset_size(); menu->set_position(get_screen_position() + p_menu_pos); menu->popup(); return; @@ -2687,7 +2694,7 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { if (profile_allow_editing) { subresources.clear(); menu_subresources->clear(); - menu_subresources->set_size(Size2(1, 1)); + menu_subresources->reset_size(); _add_children_to_popup(selection.front()->get(), 0); if (menu->get_item_count() > 0) { menu->add_separator(); @@ -2826,9 +2833,9 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { if (profile_allow_editing) { menu->add_separator(); - menu->add_icon_shortcut(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), ED_SHORTCUT("scene_tree/delete", TTR("Delete Node(s)"), KEY_DELETE), TOOL_ERASE); + menu->add_icon_shortcut(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), ED_SHORTCUT("scene_tree/delete", TTR("Delete Node(s)"), Key::KEY_DELETE), TOOL_ERASE); } - menu->set_size(Size2(1, 1)); + menu->reset_size(); menu->set_position(p_menu_pos); menu->popup(); } @@ -2840,7 +2847,7 @@ void SceneTreeDock::_open_tree_menu() { menu->add_check_item(TTR("Auto Expand to Selected"), TOOL_AUTO_EXPAND); menu->set_item_checked(menu->get_item_idx_from_text(TTR("Auto Expand to Selected")), EditorSettings::get_singleton()->get("docks/scene_tree/auto_expand_to_selected")); - menu->set_size(Size2(1, 1)); + menu->reset_size(); menu->set_position(get_screen_position() + get_local_mouse_position()); menu->popup(); } @@ -2943,7 +2950,7 @@ void SceneTreeDock::open_script_dialog(Node *p_for_node, bool p_extend) { } } -void SceneTreeDock::attach_shader_to_selected() { +void SceneTreeDock::attach_shader_to_selected(int p_preferred_mode) { if (selected_shader_material.is_null()) { return; } @@ -2970,13 +2977,13 @@ void SceneTreeDock::attach_shader_to_selected() { shader_create_dialog->connect("shader_created", callable_mp(this, &SceneTreeDock::_shader_created)); shader_create_dialog->connect("confirmed", callable_mp(this, &SceneTreeDock::_shader_creation_closed)); shader_create_dialog->connect("cancelled", callable_mp(this, &SceneTreeDock::_shader_creation_closed)); - shader_create_dialog->config(path); + shader_create_dialog->config(path, true, true, -1, p_preferred_mode); shader_create_dialog->popup_centered(); } -void SceneTreeDock::open_shader_dialog(Ref<ShaderMaterial> &p_for_material) { +void SceneTreeDock::open_shader_dialog(Ref<ShaderMaterial> &p_for_material, int p_preferred_mode) { selected_shader_material = p_for_material; - attach_shader_to_selected(); + attach_shader_to_selected(p_preferred_mode); } void SceneTreeDock::open_add_child_dialog() { @@ -3132,7 +3139,9 @@ void SceneTreeDock::_clear_clipboard() { void SceneTreeDock::_create_remap_for_node(Node *p_node, Map<RES, RES> &r_remap) { List<PropertyInfo> props; p_node->get_property_list(&props); - bool is_instantiated = EditorPropertyRevert::may_node_be_in_instance(p_node); + + Vector<SceneState::PackState> states_stack; + bool states_stack_ready = false; for (const PropertyInfo &E : props) { if (!(E.usage & PROPERTY_USAGE_STORAGE)) { @@ -3143,16 +3152,17 @@ void SceneTreeDock::_create_remap_for_node(Node *p_node, Map<RES, RES> &r_remap) if (v.is_ref()) { RES res = v; if (res.is_valid()) { - if (is_instantiated) { - Variant orig; - if (EditorPropertyRevert::get_instantiated_node_original_property(p_node, E.name, orig)) { - if (!EditorPropertyRevert::is_node_property_different(p_node, v, orig)) { - continue; - } - } + if (!states_stack_ready) { + states_stack = PropertyUtils::get_node_states_stack(p_node); + states_stack_ready = true; + } + + Variant orig = PropertyUtils::get_property_default_value(p_node, E.name, &states_stack); + if (!PropertyUtils::is_property_value_different(v, orig)) { + continue; } - if ((res->get_path() == "" || res->get_path().find("::") > -1) && !r_remap.has(res)) { + if (res->is_built_in() && !r_remap.has(res)) { _create_remap_for_resource(res, r_remap); } } @@ -3179,7 +3189,7 @@ void SceneTreeDock::_create_remap_for_resource(RES p_resource, Map<RES, RES> &r_ if (v.is_ref()) { RES res = v; if (res.is_valid()) { - if ((res->get_path() == "" || res->get_path().find("::") > -1) && !r_remap.has(res)) { + if (res->is_built_in() && !r_remap.has(res)) { _create_remap_for_resource(res, r_remap); } } @@ -3223,28 +3233,32 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel HBoxContainer *filter_hbc = memnew(HBoxContainer); filter_hbc->add_theme_constant_override("separate", 0); - ED_SHORTCUT("scene_tree/rename", TTR("Rename"), KEY_F2); - ED_SHORTCUT("scene_tree/batch_rename", TTR("Batch Rename"), KEY_MASK_SHIFT | KEY_F2); - ED_SHORTCUT("scene_tree/add_child_node", TTR("Add Child Node"), KEY_MASK_CMD | KEY_A); - ED_SHORTCUT("scene_tree/instance_scene", TTR("Instantiate Child Scene"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_A); + ED_SHORTCUT("scene_tree/rename", TTR("Rename"), Key::F2); + ED_SHORTCUT_OVERRIDE("scene_tree/rename", "macos", Key::ENTER); + + ED_SHORTCUT("scene_tree/batch_rename", TTR("Batch Rename"), KeyModifierMask::SHIFT | Key::F2); + ED_SHORTCUT_OVERRIDE("scene_tree/batch_rename", "macos", KeyModifierMask::SHIFT | Key::ENTER); + + ED_SHORTCUT("scene_tree/add_child_node", TTR("Add Child Node"), KeyModifierMask::CMD | Key::A); + ED_SHORTCUT("scene_tree/instance_scene", TTR("Instantiate Child Scene"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::A); ED_SHORTCUT("scene_tree/expand_collapse_all", TTR("Expand/Collapse All")); - ED_SHORTCUT("scene_tree/cut_node", TTR("Cut"), KEY_MASK_CMD | KEY_X); - ED_SHORTCUT("scene_tree/copy_node", TTR("Copy"), KEY_MASK_CMD | KEY_C); - ED_SHORTCUT("scene_tree/paste_node", TTR("Paste"), KEY_MASK_CMD | KEY_V); + ED_SHORTCUT("scene_tree/cut_node", TTR("Cut"), KeyModifierMask::CMD | Key::X); + ED_SHORTCUT("scene_tree/copy_node", TTR("Copy"), KeyModifierMask::CMD | Key::C); + ED_SHORTCUT("scene_tree/paste_node", TTR("Paste"), KeyModifierMask::CMD | Key::V); ED_SHORTCUT("scene_tree/change_node_type", TTR("Change Type")); ED_SHORTCUT("scene_tree/attach_script", TTR("Attach Script")); ED_SHORTCUT("scene_tree/extend_script", TTR("Extend Script")); ED_SHORTCUT("scene_tree/detach_script", TTR("Detach Script")); - ED_SHORTCUT("scene_tree/move_up", TTR("Move Up"), KEY_MASK_CMD | KEY_UP); - ED_SHORTCUT("scene_tree/move_down", TTR("Move Down"), KEY_MASK_CMD | KEY_DOWN); - ED_SHORTCUT("scene_tree/duplicate", TTR("Duplicate"), KEY_MASK_CMD | KEY_D); + ED_SHORTCUT("scene_tree/move_up", TTR("Move Up"), KeyModifierMask::CMD | Key::UP); + ED_SHORTCUT("scene_tree/move_down", TTR("Move Down"), KeyModifierMask::CMD | Key::DOWN); + ED_SHORTCUT("scene_tree/duplicate", TTR("Duplicate"), KeyModifierMask::CMD | Key::D); ED_SHORTCUT("scene_tree/reparent", TTR("Reparent")); ED_SHORTCUT("scene_tree/reparent_to_new_node", TTR("Reparent to New Node")); ED_SHORTCUT("scene_tree/make_root", TTR("Make Scene Root")); ED_SHORTCUT("scene_tree/save_branch_as_scene", TTR("Save Branch as Scene")); - ED_SHORTCUT("scene_tree/copy_node_path", TTR("Copy Node Path"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_C); - ED_SHORTCUT("scene_tree/delete_no_confirm", TTR("Delete (No Confirm)"), KEY_MASK_SHIFT | KEY_DELETE); - ED_SHORTCUT("scene_tree/delete", TTR("Delete"), KEY_DELETE); + ED_SHORTCUT("scene_tree/copy_node_path", TTR("Copy Node Path"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::C); + ED_SHORTCUT("scene_tree/delete_no_confirm", TTR("Delete (No Confirm)"), KeyModifierMask::SHIFT | Key::KEY_DELETE); + ED_SHORTCUT("scene_tree/delete", TTR("Delete"), Key::KEY_DELETE); button_add = memnew(Button); button_add->set_flat(true); diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h index 255e026887..c6e47fa002 100644 --- a/editor/scene_tree_dock.h +++ b/editor/scene_tree_dock.h @@ -48,6 +48,8 @@ #include "scene/gui/tree.h" #include "scene_tree_editor.h" +#include "modules/modules_enabled.gen.h" // For regex. + class EditorNode; class ShaderCreateDialog; @@ -246,8 +248,6 @@ class SceneTreeDock : public VBoxContainer { void _perform_instantiate_scenes(const Vector<String> &p_files, Node *parent, int p_pos); void _replace_with_branch_scene(const String &p_file, Node *base); - void _file_selected(String p_file); - void _remote_tree_selected(); void _local_tree_selected(); @@ -302,8 +302,8 @@ public: void attach_script_to_selected(bool p_extend); void open_script_dialog(Node *p_for_node, bool p_extend); - void attach_shader_to_selected(); - void open_shader_dialog(Ref<ShaderMaterial> &p_for_material); + void attach_shader_to_selected(int p_preferred_mode = -1); + void open_shader_dialog(Ref<ShaderMaterial> &p_for_material, int p_preferred_mode = -1); void open_add_child_dialog(); void open_instance_child_dialog(); diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h index 4acd5d8486..b4c40ab17a 100644 --- a/editor/scene_tree_editor.h +++ b/editor/scene_tree_editor.h @@ -114,8 +114,6 @@ class SceneTreeEditor : public Control { void _node_visibility_changed(Node *p_node); void _update_visibility_color(Node *p_node, TreeItem *p_item); - void _node_replace_owner(Node *p_base, Node *p_node, Node *p_root); - void _selection_changed(); Node *get_scene_node(); @@ -173,7 +171,6 @@ class SceneTreeDialog : public ConfirmationDialog { //Button *cancel; LineEdit *filter; - void update_tree(); void _select(); void _cancel(); void _filter_changed(const String &p_filter); diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index 1e19d9bd47..fb1575ad8c 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -315,7 +315,9 @@ void ScriptCreateDialog::_create_new() { } } - if (!is_built_in) { + if (is_built_in) { + scr->set_name(internal_name->get_text()); + } else { String lpath = ProjectSettings::get_singleton()->localize_path(file_path->get_text()); scr->set_path(lpath); Error err = ResourceSaver::save(lpath, scr, ResourceSaver::FLAG_CHANGE_PATH); @@ -686,6 +688,11 @@ void ScriptCreateDialog::_update_dialog() { builtin_warning_label->set_visible(is_built_in); + path_controls[0]->set_visible(!is_built_in); + path_controls[1]->set_visible(!is_built_in); + name_controls[0]->set_visible(is_built_in); + name_controls[1]->set_visible(is_built_in); + // Check if the script name is the same as the parent class. // This warning isn't relevant if the script is built-in. script_name_warning_label->set_visible(!is_built_in && _get_class_name() == parent_name->get_text()); @@ -868,9 +875,24 @@ ScriptCreateDialog::ScriptCreateDialog() { path_button = memnew(Button); path_button->connect("pressed", callable_mp(this, &ScriptCreateDialog::_browse_path), varray(false, true)); hb->add_child(path_button); - gc->add_child(memnew(Label(TTR("Path:")))); + Label *label = memnew(Label(TTR("Path:"))); + gc->add_child(label); gc->add_child(hb); re_check_path = false; + path_controls[0] = label; + path_controls[1] = hb; + + /* Name */ + + internal_name = memnew(LineEdit); + internal_name->set_h_size_flags(Control::SIZE_EXPAND_FILL); + label = memnew(Label(TTR("Name:"))); + gc->add_child(label); + gc->add_child(internal_name); + name_controls[0] = label; + name_controls[1] = internal_name; + label->hide(); + internal_name->hide(); /* Dialog Setup */ diff --git a/editor/script_create_dialog.h b/editor/script_create_dialog.h index 7c2ef1e150..dba798eea7 100644 --- a/editor/script_create_dialog.h +++ b/editor/script_create_dialog.h @@ -57,6 +57,7 @@ class ScriptCreateDialog : public ConfirmationDialog { OptionButton *language_menu; OptionButton *template_menu; LineEdit *file_path; + LineEdit *internal_name; Button *path_button; EditorFileDialog *file_browse; CheckBox *internal; @@ -81,6 +82,9 @@ class ScriptCreateDialog : public ConfirmationDialog { int default_language; bool re_check_path; + Control *path_controls[2]; + Control *name_controls[2]; + enum ScriptOrigin { SCRIPT_ORIGIN_PROJECT, SCRIPT_ORIGIN_EDITOR, diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp index 9062169e06..e1229729ac 100644 --- a/editor/settings_config_dialog.cpp +++ b/editor/settings_config_dialog.cpp @@ -164,7 +164,7 @@ void EditorSettingsDialog::unhandled_input(const Ref<InputEvent> &p_event) { handled = true; } - if (k->get_keycode_with_modifiers() == (KEY_MASK_CMD | KEY_F)) { + if (k->get_keycode_with_modifiers() == (KeyModifierMask::CMD | Key::F)) { _focus_current_search_box(); handled = true; } @@ -433,7 +433,7 @@ void EditorSettingsDialog::_update_shortcuts() { } Array original = sc->get_meta("original"); - Array shortcuts_array = sc->get_events(); + Array shortcuts_array = sc->get_events().duplicate(true); bool same_as_defaults = Shortcut::is_event_array_equal(original, shortcuts_array); bool collapse = !collapsed.has(E) || (collapsed.has(E) && collapsed[E]); @@ -486,7 +486,7 @@ void EditorSettingsDialog::_shortcut_button_pressed(Object *p_item, int p_column _update_shortcut_events(current_edited_identifier, Array()); } } else if (type == "event") { - current_events.remove(current_event_index); + current_events.remove_at(current_event_index); if (is_editing_action) { _update_builtin_action(current_edited_identifier, current_events); @@ -564,7 +564,7 @@ void EditorSettingsDialog::drop_data_fw(const Point2 &p_point, const Variant &p_ Array events = selected->get_parent()->get_meta("events"); Variant event_moved = events[index_moving_from]; - events.remove(index_moving_from); + events.remove_at(index_moving_from); events.insert(target_event_index, event_moved); String ident = selected->get_parent()->get_meta("shortcut_identifier"); diff --git a/editor/shader_create_dialog.cpp b/editor/shader_create_dialog.cpp index 6bbefb3bb2..1ddd79eea8 100644 --- a/editor/shader_create_dialog.cpp +++ b/editor/shader_create_dialog.cpp @@ -168,6 +168,11 @@ void ShaderCreateDialog::_create_new() { code += "\t// Place sky code here.\n"; code += "}\n"; break; + case Shader::MODE_FOG: + code += "void fog() {\n"; + code += "\t// Place fog code here.\n"; + code += "}\n"; + break; } } text_shader->set_code(code.as_string()); @@ -319,7 +324,7 @@ void ShaderCreateDialog::_path_submitted(const String &p_path) { ok_pressed(); } -void ShaderCreateDialog::config(const String &p_base_path, bool p_built_in_enabled, bool p_load_enabled) { +void ShaderCreateDialog::config(const String &p_base_path, bool p_built_in_enabled, bool p_load_enabled, int p_preferred_type, int p_preferred_mode) { if (p_base_path != "") { initial_base_path = p_base_path.get_basename(); file_path->set_text(initial_base_path + "." + language_data[language_menu->get_selected()].default_extension); @@ -333,6 +338,16 @@ void ShaderCreateDialog::config(const String &p_base_path, bool p_built_in_enabl built_in_enabled = p_built_in_enabled; load_enabled = p_load_enabled; + if (p_preferred_type > -1) { + language_menu->select(p_preferred_type); + _language_changed(p_preferred_type); + } + + if (p_preferred_mode > -1) { + mode_menu->select(p_preferred_mode); + _mode_changed(p_preferred_mode); + } + _language_changed(current_language); _path_changed(file_path->get_text()); } diff --git a/editor/shader_create_dialog.h b/editor/shader_create_dialog.h index 6962fa3d8d..cd20897ddb 100644 --- a/editor/shader_create_dialog.h +++ b/editor/shader_create_dialog.h @@ -108,7 +108,7 @@ protected: static void _bind_methods(); public: - void config(const String &p_base_path, bool p_built_in_enabled = true, bool p_load_enabled = true); + void config(const String &p_base_path, bool p_built_in_enabled = true, bool p_load_enabled = true, int p_preferred_type = -1, int p_preferred_mode = -1); ShaderCreateDialog(); }; diff --git a/editor/translations/Makefile b/editor/translations/Makefile index 1843114f06..82b3d49c59 100644 --- a/editor/translations/Makefile +++ b/editor/translations/Makefile @@ -18,3 +18,24 @@ merge: check: @for po in $(POFILES); do msgfmt -c $$po -o /dev/null; done + +# Generate completion ratio from statistics string such as: +# 2775 translated messages, 272 fuzzy translations, 151 untranslated messages. +# First number can be 0, second and third numbers are only present if non-zero. +include-list: + @list=""; \ + threshold=0.30; \ + for po in $(POFILES); do \ + res=`msgfmt --statistics $$po -o /dev/null 2>&1 | sed 's/[^0-9,]*//g'`; \ + complete=`cut -d',' -f1 <<< $$res`; \ + fuzzy_or_untranslated=`cut -d',' -f2 <<< $$res`; \ + untranslated_maybe=`cut -d',' -f3 <<< $$res`; \ + if [ -z "$$fuzzy_or_untranslated" ]; then fuzzy_or_untranslated=0; fi; \ + if [ -z "$$untranslated_maybe" ]; then untranslated_maybe=0; fi; \ + incomplete=`expr $$fuzzy_or_untranslated + $$untranslated_maybe`; \ + if `awk "BEGIN {exit !($$complete / ($$complete + $$incomplete) > $$threshold)}"`; then \ + lang=`basename $$po .po`; \ + list+="$$lang,"; \ + fi; \ + done; \ + echo $$list; diff --git a/editor/translations/af.po b/editor/translations/af.po index 223a1b1c45..a1a19d1679 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -10,6 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-04-05 14:28+0000\n" "Last-Translator: Henry LeRoux <henry.leroux@ocsbstudent.ca>\n" @@ -2475,6 +2476,15 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Save All Scenes" +msgstr "Stoor As" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2592,6 +2602,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2918,11 +2932,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -#, fuzzy -msgid "Save All Scenes" -msgstr "Stoor As" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4389,6 +4398,18 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "" @@ -4398,10 +4419,6 @@ msgid "Preset" msgstr "Herset Zoem" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -7412,12 +7429,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Deursoek Hulp" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Voorskou:" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7784,11 +7803,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7852,7 +7871,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7860,6 +7879,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8204,6 +8227,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -11100,11 +11143,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14320,6 +14363,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14329,7 +14380,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 16cc1fd0a7..c8cc51dd2c 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -59,9 +59,10 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-19 11:14+0000\n" -"Last-Translator: Mohammed Mubarak <modymu9@gmail.com>\n" +"PO-Revision-Date: 2021-11-11 08:00+0000\n" +"Last-Translator: Nabeel20 <nabeelandnizam@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -70,7 +71,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -640,9 +641,8 @@ msgid "Go to Previous Step" msgstr "إذهب إلى الخطوة السابقة" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Apply Reset" -msgstr "إعادة تعيين" +msgstr "طَبق إعادة تعيين" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -985,7 +985,6 @@ msgid "Edit..." msgstr "تعديل..." #: editor/connections_dialog.cpp -#, fuzzy msgid "Go to Method" msgstr "إذهب إلى الدالة" @@ -1007,7 +1006,7 @@ msgstr "لا نتائج من أجل \"%s\"." #: editor/create_dialog.cpp editor/property_selector.cpp msgid "No description available for %s." -msgstr "ليس هناك وصف مناسب لأجل s%." +msgstr "ليس هناك وصف مناسب لأجل %s." #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp @@ -1107,17 +1106,16 @@ msgid "Owners Of:" msgstr "ملاك:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"حذف الملفات المختارة من المشروع؟ (لا يمكن استعادتها)\n" -"يمكنك إيجاد الملفات المحذوفة في سلة مهملات النظام حيث يمكنك إسترجاعها." +"حذف الملفات المُختارة من المشروع؟ (لا يمكن استعادتها).\n" +"حسب إِعدادات مُدير ملفاتِك, إِما سيتم نقل الملقات إِلى سلة المُهملات أَو سيتم حذفها " +"نهائياً." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1125,9 +1123,10 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"الملفات التي يتم إزالتها مطلوبة من قبل موارد أخرى من اجل ان تعمل.\n" -"هل تريد إزالتها على أي حال؟ (لا تراجع)\n" -"يمكنك العثور على الملفات التي تمت إزالتها في مهملات النظام لاستعادتها." +"الملفات التي يتم إزالتها مطلوبة من قبل موارد أخرى من اجل أَن تعمل.\n" +"هل تريد إزالتها على أي حال؟ (لا تراجع).\n" +"حسب إِعدادات مُدير ملفاتِك, إِما سيتم نقل الملقات إِلى سلة المُهملات أَو سيتم حذفها " +"نهائياً." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1297,9 +1296,8 @@ msgid "Licenses" msgstr "تراخيص" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Error opening asset file for \"%s\" (not in ZIP format)." -msgstr "حدث خطأ عندفتح ملف الحزمة بسبب أن الملف ليس في صيغة \"ZIP\"." +msgstr "حدث خطأ عندفتح ملف %s الحزمة بسبب أن الملف ليس في صيغة \"ZIP\"." #: editor/editor_asset_installer.cpp msgid "%s (already exists)" @@ -1882,14 +1880,12 @@ msgid "Current Profile:" msgstr "الملف (النسخة) الحالية:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Create Profile" -msgstr "مسح الملف" +msgstr "أصنع حساب" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Remove Profile" -msgstr "إزالة البلاط" +msgstr "أمسح الحساب" #: editor/editor_feature_profile.cpp msgid "Available Profiles:" @@ -1909,9 +1905,8 @@ msgid "Export" msgstr "تصدير" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Configure Selected Profile:" -msgstr "الملف (النسخة) الحالية:" +msgstr "عدل على الحساب الحالي:" #: editor/editor_feature_profile.cpp #, fuzzy @@ -2441,6 +2436,15 @@ msgid "" "be satisfied." msgstr "لا يمكن حفظ المشهد. على الأرجح لا يمكن إستيفاء التبعيات (مجسّدات)." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "لا يمكن بدء عملية جانبية!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "حفظ جميع المشاهد" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "لا يمكن الكتابة عنوة (استبدال overwrite ) المشهد كونه ما زال مفتوحاً!" @@ -2577,6 +2581,10 @@ msgid "Save changes to '%s' before closing?" msgstr "هل تريد حفظ التغييرات إلي'%s' قبل الإغلاق؟" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s لم يعد موجوداً! من فضلك حدد موقعاً جديداً للحفظ." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2621,11 +2629,11 @@ msgstr "لم يتم حفظ المشهد الحالي. إفتحه علي أية #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "لا يمكن التراجع أثناء ضغط أزار الفأرة." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "لا شيء للتراجع عنه." #: editor/editor_node.cpp #, fuzzy @@ -2634,11 +2642,11 @@ msgstr "تراجع" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "لا يمكن إعادة العمل أثناء ضغط أزرار الفأرة." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "لا شيء لإعادة عمله مجدداً." #: editor/editor_node.cpp #, fuzzy @@ -2924,10 +2932,6 @@ msgid "Save Scene" msgstr "حفظ المشهد" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "حفظ جميع المشاهد" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "تحويل إلى..." @@ -3589,7 +3593,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "تحميل سريع" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -4252,15 +4256,15 @@ msgstr "جاري البحث..." #: editor/find_in_files.cpp msgid "%d match in %d file." -msgstr "d% تطابق في d% الملف." +msgstr "%d تطابق في %d الملف." #: editor/find_in_files.cpp msgid "%d matches in %d file." -msgstr "d% تطابقات في d% الملف." +msgstr "%d تطابقات في %d الملف." #: editor/find_in_files.cpp msgid "%d matches in %d files." -msgstr "d% تطابقات في d% الملف." +msgstr "%d تطابقات في %d الملف." #: editor/groups_editor.cpp msgid "Add to Group" @@ -4425,6 +4429,18 @@ msgid "Clear Default for '%s'" msgstr "إخلاء الإفتراضي ل '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "إعادة إستيراد" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "إستيراد ك:" @@ -4433,10 +4449,6 @@ msgid "Preset" msgstr "إعداد مُسبق" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "إعادة إستيراد" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "احفظ المشاهد، إعادة-الإستيراد، وإعادة التشغيل" @@ -7430,11 +7442,13 @@ msgid "Move Down" msgstr "تحريك لأسفل" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "النص البرمجي التالي" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "النص البرمجي السابق" #: editor/plugins/script_editor_plugin.cpp @@ -7785,14 +7799,14 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "لا يملك هذا الهكيل أيّة عظام، أنشئ بعض عُقد العظام ثنائية البُعد كأبناء." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "إنشاء وضعية الراحة من العظام" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "تحديد وضعية الراحة على العظام" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "إنشاء وضعية الراحة من العظام" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "هيكل ثنائي البُعد" @@ -7857,7 +7871,7 @@ msgstr "متعامد" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "منظوري" #: editor/plugins/spatial_editor_plugin.cpp @@ -7867,6 +7881,11 @@ msgstr "متعامد" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "منظوري" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "متعامد" @@ -8230,6 +8249,27 @@ msgid "Right View" msgstr "الواجهة View اليُمنى" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "الواجهة View الأمامية" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "التبديل بين الرؤية المنظورية / الإسقاطية Orthogonal" @@ -11238,14 +11278,14 @@ msgstr "" "عنه query على الأقل حرف `/` واحد." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "زر " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "الزر الفيزيائي" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "زر " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "زر Joy" @@ -14648,6 +14688,14 @@ msgstr "" "تعذر تحميل البيئة الافتراضية كما هو محدد في إعدادات المشروع (التقديم -> " "البيئة -> البيئة الافتراضية)." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14660,7 +14708,10 @@ msgstr "" "اجعلها RenderTarget وقم بتعيين نسيجها الداخلي لبعض العقد لعرضها." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +#, fuzzy +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "ينبغي أن يكون حجم إطار العرض أكبر من 0 ليتم الإخراج البصري لأي شيء." #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/az.po b/editor/translations/az.po index 1965e41921..df60e7757a 100644 --- a/editor/translations/az.po +++ b/editor/translations/az.po @@ -8,6 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2021-09-16 14:36+0000\n" "Last-Translator: Lucifer25x <umudyt2006@gmail.com>\n" "Language-Team: Azerbaijani <https://hosted.weblate.org/projects/godot-engine/" @@ -2403,6 +2404,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2519,6 +2528,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2838,10 +2851,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4245,15 +4254,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7146,12 +7163,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Skriptə qoşulun:" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Əvvəlki addıma keç" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7496,11 +7515,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7560,7 +7579,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7568,6 +7587,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7905,6 +7928,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10656,11 +10699,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13771,6 +13814,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13780,7 +13831,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/bg.po b/editor/translations/bg.po index 7aab99c847..98f60b8518 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -16,8 +16,9 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-20 14:46+0000\n" +"PO-Revision-Date: 2021-10-11 15:44+0000\n" "Last-Translator: Любомир Василев <lyubomirv@gmx.com>\n" "Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/" "godot/bg/>\n" @@ -2336,6 +2337,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Запазване на всички сцени" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2452,6 +2461,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2793,10 +2806,6 @@ msgid "Save Scene" msgstr "Запазване на сцената" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Запазване на всички сцени" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4202,6 +4211,18 @@ msgid "Clear Default for '%s'" msgstr "Изчистване на подразбирането за „%s“" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Повторно внасяне" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Внасяне като:" @@ -4210,10 +4231,6 @@ msgid "Preset" msgstr "" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Повторно внасяне" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -5481,15 +5498,13 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Заключване на избраното" +msgstr "Заключено" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Групи" +msgstr "Групирано" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -7143,11 +7158,13 @@ msgid "Move Down" msgstr "Преместване надолу" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Следващ скрипт" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Предишен скрипт" #: editor/plugins/script_editor_plugin.cpp @@ -7497,14 +7514,14 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Създаване на поза на покоя от костите" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Създаване на поза на покоя от костите" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "" @@ -7564,8 +7581,9 @@ msgid "Left Orthogonal" msgstr "Ляв бутон" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" -msgstr "" +#, fuzzy +msgid "Left Perspective" +msgstr "Долу вляво" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -7573,6 +7591,10 @@ msgid "Right Orthogonal" msgstr "Десен бутон" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7910,6 +7932,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10678,11 +10720,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13854,6 +13896,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13863,7 +13913,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 6c958956bc..a8581e7f45 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -14,6 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-08-03 06:20+0000\n" "Last-Translator: Oymate <dhruboadittya96@gmail.com>\n" @@ -2513,6 +2514,16 @@ msgstr "" "দৃশ্যটি সংরক্ষণ করা সম্ভব হচ্ছে না। সম্ভবত যেসবের (ইন্সট্যান্স) উপর নির্ভর করছে তাদের " "সন্তুষ্ট করা সম্ভব হচ্ছে না।" +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "রূপান্তরিত গঠনবিন্যাস সংরক্ষণ করা সম্ভব হচ্ছে না:" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Save All Scenes" +msgstr "সকল দৃশ্য সংরক্ষণ করুন" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2646,6 +2657,10 @@ msgid "Save changes to '%s' before closing?" msgstr "'%s' বন্ধ করার পূর্বে পরিবর্তনসমূহ সংরক্ষণ করবেন?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -3009,11 +3024,6 @@ msgid "Save Scene" msgstr "দৃশ্য সংরক্ষণ করুন" #: editor/editor_node.cpp -#, fuzzy -msgid "Save All Scenes" -msgstr "সকল দৃশ্য সংরক্ষণ করুন" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "এতে রূপান্তর করুন..." @@ -4622,6 +4632,19 @@ msgstr "'%s' এর জন্য ডিফল্ট ক্লিয়ার ক #: editor/import_dock.cpp #, fuzzy +msgid "Reimport" +msgstr "পুন-ইম্পোর্ট" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp +#, fuzzy msgid "Import As:" msgstr "ইম্পোর্ট" @@ -4631,11 +4654,6 @@ msgid "Preset" msgstr "প্রিসেট..." #: editor/import_dock.cpp -#, fuzzy -msgid "Reimport" -msgstr "পুন-ইম্পোর্ট" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -7820,11 +7838,13 @@ msgid "Move Down" msgstr "নীচে যান" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "পরবর্তী স্ক্রিপ্ট" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "পূর্ববর্তী স্ক্রিপ্ট" #: editor/plugins/script_editor_plugin.cpp @@ -8207,15 +8227,15 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Create Rest Pose from Bones" msgstr "Mesh হতে Emitter তৈরি করুন" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" -msgstr "" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Skeleton2D" msgstr "স্কেলেটন/কাঠাম..." @@ -8285,7 +8305,7 @@ msgstr "সমকোণীয় (Orthogonal)" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "পরিপ্রেক্ষিত (Perspective)" #: editor/plugins/spatial_editor_plugin.cpp @@ -8295,6 +8315,11 @@ msgstr "সমকোণীয় (Orthogonal)" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "পরিপ্রেক্ষিত (Perspective)" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "সমকোণীয় (Orthogonal)" @@ -8669,6 +8694,27 @@ msgid "Right View" msgstr "ডান দর্শন" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "সন্মুখ দর্শন" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Switch Perspective/Orthogonal View" msgstr "পরিপ্রেক্ষিত/সমকোণীয় (Perspective/Orthogonal) দর্শন পরিবর্তন করুন" @@ -11747,14 +11793,14 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "কী/চাবি " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "কী/চাবি " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "জয়স্টিক বোতাম" @@ -15215,6 +15261,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -15228,7 +15282,9 @@ msgstr "" "দৃশ্যাবলিকে (texture) দৃশ্যমান করতে কোনো নোডে হস্তান্তর করুন।" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp @@ -16860,9 +16916,6 @@ msgstr "" #~ msgid "Couldn't save atlas image:" #~ msgstr "এটলাস/মানচিত্রাবলীর ছবি সংরক্ষণ করা সম্ভব হচ্ছে না:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "রূপান্তরিত গঠনবিন্যাস সংরক্ষণ করা সম্ভব হচ্ছে না:" - #~ msgid "Invalid translation source!" #~ msgstr "অকার্যকর অনুবাদের উৎস!" diff --git a/editor/translations/br.po b/editor/translations/br.po index 4db566b371..3cbe4155a9 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -7,6 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2020-12-29 15:03+0000\n" "Last-Translator: Feufoll <feufoll@gmail.com>\n" "Language-Team: Breton <https://hosted.weblate.org/projects/godot-engine/" @@ -2337,6 +2338,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2453,6 +2462,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2772,10 +2785,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4177,15 +4186,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7069,11 +7086,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7419,11 +7436,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7483,7 +7500,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7491,6 +7508,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7828,6 +7849,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10573,11 +10614,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13686,6 +13727,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13695,7 +13744,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/ca.po b/editor/translations/ca.po index e2580e35d9..22b9e47836 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -9,7 +9,7 @@ # roger <616steam@gmail.com>, 2019, 2020. # Roger BR <drai_kin@hotmail.com>, 2019. # Adolfo Jayme Barrientos <fitojb@ubuntu.com>, 2020. -# Xavier Gomez <hiulit@gmail.com>, 2020. +# Xavier Gomez <hiulit@gmail.com>, 2020, 2021. # Aina <ainasoga@gmail.com>, 2020. # Alex Mancha <codingstain@gmail.com>, 2020, 2021. # Carles Pastor Badosa <cpbadosa@gmail.com>, 2021. @@ -19,9 +19,10 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-06-29 12:48+0000\n" -"Last-Translator: DFC <damiafluixacanals28@gmail.com>\n" +"PO-Revision-Date: 2021-10-21 10:31+0000\n" +"Last-Translator: Xavier Gomez <hiulit@gmail.com>\n" "Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/" "godot/ca/>\n" "Language: ca\n" @@ -29,7 +30,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7.1-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -52,7 +53,7 @@ msgstr "L'entrada %i en l'expressió no és vàlida (no transmesa)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "No es pot emprar \"self\" car l'instància és nul·la (no transmesa)" +msgstr "self no es pot utilitzar perquè la instància és nul·la (no aprovada)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -588,7 +589,7 @@ msgstr "Escala amb el Cursor" #: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "Duplicar la Selecció" +msgstr "Duplica la Selecció" #: editor/animation_track_editor.cpp msgid "Duplicate Transposed" @@ -596,7 +597,7 @@ msgstr "Duplica'l Transposat" #: editor/animation_track_editor.cpp msgid "Delete Selection" -msgstr "Suprimir la Selecció" +msgstr "Suprimeix la Selecció" #: editor/animation_track_editor.cpp msgid "Go to Next Step" @@ -746,7 +747,6 @@ msgid "Whole Words" msgstr "Paraules senceres" #: editor/code_editor.cpp -#, fuzzy msgid "Replace" msgstr "Reemplaçar" @@ -979,7 +979,7 @@ msgstr "No hi ha cap resultat per a «%s»." #: editor/create_dialog.cpp editor/property_selector.cpp msgid "No description available for %s." -msgstr "" +msgstr "Cap descripció disponible per a %s." #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp @@ -1079,15 +1079,16 @@ msgid "Owners Of:" msgstr "Propietaris de:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." -msgstr "Eliminar els fitxers seleccionats del projecte? (No es pot restaurar)" +msgstr "" +"Voleu eliminar els fitxers seleccionats del projecte? (No es pot desfer.)\n" +"Depenent de la configuració del vostre sistema de fitxers, els fitxers es " +"mouran a la paperera del sistema o se suprimiran permanentment." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1095,8 +1096,11 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"Els fitxers seleccionats són utilitzats per altres recursos.\n" -"Voleu Eliminar-los de totes maneres? (No es pot desfer!)" +"Els fitxers que s’eliminen són requerits per altres recursos perquè " +"funcionin.\n" +"Voleu eliminar-los de totes maneres? (No es pot desfer.)\n" +"Depenent de la configuració del vostre sistema de fitxers, els fitxers es " +"mouran a la paperera del sistema o se suprimiran permanentment." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1750,7 +1754,6 @@ msgid "Node Dock" msgstr "Nodes" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem Dock" msgstr "Sistema de Fitxers" @@ -1892,7 +1895,7 @@ msgstr "Fés l'actual" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp msgid "Import" -msgstr "Importa" +msgstr "Importar" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" @@ -2154,7 +2157,6 @@ msgid "Constants" msgstr "Constants" #: editor/editor_help.cpp -#, fuzzy msgid "Property Descriptions" msgstr "Descripcions de la Propietat" @@ -2171,9 +2173,8 @@ msgstr "" "$color][url=$url] totaportant-ne una[/url][/color]!" #: editor/editor_help.cpp -#, fuzzy msgid "Method Descriptions" -msgstr "Descripcions del Mètode" +msgstr "Descripcions dels Mètodes" #: editor/editor_help.cpp msgid "" @@ -2435,6 +2436,15 @@ msgstr "" "No s'ha pogut desar l'escena. Probablement, no s'han pogut establir totes " "les dependències (instàncies o herències)." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "No s'ha pogut començar el subprocés!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Desar Totes les Escenes" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "No es pot sobreescriure la escena si encara està oberta!" @@ -2570,6 +2580,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Desar els canvis a '%s' abans de tancar?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2646,7 +2660,6 @@ msgid "Reload Saved Scene" msgstr "Desa Escena" #: editor/editor_node.cpp -#, fuzzy msgid "" "The current scene has unsaved changes.\n" "Reload the saved scene anyway? This action cannot be undone." @@ -2727,14 +2740,14 @@ msgid "Unable to load addon script from path: '%s'." msgstr "Error carregant l'Script complement des del camí: '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "" "Unable to load addon script from path: '%s'. This might be due to a code " "error in that script.\n" "Disabling the addon at '%s' to prevent further errors." msgstr "" -"No es pot carregar l'script d'addon des del camí: '%s' Sembla que hi ha un " -"error en el codi, si us plau comproveu la sintaxi." +"No es pot carregar l'script de complement (addon) del camí: '%s'. Això pot " +"ser degut a un error de codi en aquest script.\n" +"Es desactivarà el complement (addon) a '% s' per a evitar més errors." #: editor/editor_node.cpp msgid "" @@ -2927,10 +2940,6 @@ msgid "Save Scene" msgstr "Desa Escena" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Desar Totes les Escenes" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Converteix a..." @@ -3182,9 +3191,8 @@ msgid "Suggest a Feature" msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Send Docs Feedback" -msgstr "Enviar suggeriments sobre la documentació" +msgstr "Enviar suggeriments sobre la Documentació" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3208,9 +3216,8 @@ msgid "Play" msgstr "Reprodueix" #: editor/editor_node.cpp -#, fuzzy msgid "Pause the scene execution for debugging." -msgstr "Pausa l’execució d’escena per a la depuració." +msgstr "Posa en pausa l'execució de l'escena per a depurar-la." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3254,9 +3261,8 @@ msgid "Update When Changed" msgstr "Actualitzar quan es canvia" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "Desactiva l'Indicador d'Actualització" +msgstr "Amaga l'Indicador d'Actualització" #: editor/editor_node.cpp msgid "FileSystem" @@ -3268,7 +3274,7 @@ msgstr "Inspector" #: editor/editor_node.cpp msgid "Expand Bottom Panel" -msgstr "Expandeix el Quadre inferior" +msgstr "Desplega el Tauler Inferior" #: editor/editor_node.cpp msgid "Output" @@ -3289,14 +3295,12 @@ msgid "Manage Templates" msgstr "Administrar Plantilles" #: editor/editor_node.cpp -#, fuzzy msgid "Install from file" -msgstr "Instal·lar des d'un Fitxer" +msgstr "Instal·la des d'un fitxer" #: editor/editor_node.cpp -#, fuzzy msgid "Select android sources file" -msgstr "Selecciona una Malla d'Origen:" +msgstr "Selecciona el fitxer de fonts d'Android" #: editor/editor_node.cpp msgid "" @@ -3316,7 +3320,6 @@ msgstr "" "d'exportació per a Android per personalitzar la compilació." #: editor/editor_node.cpp -#, fuzzy msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" @@ -3325,17 +3328,16 @@ msgid "" msgstr "" "La plantilla de compilació d'Android ja està instal·lada i no se " "sobreescriurà.\n" -"Elimineu el directori 'build' manualment abans de tornar a intentar aquesta " -"operació." +"Elimineu el directori \"res://android/build\" manualment abans de tornar a " +"intentar aquesta operació." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "Importa Plantilles des d'un Fitxer ZIP" #: editor/editor_node.cpp -#, fuzzy msgid "Template Package" -msgstr "Gestor de Plantilles d'Exportació" +msgstr "Paquet de Plantilles" #: editor/editor_node.cpp modules/gltf/editor_scene_exporter_gltf_plugin.cpp msgid "Export Library" @@ -3346,9 +3348,8 @@ msgid "Merge With Existing" msgstr "Combina amb Existents" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Modifica la Transformació de l'Animació" +msgstr "Apliqueu Transformacions de MeshInstance" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3385,9 +3386,8 @@ msgid "Select" msgstr "Selecciona" #: editor/editor_node.cpp -#, fuzzy msgid "Select Current" -msgstr "Selecciona el Directori Actual" +msgstr "Selecciona Actual" #: editor/editor_node.cpp msgid "Open 2D Editor" @@ -3414,9 +3414,8 @@ msgid "Open the previous Editor" msgstr "Obre l'Editor precedent" #: editor/editor_node.h -#, fuzzy msgid "Warning!" -msgstr "Avís" +msgstr "Atenció!" #: editor/editor_path.cpp #, fuzzy @@ -3778,12 +3777,11 @@ msgid "Cannot remove temporary file:" msgstr "No es pot desar el Tema:" #: editor/export_template_manager.cpp -#, fuzzy msgid "" "Templates installation failed.\n" "The problematic templates archives can be found at '%s'." msgstr "" -"No s'han pogut instal·lar les plantilles. \n" +"No s'han pogut instal·lar les plantilles.\n" "Les plantilles problemàtics es troben a '%s'." #: editor/export_template_manager.cpp @@ -4472,6 +4470,18 @@ msgid "Clear Default for '%s'" msgstr "Neteja el valor Predeterminat de '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "ReImportar" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importar com a:" @@ -4481,10 +4491,6 @@ msgid "Preset" msgstr "Configuracions prestablertes" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "ReImportar" - -#: editor/import_dock.cpp #, fuzzy msgid "Save Scenes, Re-Import, and Restart" msgstr "Guardar escenes, reimportar i reiniciar" @@ -4894,11 +4900,10 @@ msgstr "" "els noms de les pistes." #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Player path set is invalid, so unable to retrieve track names." msgstr "" -"El camí del reproductor assignat no és vàlid, de manera que no pot recuperar " -"els noms de les pistes." +"El camí del reproductor assignat no és vàlid, de manera que no s'ha pogut " +"recuperar els noms de les pistes." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp @@ -5124,7 +5129,6 @@ msgid "Include Gizmos (3D)" msgstr "Inclou Gizmos (3D)" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Pin AnimationPlayer" msgstr "Fixar AnimationPlayer" @@ -5456,14 +5460,12 @@ msgid "Redirect loop." msgstr "Bucle de redirecció." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Request failed, timeout" msgstr "La sol·licitud ha fallat, s'ha esgotat el temps d'espera" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Timeout." -msgstr "Temps esgotat." +msgstr "Temps d'espera esgotat." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" @@ -5527,7 +5529,6 @@ msgid "Download for this asset is already in progress!" msgstr "Ja s'està baixant aquest actiu!" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Recently Updated" msgstr "Actualitzat Recentment" @@ -5536,12 +5537,10 @@ msgid "Least Recently Updated" msgstr "Actualitzacions menys recents" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Name (A-Z)" msgstr "Nom (A-Z)" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Name (Z-A)" msgstr "Nom (Z-A)" @@ -5695,9 +5694,8 @@ msgid "Grid Step:" msgstr "Pas de la Graella:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Primary Line Every:" -msgstr "Línia principal cada:" +msgstr "Línia Principal Cada:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6018,11 +6016,10 @@ msgstr "Eliminar el node o transició seleccionats." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Alt+RMB: Show list of all nodes at position clicked, including locked." msgstr "" -"Mostra la llista de tots els objectes en la posició clicada\n" -"(Tal com Alt+Clic Dreta en el mode de Selecció)." +"Alt + RMB: Mostra la llista de tots els nodes a la posició en què es fa " +"clic, inclòs el bloquejat." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "RMB: Add node at position clicked." @@ -6089,7 +6086,6 @@ msgid "Snapping Options" msgstr "Opcions d'Ajustament" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Rotation Snap" msgstr "Utilitzar Ajustament de Rotació" @@ -6120,7 +6116,6 @@ msgid "Snap to Parent" msgstr "Ajustar al Pare" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Anchor" msgstr "Ajustar a l'Àncora del Node" @@ -6133,9 +6128,8 @@ msgid "Snap to Node Center" msgstr "Ajustar al centre del node" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Other Nodes" -msgstr "Ajustar als altres nodes" +msgstr "Ajustar a altres Nodes" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Guides" @@ -6170,9 +6164,8 @@ msgid "Show Bones" msgstr "Mostra els Ossos" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Make Custom Bone(s) from Node(s)" -msgstr "Fer os(sos) personalitzat(s) a partir de Node(s)" +msgstr "Crear os(sos) personalitzat(s) a partir de Node(s)" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6222,9 +6215,8 @@ msgid "Frame Selection" msgstr "Enquadra la Selecció" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Preview Canvas Scale" -msgstr "Vista prèvia de l'escala del llenç" +msgstr "Vista prèvia de l'Escala del Llenç" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." @@ -6436,20 +6428,18 @@ msgstr "Píxels sòlids" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Border Pixels" -msgstr "Píxels de la vora" +msgstr "Píxels de la Vora" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Directed Border Pixels" -msgstr "Directoris i Fitxers:" +msgstr "Píxels de la Vora Dirigits" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Capture from Pixel" -msgstr "Captura des d'un Píxel" +msgstr "Captura des de Píxel" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -6457,9 +6447,8 @@ msgid "Emission Colors" msgstr "Colors d'Emissió" #: editor/plugins/cpu_particles_editor_plugin.cpp -#, fuzzy msgid "CPUParticles" -msgstr "ParticulesCPU" +msgstr "PartículesCPU" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -6472,14 +6461,12 @@ msgid "Create Emission Points From Node" msgstr "Crea Punts d'Emissió des d'un Node" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 0" -msgstr "Flat0" +msgstr "Flat 0" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 1" -msgstr "Flat1" +msgstr "Flat 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -6572,9 +6559,8 @@ msgid "Mesh is empty!" msgstr "La malla és buida!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Couldn't create a Trimesh collision shape." -msgstr "Crea una Col·lisió entre malles de triangles germanes." +msgstr "No s'ha pogut crear una forma de col·lisió Trimesh." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Trimesh Body" @@ -6766,18 +6752,16 @@ msgid "Remove item %d?" msgstr "Elimina l'element %d?" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "" "Update from existing scene?:\n" "%s" msgstr "" -"Actualitzar des d'una 'Escena existent?:\n" +"Actualitzar des de l'Escena existent?:\n" "%s" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Mesh Library" -msgstr "Biblioteca de Models (MeshLibrary)" +msgstr "Biblioteca de Malles" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Add Item" @@ -6900,7 +6884,6 @@ msgstr "Crea un Polígon de Navegació" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles" msgstr "Convertir a ParticulesCPU" @@ -6936,9 +6919,8 @@ msgid "The geometry doesn't contain any faces." msgstr "El Node no conté cap geometria (cares)." #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "\"%s\" doesn't inherit from Spatial." -msgstr "\"% s\" no hereta de Spatial." +msgstr "\"%s\" no hereta de Spatial." #: editor/plugins/particles_editor_plugin.cpp #, fuzzy @@ -7247,14 +7229,12 @@ msgid "Scale Polygon" msgstr "Escala el Polígon" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Create a custom polygon. Enables custom polygon rendering." msgstr "" -"Crear polígon personalitzat. Habilita el renderitzat de polígons " +"Crear un polígon personalitzat. S'habilita el renderitzat de polígons " "personalitzats." #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "" "Remove a custom polygon. If none remain, custom polygon rendering is " "disabled." @@ -7267,9 +7247,8 @@ msgid "Paint weights with specified intensity." msgstr "Pinta pesos amb la intensitat especificada." #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Unpaint weights with specified intensity." -msgstr "Despinta el pes amb la intensitat especificada." +msgstr "Despinta pesos amb la intensitat especificada." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Radius:" @@ -7418,7 +7397,6 @@ msgid "AnimationTree has no path set to an AnimationPlayer" msgstr "L'AnimationTree no té ruta assignada cap a un AnimationPlayer" #: editor/plugins/root_motion_editor_plugin.cpp -#, fuzzy msgid "Path to AnimationPlayer is invalid" msgstr "El camí cap a l'AnimationPlayer no és vàlid" @@ -7552,11 +7530,13 @@ msgid "Move Down" msgstr "Mou avall" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Script Següent" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Script Anterior" #: editor/plugins/script_editor_plugin.cpp @@ -7743,7 +7723,6 @@ msgstr "" "No s'hi poden afegir els nodes ja que l'escena no utilitza l'script '%s' ." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Lookup Symbol" msgstr "Cercar Símbol" @@ -7828,9 +7807,8 @@ msgid "Complete Symbol" msgstr "Completa el Símbol" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Evaluate Selection" -msgstr "Escala la Selecció" +msgstr "Evalua la Selecció" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" @@ -7857,7 +7835,6 @@ msgid "Contextual Help" msgstr "Ajuda Contextual" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Toggle Bookmark" msgstr "Commutar Marcador" @@ -7866,9 +7843,8 @@ msgid "Go to Next Bookmark" msgstr "Anar al marcador següent" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Bookmark" -msgstr "Anar al marcador anterior" +msgstr "Anar al Marcador Anterior" #: editor/plugins/script_text_editor.cpp msgid "Remove All Bookmarks" @@ -7912,19 +7888,17 @@ msgid "Shader" msgstr "Shader" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "This skeleton has no bones, create some children Bone2D nodes." -msgstr "Aquest esquelet no té ossos, crea alguns nodes fill Bone2D." +msgstr "Aquest esquelet no té ossos, crea alguns nodes Bone2D fills." #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy -msgid "Create Rest Pose from Bones" -msgstr "Crea Punts d'Emissió des d'una Malla" +msgid "Set Rest Pose to Bones" +msgstr "Estableix la Postura de Repòs als Ossos" #: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy -msgid "Set Rest Pose to Bones" -msgstr "Estableix la postura de repòs als ossos" +msgid "Create Rest Pose from Bones" +msgstr "Crea Punts d'Emissió des d'una Malla" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" @@ -7953,7 +7927,6 @@ msgid "Create physical skeleton" msgstr "Crea esquelet físic" #: editor/plugins/skeleton_ik_editor_plugin.cpp -#, fuzzy msgid "Play IK" msgstr "Reproduir IK" @@ -7992,7 +7965,7 @@ msgstr "Ortogonal" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "Perspectiva" #: editor/plugins/spatial_editor_plugin.cpp @@ -8002,6 +7975,11 @@ msgstr "Ortogonal" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "Perspectiva" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "Ortogonal" @@ -8102,9 +8080,8 @@ msgid "Yaw:" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size:" -msgstr "Mida: " +msgstr "Mida:" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -8241,7 +8218,6 @@ msgid "Cinematic Preview" msgstr "Previsualització Cinemàtica" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Not available when using the GLES2 renderer." msgstr "No disponible quan s'utilitza el renderitzador GLES2." @@ -8293,13 +8269,13 @@ msgid "" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" -"Nota: el valor FPS mostrat és la taxa de fotogrames de l'editor.\n" -"No es pot utilitzar com una indicació fiable del rendiment en el joc." +"Nota: El valor FPS que es mostra és el percentatge de fotogrames de " +"l'editor.\n" +"No es pot utilitzar com a indicació fiable del rendiment del joc." #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -8325,9 +8301,8 @@ msgid "Snap Nodes to Floor" msgstr "Ajustar Nodes al Terra" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Couldn't find a solid floor to snap the selection to." -msgstr "No ha pogut trobar un terra sòlid per ajustar la selecció." +msgstr "No s'ha pogut trobar un sòl sòlid on ajustar la selecció." #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -8367,6 +8342,27 @@ msgid "Right View" msgstr "Vista Dreta" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Vista Frontal" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Canviar Vista Perspectiva/Ortogonal" @@ -8424,7 +8420,6 @@ msgid "4 Viewports" msgstr "4 Vistes" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Gizmos" msgstr "Gizmos" @@ -8456,17 +8451,14 @@ msgid "Snap Settings" msgstr "Configuració d'Ajustament" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translate Snap:" msgstr "Ajustament de Translació:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rotate Snap (deg.):" msgstr "Ajustament de Rotació (graus):" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scale Snap (%):" msgstr "Ajustament d'Escala (%):" @@ -8557,9 +8549,8 @@ msgid "LightOccluder2D Preview" msgstr "Crea un Polígon Oclusor" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Sprite is empty!" -msgstr "El Sprite està buit!" +msgstr "L'Sprite està buit!" #: editor/plugins/sprite_editor_plugin.cpp msgid "Can't convert a sprite using animation frames to mesh." @@ -8592,9 +8583,8 @@ msgid "Create CollisionPolygon2D Sibling" msgstr "Crea un Polígon de Navegació" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Invalid geometry, can't create light occluder." -msgstr "La geometria no és vàlida, no es pot crear oclusor de llum." +msgstr "La geometria no és vàlida; no es pot crear un oclusor de llum." #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -8626,12 +8616,10 @@ msgid "Settings:" msgstr "Configuració:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "No Frames Selected" -msgstr "No hi ha Fotogrames Seleccionats" +msgstr "No s'ha seleccionat cap fotograma" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Add %d Frame(s)" msgstr "Afegir %d Fotograma(es)" @@ -8698,9 +8686,8 @@ msgid "Add a Texture from File" msgstr "Afegir Textura des de Fitxer" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Add Frames from a Sprite Sheet" -msgstr "Afegir fotogrames des d'una fulla de Sprites" +msgstr "Afegir fotogrames des d'un full d'Sprites" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -8719,7 +8706,6 @@ msgid "Move (After)" msgstr "Mou (Després)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select Frames" msgstr "Seleccionar Fotogrames" @@ -8758,9 +8744,8 @@ msgid "Snap Mode:" msgstr "Mode d'ajustament:" #: editor/plugins/texture_region_editor_plugin.cpp -#, fuzzy msgid "Pixel Snap" -msgstr "Ajustar amb els Píxels" +msgstr "Ajustament de Píxels" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" @@ -8831,18 +8816,16 @@ msgid "{num} font(s)" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No fonts found." -msgstr "No s'ha trobat!" +msgstr "No s'ha trobat cap tipus de lletra." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} icon(s)" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No icons found." -msgstr "No s'ha trobat!" +msgstr "No s'ha trobat cap icona." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} stylebox(es)" @@ -8871,9 +8854,8 @@ msgid "Importing items {n}/{n}" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Updating the editor" -msgstr "Voleu Sortir de l'editor?" +msgstr "S'està actualitzant l'editor" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8881,9 +8863,8 @@ msgid "Finalizing" msgstr "S'està Analitzant" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Filter:" -msgstr "Filtre: " +msgstr "Filtre:" #: editor/plugins/theme_editor_plugin.cpp msgid "With Data" @@ -8895,9 +8876,8 @@ msgid "Select by data type:" msgstr "Selecciona un Node" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible color items." -msgstr "Cal seleccionar un Element!" +msgstr "Seleccioneu tots els elements de color visibles." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible color items and their data." @@ -8908,9 +8888,8 @@ msgid "Deselect all visible color items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible constant items." -msgstr "Cal seleccionar un Element!" +msgstr "Seleccioneu tots els elements constants visibles." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible constant items and their data." @@ -8921,9 +8900,8 @@ msgid "Deselect all visible constant items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible font items." -msgstr "Cal seleccionar un Element!" +msgstr "Seleccioneu tots els elements de tipus de lletra visibles." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible font items and their data." @@ -8934,19 +8912,16 @@ msgid "Deselect all visible font items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items." -msgstr "Cal seleccionar un Element!" +msgstr "Seleccioneu tots els elements d'icona visibles." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items and their data." -msgstr "Cal seleccionar un Element!" +msgstr "Seleccioneu tots els elements d'icona visibles i les seves dades." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Deselect all visible icon items." -msgstr "Cal seleccionar un Element!" +msgstr "Desmarqueu tots els elements d'icona visibles." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible stylebox items." @@ -9289,9 +9264,8 @@ msgid "" msgstr "" #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Toggle Button" -msgstr "Botó de commutació" +msgstr "Botó de Commutació" #: editor/plugins/theme_editor_preview.cpp msgid "Disabled Button" @@ -9370,7 +9344,6 @@ msgid "Editable Item" msgstr "Element Editable" #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Subtree" msgstr "Subarbre" @@ -9400,9 +9373,8 @@ msgid "Erase Selection" msgstr "Elimina la Selecció" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Fix Invalid Tiles" -msgstr "Arreglar Rajoles no Valides" +msgstr "Arreglar Tiles no vàlides" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -9423,7 +9395,7 @@ msgstr "Pinta Rectangle" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Bucket Fill" -msgstr "Cubell de pintura" +msgstr "Cubell de Farcit" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase TileMap" @@ -9431,7 +9403,7 @@ msgstr "Elimina Mapa de Rajoles" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Find Tile" -msgstr "Trobar Rajola" +msgstr "Troba el Tile" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" @@ -9447,9 +9419,8 @@ msgid "Enable Priority" msgstr "Habilitar Prioritat" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Filter tiles" -msgstr "Filtrat de Fitxers" +msgstr "Filtrar tiles" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Give a TileSet resource to this TileMap to use its tiles." @@ -9479,37 +9450,35 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" -msgstr "Escollir Rajola" +msgstr "Escollir Tile" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate Left" -msgstr "Girar a l'Esquerra" +msgstr "Gira cap a l'Esquerra" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate Right" -msgstr "Girar a la Dreta" +msgstr "Gira cap a la Dreta" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Horizontally" -msgstr "Invertir Horitzontalment" +msgstr "Volteja Horitzontalment" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Vertically" -msgstr "Invertir Verticalment" +msgstr "Volteja Verticalment" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Clear Transform" msgstr "Restablir Transformació" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Add Texture(s) to TileSet." -msgstr "Afegeix Nodes des d'Arbre." +msgstr "Afegir Textura(es) al TileSet" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove selected Texture from TileSet." -msgstr "Elimineu la textura seleccionada de TileSet." +msgstr "Eliminar la textura seleccionada del TileSet." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" @@ -9538,18 +9507,16 @@ msgid "Next Coordinate" msgstr "Coordenada Següent" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Select the next shape, subtile, or Tile." -msgstr "Seleccioneu la forma, sub-rajola o rajola següent." +msgstr "Seleccioneu la següent forma, subtile o Tile." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Previous Coordinate" msgstr "Coordenada Anterior" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Select the previous shape, subtile, or Tile." -msgstr "Seleccioneu la forma, sub-rajola o rajola anterior." +msgstr "Seleccioneu la forma, el subtile o el Tile anterior." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -9607,36 +9574,30 @@ msgid "Navigation Mode" msgstr "Mode Navegació" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Bitmask Mode" msgstr "Mode màscara de bits" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Priority Mode" msgstr "Mode Prioritat" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Icon Mode" msgstr "Mode Icona" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Z Index Mode" -msgstr "Mode Index Z" +msgstr "Mode Índex Z" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Copy bitmask." msgstr "Copiar màscara de bits." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Paste bitmask." msgstr "Enganxar màscara de bits." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Erase bitmask." msgstr "Esborrar màscara de bits." @@ -9664,9 +9625,8 @@ msgid "Delete Selected Shape" msgstr "Elimina Seleccionats" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Keep polygon inside region Rect." -msgstr "Mantenir polígon dins de la regió Rect." +msgstr "Mantenir el polígon dins de la regió Rect." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." @@ -9720,9 +9680,8 @@ msgstr "" "Clica en una altra Peça per a editar-lo." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete selected Rect." -msgstr "Suprimir Rectangle seleccionat." +msgstr "Suprimir el Rect seleccionat." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -9916,9 +9875,8 @@ msgid "Detect new changes" msgstr "Detectar nous canvis" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Changes" -msgstr "Modifica" +msgstr "Canvis" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -9961,9 +9919,8 @@ msgstr "" "versió" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No file diff is active" -msgstr "Cap fitxer seleccionat!" +msgstr "No hi ha cap diferència de fitxer activa" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect changes in file diff" @@ -10370,9 +10327,8 @@ msgid "Returns the arc-sine of the parameter." msgstr "Retorna l'arc sinus del paràmetre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "(Només GLES3) Retorna el sinus hiperbòlic invers del paràmetre." +msgstr "Retorna el sinus hiperbòlic invers del paràmetre." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -10887,7 +10843,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" -msgstr "VisualShader" +msgstr "ShaderVisual" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -11349,14 +11305,12 @@ msgid "Are you sure to run %d projects at once?" msgstr "Esteu segur que voleu executar %d projectes de cop?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove %d projects from the list?" -msgstr "Selecciona un dispositiu de la llista" +msgstr "Voleu eliminar %d projectes de la llista?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove this project from the list?" -msgstr "Selecciona un dispositiu de la llista" +msgstr "Voleu eliminar aquest projecte de la llista?" #: editor/project_manager.cpp #, fuzzy @@ -11493,14 +11447,14 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Tecla " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Tecla " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Botó de la Maneta" @@ -11890,9 +11844,8 @@ msgid "Select Method" msgstr "Selecciona un Mètode" #: editor/rename_dialog.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Batch Rename" -msgstr "Reanomena" +msgstr "Reanomena en lot" #: editor/rename_dialog.cpp msgid "Replace:" @@ -12096,9 +12049,8 @@ msgid "Instance Child Scene" msgstr "Instancia una Escena Filla" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "No es pot operar en Nodes d'una escena externa!" +msgstr "No es pot enganxar el node arrel a la mateixa escena." #: editor/scene_tree_dock.cpp #, fuzzy @@ -12334,9 +12286,8 @@ msgid "Reparent to New Node" msgstr "Torna a Parentar el Node" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Make Scene Root" -msgstr "Entesos!" +msgstr "Convertir a Arrel d'Escena" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -12596,9 +12547,8 @@ msgid "Will load an existing script file." msgstr "Es carregarà un fitxer de script existent." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script file already exists." -msgstr "L'Acció '%s' ja existeix!" +msgstr "El fitxer script ja existeix." #: editor/script_create_dialog.cpp msgid "" @@ -13765,9 +13715,8 @@ msgid "Installing to device, please wait..." msgstr "S'estan buscant rèpliques..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not install to device: %s" -msgstr "No s'ha pogut començar el subprocés!" +msgstr "No s'ha pogut instal·lar al dispositiu: %s" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -13889,11 +13838,8 @@ msgid "Signing debug %s..." msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signing release %s..." -msgstr "" -"Analitzant Fitxers,\n" -"Si Us Plau Espereu..." +msgstr "S'està signant la versió %s ..." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -13963,14 +13909,12 @@ msgid "" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project\n" -msgstr "No es pot trobat el el fitxer 'project.godot' en el camí del projecte." +msgstr "No s'han pogut exportar fitxers de projecte a gradle project\n" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not write expansion package file!" -msgstr "No s'ha pogut escriure el fitxer:" +msgstr "No s'ha pogut escriure el fitxer del paquet d'expansió!" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -14009,11 +13953,12 @@ msgid "Creating APK..." msgstr "Creant els contorns..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Could not find template APK to export:\n" "%s" -msgstr "No es pot obrir la plantilla per exportar:" +msgstr "" +"No s'ha trobat la plantilla APK per a exportar:\n" +"%s" #: platform/android/export/export_plugin.cpp msgid "" @@ -14303,9 +14248,9 @@ msgstr "" "(occluder) faci efecte." #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "The occluder polygon for this occluder is empty. Please draw a polygon." -msgstr "El polígon oclusiu és buit. Dibuixeu un polígon!" +msgstr "" +"El polígon oclusor d'aquest oclusor és buit. Si us plau, dibuixeu un polígon." #: scene/2d/navigation_polygon.cpp msgid "" @@ -14508,13 +14453,12 @@ msgstr "" "StaticBody, RigidBody, KinematicBody, etc." #: scene/3d/collision_shape.cpp -#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " "shape resource for it." msgstr "" -"Cal proveir una forma perquè CollisionShape funcioni. Creeu-li un recurs de " -"forma!" +"Cal proporcionar una forma perquè CollisionShape funcioni. Creeu-ne un " +"recurs de forma." #: scene/3d/collision_shape.cpp #, fuzzy @@ -14777,9 +14721,8 @@ msgid "" "VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " "it as a child of a VehicleBody." msgstr "" -"El motor de físiques sobreescriurà els canvis en la mida dels nodes " -"RigidBody(Caràcter o Rígid). \n" -"Modifica la mida de les Formes de Col·lisió Filles." +"VehicleWheel serveix per a proporcionar un sistema de rodes a un " +"VehicleBody. Utilitzeu-lo com a fill d'un VehicleBody." #: scene/3d/world_environment.cpp msgid "" @@ -14910,7 +14853,7 @@ msgstr "Cal utilitzar una extensió vàlida." #: scene/gui/graph_edit.cpp msgid "Enable grid minimap." -msgstr "Activar graella del minimapa" +msgstr "Activa el minimapa de quadrícula." #: scene/gui/nine_patch_rect.cpp msgid "" @@ -14959,6 +14902,14 @@ msgstr "" "No es pot carregar l'Entorn per Defecte especificat en la Configuració del " "Projecte (Renderització->Entorn->Entorn Per Defecte)." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14972,7 +14923,9 @@ msgstr "" "de Renderització i assigneu-ne la textura interna a algun node." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/cs.po b/editor/translations/cs.po index eb257b0af6..34de7ebc7a 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -26,12 +26,14 @@ # Václav Blažej <vaclavblazej@seznam.cz>, 2020, 2021. # ProfJack <profjackcz@gmail.com>, 2021. # swifterik <blaha.j502@gmail.com>, 2021. +# Daniel <dan@ger.cz>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-15 00:46+0000\n" -"Last-Translator: Zbyněk <zbynek.fiala@gmail.com>\n" +"PO-Revision-Date: 2021-10-27 21:45+0000\n" +"Last-Translator: Daniel <dan@ger.cz>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" "Language: cs\n" @@ -388,15 +390,13 @@ msgstr "Animace: vložit" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "node '%s'" -msgstr "Nelze otevřít '%s'." +msgstr "uzel '%s'" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "animation" -msgstr "Animace" +msgstr "animace" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." @@ -404,9 +404,8 @@ msgstr "AnimationPlayer nemůže animovat sám sebe, pouze ostatní přehrávač #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "property '%s'" -msgstr "Vlastnost '%s' neexistuje." +msgstr "vlastnost '%s'" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -553,7 +552,7 @@ msgstr "Seskupit stopy podle uzlu nebo je zobrazit jako jednoduchý seznam." #: editor/animation_track_editor.cpp msgid "Snap:" -msgstr "Přichycení:" +msgstr "Přichytit:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -964,7 +963,6 @@ msgid "Edit..." msgstr "Upravit..." #: editor/connections_dialog.cpp -#, fuzzy msgid "Go to Method" msgstr "Přejít na metodu" @@ -986,7 +984,7 @@ msgstr "Žádné výsledky pro \"%s\"." #: editor/create_dialog.cpp editor/property_selector.cpp msgid "No description available for %s." -msgstr "" +msgstr "Pro %s není dostupný popis." #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp @@ -1086,17 +1084,16 @@ msgid "Owners Of:" msgstr "Vlastníci:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"Odebrat vybrané soubory z projektu? (Nelze vrátit zpět)\n" -"Odebrané soubory budou v systémovém koši a obnovit je." +"Odebrat vybrané soubory z projektu? (Nelze vrátit zpět.)\n" +"V závislosti na konfiguraci souborového systému budou soubory buď přesunuty " +"do systémového koše, nebo trvale odstraněny." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1104,9 +1101,10 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"Soubory ke smazání potřebují jiné zdroje ke své činnosti.\n" -"Přesto je chcete smazat? (nelze vrátit zpět)\n" -"Odebrané soubory budou v systémovém koši a obnovit je." +"Odstraňované soubory potřebují jiné zdroje ke své činnosti.\n" +"Chcete je přesto odstranit? (Nelze vrátit zpět.)\n" +"V závislosti na konfiguraci souborového systému budou soubory buď přesunuty " +"do systémového koše, nebo trvale odstraněny." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1178,7 +1176,7 @@ msgstr "Děkujeme za komunitu Godotu!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Klikněte pro zkopírování." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1276,41 +1274,37 @@ msgid "Licenses" msgstr "Licence" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Error opening asset file for \"%s\" (not in ZIP format)." -msgstr "Chyba při otevírání balíčku (není ve formátu ZIP)." +msgstr "Chyba při otevírání balíčku \"%s\" (není ve formátu ZIP)." #: editor/editor_asset_installer.cpp -#, fuzzy msgid "%s (already exists)" msgstr "%s (již existuje)" #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" -msgstr "" +msgstr "Obsah balíčku \"%s\" - %d souborů koliduje s vaším projektem:" #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - No files conflict with your project:" msgstr "" +"Obsah balíčku \"%s\" - Žádné soubory nejsou v konfliktu s vaším projektem:" #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" msgstr "Dekomprese uživatelského obsahu" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "The following files failed extraction from asset \"%s\":" -msgstr "Selhala extrakce následujících souborů z balíčku:" +msgstr "Následující soubory se nepodařilo extrahovat z balíčku \"%s\":" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "(and %s more files)" -msgstr "A %s dalších souborů." +msgstr "(a %s dalších souborů)" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset \"%s\" installed successfully!" -msgstr "Balíček byl úspěšně nainstalován!" +msgstr "Balíček \"%s\" byl úspěšně nainstalován!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -1322,7 +1316,6 @@ msgid "Install" msgstr "Instalovat" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset Installer" msgstr "Instalátor balíčků" @@ -1555,13 +1548,12 @@ msgid "Can't add autoload:" msgstr "Nelze přidat auto-načítání:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "%s is an invalid path. File does not exist." -msgstr "Soubor neexistuje." +msgstr "%s je neplatná cesta. Soubor neexistuje." #: editor/editor_autoload_settings.cpp msgid "%s is an invalid path. Not in resource path (res://)." -msgstr "" +msgstr "%s je neplatná cesta. Není v cestě ke zdrojům (res://)." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" @@ -1585,9 +1577,8 @@ msgid "Name" msgstr "Název" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Global Variable" -msgstr "Proměnná" +msgstr "Globální proměnná" #: editor/editor_data.cpp msgid "Paste Params" @@ -1761,48 +1752,50 @@ msgstr "Importovat panel" #: editor/editor_feature_profile.cpp msgid "Allows to view and edit 3D scenes." -msgstr "" +msgstr "Umožňuje prohlížet a upravovat 3D scény." #: editor/editor_feature_profile.cpp msgid "Allows to edit scripts using the integrated script editor." -msgstr "" +msgstr "Umožňuje upravovat skripty pomocí integrovaného editoru skriptů." #: editor/editor_feature_profile.cpp msgid "Provides built-in access to the Asset Library." -msgstr "" +msgstr "Poskytuje integrovaný přístup ke Knihovně balíčků." #: editor/editor_feature_profile.cpp msgid "Allows editing the node hierarchy in the Scene dock." -msgstr "" +msgstr "Umožňuje upravovat hierarchii uzlů v doku scény." #: editor/editor_feature_profile.cpp msgid "" "Allows to work with signals and groups of the node selected in the Scene " "dock." -msgstr "" +msgstr "Umožňuje pracovat se signály a skupinami uzlu vybraného v doku scény." #: editor/editor_feature_profile.cpp msgid "Allows to browse the local file system via a dedicated dock." msgstr "" +"Umožňuje procházet místní souborový systém prostřednictvím vyhrazeného doku." #: editor/editor_feature_profile.cpp msgid "" "Allows to configure import settings for individual assets. Requires the " "FileSystem dock to function." msgstr "" +"Umožňuje konfigurovat nastavení importu pro jednotlivé zdroje. Pro svou " +"funkci vyžaduje dok Souborový systém." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(current)" -msgstr "(Aktuální)" +msgstr "(aktuální)" #: editor/editor_feature_profile.cpp msgid "(none)" -msgstr "" +msgstr "(žádný)" #: editor/editor_feature_profile.cpp msgid "Remove currently selected profile, '%s'? Cannot be undone." -msgstr "" +msgstr "Odstranit aktuálně vybraný profil, '%s'? Nelze vrátit zpět." #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -1833,19 +1826,16 @@ msgid "Enable Contextual Editor" msgstr "Aktivovat kontextový editor" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Properties:" -msgstr "Vlastnosti:" +msgstr "Vlastnosti třídy:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Main Features:" -msgstr "Vlastnosti" +msgstr "Hlavní funkce:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Nodes and Classes:" -msgstr "Povolené třídy:" +msgstr "Uzly a třídy:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." @@ -1862,7 +1852,6 @@ msgid "Error saving profile to path: '%s'." msgstr "Chyba při ukládání profilu do cesty: '%s '." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Reset to Default" msgstr "Obnovit výchozí" @@ -1871,14 +1860,12 @@ msgid "Current Profile:" msgstr "Aktuální profil:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Create Profile" -msgstr "Smazat profil" +msgstr "Vytvořit profil" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Remove Profile" -msgstr "Odstranit dlaždici" +msgstr "Odstranit profil" #: editor/editor_feature_profile.cpp msgid "Available Profiles:" @@ -1898,18 +1885,16 @@ msgid "Export" msgstr "Export" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Configure Selected Profile:" -msgstr "Aktuální profil:" +msgstr "Konfigurace vybraného profilu:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Extra Options:" -msgstr "Možnosti třídy:" +msgstr "Další možnosti:" #: editor/editor_feature_profile.cpp msgid "Create or import a profile to edit available classes and properties." -msgstr "" +msgstr "Vytvořte nebo importujte profil a upravte dostupné třídy a vlastnosti." #: editor/editor_feature_profile.cpp msgid "New profile name:" @@ -1936,9 +1921,8 @@ msgid "Select Current Folder" msgstr "Vybrat stávající složku" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "File exists, overwrite?" -msgstr "Soubor už existuje. Přepsat?" +msgstr "Soubor existuje, přepsat?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select This Folder" @@ -2336,6 +2320,9 @@ msgid "" "Update Continuously is enabled, which can increase power usage. Click to " "disable it." msgstr "" +"Aktivuje se při překreslování okna editoru.\n" +"Je zapnuta funkce Průběžná aktualizace, která může zvýšit spotřebu energie. " +"Klepnutím ji zakážete." #: editor/editor_node.cpp msgid "Spins when the editor window redraws." @@ -2431,6 +2418,14 @@ msgstr "" "Nepodařilo se uložit scénu. Nejspíše se nepodařilo uspokojit závislosti " "(instance nebo dědičnosti)." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Nelze uložit jednu nebo více scén!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Uložit všechny scény" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Nelze přepsat scénu, která je stále otevřená!" @@ -2566,17 +2561,24 @@ msgid "Save changes to '%s' before closing?" msgstr "Uložit změny '%s' před zavřením?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s již neexistuje! Zadejte prosím nové umístění pro uložení." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." msgstr "" +"Aktuální scéna nemá kořenový uzel, ale přesto bylo uloženo %d upravených " +"externích zdrojů." #: editor/editor_node.cpp -#, fuzzy msgid "" "A root node is required to save the scene. You can add a root node using the " "Scene tree dock." -msgstr "Pro uložení scény je vyžadován kořenový uzel." +msgstr "" +"Pro uložení scény je nutný kořenový uzel. Kořenový uzel můžete přidat pomocí " +"doku Strom scény." #: editor/editor_node.cpp msgid "Save Scene As..." @@ -2608,29 +2610,27 @@ msgstr "Aktuální scéna neuložena. Přesto otevřít?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Nelze vrátit zpět, když jsou stisknuta tlačítka myši." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Není co vracet." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Zpět" +msgstr "Zpět: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Nelze opakovat, když jsou stisknuta tlačítka myši." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Není co opakovat." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Znovu" +msgstr "Opakovat: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2910,20 +2910,16 @@ msgid "Save Scene" msgstr "Uložit scénu" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Uložit všechny scény" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Konvertovat na..." #: editor/editor_node.cpp msgid "MeshLibrary..." -msgstr "MeshLibrary..." +msgstr "Knihovna modelů..." #: editor/editor_node.cpp msgid "TileSet..." -msgstr "TileSet..." +msgstr "Sada dlaždic..." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -2981,9 +2977,8 @@ msgid "Orphan Resource Explorer..." msgstr "Průzkumník osiřelých zdrojů..." #: editor/editor_node.cpp -#, fuzzy msgid "Reload Current Project" -msgstr "Přejmenovat projekt" +msgstr "Znovu načíst aktuální projekt" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -3141,13 +3136,12 @@ msgid "Help" msgstr "Nápověda" #: editor/editor_node.cpp -#, fuzzy msgid "Online Documentation" -msgstr "Otevřít dokumentaci" +msgstr "Online dokumentace" #: editor/editor_node.cpp msgid "Questions & Answers" -msgstr "" +msgstr "Otázky & odpovědi" #: editor/editor_node.cpp msgid "Report a Bug" @@ -3155,7 +3149,7 @@ msgstr "Nahlásit chybu" #: editor/editor_node.cpp msgid "Suggest a Feature" -msgstr "" +msgstr "Navrhnout funkci" #: editor/editor_node.cpp msgid "Send Docs Feedback" @@ -3166,9 +3160,8 @@ msgid "Community" msgstr "Komunita" #: editor/editor_node.cpp -#, fuzzy msgid "About Godot" -msgstr "O aplikaci" +msgstr "O aplikaci Godot" #: editor/editor_node.cpp msgid "Support Godot Development" @@ -3261,14 +3254,12 @@ msgid "Manage Templates" msgstr "Spravovat šablony" #: editor/editor_node.cpp -#, fuzzy msgid "Install from file" msgstr "Instalovat ze souboru" #: editor/editor_node.cpp -#, fuzzy msgid "Select android sources file" -msgstr "Vyberte zdrojovou síť:" +msgstr "Vyberte soubor se zdroji pro Android" #: editor/editor_node.cpp msgid "" @@ -3316,9 +3307,8 @@ msgid "Merge With Existing" msgstr "Sloučit s existující" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Animace: Změna transformace" +msgstr "Použít transformace MeshInstance" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3355,9 +3345,8 @@ msgid "Select" msgstr "Vybrat" #: editor/editor_node.cpp -#, fuzzy msgid "Select Current" -msgstr "Vybrat stávající složku" +msgstr "Vybrat aktuální" #: editor/editor_node.cpp msgid "Open 2D Editor" @@ -3392,9 +3381,8 @@ msgid "No sub-resources found." msgstr "Nebyly nalezeny žádné dílčí zdroje." #: editor/editor_path.cpp -#, fuzzy msgid "Open a list of sub-resources." -msgstr "Nebyly nalezeny žádné dílčí zdroje." +msgstr "Otevřete seznam dílčích zdrojů." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -3421,14 +3409,12 @@ msgid "Update" msgstr "Aktualizovat" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Version" -msgstr "Verze:" +msgstr "Verze" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Author" -msgstr "Autoři" +msgstr "Autor" #: editor/editor_plugin_settings.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -3441,14 +3427,12 @@ msgid "Measure:" msgstr "Měření:" #: editor/editor_profiler.cpp -#, fuzzy msgid "Frame Time (ms)" -msgstr "Čas snímku (sek.)" +msgstr "Čas snímku (ms)" #: editor/editor_profiler.cpp -#, fuzzy msgid "Average Time (ms)" -msgstr "Průměrný čas (sek.)" +msgstr "Průměrný čas (ms)" #: editor/editor_profiler.cpp msgid "Frame %" @@ -3475,6 +3459,12 @@ msgid "" "functions called by that function.\n" "Use this to find individual functions to optimize." msgstr "" +"Včetně: Zahrnuje čas z jiných funkcí volaných touto funkcí.\n" +"Slouží k odhalení úzkých míst.\n" +"\n" +"Vlastní: Započítává pouze čas strávený v samotné funkci, nikoli v jiných " +"funkcích volaných touto funkcí.\n" +"Použijte k vyhledání jednotlivých funkcí, které je třeba optimalizovat." #: editor/editor_profiler.cpp msgid "Frame #:" @@ -3579,7 +3569,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Rychlé načtení" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -3600,9 +3590,8 @@ msgid "Paste" msgstr "Vložit" #: editor/editor_resource_picker.cpp editor/property_editor.cpp -#, fuzzy msgid "Convert to %s" -msgstr "Konvertovat na %s" +msgstr "Převést na %s" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New %s" @@ -3652,11 +3641,9 @@ msgid "Did you forget the '_run' method?" msgstr "Nezapoměl jste metodu '_run'?" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hold %s to round to integers. Hold Shift for more precise changes." msgstr "" -"Podržte Ctrl pro zaokrouhlení na celá čísla. Podržte Shift pro přesnější " -"úpravy." +"Podržte %s pro zaokrouhlení na celá čísla. Pro přesnější změny podržte Shift." #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -3676,49 +3663,43 @@ msgstr "Import z uzlu:" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." -msgstr "" +msgstr "Otevřít složku obsahující tyto šablony." #: editor/export_template_manager.cpp msgid "Uninstall these templates." -msgstr "" +msgstr "Odinstalovat tyto šablony." #: editor/export_template_manager.cpp -#, fuzzy msgid "There are no mirrors available." -msgstr "Neexistuje '%s' soubor." +msgstr "Nejsou k dispozici žádná zrcadla." #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving the mirror list..." -msgstr "Získávání zrcadel, prosím čekejte..." +msgstr "Získávání seznamu zrcadel..." #: editor/export_template_manager.cpp msgid "Starting the download..." -msgstr "" +msgstr "Zahájení stahování..." #: editor/export_template_manager.cpp msgid "Error requesting URL:" msgstr "Chyba žádosti o URL:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to the mirror..." -msgstr "Připojuji se k zrcadlu..." +msgstr "Připojení k zrcadlu..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't resolve the requested address." -msgstr "Nelze přeložit název hostitele:" +msgstr "Nelze dohledat požadovanou adresu." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't connect to the mirror." -msgstr "Nelze se připojit k hostiteli:" +msgstr "Nelze se připojit k zrcadlu." #: editor/export_template_manager.cpp -#, fuzzy msgid "No response from the mirror." -msgstr "Žádná odpověď od hostitele:" +msgstr "Zrcadlo neodpovídá." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3726,18 +3707,16 @@ msgid "Request failed." msgstr "Požadavek selhal." #: editor/export_template_manager.cpp -#, fuzzy msgid "Request ended up in a redirect loop." -msgstr "Požadavek se nezdařil, příliš mnoho přesměrování" +msgstr "Požadavek skončil ve smyčce přesměrování." #: editor/export_template_manager.cpp -#, fuzzy msgid "Request failed:" -msgstr "Požadavek selhal." +msgstr "Požadavek selhal:" #: editor/export_template_manager.cpp msgid "Download complete; extracting templates..." -msgstr "" +msgstr "Stažení dokončeno; extrahování šablon..." #: editor/export_template_manager.cpp msgid "Cannot remove temporary file:" @@ -3756,13 +3735,13 @@ msgid "Error getting the list of mirrors." msgstr "Chyba při získávání seznamu zrcadel." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error parsing JSON with the list of mirrors. Please report this issue!" -msgstr "Chyba parsování JSON mirror list. Prosím nahlaste tuto chybu!" +msgstr "" +"Chyba při parsování JSON se seznamem zrcadel. Nahlaste prosím tento problém!" #: editor/export_template_manager.cpp msgid "Best available mirror" -msgstr "" +msgstr "Nejlepší dostupné zrcadlo" #: editor/export_template_manager.cpp msgid "" @@ -3815,24 +3794,20 @@ msgid "SSL Handshake Error" msgstr "Selhání SSL handshaku" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't open the export templates file." -msgstr "Nelze otevřít zip soubor exportních šablon." +msgstr "Nelze otevřít soubor exportních šablon." #: editor/export_template_manager.cpp -#, fuzzy msgid "Invalid version.txt format inside the export templates file: %s." -msgstr "Neplatný formát version.txt uvnitř šablon: %s." +msgstr "Nesprávný formát version.txt uvnitř souboru exportních šablon: %s." #: editor/export_template_manager.cpp -#, fuzzy msgid "No version.txt found inside the export templates file." -msgstr "Nenalezena version.txt uvnitř šablon." +msgstr "V souboru exportních šablon nebyl nalezen soubor version.txt." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for extracting templates:" -msgstr "Chyba při vytváření cesty pro šablony:" +msgstr "Chyba při vytváření cesty pro extrakci šablon:" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" @@ -3843,9 +3818,8 @@ msgid "Importing:" msgstr "Importování:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove templates for the version '%s'?" -msgstr "Odstranit šablonu verze '%s'?" +msgstr "Odstranit šablony pro verzi '%s'?" #: editor/export_template_manager.cpp msgid "Uncompressing Android Build Sources" @@ -3862,67 +3836,62 @@ msgstr "Aktuální verze:" #: editor/export_template_manager.cpp msgid "Export templates are missing. Download them or install from a file." msgstr "" +"Chybí šablony pro export. Stáhněte si je nebo je nainstalujte ze souboru." #: editor/export_template_manager.cpp msgid "Export templates are installed and ready to be used." -msgstr "" +msgstr "Exportní šablony jsou nainstalovány a připraveny k použití." #: editor/export_template_manager.cpp -#, fuzzy msgid "Open Folder" -msgstr "Otevřít soubor" +msgstr "Otevřít složku" #: editor/export_template_manager.cpp msgid "Open the folder containing installed templates for the current version." -msgstr "" +msgstr "Otevře složku obsahující nainstalované šablony pro aktuální verzi." #: editor/export_template_manager.cpp msgid "Uninstall" msgstr "Odinstalovat" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall templates for the current version." -msgstr "Počáteční hodnota pro počítadlo" +msgstr "Odinstalování šablon pro aktuální verzi." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download from:" -msgstr "Chyba při stahování" +msgstr "Stáhnout z:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Open in Web Browser" -msgstr "Spustit v prohlížeči" +msgstr "Otevřít v prohlížeči" #: editor/export_template_manager.cpp -#, fuzzy msgid "Copy Mirror URL" -msgstr "Kopírovat chybu" +msgstr "Kopírovat URL zrcadla" #: editor/export_template_manager.cpp msgid "Download and Install" -msgstr "" +msgstr "Stáhnout a instalovat" #: editor/export_template_manager.cpp msgid "" "Download and install templates for the current version from the best " "possible mirror." msgstr "" +"Stáhnutí a instalace šablon pro aktuální verzi z nejlepšího možného zrcadla." #: editor/export_template_manager.cpp msgid "Official export templates aren't available for development builds." msgstr "Oficiální šablony exportu nejsou k dispozici pro vývojová sestavení." #: editor/export_template_manager.cpp -#, fuzzy msgid "Install from File" msgstr "Instalovat ze souboru" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install templates from a local file." -msgstr "Importovat šablony ze ZIP souboru" +msgstr "Instalace šablon z místního souboru." #: editor/export_template_manager.cpp editor/find_in_files.cpp #: editor/progress_dialog.cpp scene/gui/dialogs.cpp @@ -3930,19 +3899,16 @@ msgid "Cancel" msgstr "Zrušit" #: editor/export_template_manager.cpp -#, fuzzy msgid "Cancel the download of the templates." -msgstr "Nelze otevřít zip soubor exportních šablon." +msgstr "Zrušit stahování šablon." #: editor/export_template_manager.cpp -#, fuzzy msgid "Other Installed Versions:" -msgstr "Instalované verze:" +msgstr "Další nainstalované verze:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall Template" -msgstr "Odinstalovat" +msgstr "Odinstalovat šablonu" #: editor/export_template_manager.cpp msgid "Select Template File" @@ -3957,6 +3923,8 @@ msgid "" "The templates will continue to download.\n" "You may experience a short editor freeze when they finish." msgstr "" +"Šablony se budou stahovat i nadále.\n" +"Po dokončení může dojít ke krátkému zamrznutí editoru." #: editor/filesystem_dock.cpp msgid "Favorites" @@ -4103,35 +4071,32 @@ msgid "Collapse All" msgstr "Sbalit vše" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort files" -msgstr "Hledat soubory" +msgstr "Seřadit soubory" #: editor/filesystem_dock.cpp msgid "Sort by Name (Ascending)" -msgstr "" +msgstr "Seřadit podle názvu (vzestupně)" #: editor/filesystem_dock.cpp msgid "Sort by Name (Descending)" -msgstr "" +msgstr "Seřadit podle názvu (sestupně)" #: editor/filesystem_dock.cpp msgid "Sort by Type (Ascending)" -msgstr "" +msgstr "Seřadit podle typu (vzestupně)" #: editor/filesystem_dock.cpp msgid "Sort by Type (Descending)" -msgstr "" +msgstr "Seřadit podle typu (sestupně)" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort by Last Modified" -msgstr "Datum modifikace" +msgstr "Seřadit podle poslední změny" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort by First Modified" -msgstr "Datum modifikace" +msgstr "Seřadit podle první změny" #: editor/filesystem_dock.cpp msgid "Duplicate..." @@ -4143,7 +4108,7 @@ msgstr "Přejmenovat..." #: editor/filesystem_dock.cpp msgid "Focus the search box" -msgstr "" +msgstr "Přejít do vyhledávacího pole" #: editor/filesystem_dock.cpp msgid "Previous Folder/File" @@ -4420,6 +4385,22 @@ msgid "Clear Default for '%s'" msgstr "Vyčistit výchozí pro '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Znovu importovat" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Máte čekající změny, které ještě nebyly použity. Klepnutím na tlačítko Znovu " +"importovat uplatníte změny provedené v možnostech importu.\n" +"Výběrem jiného zdroje v doku Souborový systém bez předchozího kliknutí na " +"tlačítko Znovu importovat se změny provedené v doku Import zruší." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importovat jako:" @@ -4428,10 +4409,6 @@ msgid "Preset" msgstr "Profil" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Znovu importovat" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Uložit scény, znovu importovat a restartovat" @@ -4451,14 +4428,12 @@ msgid "Failed to load resource." msgstr "Selhalo nahrání zdroje." #: editor/inspector_dock.cpp -#, fuzzy msgid "Copy Properties" -msgstr "Vlastnosti" +msgstr "Kopírovat vlastnosti" #: editor/inspector_dock.cpp -#, fuzzy msgid "Paste Properties" -msgstr "Vlastnosti" +msgstr "Vložit vlastnosti" #: editor/inspector_dock.cpp msgid "Make Sub-Resources Unique" @@ -4483,23 +4458,20 @@ msgid "Save As..." msgstr "Uložit jako..." #: editor/inspector_dock.cpp -#, fuzzy msgid "Extra resource options." -msgstr "Není v cestě ke zdroji." +msgstr "Další možnosti zdrojů." #: editor/inspector_dock.cpp -#, fuzzy msgid "Edit Resource from Clipboard" -msgstr "Editovat schránku zdrojů" +msgstr "Upravit zdroj ze schránky" #: editor/inspector_dock.cpp msgid "Copy Resource" msgstr "Kopírovat zdroj" #: editor/inspector_dock.cpp -#, fuzzy msgid "Make Resource Built-In" -msgstr "Vytvořit vestavěný" +msgstr "Vytvořit vestavěný zdroj" #: editor/inspector_dock.cpp msgid "Go to the previous edited object in history." @@ -4514,9 +4486,8 @@ msgid "History of recently edited objects." msgstr "Historie naposledy upravených objektů." #: editor/inspector_dock.cpp -#, fuzzy msgid "Open documentation for this object." -msgstr "Otevřít dokumentaci" +msgstr "Otevřít dokumentaci k tomuto objektu." #: editor/inspector_dock.cpp editor/scene_tree_dock.cpp msgid "Open Documentation" @@ -4527,9 +4498,8 @@ msgid "Filter properties" msgstr "Filtrovat vlastnosti" #: editor/inspector_dock.cpp -#, fuzzy msgid "Manage object properties." -msgstr "Vlastnosti objektu." +msgstr "Spravovat vlastnosti objektu." #: editor/inspector_dock.cpp msgid "Changes may be lost!" @@ -4773,9 +4743,8 @@ msgid "Blend:" msgstr "Prolínání:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Parameter Changed:" -msgstr "Parametr změněn" +msgstr "Změněný parametr:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -5501,11 +5470,11 @@ msgstr "všichni" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search templates, projects, and demos" -msgstr "" +msgstr "Vyhledávání šablon, projektů a ukázek" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search assets (excluding templates, projects, and demos)" -msgstr "" +msgstr "Vyhledávání zdrojů (kromě šablon, projektů a ukázek)" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5549,7 +5518,7 @@ msgstr "ZIP soubor asetů" #: editor/plugins/audio_stream_editor_plugin.cpp msgid "Audio Preview Play/Pause" -msgstr "" +msgstr "Náhled zvuku Přehrát/Pozastavit" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -5560,13 +5529,12 @@ msgstr "" "Uložte scénu a zkuste to znovu." #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "" "No meshes to bake. Make sure they contain an UV2 channel and that the 'Use " "In Baked Light' and 'Generate Lightmap' flags are on." msgstr "" -"Žádné sítě k zapečení. Ujistěte se, že obsahují kanál UV2 a že je nastaven " -"příznak \"Zapéct světlo\"." +"Žádné sítě k zapečení. Ujistěte se, že obsahují kanál UV2 a že jsou zapnuté " +"přepínače \"Použít v zapečeném světle\" a \"Generovat světelnou mapu\"." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed creating lightmap images, make sure path is writable." @@ -5709,15 +5677,13 @@ msgstr "Přemístit CanvasItem \"%s\" na (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Uzamčít vybraný" +msgstr "Zamčeno" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Skupiny" +msgstr "Seskupené" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5821,13 +5787,12 @@ msgstr "Upravit kotvy" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Project Camera Override\n" "Overrides the running project's camera with the editor viewport camera." msgstr "" -"Přepsat herní kameru\n" -"Herní kamera se nahradí kamerou z pohledu editoru." +"Přepsání projektové kamery\n" +"Přepíše kameru spuštěného projektu kamerou v pohledu editoru." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5836,6 +5801,9 @@ msgid "" "No project instance running. Run the project from the editor to use this " "feature." msgstr "" +"Přepsání projektové kamery\n" +"Není spuštěna žádná instance projektu. Chcete-li tuto funkci použít, spusťte " +"projekt z editoru." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5903,31 +5871,26 @@ msgstr "Režim výběru" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Drag: Rotate selected node around pivot." -msgstr "Odstranit vybraný uzel nebo přechod." +msgstr "Přetažení: Otáčení vybraného uzlu kolem pivotu." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Move selected node." -msgstr "Alt+Táhnutí: Přemístit" +msgstr "Alt+přetažení: Přesun vybraného uzlu." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "V: Set selected node's pivot position." -msgstr "Odstranit vybraný uzel nebo přechod." +msgstr "V: Nastavení polohy pivotu vybraného uzlu." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Alt+RMB: Show list of all nodes at position clicked, including locked." msgstr "" -"Zobrazit seznam objektů v bodě kliknutí\n" -"(stejné jako Alt+PTM v režimu výběru)." +"Alt+PTM: Zobrazí seznam všech uzlů na kliknuté pozici, včetně uzamčených." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "RMB: Add node at position clicked." -msgstr "" +msgstr "PTM: Přidání uzlu na pozici, na kterou bylo kliknuto." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6165,14 +6128,12 @@ msgid "Clear Pose" msgstr "Vymazat pózu" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Add Node Here" -msgstr "Přidat uzel" +msgstr "Přidání uzlu sem" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Instance Scene Here" -msgstr "Scéna/Scény instance" +msgstr "Instance scény sem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" @@ -6188,49 +6149,43 @@ msgstr "Přesunout pohled" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 3.125%" -msgstr "" +msgstr "Přiblížení na 3,125 %" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 6.25%" -msgstr "" +msgstr "Přiblížení na 6,25 %" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 12.5%" -msgstr "" +msgstr "Přiblížení na 12,5 %" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 25%" -msgstr "Zmenšit" +msgstr "Přiblížení na 25 %" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 50%" -msgstr "Zmenšit" +msgstr "Přiblížení na 50 %" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 100%" -msgstr "Zmenšit" +msgstr "Přiblížení na 100 %" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 200%" -msgstr "Zmenšit" +msgstr "Přiblížení na 200 %" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 400%" -msgstr "Zmenšit" +msgstr "Přiblížení na 400 %" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 800%" -msgstr "Zmenšit" +msgstr "Přiblížení na 800 %" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 1600%" -msgstr "" +msgstr "Přiblížení na 1600 %" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -6475,9 +6430,8 @@ msgid "Couldn't create a single convex collision shape." msgstr "Vytvoření jediného konvexního kolizního tvaru se nezdařilo." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Simplified Convex Shape" -msgstr "Vytvořit jediný konvexní tvar" +msgstr "Vytvoření zjednodušeného konvexního tvaru" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Single Convex Shape" @@ -6512,9 +6466,8 @@ msgid "No mesh to debug." msgstr "Žádná mesh pro debugování." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Mesh has no UV in layer %d." -msgstr "Model nemá UV v této vrstvě" +msgstr "Model nemá ve vrstvě %d žádné UV." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "MeshInstance lacks a Mesh!" @@ -6589,6 +6542,9 @@ msgid "" "This is similar to single collision shape, but can result in a simpler " "geometry in some cases, at the cost of accuracy." msgstr "" +"Vytvoří zjednodušený konvexní kolizní tvar.\n" +"Je podobný jednoduchému koliznímu tvaru, ale v některých případech může vést " +"k jednodušší geometrii na úkor přesnosti." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Multiple Convex Collision Siblings" @@ -6634,7 +6590,7 @@ msgstr "Rozbalit UV2 pro Lightmapu/AO" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh" -msgstr "Vytvořit síť obrysu" +msgstr "Vytvoření obrysového modelu" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Outline Size:" @@ -6658,7 +6614,7 @@ msgstr "" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Mesh Library" -msgstr "Knihovna síťí" +msgstr "Knihovna modelů" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Add Item" @@ -6721,7 +6677,7 @@ msgstr "Povrch je neplatný (žádné stěny)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Source Mesh:" -msgstr "Vyberte zdrojovou síť:" +msgstr "Vyberte zdrojový model:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Target Surface:" @@ -7254,14 +7210,12 @@ msgid "Flip Portals" msgstr "Převrátit horizontálně" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Room Generate Points" -msgstr "Počet vygenerovaných bodů:" +msgstr "Generovat body místnosti" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Generate Points" -msgstr "Počet vygenerovaných bodů:" +msgstr "Generovat body" #: editor/plugins/room_manager_editor_plugin.cpp #, fuzzy @@ -7412,11 +7366,13 @@ msgid "Move Down" msgstr "Přesunout dolů" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Další skript" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Předchozí skript" #: editor/plugins/script_editor_plugin.cpp @@ -7766,14 +7722,14 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Kostra nemá žádné kosti, vytvoř nějaké potomky Bone2D." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Vytvořit klidovou pózu z kostí" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Nastavit kosti podle klidové pózy" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Vytvořit klidovou pózu z kostí" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D (Kostra 2D)" @@ -7838,7 +7794,7 @@ msgstr "Ortogonální" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "Perspektivní" #: editor/plugins/spatial_editor_plugin.cpp @@ -7848,6 +7804,11 @@ msgstr "Ortogonální" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "Perspektivní" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "Ortogonální" @@ -7869,12 +7830,12 @@ msgstr "Perspektivní" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [auto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [aktivní portály]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -7903,20 +7864,17 @@ msgid "None" msgstr "Žádné" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rotate" -msgstr "Režim otáčení" +msgstr "Otočit" #. TRANSLATORS: This refers to the movement that changes the position of an object. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translate" -msgstr "Posunout:" +msgstr "Posunout" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scale" -msgstr "Zvětšení:" +msgstr "Zvětšit" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scaling: " @@ -7939,52 +7897,44 @@ msgid "Animation Key Inserted." msgstr "Animační klíč vložen." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Pitch:" -msgstr "Stoupání" +msgstr "Stoupání:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Yaw:" -msgstr "" +msgstr "Odklon (Yaw):" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size:" -msgstr "Velikost: " +msgstr "Velikost:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Objects Drawn:" -msgstr "Objekty vykreslené" +msgstr "Kreslené objekty:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Material Changes:" -msgstr "Změny materiálu" +msgstr "Změny materiálu:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Shader Changes:" -msgstr "Změny shaderu" +msgstr "Změny shaderu:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Surface Changes:" -msgstr "Změny povrchu" +msgstr "Změny povrchu:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Draw Calls:" -msgstr "Vykreslovací volání" +msgstr "Vykreslovací volání:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Vertices:" -msgstr "Vrcholy" +msgstr "Vrcholy:" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" -msgstr "" +msgstr "FPS: %d (%s ms)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -8131,6 +8081,8 @@ msgstr "Rotace pohledu uzamknuta" msgid "" "To zoom further, change the camera's clipping planes (View -> Settings...)" msgstr "" +"Chcete-li přiblížení zvětšit, změňte roviny oříznutí kamery (Zobrazit -> " +"Nastavení...)" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -8147,7 +8099,7 @@ msgstr "Konvertovat na %s" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" -msgstr "XForm Dialog" +msgstr "XForm dialog" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -8209,6 +8161,27 @@ msgid "Right View" msgstr "Pohled zprava" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Pohled zepředu" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Přepnout perspektivní/ortogonální pohled" @@ -8267,7 +8240,7 @@ msgstr "4 výřezy" #: editor/plugins/spatial_editor_plugin.cpp msgid "Gizmos" -msgstr "Gizmos" +msgstr "Gizma" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" @@ -8563,7 +8536,7 @@ msgstr "Vytvořit rámečky ze Sprite Sheet" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" -msgstr "SpriteFrames" +msgstr "Snímky spritu" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Region Rect" @@ -8649,18 +8622,16 @@ msgid "{num} font(s)" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No fonts found." -msgstr "Nenalezeno!" +msgstr "Nebyla nalezena žádná písma." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} icon(s)" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No icons found." -msgstr "Nenalezeno!" +msgstr "Nebyly nalezeny žádné ikony." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} stylebox(es)" @@ -8689,9 +8660,8 @@ msgid "Importing items {n}/{n}" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Updating the editor" -msgstr "Ukončit editor?" +msgstr "Aktualizace editoru" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8708,14 +8678,12 @@ msgid "With Data" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select by data type:" -msgstr "Vybrat uzel" +msgstr "Výběr podle typu dat:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible color items." -msgstr "Vyberte složku pro skenování" +msgstr "Vybrat všechny viditelné barevné položky." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible color items and their data." @@ -8726,9 +8694,8 @@ msgid "Deselect all visible color items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible constant items." -msgstr "Nejprve vyberte nastavení ze seznamu!" +msgstr "Vybrat všechny viditelné konstantní položky." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible constant items and their data." @@ -8739,9 +8706,8 @@ msgid "Deselect all visible constant items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible font items." -msgstr "Nejprve vyberte nastavení ze seznamu!" +msgstr "Vybrat všechny viditelné položky písma." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible font items and their data." @@ -8752,19 +8718,16 @@ msgid "Deselect all visible font items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items." -msgstr "Nejprve vyberte nastavení ze seznamu!" +msgstr "Vybrat všechny viditelné položky ikon." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items and their data." -msgstr "Nejprve vyberte nastavení ze seznamu!" +msgstr "Vybrat všechny viditelné položky ikon a jejich data." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Deselect all visible icon items." -msgstr "Nejprve vyberte nastavení ze seznamu!" +msgstr "Zrušit výběr všech viditelných položek ikon." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible stylebox items." @@ -8785,19 +8748,16 @@ msgid "" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Collapse types." -msgstr "Sbalit vše" +msgstr "Sbalit typy." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Expand types." -msgstr "Rozbalit vše" +msgstr "Rozbalit typy." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all Theme items." -msgstr "Vybrat soubor šablony" +msgstr "Vybrat všechny položky motivu." #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8951,9 +8911,8 @@ msgid "Add Type:" msgstr "Typ:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Item:" -msgstr "Přidat položku" +msgstr "Přidat položku:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8961,9 +8920,8 @@ msgid "Add StyleBox Item" msgstr "Přidat všechny položky" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Items:" -msgstr "Odstranit položku" +msgstr "Odstranit položky:" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" @@ -9004,9 +8962,8 @@ msgid "Editor Theme" msgstr "Editovat téma" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select Another Theme Resource:" -msgstr "Smazat zdroj" +msgstr "Vybrerte jiný zdroj motivu:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9049,9 +9006,8 @@ msgid "Add Item Type" msgstr "Přidat položku" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Node Types:" -msgstr "Typ uzlu" +msgstr "Typy uzlu:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9072,9 +9028,8 @@ msgid "Override all default type items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme:" -msgstr "Téma" +msgstr "Motiv:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9096,9 +9051,8 @@ msgid "Default Preview" msgstr "Obnovit náhled" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select UI Scene:" -msgstr "Vyberte zdrojovou síť:" +msgstr "Vyberte scénu uživatelského rozhraní:" #: editor/plugins/theme_editor_preview.cpp msgid "" @@ -9375,7 +9329,7 @@ msgstr "Bitmaska" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Priority" -msgstr "Priority" +msgstr "Priorita" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Icon" @@ -9750,7 +9704,7 @@ msgstr "Boolean" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sampler" -msgstr "Sampler" +msgstr "Vzorkovač" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -10596,12 +10550,11 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" -msgstr "VisualShader" +msgstr "Vizuální shader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property:" -msgstr "Upravit vizuální vlastnost" +msgstr "Upravit vizuální vlastnost:" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" @@ -10913,7 +10866,7 @@ msgstr "Instalační cesta k projektu:" #: editor/project_manager.cpp msgid "Renderer:" -msgstr "Renderer:" +msgstr "Vykreslovač:" #: editor/project_manager.cpp msgid "OpenGL ES 3.0" @@ -11046,14 +10999,12 @@ msgid "Are you sure to run %d projects at once?" msgstr "Jste si jisti, že chcete spustit %d projektů najednou?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove %d projects from the list?" -msgstr "Vyberte zařízení ze seznamu" +msgstr "Odstranit %d projektů ze seznamu?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove this project from the list?" -msgstr "Vyberte zařízení ze seznamu" +msgstr "Odstranit tento projekt ze seznamu?" #: editor/project_manager.cpp msgid "" @@ -11189,14 +11140,14 @@ msgstr "" "jeden znak \"/\"." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Klávesa " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Klávesa " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Tlačítko gamepadu" @@ -12701,7 +12652,7 @@ msgstr "GridMap Vyplnit výběr" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" -msgstr "Grid Map" +msgstr "Mřížková mapa" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" @@ -12834,7 +12785,7 @@ msgstr "Zapéct NavMesh" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." -msgstr "Vymazat navigační síť." +msgstr "Vymazat navigační model." #: modules/recast/navigation_mesh_generator.cpp msgid "Setting up Configuration..." @@ -13336,14 +13287,12 @@ msgid "Running on %s" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exporting APK..." -msgstr "Exportování všeho" +msgstr "Exportování APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Uninstalling..." -msgstr "Odinstalovat" +msgstr "Odinstalování..." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -13351,9 +13300,8 @@ msgid "Installing to device, please wait..." msgstr "Načítání, prosím čekejte..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not install to device: %s" -msgstr "Nelze spustit podproces!" +msgstr "Nepodařilo se nainstalovat do zařízení: %s" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -13475,16 +13423,12 @@ msgid "Signing debug %s..." msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signing release %s..." -msgstr "" -"Skenování souborů,\n" -"Prosím, čekejte..." +msgstr "Podepisování vydání %s..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find keystore, unable to export." -msgstr "Nelze otevřít šablonu pro export:" +msgstr "Nepodařilo se najít úložiště klíčů, nelze exportovat." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -13545,14 +13489,12 @@ msgid "" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project\n" -msgstr "Nelze upravit project.godot v umístění projektu." +msgstr "Nelze exportovat soubory projektu do projektu gradle\n" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not write expansion package file!" -msgstr "Nelze zapsat soubor:" +msgstr "Nelze zapsat soubor rozšiřujícího balíčku!" #: platform/android/export/export_plugin.cpp msgid "Building Android Project (gradle)" @@ -13589,11 +13531,12 @@ msgid "Creating APK..." msgstr "Vytvářím kontury..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Could not find template APK to export:\n" "%s" -msgstr "Nelze otevřít šablonu pro export:" +msgstr "" +"Nepodařilo se najít šablonu APK pro export:\n" +"%s" #: platform/android/export/export_plugin.cpp msgid "" @@ -13609,9 +13552,8 @@ msgid "Adding files..." msgstr "Přidávám %s..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files" -msgstr "Nelze zapsat soubor:" +msgstr "Nelze exportovat soubory projektu" #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -13676,14 +13618,12 @@ msgid "Could not read HTML shell:" msgstr "Nebylo možné přečíst HTML shell:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory:" -msgstr "Nelze vytvořit složku." +msgstr "Nepodařilo se vytvořit adresář serveru HTTP:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server:" -msgstr "Chyba při ukládání scény." +msgstr "Chyba při spuštění serveru HTTP:" #: platform/osx/export/export.cpp #, fuzzy @@ -14315,7 +14255,7 @@ msgstr "" #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." -msgstr "Toto tělo bude ignorováno dokud nenastavíte síť." +msgstr "Toto těleso bude ignorováno, dokud nenastavíte model." #: scene/3d/soft_body.cpp msgid "" @@ -14429,7 +14369,7 @@ msgstr "HSV" #: scene/gui/color_picker.cpp msgid "Raw" -msgstr "Raw" +msgstr "Surový" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -14519,6 +14459,14 @@ msgstr "" "Výchozí prostředí specifikované v nastavení projektu (Vykreslování -> " "Zobrazovací výřez -> Výchozí prostředí) se nepodařilo načíst." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14532,7 +14480,10 @@ msgstr "" "vnitřní texturu nějakému uzlu k zobrazení." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +#, fuzzy +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" "Velikost pohledu musí být větší než 0, aby bylo možné cokoliv renderovat." diff --git a/editor/translations/da.po b/editor/translations/da.po index 008f3b947c..12df305276 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -14,16 +14,17 @@ # Rémi Verschelde <akien@godotengine.org>, 2019. # Mads K. Bredager <mbredager@gmail.com>, 2019. # Kristoffer Andersen <kjaa@google.com>, 2019. -# Joe Osborne <reachjoe.o@gmail.com>, 2020. +# Joe Osborne <reachjoe.o@gmail.com>, 2020, 2021. # Autowinto <happymansi@hotmail.com>, 2020, 2021. # Mikkel Mouridsen <mikkelmouridsen@me.com>, 2020, 2021. # snakatk <snaqii@live.dk>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-04-26 22:31+0000\n" -"Last-Translator: Kim Nielsen <kimmowich@stofanet.dk>\n" +"PO-Revision-Date: 2021-11-05 11:56+0000\n" +"Last-Translator: Joe Osborne <reachjoe.o@gmail.com>\n" "Language-Team: Danish <https://hosted.weblate.org/projects/godot-engine/" "godot/da/>\n" "Language: da\n" @@ -31,7 +32,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -231,9 +232,8 @@ msgid "Animation Playback Track" msgstr "Animation-afspilningsspor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (frames)" -msgstr "Animations længde (i sekunder)" +msgstr "Animations længde (billeder)" #: editor/animation_track_editor.cpp #, fuzzy @@ -262,9 +262,8 @@ msgid "Anim Clips:" msgstr "Anim klip:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Track Path" -msgstr "Ændre Array-Værdi" +msgstr "Ændre sporsti" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." @@ -390,9 +389,8 @@ msgstr "Anim Indsæt" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "node '%s'" -msgstr "Kan ikke åbne '%s'." +msgstr "node '%s'" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp @@ -629,9 +627,8 @@ msgid "Go to Previous Step" msgstr "Gå til Forrige Trin" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Apply Reset" -msgstr "Nulstil Zoom" +msgstr "Anvende nulstilling" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -2509,6 +2506,15 @@ msgstr "" "Kunne ikke gemme scene. Der er nogle afhængigheder (forekomster) som ikke " "kunne opfyldes." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Kunne ikke starte underproces!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Gem alle Scener" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2645,6 +2651,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Gem ændringer til '%s' før lukning?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2995,10 +3005,6 @@ msgid "Save Scene" msgstr "Gem Scene" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Gem alle Scener" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Konverter Til..." @@ -4540,6 +4546,18 @@ msgid "Clear Default for '%s'" msgstr "Fjern Standard for '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Genimporter" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importer Som:" @@ -4549,10 +4567,6 @@ msgid "Preset" msgstr "Forudindstillet..." #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Genimporter" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -5273,7 +5287,7 @@ msgstr "Slut" #: editor/plugins/animation_state_machine_editor.cpp msgid "Immediate" -msgstr "Umiddelbart" +msgstr "Umiddelbar" #: editor/plugins/animation_state_machine_editor.cpp msgid "Sync" @@ -5314,8 +5328,8 @@ msgid "" "Shift+LMB to create connections." msgstr "" "Vælg og flyt nodes.\n" -"RMB for at tilføje ny nodes.\n" -"Shift+LMB for at oprette forbindelse." +"RMB for at tilføje nye nodes.\n" +"Shift+LMB for at oprette forbindelser." #: editor/plugins/animation_state_machine_editor.cpp msgid "Create new nodes." @@ -5349,7 +5363,7 @@ msgstr "Afspil Mode:" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "AnimationTree" -msgstr "Animation Tree" +msgstr "Animation Træ" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "New name:" @@ -5362,11 +5376,11 @@ msgstr "Skalér:" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Fade In (s):" -msgstr "" +msgstr "Fade ind (s):" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Fade Out (s):" -msgstr "" +msgstr "Fade Ud (s):" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend" @@ -5391,7 +5405,7 @@ msgstr "" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Start!" -msgstr "" +msgstr "Start!" #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp @@ -5424,11 +5438,11 @@ msgstr "Tilføj Input" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Clear Auto-Advance" -msgstr "" +msgstr "Ryd Automatisk Fremrykning" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Set Auto-Advance" -msgstr "" +msgstr "Sæt Automatisk Fremrykning" #: editor/plugins/animation_tree_player_editor_plugin.cpp #, fuzzy @@ -5445,7 +5459,7 @@ msgstr "Animationstræ er ugyldigt." #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Animation Node" -msgstr "" +msgstr "Animations Node" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "OneShot Node" @@ -5469,15 +5483,15 @@ msgstr "" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "TimeScale Node" -msgstr "" +msgstr "Tidsskala Node" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "TimeSeek Node" -msgstr "" +msgstr "Tidssøgning Node" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Transition Node" -msgstr "" +msgstr "Overgangs Node" #: editor/plugins/animation_tree_player_editor_plugin.cpp #, fuzzy @@ -5507,52 +5521,49 @@ msgid "Download" msgstr "Download" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Connection error, please try again." msgstr "Forbindelsesfejl, prøv venligst igen." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect." -msgstr "Ingen forbindelse." +msgstr "Kan ikke oprette forbindelse." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect to host:" -msgstr "Kan ikke forbinde til host:" +msgstr "Kan ikke forbinde til værten:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response from host:" -msgstr "Ingen respons fra host:" +msgstr "Intet svar fra værten:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response." -msgstr "Ingen reaktion." +msgstr "Intet svar." #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Can't resolve hostname:" -msgstr "" +msgstr "Kan ikke løse værtsnavnet:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve." msgstr "Kan ikke løses." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Request failed, return code:" msgstr "Forespørgsel mislykkedes, returkode:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Cannot save response to:" -msgstr "Kan ikke gemme respons i:" +msgstr "Kan ikke gemme svar til:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Write error." msgstr "Skrivefejl." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" -msgstr "" +msgstr "Anmodningen mislykkedes, for mange omdirigeringer" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -5560,12 +5571,10 @@ msgid "Redirect loop." msgstr "Omdiriger Løkke." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Request failed, timeout" msgstr "Forespørgsel mislykkedes, tiden udløb." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Timeout." msgstr "Tiden udløb." @@ -5575,23 +5584,24 @@ msgstr "Fejlet:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." -msgstr "" +msgstr "Dårligt download-hash, formoder at filen er blevet manipuleret." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" -msgstr "" +msgstr "Forventet:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Got:" -msgstr "" +msgstr "Fik:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed SHA-256 hash check" -msgstr "" +msgstr "Mislykkedes SHA-256 hash-tjek" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Asset Download Error:" -msgstr "" +msgstr "Asset Download Fejl:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Downloading (%s / %s)..." @@ -5602,8 +5612,9 @@ msgid "Downloading..." msgstr "Downloader..." #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Resolving..." -msgstr "" +msgstr "Løser..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Error making request" @@ -5614,9 +5625,8 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "Installér..." +msgstr "Installere.." #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -5625,19 +5635,20 @@ msgstr "Prøv igen" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download Error" -msgstr "" +msgstr "Fejl i Download" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "" +msgstr "Download for dette asset er allerede i gang!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Recently Updated" -msgstr "" +msgstr "Nyligt Opdateret" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Least Recently Updated" -msgstr "" +msgstr "Seneste Nyligt Opdateret" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Name (A-Z)" @@ -5660,9 +5671,8 @@ msgid "First" msgstr "Første" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Previous" -msgstr "Forrige fane" +msgstr "Forrige" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Next" @@ -5678,11 +5688,12 @@ msgstr "Alle" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search templates, projects, and demos" -msgstr "" +msgstr "Søg skabeloner, projekter og demoer" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Search assets (excluding templates, projects, and demos)" -msgstr "" +msgstr "Søge assets (undtagen skabeloner, projekter og demoer)" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5725,14 +5736,18 @@ msgid "Assets ZIP File" msgstr "Assets zipfil" #: editor/plugins/audio_stream_editor_plugin.cpp +#, fuzzy msgid "Audio Preview Play/Pause" -msgstr "" +msgstr "Lyd forhåndsvisning Afspil/pause" #: editor/plugins/baked_lightmap_editor_plugin.cpp +#, fuzzy msgid "" "Can't determine a save path for lightmap images.\n" "Save your scene and try again." msgstr "" +"Kan ikke finde et sted at gemme lightmap images.\n" +"Gem din scene, og prøv igen." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -7612,12 +7627,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Åben script" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Forrige fane" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7990,15 +8007,15 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Create Rest Pose from Bones" msgstr "Spil Brugerdefineret Scene" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" -msgstr "" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Skeleton2D" msgstr "Singleton" @@ -8060,7 +8077,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -8069,6 +8086,10 @@ msgid "Right Orthogonal" msgstr "Højre knap." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8419,6 +8440,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -11376,11 +11417,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14728,6 +14769,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14741,7 +14790,9 @@ msgstr "" "indre textur til en node så den kan vises." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/de.po b/editor/translations/de.po index b0ca136093..56eca938d0 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -72,12 +72,15 @@ # Philipp Wabnitz <philipp.wabnitz@s2011.tu-chemnitz.de>, 2021. # jmih03 <joerni@mail.de>, 2021. # Dominik Moos <dominik.moos@protonmail.com>, 2021. +# Zae Chao <zaevi@live.com>, 2021. +# Tim <tim14speckenwirth@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-08-27 08:25+0000\n" -"Last-Translator: Dominik Moos <dominik.moos@protonmail.com>\n" +"PO-Revision-Date: 2021-10-31 22:17+0000\n" +"Last-Translator: Tim <tim14speckenwirth@gmail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -85,7 +88,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2485,6 +2488,14 @@ msgstr "" "Szene konnte nicht gespeichert werden. Wahrscheinlich werden Abhängigkeiten " "(Instanzen oder Vererbungen) nicht erfüllt." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Eine oder mehrere Szenen konnten nicht gespeichert werden!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Alle Szenen speichern" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Momentan geöffnete Szenen können nicht überschrieben werden!" @@ -2621,6 +2632,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Änderungen in ‚%s‘ vor dem Schließen speichern?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s existiert nicht mehr! Bitte anderen Ort zum Speichern wählen." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2666,29 +2681,27 @@ msgstr "Die aktuelle Szene ist nicht gespeichert. Trotzdem öffnen?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Kann nicht rückgängig gemacht werden während Maustasten gedrückt sind." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Nichts rückgängig zu machen." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Rückgängig machen" +msgstr "Rückgängig machen: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Kann nicht wiederhergestellt werden solange Maustasten gedrückt sind." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Nichts wiederherzustellen." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Wiederherstellen" +msgstr "Wiederherstellen: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2983,10 +2996,6 @@ msgid "Save Scene" msgstr "Szene speichern" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Alle Szenen speichern" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Umwandeln zu..." @@ -3388,9 +3397,8 @@ msgid "Merge With Existing" msgstr "Mit existierendem vereinen" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Transformation bearbeiten" +msgstr "MeshInstance-Transforms anwenden" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3653,7 +3661,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Schnell laden" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -4474,6 +4482,24 @@ msgid "Clear Default for '%s'" msgstr "Standard für ‚%s‘ löschen" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Neuimport" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Es existieren ausstehende Änderungen die noch nicht angewandt wurden. Um " +"Änderungen der Importoptionen anzuwenden, bitte den Reimportieren-Knopf " +"klicken.\n" +"Eine andere Ressource in der Dateisystemleiste auszuwählen, ohne zuvor den " +"Reimportieren-Knopf zu betätigen, verwirft sämtliche ausstehende Änderungen " +"der Importoptionen." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importiere als:" @@ -4482,10 +4508,6 @@ msgid "Preset" msgstr "Vorlage" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Neuimport" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Szenen speichern, reimportieren und neu starten" @@ -5760,19 +5782,17 @@ msgstr "%d CanvasItems verschieben" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move CanvasItem \"%s\" to (%d, %d)" -msgstr "CanvasItem „%s“ zu (%d, d%) verschieben" +msgstr "CanvasItem „%s“ zu (%d, %d) verschieben" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Sperren ausgewählt" +msgstr "Gesperrt" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Gruppe" +msgstr "Gruppiert" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6722,14 +6742,12 @@ msgid "Remove Selected Item" msgstr "Ausgewähltes Element entfernen" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Aus Szene importieren" +msgstr "Aus Szene importieren (Transforms ignorieren)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Aus Szene importieren" +msgstr "Aus Szene importieren (Transforms anwenden)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7323,14 +7341,12 @@ msgid "Flip Portal" msgstr "Portal umdrehen" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "Transform leeren" +msgstr "Occluder-Set-Transform" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Erzeuge Node" +msgstr "Mittel-Node" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7467,11 +7483,11 @@ msgid "Move Down" msgstr "Schiebe runter" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "Nächstes Skript" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "Vorheriges Skript" #: editor/plugins/script_editor_plugin.cpp @@ -7826,26 +7842,24 @@ msgstr "" "hinzugefügt werden." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Ruhe-Pose aus Knochen erstellen" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Knochen in Ruhe-Pose setzen" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Ruhe-Pose aus Knochen erstellen" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skelett2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Kochen in Ruhe-Pose setzen" +msgstr "Zu Ruhepose zurücksetzen" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Überschreiben" +msgstr "Ruhepose überschreiben" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7872,69 +7886,62 @@ msgid "Perspective" msgstr "Perspektivisch" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Senkrecht" +msgstr "Oben orthogonal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Perspektivisch" +msgstr "Oben perspektivisch" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Senkrecht" +msgstr "Unten orthogonal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Perspektivisch" +msgstr "Unten perspektivisch" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Senkrecht" +msgstr "Links orthogonal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Perspektivisch" +msgid "Left Perspective" +msgstr "Linke Perspektive" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Senkrecht" +msgstr "Rechts orthogonal" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Rechts perspektivisch" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Senkrecht" +msgstr "Vorne orthogonal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Perspektivisch" +msgstr "Vorne perspektivisch" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Senkrecht" +msgstr "Hinten orthogonal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Perspektivisch" +msgstr "Hinten perspektivisch" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [auto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [Portale aktiv]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8261,6 +8268,26 @@ msgid "Right View" msgstr "Sicht von rechts" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "Orbitsicht unten" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "Orbitsicht links" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "Orbitsicht rechts" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "Orbitsicht oben" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "Orbitsicht 180" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Zwischen perspektivischer und orthogonaler Sicht wechseln" @@ -8334,9 +8361,8 @@ msgid "View Portal Culling" msgstr "Portal-Culling anzeigen" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Portal-Culling anzeigen" +msgstr "Occlusion-Culling anzeigen" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8404,9 +8430,8 @@ msgid "Post" msgstr "Nachher" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "Unbenanntes Projekt" +msgstr "Unbenannter Griff" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -11194,14 +11219,14 @@ msgstr "" "der Suchanfrage vorhanden sein." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Taste " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "Physische Taste" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Taste " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Joysticktaste" @@ -12552,14 +12577,12 @@ msgid "Set Portal Point Position" msgstr "Portal-Point-Position festlegen" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Zylinderformradius ändern" +msgstr "Occluder-Sphärenradius festlegen" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "Kurven-Eingangsposition festlegen" +msgstr "Occluder-Sphärenposition festlegen" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12844,9 +12867,8 @@ msgid "Class name can't be a reserved keyword" msgstr "Der Klassenname kann nicht ein reserviertes Schlüsselwort sein" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Auswahl füllen" +msgstr "Solution bauen" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -14211,11 +14233,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "Es wurde keine Form festgelegt." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Es werden nur gleichförmige Skalierungen unterstützt." #: scene/3d/particles.cpp msgid "" @@ -14362,7 +14384,7 @@ msgid "" "Please check the RoomList branch has been assigned in the RoomManager." msgstr "" "RoomList-Pfad ist ungültig.\n" -"Wurde der RoomList-Zweig im RoomManager zugewiesen?" +"Bitte überprüfen Sie, ob der RoomList-Zweig im RoomManager zugewiesen wurde." #: scene/3d/room_manager.cpp msgid "RoomList contains no Rooms, aborting." @@ -14399,8 +14421,9 @@ msgid "" "Error calculating room bounds.\n" "Ensure all rooms contain geometry or manual bounds." msgstr "" -"Fehler beim Berechnen der Raumbegrenzungen.\n" -"Enthalten alle Räume Geometrie oder manuelle Begrenzungen?" +"Fehler bei der Berechnung von Raumbegrenzungen.\n" +"Stellen Sie sicher, dass alle Räume Geometrie oder manuelle Begrenzungen " +"enthalten." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -14581,6 +14604,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Die Achsenstreckungsoptionen „Tile“ und „Tile Fit“ sind nur aktiv, wenn das " +"GLES3-Rendering-Backend genutzt wird.\n" +"Zur Zeit wird das GLES2-Backend genutzt und diese Optionen verhalten sich " +"wie „Stretch“." #: scene/gui/popup.cpp msgid "" @@ -14621,6 +14648,18 @@ msgstr "" "Das Standard-Environment wie festgelegt in den Projekteinstellungen " "(Rendering→Environment→Standard-Environment) konnte nicht geladen werden." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"Sehr kurze Schaltzeiten (< 0,05 Sekunden) können instabile Ergebnisse " +"abhängig von der Bildfrequenz liefern.\n" +"Für sehr kurze Schaltzeiten wird empfohlen, statt eines Timers, die " +"›process‹-Schleife eines Skripts zu benutzen." + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14635,13 +14674,16 @@ msgstr "" "irgendeinem Node zum Anzeigen zugewiesen werden." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" -"Die Größe des Viewports muss größer als 0 sein um etwas rendern zu können." +"Die Größe des Viewports muss mindestes 2 Pixel in beiden Dimensionen " +"betragen um überhaupt irgendetwas rendern zu können." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "OccluderShapeSphere-Spheres festlegen" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -16530,9 +16572,6 @@ msgstr "Konstanten können nicht verändert werden." #~ msgid "Couldn't save atlas image:" #~ msgstr "Atlas-Bild konnte nicht gespeichert werden:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "Konvertierte Textur konnte nicht gespeichert werden:" - #~ msgid "Invalid translation source!" #~ msgstr "Fehlerhafte Übersetzungsquelle!" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 47aa1d3a22..9d183271f6 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -9,6 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" +"MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" @@ -2314,6 +2316,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2430,6 +2440,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2749,10 +2763,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4152,15 +4162,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7041,11 +7059,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7391,11 +7409,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7455,7 +7473,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7463,6 +7481,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7800,6 +7822,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10545,11 +10587,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13657,6 +13699,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13666,7 +13716,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/el.po b/editor/translations/el.po index ea1c91f4b5..3aa20da318 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -16,6 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-07-09 14:32+0000\n" "Last-Translator: Shadofer <shadowrlrs@gmail.com>\n" @@ -2432,6 +2433,15 @@ msgstr "" "Αδύνατη η αποθήκευση σκηνής. Πιθανώς οι εξαρτήσεις (στιγμιότυπα ή " "κληρονομιά) να μην μπορούσαν να ικανοποιηθούν." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Δεν ήταν δυνατή η αποθήκευση υφής που έχει μετατραπεί:" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Αποθήκευση Ολων των Σκηνών" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Αδύνατη η αντικατάσταση σκηνής που είναι ακόμα ανοιχτή!" @@ -2573,6 +2583,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Αποθήκευση αλλαγών στο '%s' πριν το κλείσιμο;" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2929,10 +2943,6 @@ msgid "Save Scene" msgstr "Αποθηκεύση σκηνής" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Αποθήκευση Ολων των Σκηνών" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Μετατροπή σε..." @@ -4455,6 +4465,18 @@ msgid "Clear Default for '%s'" msgstr "Εκκαθάριση προεπιλογής για '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Επανεισαγωγή" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Εισαγωγή ώς:" @@ -4463,10 +4485,6 @@ msgid "Preset" msgstr "Προρύθμιση" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Επανεισαγωγή" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Αποθήκευση Σκηνών, Επανεισαγωγή και Επανεκκίνηση" @@ -7484,11 +7502,13 @@ msgid "Move Down" msgstr "Μετακίνηση κάτω" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Επόμενη Δέμη Ενεργειών" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Προηγούμενη Δέσμη Ενεργειών" #: editor/plugins/script_editor_plugin.cpp @@ -7843,14 +7863,14 @@ msgstr "" "Αυτός ο σκελετός δεν έχει οστά, δώστε του κάποιους κόμβους-παιδιά Bone2D." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Δημιουργία Στάσης Αδράνειας από Οστά" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Ορισμός Στάσης Αδράνειας σε Οστά" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Δημιουργία Στάσης Αδράνειας από Οστά" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D" @@ -7915,7 +7935,7 @@ msgstr "Αξονομετρική" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "Προοπτική" #: editor/plugins/spatial_editor_plugin.cpp @@ -7925,6 +7945,11 @@ msgstr "Αξονομετρική" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "Προοπτική" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "Αξονομετρική" @@ -8290,6 +8315,27 @@ msgid "Right View" msgstr "Δεξιά όψη" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Εμπρόσθια όψη" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Εναλλαγή Προοπτικής/Αξονομετρικής Προβολής" @@ -11294,14 +11340,14 @@ msgstr "" "περιέχει τουλάχιστον έναν χαρακτήρα `/`." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Κλειδί " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Κλειδί " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Κουμπί Joystick" @@ -14696,6 +14742,14 @@ msgstr "" "Το προεπιλεγμένο περιβάλλον, όπως έχει ορισθεί στις ρυθμίσεις έργου " "(Rendering -> Environment -> Default Environment) δεν μπορούσε να φορτωθεί." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14709,7 +14763,10 @@ msgstr "" "έναν κόμβο για απεικόνιση." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +#, fuzzy +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" "Το μέγεθος της οπτικής γωνίας πρέπει να είναι μεγαλύτερο του 0 για να γίνει " "απόδοση." @@ -16573,9 +16630,6 @@ msgstr "Οι σταθερές δεν μπορούν να τροποποιηθο #~ msgid "Couldn't save atlas image:" #~ msgstr "Δεν ήταν δυνατή η αποθήκευση εικόνας άτλαντα:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "Δεν ήταν δυνατή η αποθήκευση υφής που έχει μετατραπεί:" - #~ msgid "Invalid translation source!" #~ msgstr "Μη έγκυρη πηγή μετάφρασης!" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 5987003cb7..c9dd8cfaa8 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -17,15 +17,16 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2021-08-14 19:04+0000\n" -"Last-Translator: mourning20s <mourning20s@protonmail.com>\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" +"PO-Revision-Date: 2021-10-06 00:12+0000\n" +"Last-Translator: Manuel González <mgoopazo@gmail.com>\n" "Language-Team: Esperanto <https://hosted.weblate.org/projects/godot-engine/" "godot/eo/>\n" "Language: eo\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2404,6 +2405,15 @@ msgstr "" "Ne eble konservi scenon. Verŝajne dependoj (ekzemploj aŭ heredito) ne " "verigus." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Ne eble komencas subprocezon!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Konservi ĉiujn scenojn" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Ne eble anstataŭigas scenon ke estas ankoraŭ malferma!" @@ -2539,6 +2549,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Konservi ŝanĝojn al '%s' antaŭ fermo?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2584,7 +2598,7 @@ msgstr "Nuna sceno ne estas konservita. Malfermi ĉuikaze?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Ne povu malfari dum musbutonoj estas premitaj." #: editor/editor_node.cpp msgid "Nothing to undo." @@ -2888,10 +2902,6 @@ msgid "Save Scene" msgstr "Konservi scenon" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Konservi ĉiujn scenojn" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Konverti al..." @@ -4395,6 +4405,18 @@ msgid "Clear Default for '%s'" msgstr "Vakigi defaŭlton por '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reenporti" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Enporti kiel:" @@ -4403,10 +4425,6 @@ msgid "Preset" msgstr "Antaŭagordo" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Reenporti" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Konservi scenojn, reenporti, kaj rekomenci" @@ -7375,12 +7393,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Nova skripto" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Antaŭa tabo" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7727,11 +7747,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7795,8 +7815,9 @@ msgid "Left Orthogonal" msgstr "Maldekstra butono" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" -msgstr "" +#, fuzzy +msgid "Left Perspective" +msgstr "Malsupre maldekstre" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -7804,6 +7825,10 @@ msgid "Right Orthogonal" msgstr "Dekstra butono" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8159,6 +8184,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -11016,14 +11061,14 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Klavo " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Klavo " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Butono de stirstango" @@ -14196,6 +14241,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14205,7 +14258,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/es.po b/editor/translations/es.po index 95a4a08bfd..fe7278beaf 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -43,7 +43,7 @@ # Dario <darlex259@gmail.com>, 2019. # Adolfo Jayme Barrientos <fitojb@ubuntu.com>, 2019. # Julián Luini <jluini@gmail.com>, 2020. -# Victor S. <victorstancioiu@gmail.com>, 2020. +# Victor S. <victorstancioiu@gmail.com>, 2020, 2021. # henry rujano herrera <rujhen@gmail.com>, 2020. # Megamega53 <Christopher.Morales21@myhunter.cuny.edu>, 2020. # Serk Lintur <serk.lintur@gmail.com>, 2020. @@ -70,12 +70,14 @@ # Erick Figueroa <querecuto@hotmail.com>, 2021. # jonagamerpro1234 ss <js398704@gmail.com>, 2021. # davidrogel <david.rogel.pernas@icloud.com>, 2021. +# Anderson Guzman Abreu <chicobello1111@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-08-27 08:25+0000\n" -"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" +"PO-Revision-Date: 2021-11-11 16:02+0000\n" +"Last-Translator: Victor S. <victorstancioiu@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" "Language: es\n" @@ -83,7 +85,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1574,7 +1576,7 @@ msgstr "Renombrar Autoload" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" -msgstr "Act./Desact. Globales de Autoload" +msgstr "Act./Desact. Globales de AutoLoad" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" @@ -2232,7 +2234,7 @@ msgstr "Buscar en la Ayuda" #: editor/editor_help_search.cpp msgid "Case Sensitive" -msgstr "Respetar Mayus./Minus." +msgstr "Respeta Mayus./Minus." #: editor/editor_help_search.cpp msgid "Show Hierarchy" @@ -2481,6 +2483,14 @@ msgstr "" "No se pudo guardar la escena. Las posibles dependencias (instancias o " "herencias) no se pudieron resolver." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "¡No se ha podido guardar una o varias escenas!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Guardar Todas las Escenas" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "¡No se puede sobrescribir una escena que todavía está abierta!" @@ -2618,6 +2628,11 @@ msgid "Save changes to '%s' before closing?" msgstr "¿Guardar cambios de '%s' antes de cerrar?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" +"¡%s ya no existe! Por favor, especifica una nueva ubicación de guardado." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2663,29 +2678,27 @@ msgstr "Escena actual no guardada ¿Abrir de todos modos?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "No se puede deshacer mientras se pulsan los botones del mouse." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "No hay nada que deshacer." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Deshacer" +msgstr "Deshacer: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "No se puede rehacer mientras los botones del mouse están presionados." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "No hay nada que rehacer." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Rehacer" +msgstr "Rehacer: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2928,7 +2941,7 @@ msgstr "Añadir nueva escena." #: editor/editor_node.cpp msgid "Scene" -msgstr "Escenas" +msgstr "Escena" #: editor/editor_node.cpp msgid "Go to previously opened scene." @@ -2975,10 +2988,6 @@ msgid "Save Scene" msgstr "Guardar Escena" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Guardar Todas las Escenas" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Convertir a..." @@ -3383,9 +3392,8 @@ msgid "Merge With Existing" msgstr "Combinar Con Existentes" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Cambiar Transformación de la Animación" +msgstr "Aplicar Transformaciones al MeshInstance" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3647,7 +3655,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Carga Rápida" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -4474,6 +4482,23 @@ msgid "Clear Default for '%s'" msgstr "Restablecer Predeterminado para '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reimportar" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Tienes cambios pendientes que aún no se han aplicado. Haz clic en Reimportar " +"para aplicar los cambios realizados en las opciones de importación.\n" +"Si seleccionas otro recurso en el dock Sistema de Archivos sin hacer clic en " +"Reimportar primero, se descartarán los cambios realizados en el dock " +"Importar." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importar como:" @@ -4482,10 +4507,6 @@ msgid "Preset" msgstr "Preajuste" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Reimportar" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Guardar Escenas, Reimportar y Reiniciar" @@ -5064,7 +5085,7 @@ msgstr "Mostrar la lista de animaciones en el reproductor." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" -msgstr "Autoreproducir al Cargar" +msgstr "Reproducción Automática al Cargar" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Enable Onion Skinning" @@ -5766,15 +5787,13 @@ msgstr "Mover CanvasItem \"%s\" a (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Bloqueo Seleccionado" +msgstr "Bloqueado" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Grupo" +msgstr "Agrupado" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6722,14 +6741,12 @@ msgid "Remove Selected Item" msgstr "Eliminar Elemento Seleccionado" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Importar desde escena" +msgstr "Importar desde Escena (Ignorar Transformaciones)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Importar desde escena" +msgstr "Importar desde Escena (Aplicar Transformaciones)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7327,14 +7344,12 @@ msgid "Flip Portal" msgstr "Voltear Portal" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "Reestablecer Transformación" +msgstr "Ocluir Conjunto de Transformación" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Crear Nodo" +msgstr "Centrar Nodo" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7470,12 +7485,12 @@ msgid "Move Down" msgstr "Bajar" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "Script siguiente" +msgid "Next Script" +msgstr "Siguiente Script" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "Script anterior" +msgid "Previous Script" +msgstr "Script Anterior" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7827,26 +7842,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Este esqueleto no tiene huesos, crea algunos nodos Bone2D hijos." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Crear Pose de Descanso a partir de los Huesos" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Establecer Pose de Descanso en los Huesos" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Crear Pose de Descanso a partir de los Huesos" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Asignar Pose de Descanso a Huesos" +msgstr "Reiniciar a la Pose de Reposo" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Sobreescribir" +msgstr "Sobrescribir la Pose de Reposo" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7873,69 +7886,62 @@ msgid "Perspective" msgstr "Perspectiva" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Superior" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Superior" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Inferior" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Inferior" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Izquierda" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Perspectiva" +msgid "Left Perspective" +msgstr "Perspectiva Izquierda" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Derecha" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Perspectiva Derecha" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Frontal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Frontal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Trasera" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Trasera" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [auto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [portals active]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8259,6 +8265,26 @@ msgid "Right View" msgstr "Vista Derecha" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "Vista de Órbita Inferior" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "Vista de Órbita Izquierda" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "Vista de Órbita Derecha" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "Vista de Órbita Superior" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "Vista de Órbita 180" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Cambiar Vista Perspectiva/Ortogonal" @@ -8332,9 +8358,8 @@ msgid "View Portal Culling" msgstr "Ver Eliminación de Portales" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Ver Eliminación de Portales" +msgstr "Ver Eliminación de Oclusión" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8402,9 +8427,8 @@ msgid "Post" msgstr "Posterior" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "Proyecto Sin Nombre" +msgstr "Gizmo Sin Nombre" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -11189,14 +11213,14 @@ msgstr "" "al menos un carácter `/`." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Tecla " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "Tecla Física" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Tecla " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Botón del Mando" @@ -11510,7 +11534,7 @@ msgstr "Idiomas:" #: editor/project_settings_editor.cpp msgid "AutoLoad" -msgstr "AutoCarga" +msgstr "AutoLoad" #: editor/project_settings_editor.cpp msgid "Plugins" @@ -12545,14 +12569,12 @@ msgid "Set Portal Point Position" msgstr "Establecer Posición del Portal Point" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Cambiar Radio de la Forma del Cilindro" +msgstr "Establecer Radio de la Esfera de Oclusión" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "Establecer Posición de Entrada de Curva" +msgstr "Establecer Posición de la Esfera de Oclusión" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12840,9 +12862,8 @@ msgid "Class name can't be a reserved keyword" msgstr "El nombre de la clase no puede ser una palabra reservada" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Rellenar Selección" +msgstr "Crear Solución" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -13509,11 +13530,11 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." -msgstr "Firma de depuración %s..." +msgstr "Firmando %s debug..." #: platform/android/export/export_plugin.cpp msgid "Signing release %s..." -msgstr "Firmando liberación %s..." +msgstr "Firmando %s release..." #: platform/android/export/export_plugin.cpp msgid "Could not find keystore, unable to export." @@ -14210,11 +14231,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "No se ha establecido ninguna forma." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Sólo se admiten escalas uniformes." #: scene/3d/particles.cpp msgid "" @@ -14573,6 +14594,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Las opciones Tile y Tile Fit para las propiedades Axis Stretch sólo son " +"efectivas cuando se utiliza el backend de renderizado GLES3.\n" +"El backend GLES2 está actualmente en uso, por lo que estos modos actuarán " +"como Stretch en su lugar." #: scene/gui/popup.cpp msgid "" @@ -14610,6 +14635,19 @@ msgstr "" "El Entorno por Defecto como se especifica en Configuración del Proyecto " "(Rendering -> Environment -> Default Environment) no se ha podido cargar." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"Los tiempos de espera del temporizador muy bajos (< 0,05 segundos) pueden " +"comportarse de manera significativamente diferente dependiendo de la " +"velocidad de fotogramas renderizados o de la física.\n" +"Considera la posibilidad de utilizar un bucle en process dentro del script " +"en lugar de depender de un Timer para tiempos de espera muy bajos." + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14624,14 +14662,16 @@ msgstr "" "nodo para que se muestre." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" -"El tamaño del Viewport debe ser mayor que 0 para poder renderizar cualquier " -"cosa." +"El tamaño del Viewport debe ser mayor o igual a 2 píxeles en ambas " +"dimensiones para renderizar cualquier cosa." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "Establecer Esferas OccluderShapeSphere" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -16532,9 +16572,6 @@ msgstr "Las constantes no pueden modificarse." #~ msgid "Couldn't save atlas image:" #~ msgstr "No se pudo guardar la imagen de atlas:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "No se pudo guardar la textura convertida:" - #~ msgid "Invalid translation source!" #~ msgstr "¡Origen de traducción incorrecto!" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 0decc83e9f..271bb11040 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -18,12 +18,14 @@ # Skarline <lihue-molina@hotmail.com>, 2020. # Joakker <joaquinandresleon108@gmail.com>, 2020. # M3CG <cgmario1999@gmail.com>, 2021. +# Manuel González <mgoopazo@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-06 16:32+0000\n" -"Last-Translator: M3CG <cgmario1999@gmail.com>\n" +"PO-Revision-Date: 2021-10-23 10:13+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" "Language: es_AR\n" @@ -31,7 +33,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2424,6 +2426,14 @@ msgstr "" "No se pudo guardar la escena. Probablemente no se hayan podido satisfacer " "dependencias (instancias o herencia)." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "¡No se ha podido guardar una o varias escenas!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Guardar Todas las Escenas" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "No se puede sobrescribir una escena que todavía esta abierta!" @@ -2562,6 +2572,11 @@ msgid "Save changes to '%s' before closing?" msgstr "Guardar cambios a '%s' antes de cerrar?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" +"¡%s ya no existe! Por favor, especificá una nueva ubicación de guardado." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2607,29 +2622,27 @@ msgstr "Escena actual sin guardar. Abrir de todos modos?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "No se puede deshacer mientras los botones del mouse están presionados." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Nada para deshacer." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Deshacer" +msgstr "Deshacer: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "No se puede rehacer mientras los botones del mouse están presionados." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "No hay nada que rehacer." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Rehacer" +msgstr "Rehacer: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2919,10 +2932,6 @@ msgid "Save Scene" msgstr "Guardar Escena" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Guardar Todas las Escenas" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Convertir A..." @@ -3325,9 +3334,8 @@ msgid "Merge With Existing" msgstr "Mergear Con Existentes" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Cambiar Transform de Anim" +msgstr "Aplicar Transformaciones al MeshInstance" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3588,7 +3596,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Carga Rápida" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -3873,7 +3881,7 @@ msgstr "Abrir Carpeta" #: editor/export_template_manager.cpp msgid "Open the folder containing installed templates for the current version." msgstr "" -"Abra la carpeta que contiene las plantillas instaladas para la versión " +"Abrir la carpeta que contiene las plantillas instaladas para la versión " "actual." #: editor/export_template_manager.cpp @@ -4415,6 +4423,23 @@ msgid "Clear Default for '%s'" msgstr "Restablecer Predeterminados para '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reimportar" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Tenés cambios pendientes que aún no se han aplicado. Hacé clic en Reimportar " +"para aplicar los cambios realizados en las opciones de importación.\n" +"Si seleccionás otro recurso en el dock Sistema de Archivos sin hacer clic en " +"Reimportar primero, se descartarán los cambios realizados en el dock " +"Importar." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importar Como:" @@ -4423,10 +4448,6 @@ msgid "Preset" msgstr "Preset" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Reimportar" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Guardar Escenas, Reimportar y Reiniciar" @@ -5708,15 +5729,13 @@ msgstr "Mover CanvasItem \"%s\" a (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Bloqueo Seleccionado" +msgstr "Bloqueado" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Grupo" +msgstr "Agrupado" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5910,7 +5929,7 @@ msgstr "Arrastrar: Rotar el nodo seleccionado alrededor del pivote." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+Drag: Move selected node." -msgstr "Alt+Arrastrar: Mover el nodo seleccionado" +msgstr "Alt+Arrastrar: Mover el nodo seleccionado." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "V: Set selected node's pivot position." @@ -6662,14 +6681,12 @@ msgid "Remove Selected Item" msgstr "Remover Item Seleccionado" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Importar desde Escena" +msgstr "Importar desde Escena (Ignorar Transformaciones)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Importar desde Escena" +msgstr "Importar desde Escena (Aplicar Transformaciones)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7256,21 +7273,19 @@ msgstr "Generar Puntos en la Room" #: editor/plugins/room_manager_editor_plugin.cpp msgid "Generate Points" -msgstr "Conteo de Puntos Generados:" +msgstr "Generar puntos" #: editor/plugins/room_manager_editor_plugin.cpp msgid "Flip Portal" msgstr "Invertir Portal" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "Reestablecer Transform" +msgstr "Transform de Occluder Set" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Crear Nodo" +msgstr "Centrar Nodo" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7406,12 +7421,12 @@ msgid "Move Down" msgstr "Bajar" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "Script siguiente" +msgid "Next Script" +msgstr "Script Siguiente" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "Script anterior" +msgid "Previous Script" +msgstr "Script Anterior" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7763,26 +7778,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Este esqueleto no tiene huesos, crea algunos nodos Bone2D hijos." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Crear Pose de Descanso a partir de Huesos" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Asignar Pose de Descanso a Huesos" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Crear Pose de Descanso a partir de Huesos" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Setear Huesos a la Pose de Descanso" +msgstr "Restablecer a la Pose de Reposo" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Sobreescribir" +msgstr "Sobrescribir la Pose de Reposo" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7809,69 +7822,62 @@ msgid "Perspective" msgstr "Perspectiva" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Superior" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Superior" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Inferior" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Inferior" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Izquierda" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Perspectiva" +msgid "Left Perspective" +msgstr "Perspectiva Izquierda" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Derecha" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Perspectiva Derecha" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Frontal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Frontal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Trasera" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Trasera" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [auto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [portales activos]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -7970,7 +7976,7 @@ msgstr "Vértices:" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" -msgstr "" +msgstr "FPS: %d (%s ms)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -8195,6 +8201,26 @@ msgid "Right View" msgstr "Vista Derecha" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "Orbitar Vista Hacia Abajo" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "Orbitar Vista Hacia La Izquierda" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "Orbitar Vista Hacia La Derecha" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "Orbitar Vista Hacia Arriba" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "Orbitar Vista 180" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Intercambiar entre Vista Perspectiva/Orthogonal" @@ -8268,9 +8294,8 @@ msgid "View Portal Culling" msgstr "Ver Culling de Portales" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Ver Culling de Portales" +msgstr "Ver Occlusion Culling" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8338,9 +8363,8 @@ msgid "Post" msgstr "Post" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "Proyecto Sin Nombre" +msgstr "Gizmo Sin Nombre" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -8608,7 +8632,7 @@ msgstr "Styleboxes" #: editor/plugins/theme_editor_plugin.cpp msgid "{num} color(s)" -msgstr "" +msgstr "{num} color(es)" #: editor/plugins/theme_editor_plugin.cpp msgid "No colors found." @@ -8640,7 +8664,7 @@ msgstr "No se encontraron íconos." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} stylebox(es)" -msgstr "" +msgstr "{num} stylebox(es)" #: editor/plugins/theme_editor_plugin.cpp msgid "No styleboxes found." @@ -8692,7 +8716,7 @@ msgstr "Seleccione todos los elementos visibles de color y sus datos." #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all visible color items." -msgstr "Quitar selección a todos los elementos visibles de color." +msgstr "Quitar selección a todos los items de color visibles." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible constant items." @@ -8700,11 +8724,11 @@ msgstr "Seleccionar todos elementos constant visibles." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible constant items and their data." -msgstr "" +msgstr "Seleccionar todos los items visibles constantes y sus datos." #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all visible constant items." -msgstr "" +msgstr "Quitar selección a todos los items visibles constantes." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible font items." @@ -8712,11 +8736,11 @@ msgstr "Seleccionar todos los elementos font visibles." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible font items and their data." -msgstr "" +msgstr "Seleccionar todos los items visibles y sus datos." #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all visible font items." -msgstr "" +msgstr "Deseleccionar todos los elementos font visibles." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible icon items." @@ -8732,21 +8756,23 @@ msgstr "Deseleccionar todos los elementos icon visibles." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible stylebox items." -msgstr "" +msgstr "Seleccionar todos los elementos stylebox visibles." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible stylebox items and their data." -msgstr "" +msgstr "Seleccionar todos los elementos stylebox visibles y sus datos." #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all visible stylebox items." -msgstr "" +msgstr "Deseleccionar todos los elementos stylebox visibles." #: editor/plugins/theme_editor_plugin.cpp msgid "" "Caution: Adding icon data may considerably increase the size of your Theme " "resource." msgstr "" +"Precaución: Añadir datos de iconos puede aumentar considerablemente el " +"tamaño de su recurso Theme." #: editor/plugins/theme_editor_plugin.cpp msgid "Collapse types." @@ -8786,6 +8812,9 @@ msgid "" "closing this window.\n" "Close anyway?" msgstr "" +"En la pestaña de Elementos de Importación se han seleccionado algunos " +"elementos. La selección se perderá al cerrar esta ventana.\n" +"¿Cerrar de todos modos?" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -8825,6 +8854,8 @@ msgid "" "This theme type is empty.\n" "Add more items to it manually or by importing from another theme." msgstr "" +"Este tipo de theme está vacío.\n" +"Añadí más propiedades manualmente o importalas desde otro Theme." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Color Item" @@ -8956,81 +8987,78 @@ msgstr "Reemplazar Elemento" #: editor/plugins/theme_editor_plugin.cpp msgid "Unpin this StyleBox as a main style." -msgstr "" +msgstr "Quitar este StyleBox como estilo principal." #: editor/plugins/theme_editor_plugin.cpp msgid "" "Pin this StyleBox as a main style. Editing its properties will update the " "same properties in all other StyleBoxes of this type." msgstr "" +"Establecer este StyleBox como un estilo principal. La edición de sus " +"propiedades actualizará las mismas propiedades en todos los demás StyleBoxes " +"de este tipo." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Type" -msgstr "Tipo" +msgstr "Añadir Tipo" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Item Type" -msgstr "Agregar Item" +msgstr "Añadir Tipo de Elemento" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Node Types:" -msgstr "Tipo de nodo" +msgstr "Tipos de Nodo:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Show Default" -msgstr "Cargar Valores por Defecto" +msgstr "Mostrar Valores por Defecto" #: editor/plugins/theme_editor_plugin.cpp msgid "Show default type items alongside items that have been overridden." msgstr "" +"Mostrar los elementos de tipo por defecto junto a los elementos que han sido " +"sobrescritos." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Override All" -msgstr "Reemplazos(Overrides)" +msgstr "Anular Todo" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." -msgstr "" +msgstr "Anular todos los elementos de tipo por defecto." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme:" -msgstr "Tema" +msgstr "Theme:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Manage Items..." -msgstr "Administrar Plantillas de Exportación..." +msgstr "Administrar Elementos..." #: editor/plugins/theme_editor_plugin.cpp msgid "Add, remove, organize and import Theme items." -msgstr "" +msgstr "Añadir, eliminar, organizar e importar elementos del Theme." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Preview" -msgstr "Vista Previa" +msgstr "Añadir Vista Previa" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Default Preview" -msgstr "Actualizar Vista Previa" +msgstr "Vista Previa Por Defecto" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select UI Scene:" -msgstr "Seleccioná una Mesh de Origen:" +msgstr "Seleccionar Escena de UI:" #: editor/plugins/theme_editor_preview.cpp msgid "" "Toggle the control picker, allowing to visually select control types for " "edit." msgstr "" +"Activar el selector de controles, lo que permite seleccionar visualmente los " +"tipos de control para su edición." #: editor/plugins/theme_editor_preview.cpp msgid "Toggle Button" @@ -9065,9 +9093,8 @@ msgid "Checked Radio Item" msgstr "Radio Ítem Tildado" #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Named Separator" -msgstr "Separador con nombre." +msgstr "Separador Nomenclado" #: editor/plugins/theme_editor_preview.cpp msgid "Submenu" @@ -9120,19 +9147,19 @@ msgstr "Tiene,Muchas,Opciones" #: editor/plugins/theme_editor_preview.cpp msgid "Invalid path, the PackedScene resource was probably moved or removed." msgstr "" +"Ruta inválida, el recurso PackedScene probablemente fue movido o eliminado." #: editor/plugins/theme_editor_preview.cpp msgid "Invalid PackedScene resource, must have a Control node at its root." -msgstr "" +msgstr "Recurso PackedScene inválido, debe tener un nodo Control en la raíz." #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Invalid file, not a PackedScene resource." -msgstr "Archivo inválido. No es un layout de bus de audio." +msgstr "Archivo inválido, no es un recurso PackedScene." #: editor/plugins/theme_editor_preview.cpp msgid "Reload the scene to reflect its most actual state." -msgstr "" +msgstr "Recargar la escena para reflejar su estado actual." #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" @@ -10534,9 +10561,8 @@ msgid "VisualShader" msgstr "VisualShader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property:" -msgstr "Editar Propiedad Visual" +msgstr "Editar Propiedad Visual:" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" @@ -10664,9 +10690,8 @@ msgid "Script" msgstr "Script" #: editor/project_export.cpp -#, fuzzy msgid "GDScript Export Mode:" -msgstr "Modo de Exportación de Scipts:" +msgstr "Modo de Exportación GDScript:" #: editor/project_export.cpp msgid "Text" @@ -10674,21 +10699,21 @@ msgstr "Texto" #: editor/project_export.cpp msgid "Compiled Bytecode (Faster Loading)" -msgstr "" +msgstr "Bytecode Compilado (Carga Más Rápida)" #: editor/project_export.cpp msgid "Encrypted (Provide Key Below)" msgstr "Encriptado (Proveer la Clave Debajo)" #: editor/project_export.cpp -#, fuzzy msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" -msgstr "Clave de Encriptación Inválida (debe tener 64 caracteres de largo)" +msgstr "" +"Clave de Encriptación Inválida (debe tener 64 caracteres hexadecimales de " +"largo)" #: editor/project_export.cpp -#, fuzzy msgid "GDScript Encryption Key (256-bits as hexadecimal):" -msgstr "Clave de Encriptación de Script (256-bits como hex):" +msgstr "Clave de Encriptación de Script (256-bits en hexadecimal):" #: editor/project_export.cpp msgid "Export PCK/Zip" @@ -10762,9 +10787,8 @@ msgid "Imported Project" msgstr "Proyecto Importado" #: editor/project_manager.cpp -#, fuzzy msgid "Invalid project name." -msgstr "Nombre de Proyecto Inválido." +msgstr "Nombre de proyecto Inválido." #: editor/project_manager.cpp msgid "Couldn't create folder." @@ -10990,14 +11014,12 @@ msgid "Are you sure to run %d projects at once?" msgstr "¿Estás seguro/a que querés ejecutar %d proyectos a la vez?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove %d projects from the list?" -msgstr "Seleccionar dispositivo de la lista" +msgstr "¿Quitar %d proyectos de la lista?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove this project from the list?" -msgstr "Seleccionar dispositivo de la lista" +msgstr "¿Quitar este proyecto de la lista?" #: editor/project_manager.cpp msgid "" @@ -11031,9 +11053,8 @@ msgid "Project Manager" msgstr "Gestor de Proyectos" #: editor/project_manager.cpp -#, fuzzy msgid "Local Projects" -msgstr "Proyectos" +msgstr "Proyectos Locales" #: editor/project_manager.cpp msgid "Loading, please wait..." @@ -11044,23 +11065,20 @@ msgid "Last Modified" msgstr "Ultima Modificación" #: editor/project_manager.cpp -#, fuzzy msgid "Edit Project" -msgstr "Exportar Proyecto" +msgstr "Editar Proyecto" #: editor/project_manager.cpp -#, fuzzy msgid "Run Project" -msgstr "Renombrar Proyecto" +msgstr "Reproducir Proyecto" #: editor/project_manager.cpp msgid "Scan" msgstr "Examinar" #: editor/project_manager.cpp -#, fuzzy msgid "Scan Projects" -msgstr "Proyectos" +msgstr "Encontrar Proyectos" #: editor/project_manager.cpp msgid "Select a Folder to Scan" @@ -11071,14 +11089,12 @@ msgid "New Project" msgstr "Proyecto Nuevo" #: editor/project_manager.cpp -#, fuzzy msgid "Import Project" -msgstr "Proyecto Importado" +msgstr "Importar Proyecto" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Project" -msgstr "Renombrar Proyecto" +msgstr "Eliminar Proyecto" #: editor/project_manager.cpp msgid "Remove Missing" @@ -11089,9 +11105,8 @@ msgid "About" msgstr "Acerca de" #: editor/project_manager.cpp -#, fuzzy msgid "Asset Library Projects" -msgstr "Biblioteca de Assets" +msgstr "Proyectos de la Librería de Assets" #: editor/project_manager.cpp msgid "Restart Now" @@ -11103,7 +11118,7 @@ msgstr "Quitar Todos" #: editor/project_manager.cpp msgid "Also delete project contents (no undo!)" -msgstr "" +msgstr "También eliminar el contenido del proyecto (¡no se puede deshacer!)" #: editor/project_manager.cpp msgid "Can't run project" @@ -11118,29 +11133,27 @@ msgstr "" "¿Te gustaría explorar los ejemplos oficiales en la Biblioteca de Assets?" #: editor/project_manager.cpp -#, fuzzy msgid "Filter projects" -msgstr "Filtrar propiedades" +msgstr "Filtrar proyectos" #: editor/project_manager.cpp -#, fuzzy msgid "" "This field filters projects by name and last path component.\n" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" -"La casilla de búsqueda filtra los proyectos por nombre y el último " -"componente de la ruta.\n" -"Para filtrar los proyectos por nombre y ruta completa, la consulta debe " -"contener al menos un carácter `/`." +"Este campo filtra los proyectos por nombre y por el último componente de la " +"ruta.\n" +"Para filtrar proyectos por nombre y ruta completa, la consulta debe contener " +"al menos un carácter `/`." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Tecla " +msgid "Physical Key" +msgstr "Tecla Física" #: editor/project_settings_editor.cpp -msgid "Physical Key" -msgstr "" +msgid "Key " +msgstr "Tecla " #: editor/project_settings_editor.cpp msgid "Joy Button" @@ -11188,7 +11201,7 @@ msgstr "Dispositivo" #: editor/project_settings_editor.cpp msgid " (Physical)" -msgstr "" +msgstr " (Física)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." @@ -11331,23 +11344,20 @@ msgid "Override for Feature" msgstr "Sobreescribir para Característica" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Add %d Translations" -msgstr "Agregar Traducción" +msgstr "Añadir %d Traducciones" #: editor/project_settings_editor.cpp msgid "Remove Translation" msgstr "Quitar Traducción" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Translation Resource Remap: Add %d Path(s)" -msgstr "Remapear Recurso Agregar Remap" +msgstr "Remapeo de Recursos de Traducción: Añadir %d Ruta(s)" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Translation Resource Remap: Add %d Remap(s)" -msgstr "Remapear Recurso Agregar Remap" +msgstr "Remapeo de Recursos de Traducción: Añadir %d Remapeo(s)" #: editor/project_settings_editor.cpp msgid "Change Resource Remap Language" @@ -11792,12 +11802,16 @@ msgstr "¿Eliminar nodo \"%s\"?" msgid "" "Saving the branch as a scene requires having a scene open in the editor." msgstr "" +"Guardar la rama como una escena requiere tener una escena abierta en el " +"editor." #: editor/scene_tree_dock.cpp msgid "" "Saving the branch as a scene requires selecting only one node, but you have " "selected %d nodes." msgstr "" +"Guardar la rama como una escena requiere seleccionar sólo un nodo, pero " +"seleccionaste %d nodos." #: editor/scene_tree_dock.cpp msgid "" @@ -11806,6 +11820,11 @@ msgid "" "FileSystem dock context menu\n" "or create an inherited scene using Scene > New Inherited Scene... instead." msgstr "" +"No se puede guardar la rama del nodo raíz como una escena instanciada.\n" +"Para crear una copia editable de la escena actual, duplicala usando el menú " +"contextual del dock Sistema de Archivos\n" +"o crea una escena heredada usando Escena > Nueva Escena Heredada... en su " +"lugar." #: editor/scene_tree_dock.cpp msgid "" @@ -11813,6 +11832,10 @@ msgid "" "To create a variation of a scene, you can make an inherited scene based on " "the instanced scene using Scene > New Inherited Scene... instead." msgstr "" +"No se puede guardar la rama de una escena ya instanciada.\n" +"Para crear una variación de una escena, puedes hacer una escena heredada " +"basada en la escena instanciada usando Escena > Nueva Escena Heredada... en " +"su lugar." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -12295,7 +12318,7 @@ msgstr "Copiar Error" #: editor/script_editor_debugger.cpp msgid "Open C++ Source on GitHub" -msgstr "" +msgstr "Abrir Fuente C++ en GitHub" #: editor/script_editor_debugger.cpp msgid "Video RAM" @@ -12474,24 +12497,20 @@ msgid "Change Ray Shape Length" msgstr "Cambiar Largo de Shape Rayo" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Room Point Position" -msgstr "Setear Posición de Punto de Curva" +msgstr "Establecer Posición del Room Point" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Portal Point Position" -msgstr "Setear Posición de Punto de Curva" +msgstr "Establecer Posición del Portal Point" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Cambiar Radio de Shape Cilindro" +msgstr "Establecer Radio de la Esfera de Oclusión" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "Setear Posición de Entrada de Curva" +msgstr "Establecer Posición de la Esfera de Oclusión" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12605,14 +12624,12 @@ msgid "Object can't provide a length." msgstr "El objeto no puede proveer un largo." #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp -#, fuzzy msgid "Export Mesh GLTF2" -msgstr "Exportar Librería de Meshes" +msgstr "Exportar Malla GLTF2" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp -#, fuzzy msgid "Export GLTF..." -msgstr "Exportar..." +msgstr "Exportar GLTF..." #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -12655,9 +12672,8 @@ msgid "GridMap Paint" msgstr "Pintar GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Selection" -msgstr "Llenar Selección en GridMap" +msgstr "Selección de GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" @@ -12780,9 +12796,8 @@ msgid "Class name can't be a reserved keyword" msgstr "El nombre de la clase no puede ser una palabra reservada" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Llenar la Selección" +msgstr "Construir Solución" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -12914,14 +12929,12 @@ msgid "Add Output Port" msgstr "Agregar Puerto de Salida" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Port Type" -msgstr "Cambiar Tipo" +msgstr "Cambiar Tipo de Puerto" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Port Name" -msgstr "Cambiar nombre del puerto de entrada" +msgstr "Cambiar Nombre de Puerto" #: modules/visual_script/visual_script_editor.cpp msgid "Override an existing built-in function." @@ -13036,9 +13049,8 @@ msgid "Add Preload Node" msgstr "Agregar Nodo Preload" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Node(s)" -msgstr "Agregar Nodo" +msgstr "Agregar Nodo(s)" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -13305,37 +13317,31 @@ msgstr "Seleccionar dispositivo de la lista" #: platform/android/export/export_plugin.cpp msgid "Running on %s" -msgstr "" +msgstr "Ejecutando en %s" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exporting APK..." -msgstr "Exportar Todo" +msgstr "Exportar APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Uninstalling..." -msgstr "Desinstalar" +msgstr "Desinstalando..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Installing to device, please wait..." -msgstr "Cargando, esperá, por favor..." +msgstr "Instalando en el dispositivo, espera por favor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not install to device: %s" -msgstr "No se pudo instanciar la escena!" +msgstr "No se pudo instalar en el dispositivo: %s" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Running on device..." -msgstr "Ejecutando Script Personalizado..." +msgstr "Ejecutando en el dispositivo..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not execute on device." -msgstr "No se pudo crear la carpeta." +msgstr "No se ha podido ejecutar en el dispositivo." #: platform/android/export/export_plugin.cpp msgid "Unable to find the 'apksigner' tool." @@ -13446,40 +13452,38 @@ msgid "" "directory.\n" "The resulting %s is unsigned." msgstr "" +"No se ha encontrado 'apksigner'.\n" +"Por favor, comprobá que el comando esté disponible en el directorio Android " +"SDK build-tools.\n" +"El %s resultante está sin firmar." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." -msgstr "" +msgstr "Firmando %s debug..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signing release %s..." -msgstr "" -"Examinando Archivos,\n" -"Aguardá, por favor." +msgstr "Firmando %s release..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find keystore, unable to export." -msgstr "No se pudo abrir la plantilla para exportar:" +msgstr "No se pudo encontrar la keystore, no se puedo exportar." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" -msgstr "" +msgstr "'apksigner' ha retornado con error #%d" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Verifying %s..." -msgstr "Agregando %s..." +msgstr "Verificando %s..." #: platform/android/export/export_plugin.cpp msgid "'apksigner' verification of %s failed." -msgstr "" +msgstr "La verificación de 'apksigner' de %s ha fallado." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exporting for Android" -msgstr "Exportar Todo" +msgstr "Exportando para Android" #: platform/android/export/export_plugin.cpp msgid "Invalid filename! Android App Bundle requires the *.aab extension." @@ -13496,7 +13500,7 @@ msgstr "¡Nombre de archivo inválido! Android APK requiere la extensión *.apk. #: platform/android/export/export_plugin.cpp msgid "Unsupported export format!\n" -msgstr "" +msgstr "¡Formato de exportación no soportado!\n" #: platform/android/export/export_plugin.cpp msgid "" @@ -13524,16 +13528,17 @@ msgstr "" msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name" msgstr "" +"No se pudieron sobrescribir los archivos res://android/build/res/*.xml con " +"el nombre del proyecto" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project\n" -msgstr "No se pudo obtener project.godot en la ruta de proyecto." +msgstr "" +"No se pudieron exportar los archivos del proyecto a un proyecto gradle\n" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not write expansion package file!" -msgstr "No se pudo escribir el archivo:" +msgstr "¡No se pudo escribir el archivo del paquete de expansión!" #: platform/android/export/export_plugin.cpp msgid "Building Android Project (gradle)" @@ -13561,21 +13566,20 @@ msgstr "" "directorio del proyecto de gradle para ver los resultados." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: %s" -msgstr "No se encontró la animación: '%s'" +msgstr "Paquete no encontrado:% s" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Creating APK..." -msgstr "Creando contornos..." +msgstr "Creando APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Could not find template APK to export:\n" "%s" -msgstr "No se pudo abrir la plantilla para exportar:" +msgstr "" +"No se pudo encontrar la plantilla APK para exportar:\n" +"%s" #: platform/android/export/export_plugin.cpp msgid "" @@ -13584,24 +13588,26 @@ msgid "" "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" +"Bibliotecas faltantes en la plantilla de exportación para las arquitecturas " +"seleccionadas: %s.\n" +"Por favor, construya una plantilla con todas las bibliotecas necesarias, o " +"desmarque las arquitecturas faltantes en el preset de exportación." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Adding files..." -msgstr "Agregando %s..." +msgstr "Agregando archivos..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files" -msgstr "No se pudo escribir el archivo:" +msgstr "No se pudieron exportar los archivos del proyecto" #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." -msgstr "" +msgstr "Alineando APK..." #: platform/android/export/export_plugin.cpp msgid "Could not unzip temporary unaligned APK." -msgstr "" +msgstr "No se pudo descomprimir el APK temporal no alineado." #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Identifier is missing." @@ -13649,45 +13655,40 @@ msgid "Could not write file:" msgstr "No se pudo escribir el archivo:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file:" -msgstr "No se pudo escribir el archivo:" +msgstr "No se pudo leer el archivo:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell:" -msgstr "No se pudo leer el shell HTML personalizado:" +msgstr "No se pudo leer el shell HTML:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory:" -msgstr "No se pudo crear la carpeta." +msgstr "No se pudo crear el directorio del servidor HTTP:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server:" -msgstr "Error al guardar escena." +msgstr "Error al iniciar el servidor HTTP:" #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid bundle identifier:" -msgstr "Identificador inválido:" +msgstr "Identificador de paquete no válido:" #: platform/osx/export/export.cpp msgid "Notarization: code signing required." -msgstr "" +msgstr "Notarización: se requiere firma de código." #: platform/osx/export/export.cpp msgid "Notarization: hardened runtime required." -msgstr "" +msgstr "Notarización: se requiere hardened runtime." #: platform/osx/export/export.cpp msgid "Notarization: Apple ID name not specified." -msgstr "" +msgstr "Notarización: nombre de ID de Apple no especificado." #: platform/osx/export/export.cpp msgid "Notarization: Apple ID password not specified." -msgstr "" +msgstr "Notarización: contraseña de ID de Apple no especificada." #: platform/uwp/export/export.cpp msgid "Invalid package short name." @@ -14132,6 +14133,9 @@ msgid "" "longer has any effect.\n" "To remove this warning, disable the GIProbe's Compress property." msgstr "" +"La propiedad Compress de GIProbe ha quedado obsoleta debido a errores " +"conocidos y ya no tiene ningún efecto.\n" +"Para eliminar esta advertencia, desactiva la propiedad Compress de GIProbe." #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." @@ -14154,11 +14158,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "No se ha establecido ninguna forma." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Sólo se admiten escalas uniformes." #: scene/3d/particles.cpp msgid "" @@ -14229,15 +14233,15 @@ msgstr "El nodo A y el nodo B deben ser diferentes PhysicsBody" #: scene/3d/portal.cpp msgid "The RoomManager should not be a child or grandchild of a Portal." -msgstr "" +msgstr "El RoomManager no debe ser hijo o nieto de un Portal." #: scene/3d/portal.cpp msgid "A Room should not be a child or grandchild of a Portal." -msgstr "" +msgstr "Una Room no debe ser hijo o nieto de un Portal." #: scene/3d/portal.cpp msgid "A RoomGroup should not be a child or grandchild of a Portal." -msgstr "" +msgstr "Un RoomGroup no debe ser hijo o nieto de un Portal." #: scene/3d/remote_transform.cpp msgid "" @@ -14249,79 +14253,98 @@ msgstr "" #: scene/3d/room.cpp msgid "A Room cannot have another Room as a child or grandchild." -msgstr "" +msgstr "Una Room no puede tener otra Room como hija o nieta." #: scene/3d/room.cpp msgid "The RoomManager should not be placed inside a Room." -msgstr "" +msgstr "El RoomManager no debe ubicarse dentro de una Room." #: scene/3d/room.cpp msgid "A RoomGroup should not be placed inside a Room." -msgstr "" +msgstr "Un RoomGroup no debe colocarse dentro de una Room." #: scene/3d/room.cpp msgid "" "Room convex hull contains a large number of planes.\n" "Consider simplifying the room bound in order to increase performance." msgstr "" +"El cuerpo convexo de la room contiene un gran número de planos.\n" +"Considera la posibilidad de simplificar los límites de la room para aumentar " +"el rendimiento." #: scene/3d/room_group.cpp msgid "The RoomManager should not be placed inside a RoomGroup." -msgstr "" +msgstr "El RoomManager no debe colocarse dentro de un RoomGroup." #: scene/3d/room_manager.cpp msgid "The RoomList has not been assigned." -msgstr "" +msgstr "La RoomList no ha sido asignada." #: scene/3d/room_manager.cpp msgid "The RoomList node should be a Spatial (or derived from Spatial)." -msgstr "" +msgstr "El nodo RoomList debe ser un Spatial (o derivado de Spatial)." #: scene/3d/room_manager.cpp msgid "" "Portal Depth Limit is set to Zero.\n" "Only the Room that the Camera is in will render." msgstr "" +"El Límite de Profundidad del Portal está ajustado a cero.\n" +"Sólo se renderizará la room en la que se encuentra la cámara." #: scene/3d/room_manager.cpp msgid "There should only be one RoomManager in the SceneTree." -msgstr "" +msgstr "Sólo debe haber un RoomManager en el SceneTree." #: scene/3d/room_manager.cpp msgid "" "RoomList path is invalid.\n" "Please check the RoomList branch has been assigned in the RoomManager." msgstr "" +"La ruta del RoomList no es válida.\n" +"Por favor, comprueba que la rama de la RoomList ha sido asignada al " +"RoomManager." #: scene/3d/room_manager.cpp msgid "RoomList contains no Rooms, aborting." -msgstr "" +msgstr "La RoomList no contiene Rooms, abortando." #: scene/3d/room_manager.cpp msgid "Misnamed nodes detected, check output log for details. Aborting." msgstr "" +"Nodos con nombres incorrectos detectados, comprueba la salida del Log para " +"más detalles. Abortando." #: scene/3d/room_manager.cpp msgid "Portal link room not found, check output log for details." msgstr "" +"No se encuentra Portal link room, comprueba la salida del Log para más " +"detalles." #: scene/3d/room_manager.cpp msgid "" "Portal autolink failed, check output log for details.\n" "Check the portal is facing outwards from the source room." msgstr "" +"Fallo en el Portal autolink, comprueba la salida del Log para más detalles.\n" +"Comprueba si el portal está mirando hacia fuera de la room de origen." #: scene/3d/room_manager.cpp msgid "" "Room overlap detected, cameras may work incorrectly in overlapping area.\n" "Check output log for details." msgstr "" +"Detectada superposición de la Room, las cámaras pueden funcionar " +"incorrectamente en las zonas donde hay superposición.\n" +"Comrpueba la salida del Log para más detalles." #: scene/3d/room_manager.cpp msgid "" "Error calculating room bounds.\n" "Ensure all rooms contain geometry or manual bounds." msgstr "" +"Error al calcular los límites de la room.\n" +"Asegurate de que todas las rooms contengan geometría o límites manuales." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -14387,7 +14410,7 @@ msgstr "No se encontró la animación: '%s'" #: scene/animation/animation_player.cpp msgid "Anim Apply Reset" -msgstr "" +msgstr "Aplicar Reset de Animación" #: scene/animation/animation_tree.cpp msgid "In node '%s', invalid animation: '%s'." @@ -14496,6 +14519,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Las opciones Tile y Tile Fit para las propiedades Axis Stretch sólo son " +"efectivas cuando se utiliza el backend de renderizado GLES3.\n" +"El backend GLES2 está actualmente en uso, por lo que estos modos actuarán " +"como Stretch en su lugar." #: scene/gui/popup.cpp msgid "" @@ -14533,6 +14560,19 @@ msgstr "" "El Entorno por Defecto especificado en Configuración del Editor (Rendering -" "> Viewport -> Entorno por Defecto) no pudo ser cargado." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"Los tiempos de espera del temporizador muy bajos (< 0,05 segundos) pueden " +"comportarse de manera significativamente diferente dependiendo de la " +"velocidad de fotogramas renderizados o de la física.\n" +"Considera la posibilidad de utilizar un bucle en process dentro del script " +"en lugar de depender de un Timer para tiempos de espera muy bajos." + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14546,12 +14586,16 @@ msgstr "" "textura interna a algún otro nodo para mostrar." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." -msgstr "El tamaño del viewport debe ser mayor a 0 para poder renderizar." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." +msgstr "" +"El tamaño del Viewport debe ser mayor o igual a 2 píxeles en ambas " +"dimensiones para renderizar cualquier cosa." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "Establecer Esferas OccluderShapeSphere" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -14574,25 +14618,29 @@ msgid "Invalid comparison function for that type." msgstr "Función de comparación inválida para este tipo." #: servers/visual/shader_language.cpp -#, fuzzy msgid "Varying may not be assigned in the '%s' function." -msgstr "Solo se pueden asignar variaciones en funciones de vértice." +msgstr "No se pueden asignar varyings a la función '%s'." #: servers/visual/shader_language.cpp msgid "" "Varyings which assigned in 'vertex' function may not be reassigned in " "'fragment' or 'light'." msgstr "" +"Las varyings que fueron asignadas en una función 'vertex' no pueden ser " +"reasignadas en 'fragment' o 'light'." #: servers/visual/shader_language.cpp msgid "" "Varyings which assigned in 'fragment' function may not be reassigned in " "'vertex' or 'light'." msgstr "" +"Las varyings que fueron asignadas en una función 'fragment' no pueden ser " +"reasignadas en 'vertex' o 'light'." #: servers/visual/shader_language.cpp msgid "Fragment-stage varying could not been accessed in custom function!" msgstr "" +"¡No se pudo acceder a la fragment-stage varying en la función personalizada!" #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -16244,9 +16292,6 @@ msgstr "Las constantes no pueden modificarse." #~ msgid "Couldn't save atlas image:" #~ msgstr "No se pudo guardar la imagen de atlas:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "No se pudo guardar la textura convertida:" - #~ msgid "Invalid translation source!" #~ msgstr "Fuente de traducción inválida!" diff --git a/editor/translations/et.po b/editor/translations/et.po index 2c59035681..4dba826523 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -10,6 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2021-07-16 05:47+0000\n" "Last-Translator: Kritzmensch <streef.gtx@gmail.com>\n" "Language-Team: Estonian <https://hosted.weblate.org/projects/godot-engine/" @@ -2377,6 +2378,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Salvesta kõik stseenid" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Avatud stseeni ei saa üle kirjutada!" @@ -2494,6 +2503,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2823,10 +2836,6 @@ msgid "Save Scene" msgstr "Salvesta stseen" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Salvesta kõik stseenid" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Teisenda..." @@ -4245,6 +4254,18 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Taasimpordi" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Impordi kui:" @@ -4253,10 +4274,6 @@ msgid "Preset" msgstr "Eelseadistus" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Taasimpordi" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -7145,11 +7162,13 @@ msgid "Move Down" msgstr "Liiguta allapoole" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Järgmine skript" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Eelmine skript" #: editor/plugins/script_editor_plugin.cpp @@ -7495,11 +7514,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7563,7 +7582,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "Perspektiiv" #: editor/plugins/spatial_editor_plugin.cpp @@ -7571,6 +7590,11 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Right Perspective" +msgstr "Perspektiiv" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7922,6 +7946,27 @@ msgid "Right View" msgstr "Paremvaade" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Eesvaade" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10723,11 +10768,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13859,6 +13904,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13868,7 +13921,10 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +#, fuzzy +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "Vaateakne suurus peab olema suurem kui 0, et kuvada." #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/eu.po b/editor/translations/eu.po index ddcf8f5d37..be9638fa8f 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -9,6 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2021-07-29 02:34+0000\n" "Last-Translator: Sergio Varela <sergitroll9@gmail.com>\n" "Language-Team: Basque <https://hosted.weblate.org/projects/godot-engine/" @@ -2354,6 +2355,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2470,6 +2479,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2792,10 +2805,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4223,15 +4232,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7123,11 +7140,12 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Scripta" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7473,11 +7491,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7538,7 +7556,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7546,6 +7564,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7887,6 +7909,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10684,11 +10726,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13814,6 +13856,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13823,7 +13873,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 2d086fe827..54715f5c9d 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -22,12 +22,14 @@ # YASAN <yasandev@gmail.com>, 2021. # duniyal ras <duniyalr@gmail.com>, 2021. # عبدالرئوف عابدی <abdolraoofabedi@gmail.com>, 2021. +# Alireza Khodabande <alirezakhodabande74@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-08-27 08:25+0000\n" -"Last-Translator: عبدالرئوف عابدی <abdolraoofabedi@gmail.com>\n" +"PO-Revision-Date: 2021-09-29 02:21+0000\n" +"Last-Translator: Alireza Khodabande <alirezakhodabande74@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot/fa/>\n" "Language: fa\n" @@ -35,7 +37,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -361,7 +363,7 @@ msgstr "حذف ترک انیمشین" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp msgid "Create NEW track for %s and insert key?" -msgstr "یک ترک جدید برای s% بساز و کلید را درج کن؟" +msgstr "یک ترک جدید برای %s بساز و کلید را درج کن؟" #: editor/animation_track_editor.cpp msgid "Create %d NEW tracks and insert keys?" @@ -902,11 +904,11 @@ msgstr "سیگنال:" #: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" -msgstr "'s%' را به 's%' متصل کن" +msgstr "'%s' را به '%s' متصل کن" #: editor/connections_dialog.cpp msgid "Disconnect '%s' from '%s'" -msgstr "'s%' را از 's%' جدا کن" +msgstr "'%s' را از '%s' جدا کن" #: editor/connections_dialog.cpp msgid "Disconnect all from signal: '%s'" @@ -1022,7 +1024,7 @@ msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" -"ویرایش صحنه 's%' شروع شده است.\n" +"ویرایش صحنه '%s' شروع شده است.\n" "تغییرات تنها وقتی جلوه گرند که از نو بارگیری شوند." #: editor/dependency_editor.cpp @@ -1030,7 +1032,7 @@ msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" -"منابع 's%' بکار رفتهاند.\n" +"منابع '%s' بکار رفتهاند.\n" "تغییرات تنها وقتی جلوه گرند که از نو بارگیری شوند." #: editor/dependency_editor.cpp @@ -1132,7 +1134,7 @@ msgstr "خطا در بارگذاری!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "به طور دائمی تعداد 'd%' آیتم را حذف کند؟ (بدون undo !)" +msgstr "به طور دائمی تعداد '%d' آیتم را حذف کند؟ (بدون undo !)" #: editor/dependency_editor.cpp msgid "Show Dependencies" @@ -1517,7 +1519,7 @@ msgstr "کلمه کلیدی نمی تواند به عنوان یک نام خود #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "بارگذاری خودکار 's%' هم اکنون موجود است!" +msgstr "بارگذاری خودکار '%s' هم اکنون موجود است!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" @@ -2396,6 +2398,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "ذخیره صحنه" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2512,6 +2522,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2834,10 +2848,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "ذخیره صحنه" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4181,7 +4191,7 @@ msgstr "" #: editor/groups_editor.cpp #, fuzzy msgid "Group name already exists." -msgstr "بارگذاری خودکار 's%' هم اکنون موجود است!" +msgstr "بارگذاری خودکار '%s' هم اکنون موجود است!" #: editor/groups_editor.cpp #, fuzzy @@ -4213,11 +4223,11 @@ msgstr "صافی کردن گرهها" #: editor/groups_editor.cpp msgid "Nodes in Group" -msgstr "" +msgstr "گره ها در گروه" #: editor/groups_editor.cpp msgid "Empty groups will be automatically removed." -msgstr "" +msgstr "گروه های خالی به طور خودکار حذف خواهند شد." #: editor/groups_editor.cpp #, fuzzy @@ -4262,7 +4272,7 @@ msgstr "وارد کردن با اشیا و مواد و انیمیشن ها" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" -msgstr "" +msgstr "وارد کردن به عنوان صحنه های چندگانه" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" @@ -4275,7 +4285,7 @@ msgstr "" #: editor/import/resource_importer_scene.cpp msgid "Importing Scene..." -msgstr "" +msgstr "وارد کردن صحنه..." #: editor/import/resource_importer_scene.cpp msgid "Generating Lightmaps" @@ -4342,6 +4352,18 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "وارد کردن دوباره" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "" @@ -4351,10 +4373,6 @@ msgid "Preset" msgstr "بازنشانی بزرگنمایی" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "وارد کردن دوباره" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -4652,7 +4670,7 @@ msgstr "گره انیمیشن" #: editor/plugins/animation_blend_space_2d_editor.cpp #, fuzzy msgid "Triangle already exists." -msgstr "بارگذاری خودکار 's%' هم اکنون موجود است!" +msgstr "بارگذاری خودکار '%s' هم اکنون موجود است!" #: editor/plugins/animation_blend_space_2d_editor.cpp #, fuzzy @@ -4857,7 +4875,7 @@ msgstr "نام نامعتبر." #: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Animation name already exists!" -msgstr "بارگذاری خودکار 's%' هم اکنون موجود است!" +msgstr "بارگذاری خودکار '%s' هم اکنون موجود است!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -7413,12 +7431,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "صحنه جدید" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "زبانه قبلی" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7586,7 +7606,7 @@ msgstr "" #, fuzzy msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." -msgstr "'s%' را از 's%' جدا کن" +msgstr "'%s' را از '%s' جدا کن" #: editor/plugins/script_text_editor.cpp msgid "[Ignore]" @@ -7794,15 +7814,15 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Create Rest Pose from Bones" msgstr "پخش سفارشی صحنه" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" -msgstr "" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "" @@ -7862,7 +7882,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7871,6 +7891,10 @@ msgid "Right Orthogonal" msgstr "دکمهٔ راست." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8228,6 +8252,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -11205,11 +11249,11 @@ msgstr "" "`کاراکتر باشد." #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -11233,7 +11277,7 @@ msgstr "" #: editor/project_settings_editor.cpp #, fuzzy msgid "An action with the name '%s' already exists." -msgstr "بارگذاری خودکار 's%' هم اکنون موجود است!" +msgstr "بارگذاری خودکار '%s' هم اکنون موجود است!" #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -13384,7 +13428,7 @@ msgstr "مسیر به یک نود نمیرسد!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." -msgstr "نام دارایی ایندکس نامعتبر 's%' در نود s%." +msgstr "نام دارایی ایندکس نامعتبر '%s' در نود %s." #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -14452,14 +14496,13 @@ msgid "In node '%s', invalid animation: '%s'." msgstr "" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Invalid animation: '%s'." -msgstr "اندازهٔ قلم نامعتبر." +msgstr "انیمیشن نامعتبر: '%s'." #: scene/animation/animation_tree.cpp #, fuzzy msgid "Nothing connected to input '%s' of node '%s'." -msgstr "'s%' را از 's%' جدا کن" +msgstr "'%s' را از '%s' جدا کن" #: scene/animation/animation_tree.cpp msgid "No root AnimationNode for the graph is set." @@ -14500,7 +14543,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "Raw" -msgstr "" +msgstr "خام" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -14537,7 +14580,7 @@ msgstr "باید یک پسوند معتبر بکار گیرید." #: scene/gui/graph_edit.cpp msgid "Enable grid minimap." -msgstr "" +msgstr "فعال سازی شبکه نقشه کوچک." #: scene/gui/nine_patch_rect.cpp msgid "" @@ -14579,6 +14622,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14592,7 +14643,9 @@ msgstr "" "بافت داخلی آن را برای نمایش به تعدادی گره تخصیص دهید." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp @@ -14606,19 +14659,16 @@ msgid "" msgstr "" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid source for preview." -msgstr "اندازهٔ قلم نامعتبر." +msgstr "منبع نامعتبر برای پیش نمایش." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid source for shader." -msgstr "اندازهٔ قلم نامعتبر." +msgstr "منبع نامعتبر برای شیدر." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "اندازهٔ قلم نامعتبر." +msgstr "عمل مقایسه نامعتبر بزای این نوع." #: servers/visual/shader_language.cpp msgid "Varying may not be assigned in the '%s' function." @@ -14776,7 +14826,7 @@ msgstr "ثوابت قابل تغییر نیستند." #~ msgstr "صحنه جدید" #~ msgid "Replaced %d occurrence(s)." -#~ msgstr "تعداد d% رخداد جایگزین شد." +#~ msgstr "تعداد %d رخداد جایگزین شد." #, fuzzy #~ msgid "Brief Description" @@ -15182,7 +15232,7 @@ msgstr "ثوابت قابل تغییر نیستند." #~ "اسپرایت تنظیم شود تا کار کند." #~ msgid "Method List For '%s':" -#~ msgstr "لیست متد برای 's%' :" +#~ msgstr "لیست متد برای '%s' :" #~ msgid "Return:" #~ msgstr "بازگشت:" @@ -15223,7 +15273,7 @@ msgstr "ثوابت قابل تغییر نیستند." #~ "SpatialSamplePlayer آهنگ را پخش کند." #~ msgid "Replaced %d Ocurrence(s)." -#~ msgstr "تعداد d% رخداد جایگزین شد." +#~ msgstr "تعداد %d رخداد جایگزین شد." #, fuzzy #~ msgid "Create Android keystore" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 79a1e722b5..b3fc0d100b 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -15,8 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-21 15:22+0000\n" +"PO-Revision-Date: 2021-10-28 22:09+0000\n" "Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -1301,7 +1302,7 @@ msgstr "Assettien asentaja" #: editor/editor_audio_buses.cpp msgid "Speakers" -msgstr "Kaiuttimiet" +msgstr "Kaiuttimet" #: editor/editor_audio_buses.cpp msgid "Add Effect" @@ -2209,7 +2210,7 @@ msgstr "Signaali" #: editor/editor_help_search.cpp msgid "Constant" -msgstr "Muuttumaton" +msgstr "Vakio" #: editor/editor_help_search.cpp msgid "Property" @@ -2405,6 +2406,14 @@ msgstr "" "Skeneä ei voitu tallentaa. Mahdollisia riippuvuuksia (ilmentymiä tai " "perintää) ei voida toteuttaa." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Yhtä tai useampaa skeneä ei voitu tallentaa!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Tallenna kaikki skenet" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Ei voida ylikirjoittaa vielä auki olevaa skeneä!" @@ -2540,6 +2549,11 @@ msgid "Save changes to '%s' before closing?" msgstr "Tallennetaanko muutokset tiedostoon '%s' ennen sulkemista?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" +"%s ei ole enää olemassa! Ole hyvä ja määrittele uusi tallennussijainti." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2585,29 +2599,27 @@ msgstr "Nykyistä skeneä ei ole tallennettu. Avaa joka tapauksessa?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Ei voida kumota hiiren painikkeiden ollessa painettuina." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Ei ole mitään kumottavaa." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Peru" +msgstr "Kumoa: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Ei voida tehdä uudelleen hiiren painikkeiden ollessa painettuina." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Ei ole mitään uudelleen tehtävää." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Tee uudelleen" +msgstr "Tee uudelleen: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2886,10 +2898,6 @@ msgid "Save Scene" msgstr "Tallenna skene" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Tallenna kaikki skenet" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Muunna..." @@ -3289,9 +3297,8 @@ msgid "Merge With Existing" msgstr "Yhdistä olemassaolevaan" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Animaatio: muuta muunnosta" +msgstr "Käytä MeshInstance muunnoksia" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3554,7 +3561,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Pikalataus" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -4373,6 +4380,23 @@ msgid "Clear Default for '%s'" msgstr "Poista oletus valinnalta '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Tuo uudelleen" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Sinulla on avoinna olevia muutoksia, joita ei ole vielä otettu käyttöön. " +"Napsauta Tuo uudelleen ottaaksesi tuontivalinnoissa tehdyt muutokset " +"käyttöön.\n" +"Toisen resurssin valitseminen Tiedostojärjestelmä-telakassa ilman, että Tuo " +"uudelleen on tehty hylkää Tuonti-telakassa tehdyt muutokset." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Tuo nimellä:" @@ -4381,10 +4405,6 @@ msgid "Preset" msgstr "Esiasetukset" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Tuo uudelleen" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Tallenna skenet, tuo uudelleen ja käynnistä uudelleen" @@ -5007,7 +5027,7 @@ msgstr "Pakota valkoisen modulaatio" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Include Gizmos (3D)" -msgstr "Näytä 3D-muokkaimet" +msgstr "Näytä 3D-vempaimet" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pin AnimationPlayer" @@ -5661,15 +5681,13 @@ msgstr "Siirrä CanvasItem \"%s\" koordinaattiin (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Lukitse valitut" +msgstr "Lukittu" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Ryhmät" +msgstr "Ryhmitetty" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6612,14 +6630,12 @@ msgid "Remove Selected Item" msgstr "Poista valitut kohteet" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Tuo skenestä" +msgstr "Tuo skenestä (sivuuta muunnokset)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Tuo skenestä" +msgstr "Tuo skenestä (käytä muunnoksia)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7213,14 +7229,12 @@ msgid "Flip Portal" msgstr "Käännä portaali" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "Tyhjennä muunnos" +msgstr "Aseta peittäjän muunnos" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Luo solmu" +msgstr "Keskitä solmu" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7357,11 +7371,11 @@ msgid "Move Down" msgstr "Siirrä alas" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "Seuraava skripti" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "Edellinen skripti" #: editor/plugins/script_editor_plugin.cpp @@ -7713,26 +7727,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Tällä luurangolla ei ole luita, luo joitakin Bone2D alisolmuja." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Luo lepoasento luista" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Aseta lepoasento luille" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Luo lepoasento luista" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Aseta luut lepoasentoon" +msgstr "Palauta lepoasentoon" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Ylikirjoita" +msgstr "Ylikirjoita lepoasento" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7759,69 +7771,62 @@ msgid "Perspective" msgstr "Perspektiivi" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Ortogonaalinen" +msgstr "Yläortogonaalinen" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Perspektiivi" +msgstr "Yläperspektiivi" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Ortogonaalinen" +msgstr "Alaortogonaalinen" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Perspektiivi" +msgstr "Alaperspektiivi" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Ortogonaalinen" +msgstr "Vasen ortogonaalinen" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Perspektiivi" +msgid "Left Perspective" +msgstr "Vasen perspektiivi" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Ortogonaalinen" +msgstr "Oikea ortogonaalinen" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Oikea perspektiivi" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Ortogonaalinen" +msgstr "Etuortogonaalinen" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Perspektiivi" +msgstr "Etuperspektiivi" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Ortogonaalinen" +msgstr "Takaortogonaalinen" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Perspektiivi" +msgstr "Takaperspektiivi" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [automaattinen]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [portaalit aktiivisia]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -7992,7 +7997,7 @@ msgstr "Näytä ympäristö" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Gizmos" -msgstr "Näytä muokkaimet" +msgstr "Näytä vempaimet" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" @@ -8095,9 +8100,9 @@ msgid "" msgstr "" "Napsauta vaihtaaksesi näkyvyystilojen välillä.\n" "\n" -"Avoin silmä: muokkain on näkyvissä.\n" -"Suljettu silmä: muokkain on piilotettu.\n" -"Puoliavoin silmä: muokkain on näkyvissä myös läpikuultamattomien pintojen " +"Avoin silmä: vempain on näkyvissä.\n" +"Suljettu silmä: vempain on piilotettu.\n" +"Puoliavoin silmä: vempain on näkyvissä myös läpikuultamattomien pintojen " "läpi (\"röntgen\")." #: editor/plugins/spatial_editor_plugin.cpp @@ -8145,6 +8150,26 @@ msgid "Right View" msgstr "Oikea näkymä" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "Kiertoratanäkymä alas" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "Kiertoratanäkymä vasemmalle" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "Kiertoratanäkymä oikealle" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "Kiertoratanäkymä ylös" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "Kiertoratanäkymä 180" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Vaihda perspektiiviseen/ortogonaaliseen näkymään" @@ -8203,7 +8228,7 @@ msgstr "4 Näyttöruutua" #: editor/plugins/spatial_editor_plugin.cpp msgid "Gizmos" -msgstr "Muokkaimet" +msgstr "Vempaimet" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" @@ -8215,12 +8240,11 @@ msgstr "Näytä ruudukko" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Portal Culling" -msgstr "Näytä portaalien harvennus" +msgstr "Näytä portaaliharvennus" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Näytä portaalien harvennus" +msgstr "Näytä peittoharvennus" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8288,9 +8312,8 @@ msgid "Post" msgstr "Jälki" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "Nimetön projekti" +msgstr "Nimetön vempain" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -8458,7 +8481,7 @@ msgstr "Lisää tekstuuri tiedostosta" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" -msgstr "Lisää ruudut Sprite Sheetistä" +msgstr "Lisää ruudut sprite-arkista" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -8494,7 +8517,7 @@ msgstr "Valitse tai tyhjää kaikki ruudut" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Create Frames from Sprite Sheet" -msgstr "Luo ruudut Sprite Sheetistä" +msgstr "Luo ruudut sprite-arkista" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" @@ -11060,14 +11083,14 @@ msgstr "" "mukana vähintään yksi `/` merkki." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Näppäin " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "Fyysinen avain" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Näppäin " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Ohjaimen painike" @@ -12414,14 +12437,12 @@ msgid "Set Portal Point Position" msgstr "Aseta portaalin pisteen sijainti" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Muuta sylinterimuodon sädettä" +msgstr "Aseta peittopallon säde" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "Aseta käyrän aloitussijainti" +msgstr "Aseta peittopallon sijainti" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12709,9 +12730,8 @@ msgid "Class name can't be a reserved keyword" msgstr "Luokan nimi ei voi olla varattu avainsana" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Täytä valinta" +msgstr "Muodosta ratkaisu" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -14051,11 +14071,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "Mitään muotoa ei ole asetettu." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Vain uniform-skaalat ovat tuettuja." #: scene/3d/particles.cpp msgid "" @@ -14408,6 +14428,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Tile ja Tile Fit valinnat Axis Stretch ominaisuuksille vaikuttavat " +"ainoastaan GLES3 renderöintiä käytettäessä.\n" +"GLES2 on parhaillaan käytössä, joten nämä tilat toimivat sen sijaan samaan " +"tapaan kuin Stretch." #: scene/gui/popup.cpp msgid "" @@ -14445,6 +14469,19 @@ msgstr "" "Projektin asetuksissa määriteltyä oletusympäristöä (Rendering -> Environment " "-> Default Environment) ei voitu ladata." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"Hyvin alhaiset ajastimen odotusajat (< 0,05 sekuntia) saattavat käyttäytyä " +"merkittävästi eri tavoilla riippuen renderöinnin tai fysiikan " +"päivitystaajuudesta.\n" +"Harkitse skriptin prosessointisilmukan käyttöä Timer solmun hyvin alhaiseen " +"odotusaikaan luottamisen sijaan." + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14458,13 +14495,16 @@ msgstr "" "johonkin solmuun näkyväksi." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" -"Näyttöruudun koko on oltava suurempi kuin 0, jotta mitään renderöidään." +"Näyttöruudun koko on oltava suurempi tai yhtä suuri kuin kaksi pikseliä " +"kummassakin suunnassa, jotta mitään renderöidään." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "Aseta pallot OccluderShapeSpherelle" #: scene/resources/visual_shader_nodes.cpp msgid "" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index c227244f65..84d4b6ff2a 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -7,11 +7,13 @@ # Bakainkorp <Ryan.Bautista86@myhunter.cuny.edu>, 2019. # Jethro Parker <lionbearjet@hotmail.com>, 2020. # Sven Sorupia <stsorupia@gmail.com>, 2021. +# Napstaguy04 <brokenscreen3@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2021-06-07 23:43+0000\n" -"Last-Translator: Sven Sorupia <stsorupia@gmail.com>\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" +"PO-Revision-Date: 2021-11-19 08:44+0000\n" +"Last-Translator: Napstaguy04 <brokenscreen3@gmail.com>\n" "Language-Team: Filipino <https://hosted.weblate.org/projects/godot-engine/" "godot/fil/>\n" "Language: fil\n" @@ -19,7 +21,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 " "|| n % 10 == 6 || n % 10 == 9);\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2333,6 +2335,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2449,6 +2459,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2768,10 +2782,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4178,15 +4188,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7077,11 +7095,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7427,11 +7445,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7491,7 +7509,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7499,6 +7517,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7836,6 +7858,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10595,11 +10637,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -10828,7 +10870,7 @@ msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" -msgstr "" +msgstr "Pangkalahatan" #: editor/project_settings_editor.cpp msgid "Override For..." @@ -13717,6 +13759,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13726,7 +13776,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 9416a14cdc..8da997112f 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -35,7 +35,7 @@ # Rémi Verschelde <rverschelde@gmail.com>, 2016-2017. # Robin Arys <robinarys@hotmail.com>, 2017. # Roger BR <drai_kin@hotmail.com>, 2016. -# salty64 <cedric.arrabie@univ-pau.fr>, 2018, 2020. +# salty64 <cedric.arrabie@univ-pau.fr>, 2018, 2020, 2021. # Thomas Baijot <thomasbaijot@gmail.com>, 2016, 2019. # Tommy Melançon-Roy <tommel1234@hotmail.com>, 2017-2018. # Willow <theotimefd@aol.com>, 2018. @@ -49,7 +49,7 @@ # Brice Lobet <tempo.data@gmail.com>, 2018. # Florent Wijanto <f_wijanto@hotmail.com>, 2018. # Olivier gareau <olivier.gareau@protonmail.com>, 2018. -# Rémi Verschelde <akien@godotengine.org>, 2018, 2019, 2020. +# Rémi Verschelde <akien@godotengine.org>, 2018, 2019, 2020, 2021. # Rémi Bintein <reminus5@hotmail.fr>, 2018, 2019. # Sylvain Corsini <sylvain.corsini@gmail.com>, 2018. # Caye Pierre <pierrecaye@laposte.net>, 2019. @@ -83,12 +83,14 @@ # Clément Topy <topy72.mine@gmail.com>, 2021. # Cold <coldragon78@gmail.com>, 2021. # Blackiris <divjvc@free.fr>, 2021. +# Olivier Monnom <olivier.monnom@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-08-20 06:04+0000\n" -"Last-Translator: Pierre Caye <pierrecaye@laposte.net>\n" +"PO-Revision-Date: 2021-10-23 12:20+0200\n" +"Last-Translator: salty64 <cedric.arrabie@univ-pau.fr>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -96,7 +98,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2371,7 +2373,7 @@ msgstr "Monter" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" -msgstr "Nœud" +msgstr "Node" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" @@ -2498,6 +2500,14 @@ msgstr "" "Impossible d'enregistrer la scène. Les dépendances (instances ou héritage) " "n'ont sans doute pas pu être satisfaites." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Impossible de sauver la (les) scènes(s) !" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Enregistrer toutes les scènes" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Impossible de ré-écrire une scène tant que celle-ci est ouverte !" @@ -2640,6 +2650,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Sauvegarder les modifications effectuées à « %s » avant de quitter ?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s n'existe plus ! Veuillez spécifier un nouvel endroit de sauvegarde." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2685,29 +2699,27 @@ msgstr "La scène actuelle n'est pas enregistrée. Ouvrir quand même ?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Impossible d'annuler quand les boutons de la souris sont activés." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Rien à annuler." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Annuler" +msgstr "Annuler %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Impossible de rétablir quand les boutons de la souris sont activés." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Rien à rétablir." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Refaire" +msgstr "Refaire %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2743,7 +2755,7 @@ msgstr "Quitter l'éditeur ?" #: editor/editor_node.cpp msgid "Open Project Manager?" -msgstr "Ouvrir gestionnaire de projets ?" +msgstr "Ouvrir le gestionnaire de projets ?" #: editor/editor_node.cpp msgid "Save & Quit" @@ -3000,10 +3012,6 @@ msgid "Save Scene" msgstr "Enregistrer la scène" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Enregistrer toutes les scènes" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Convertir vers…" @@ -3408,9 +3416,8 @@ msgid "Merge With Existing" msgstr "Fusionner avec l'existant" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Changer la transformation de l’animation" +msgstr "Appliquer la transformation du MeshInstance" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3673,7 +3680,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Chargement rapide" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -4499,6 +4506,24 @@ msgid "Clear Default for '%s'" msgstr "Effacer le préréglage pour « %s »" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Réimporter" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Vous avez des changements en attente qui n'ont pas encore été appliqués. " +"Cliquez sur réimporter pour appliquer les changements des options " +"d'importation\n" +"Sélectionner une autre ressource dans le \"FileSystem dock\" sans cliquer " +"sur réimport avant va annuler les changements faits dans le dock " +"d'importation." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importer comme :" @@ -4507,10 +4532,6 @@ msgid "Preset" msgstr "Préréglage" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Réimporter" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Enregistrer les scènes, réimporter, puis redémarrer" @@ -5581,7 +5602,7 @@ msgstr "Dernier" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" -msgstr "All" +msgstr "Tous" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search templates, projects, and demos" @@ -5794,15 +5815,13 @@ msgstr "Déplacer le CanvasItem « %s » vers (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Verrouillage Sélectionné" +msgstr "Verrouillé" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Groupes" +msgstr "Groupé" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6755,14 +6774,12 @@ msgid "Remove Selected Item" msgstr "Supprimer l'élément sélectionné" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Importer depuis la scène" +msgstr "Importer depuis la scène (Ignore les transformations)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Importer depuis la scène" +msgstr "Importer depuis la scène (Applique les transformations)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7360,14 +7377,12 @@ msgid "Flip Portal" msgstr "Retourner le Portal" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "Supprimer la transformation" +msgstr "Définir la transformation pour l'occulteur" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Créer un nœud" +msgstr "Centrer le nœud" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7503,11 +7518,11 @@ msgid "Move Down" msgstr "Déplacer vers le bas" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "Script suivant" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "Script précédent" #: editor/plugins/script_editor_plugin.cpp @@ -7861,26 +7876,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Ce squelette n'a pas d'os, créez des nœuds Bone2D enfants." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Créer la position de repos d'après les os" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Régler la position de repos sur les os" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Créer la position de repos d'après les os" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Squelette 2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Assigner les os à la position de repos" +msgstr "Remettre à la position de repos" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Écraser" +msgstr "Écraser la position de repos" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7907,69 +7920,62 @@ msgid "Perspective" msgstr "Perspective" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Orthogonale" +msgstr "Haut Orthogonal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Perspective" +msgstr "Perspective haute" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Orthogonale" +msgstr "Bas Orthogonal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Perspective" +msgstr "Perspective basse" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Orthogonale" +msgstr "Gauche Orthogonal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Perspective" +msgid "Left Perspective" +msgstr "Perspective Gauche" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Orthogonale" +msgstr "Orthogonal Droit" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Perspective Droite" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Orthogonale" +msgstr "Orthogonal avant" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Perspective" +msgstr "Perspective Avant" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Orthogonale" +msgstr "Orthogonale arrière" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Perspective" +msgstr "Perspective arrière" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [auto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [portails actifs]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8296,6 +8302,26 @@ msgid "Right View" msgstr "Vue de droite" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "Vue de l'orbite vers le bas" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "Vue de l'orbite vers la gauche" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "Vue de l'orbite vers la droite" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "Vue de l'orbite vers le devant" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "Vue de l'orbite à 180°" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Basculer entre la vue perspective et orthogonale" @@ -8369,9 +8395,8 @@ msgid "View Portal Culling" msgstr "Afficher le Portal culling" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Afficher le Portal culling" +msgstr "Voir la suppression de l'occlusion" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8439,9 +8464,8 @@ msgid "Post" msgstr "Post" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "Projet sans titre" +msgstr "Gizmo sans nom" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -11242,14 +11266,14 @@ msgstr "" "recherche doit inclure au moins un caractère `/`." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Touche " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "Touche physique" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Touche " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Bouton de joystick" @@ -12602,14 +12626,12 @@ msgid "Set Portal Point Position" msgstr "Définir la position du point du Portal" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Changer le rayon de la forme du cylindre" +msgstr "Définir le rayon de la sphère de l'occulteur" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "Définir position d'entrée de la courbe" +msgstr "Définir la position de la sphère de l'occulteur" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12897,9 +12919,8 @@ msgid "Class name can't be a reserved keyword" msgstr "Le nom de classe ne peut pas être un mot-clé réservé" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Remplir la sélection" +msgstr "Compiler la solution" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -14279,11 +14300,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "Aucune forme n'est définie." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Seules les échelles uniformes sont prises en charge." #: scene/3d/particles.cpp msgid "" @@ -14647,6 +14668,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Les options Tile et Tile Fit pour les propriétés d'extension d'axe ne sont " +"efficaces que si vous utilisez le rendu GLES3.\n" +"Le rendu GLES2 étant actuellement utilisé, ces modes se comporteront comme " +"un étirement." #: scene/gui/popup.cpp msgid "" @@ -14686,6 +14711,18 @@ msgstr "" "L'environnement par défaut spécifié dans les réglages du projet (Rendu -> " "Environnement -> Environnement par défaut) ne peut pas être chargé." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"Les temps d'attente très faibles des timers(< 0,05 seconde) peuvent se " +"comporter de manière très différente selon la vitesse du rendu ou physique.\n" +"Envisagez d'utiliser la boucle de traitement d'un script au lieu de vous " +"fier à un timer pour les temps d'attente très faibles." + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14699,14 +14736,16 @@ msgstr "" "RenderTarget et assignez sa texture à un nœud pouvant l'afficher." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" -"La taille de la fenêtre d'affichage doit être supérieure à 0 pour pouvoir " -"afficher quoi que ce soit." +"La taille de la fenêtre d'affichage doit être supérieure ou égale à 2 pixels " +"dans les deux sens pour que le rendu soit possible." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "Définir les sphères pour OccluderShapeSphere" #: scene/resources/visual_shader_nodes.cpp msgid "" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index da5c9051ed..41c2b72c3f 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -6,6 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2020-06-15 01:48+0000\n" "Last-Translator: Rónán Quill <ronan085@gmail.com>\n" "Language-Team: Irish <https://hosted.weblate.org/projects/godot-engine/godot/" @@ -2325,6 +2326,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2441,6 +2450,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2761,10 +2774,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4167,15 +4176,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7060,11 +7077,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7410,11 +7427,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7474,7 +7491,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7482,6 +7499,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7820,6 +7841,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10576,11 +10617,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13696,6 +13737,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13705,7 +13754,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/gl.po b/editor/translations/gl.po index 285cdf4e3b..43be118f3d 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -10,6 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2021-08-12 21:32+0000\n" "Last-Translator: davidrogel <david.rogel.pernas@icloud.com>\n" "Language-Team: Galician <https://hosted.weblate.org/projects/godot-engine/" @@ -2412,6 +2413,15 @@ msgstr "" "Non se puido gardar a escena. Posiblemente as dependencias (instancias ou " "herenzas) non puideron satisfacerse." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Non se puido iniciar subproceso!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Gardar Todas as Escenas" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Non se pode sobreescribir escena que sigue aberta!" @@ -2549,6 +2559,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Gardar os cambios de '%s' antes de pechar?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2904,10 +2918,6 @@ msgid "Save Scene" msgstr "Gardar Escena" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Gardar Todas as Escenas" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Converter a..." @@ -4383,6 +4393,18 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reimportar" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importar Como:" @@ -4391,10 +4413,6 @@ msgid "Preset" msgstr "Axustes de Importación" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Reimportar" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -7334,11 +7352,13 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Seguinte script" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Anterior script" #: editor/plugins/script_editor_plugin.cpp @@ -7686,14 +7706,14 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Este esqueleto non ten ósos; crea uns nodos fillo Bone2D." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Crear Pose de Repouso a partir dos Ósos" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Asignar Pose de Repouso aos Ósos" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Crear Pose de Repouso a partir dos Ósos" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D" @@ -7758,7 +7778,7 @@ msgstr "Ortogonal" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "Perspetiva" #: editor/plugins/spatial_editor_plugin.cpp @@ -7768,6 +7788,11 @@ msgstr "Ortogonal" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "Perspetiva" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "Ortogonal" @@ -8130,6 +8155,27 @@ msgid "Right View" msgstr "Vista Dereita" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Vista Frontal" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Vista Perspectiva/Ortogonal" @@ -11043,14 +11089,14 @@ msgstr "" "polo menos un carácter '/'." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Botón: " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Botón: " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Botón Joystick" @@ -14260,6 +14306,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14273,7 +14327,10 @@ msgstr "" "Ou ben, fágao un RenderTarget e asigne a súa textura a algún nodo." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +#, fuzzy +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" "As dimensións da Mini-Ventá (Viewport) deben de ser maior que 0 para poder " "renderizar nada." diff --git a/editor/translations/he.po b/editor/translations/he.po index 15c4694949..8150eb063d 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -23,6 +23,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-05-14 11:20+0000\n" "Last-Translator: Ram Tourgeman <ramtorgeman@gmail.com>\n" @@ -965,7 +966,7 @@ msgstr "מעבר למתודה" #: editor/create_dialog.cpp msgid "Change %s Type" -msgstr "שנה את הסוג של s%" +msgstr "שנה את הסוג של %s" #: editor/create_dialog.cpp editor/project_settings_editor.cpp msgid "Change" @@ -1025,7 +1026,7 @@ msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" -"סצנה 's%' נמצאת כרגע בעריכה.\n" +"סצנה '%s' נמצאת כרגע בעריכה.\n" "שינויים יכנסו לתוקף בטעינה מחדש." #: editor/dependency_editor.cpp @@ -1033,7 +1034,7 @@ msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" -"משאב 's%' נמצא בשימוש.\n" +"משאב '%s' נמצא בשימוש.\n" "שינויים יכנסו לתוקף רק בטעינה מחדש." #: editor/dependency_editor.cpp @@ -2425,6 +2426,15 @@ msgid "" "be satisfied." msgstr "לא ניתן לשמור את הסצנה. כנראה עקב תלות (מופע או ירושה) שלא מסופקת." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "לא ניתן להפעיל תהליך משנה!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "שמירת כל הסצנות" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "לא ניתן להחליף סצנה שעדיין פתוחה!" @@ -2553,6 +2563,10 @@ msgid "Save changes to '%s' before closing?" msgstr "לשמור את השינויים ל־'%s' לפני הסגירה?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2893,10 +2907,6 @@ msgid "Save Scene" msgstr "שמירת סצנה" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "שמירת כל הסצנות" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "המרה אל…" @@ -4401,6 +4411,18 @@ msgid "Clear Default for '%s'" msgstr "מחיקת בררת מחדל עבור ‚%s’" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "ייבוא מחדש" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "ייבוא בתור:" @@ -4410,10 +4432,6 @@ msgid "Preset" msgstr "ערכה מוגדרת…" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "ייבוא מחדש" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -7433,11 +7451,13 @@ msgid "Move Down" msgstr "העברה למטה" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "הסקריפט הבא" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "הסקריפט הקודם" #: editor/plugins/script_editor_plugin.cpp @@ -7811,15 +7831,15 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Create Rest Pose from Bones" msgstr "נגינת סצנה בהתאמה אישית" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" -msgstr "" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Skeleton2D" msgstr "יחידני" @@ -7884,8 +7904,9 @@ msgid "Left Orthogonal" msgstr "כפתור שמאלי" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" -msgstr "" +#, fuzzy +msgid "Left Perspective" +msgstr "מבט תחתי" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -7893,6 +7914,10 @@ msgid "Right Orthogonal" msgstr "כפתור ימני" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8247,6 +8272,27 @@ msgid "Right View" msgstr "מבט ימני" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "מבט קדמי" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Switch Perspective/Orthogonal View" msgstr "החלפה בין תצוגה פרספקטיבה/אנכית" @@ -11203,14 +11249,14 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "מקש " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "מקש " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "" @@ -14520,6 +14566,14 @@ msgstr "" "לא היתה אפשרות לטעון את הסביבה שנקבעה כברירת המחדל בהגדרות המיזם (Rendering -" "> Environment -> Default Environment)." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14532,7 +14586,10 @@ msgstr "" "הפנימי שלו למפרק כלשהו לתצוגה." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +#, fuzzy +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "גודל חלון התצוגה חייב להיות גדול מ-0 על מנת להציג משהו." #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/hi.po b/editor/translations/hi.po index e6a2a76f37..c9d5128faa 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -14,12 +14,14 @@ # Bishwajeet Parhi <bishwajeet.techmaster@gmail.com>, 2020. # l4KKY <greenforcesave@gmail.com>, 2020. # harvinder rathor <harvinderr09@gmail.com>, 2021. +# Sumanyu Aggarwal <sumanyu.code@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-03 21:29+0000\n" -"Last-Translator: harvinder rathor <harvinderr09@gmail.com>\n" +"PO-Revision-Date: 2021-10-28 22:09+0000\n" +"Last-Translator: Sumanyu Aggarwal <sumanyu.code@gmail.com>\n" "Language-Team: Hindi <https://hosted.weblate.org/projects/godot-engine/godot/" "hi/>\n" "Language: hi\n" @@ -27,7 +29,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -382,7 +384,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy msgid "animation" -msgstr "कार्यों:" +msgstr "एनिमेशन" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." @@ -2403,6 +2405,15 @@ msgid "" "be satisfied." msgstr "दृश्य नहीं बचा सका । संभावित निर्भरता (उदाहरण या विरासत) संतुष्ट नहीं हो सकीं।" +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "उपप्रक्रिया शुरू नहीं कर सका!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "सभी दृश्यों को सहेजें" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "दृश्य है कि अभी भी खुला है ओवरराइट नहीं कर सकते!" @@ -2537,6 +2548,10 @@ msgid "Save changes to '%s' before closing?" msgstr "बंद करने से पहले '%' में परिवर्तन सहेजें?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2876,10 +2891,6 @@ msgid "Save Scene" msgstr "दृश्य बचाओ" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "सभी दृश्यों को सहेजें" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "बदलने के लिए..." @@ -3667,14 +3678,12 @@ msgid "Can't resolve the requested address." msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't connect to the mirror." -msgstr "कनेक्ट नहीं कर सकते।" +msgstr "शीशे से जोड़ नहीं सकते|" #: editor/export_template_manager.cpp -#, fuzzy msgid "No response from the mirror." -msgstr "कोई जवाब नहीं।" +msgstr "शीशे से कोई जवाब नहीं।" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -4371,18 +4380,26 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" -msgstr "प्रीसेट" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" msgstr "" #: editor/import_dock.cpp +msgid "Preset" +msgstr "प्रीसेट" + +#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -7301,12 +7318,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "नई स्क्रिप्ट" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "पिछला टैब" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7658,11 +7677,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7725,7 +7744,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7733,6 +7752,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8076,6 +8099,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10952,11 +10995,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14150,6 +14193,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14159,7 +14210,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/hr.po b/editor/translations/hr.po index c5fcf3ab6e..e4a3ff779e 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -9,6 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2021-08-13 19:05+0000\n" "Last-Translator: LeoClose <leoclose575@gmail.com>\n" "Language-Team: Croatian <https://hosted.weblate.org/projects/godot-engine/" @@ -2350,6 +2351,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2466,6 +2475,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2785,10 +2798,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4205,15 +4214,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7107,12 +7124,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Odspoji Skriptu" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Idi na prethodni korak" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7457,11 +7476,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7522,7 +7541,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7530,6 +7549,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7870,6 +7893,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10649,11 +10692,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13779,6 +13822,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13788,7 +13839,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 2df1fc98b0..06185da411 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -16,12 +16,17 @@ # Czmorek Dávid <czmdav.soft@gmail.com>, 2020. # Újvári Marcell <mmarci72@gmail.com>, 2021. # Gergő Pistai <gergopistai@gmail.com>, 2021. +# Misi <varady.misi@gmail.com>, 2021. +# Looky1173 <lgl1173and2006@gmail.com>, 2021. +# Frontrider <frontrider@tutanota.com>, 2021. +# Andras Virag <snowflake71@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-03-31 03:53+0000\n" -"Last-Translator: Gergő Pistai <gergopistai@gmail.com>\n" +"PO-Revision-Date: 2021-11-14 11:41+0000\n" +"Last-Translator: Andras Virag <snowflake71@gmail.com>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/godot-engine/" "godot/hu/>\n" "Language: hu\n" @@ -29,7 +34,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.6-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -488,7 +493,7 @@ msgstr "Animáció - Kulcsok Mozgatása" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Clipboard is empty!" -msgstr "" +msgstr "A vágólap üres!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1171,7 +1176,7 @@ msgstr "Köszönet a Godot közösségétől!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Kattints a másoláshoz." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1556,6 +1561,8 @@ msgstr "A fájl nem létezik." #: editor/editor_autoload_settings.cpp msgid "%s is an invalid path. Not in resource path (res://)." msgstr "" +"%s egy érvénytelen elérési útvonal. Nincs az erőforrás elérési útvonalában " +"(res://)." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" @@ -1754,8 +1761,9 @@ msgid "Import Dock" msgstr "Dock importálása" #: editor/editor_feature_profile.cpp +#, fuzzy msgid "Allows to view and edit 3D scenes." -msgstr "" +msgstr "Lehetővé teszi a 3D jelenetek megtekintését és szerkesztését." #: editor/editor_feature_profile.cpp msgid "Allows to edit scripts using the integrated script editor." @@ -2138,19 +2146,19 @@ msgstr "Metódusok" #: editor/editor_help.cpp msgid "Theme Properties" -msgstr "Téma tulajdonságai" +msgstr "Téma Tulajdonságai" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "Felsorolások" +msgstr "Listák" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constants" -msgstr "Konstansok" +msgstr "Állandók" #: editor/editor_help.cpp msgid "Property Descriptions" -msgstr "Tulajdonságleírások" +msgstr "Tulajdonság leírásai" #: editor/editor_help.cpp msgid "(value)" @@ -2166,7 +2174,7 @@ msgstr "" #: editor/editor_help.cpp msgid "Method Descriptions" -msgstr "Metódusleírások" +msgstr "Metódus leírások" #: editor/editor_help.cpp msgid "" @@ -2429,6 +2437,15 @@ msgstr "" "Nem sikerült a Scene mentése. Valószínű, hogy a függőségei (példányok vagy " "öröklések) nem voltak megfelelőek." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Az alprocesszt nem lehetett elindítani!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Az összes jelenet mentése" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Nem lehet felülírni a még nyitott jelenetet!" @@ -2571,6 +2588,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Bezárás előtt menti a '%s'-n végzett módosításokat?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2926,10 +2947,6 @@ msgid "Save Scene" msgstr "Jelenet Mentése" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Az összes jelenet mentése" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Átkonvertálás..." @@ -4404,6 +4421,18 @@ msgid "Clear Default for '%s'" msgstr "Alapértelmezett Törlése '%s'-nél" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Újraimportálás" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importálás Mint:" @@ -4412,10 +4441,6 @@ msgid "Preset" msgstr "Előre beállított" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Újraimportálás" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Jelenetek mentése, újraimportálás és újraindítás" @@ -7359,11 +7384,13 @@ msgid "Move Down" msgstr "Mozgatás Lefelé" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Következő Szkript" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Előző Szkript" #: editor/plugins/script_editor_plugin.cpp @@ -7711,11 +7738,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7783,7 +7810,7 @@ msgstr "Ortogonális" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "Perspektíva" #: editor/plugins/spatial_editor_plugin.cpp @@ -7793,6 +7820,11 @@ msgstr "Ortogonális" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "Perspektíva" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "Ortogonális" @@ -8146,6 +8178,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10971,14 +11023,14 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Kulcs " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Kulcs " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Joy gomb" @@ -14129,6 +14181,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14142,7 +14202,9 @@ msgstr "" "té, és állítsa hozzá a belső textúráját valamilyen node-hoz kirajzolásra." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/id.po b/editor/translations/id.po index 83b80592b1..a52361e5c7 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -33,12 +33,15 @@ # Naufal Adriansyah <naufaladrn90@gmail.com>, 2021. # undisputedgoose <diablodvorak@gmail.com>, 2021. # Tsaqib Fadhlurrahman Soka <sokatsaqib@gmail.com>, 2021. +# Hilman Hazazi <hafizd.muhammad.kren.403@gmail.com>, 2021. +# Brian <brian@brianthe.dev>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-20 14:46+0000\n" -"Last-Translator: Sofyan Sugianto <sofyanartem@gmail.com>\n" +"PO-Revision-Date: 2021-11-19 08:43+0000\n" +"Last-Translator: Brian <brian@brianthe.dev>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -46,7 +49,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -55,13 +58,13 @@ msgstr "Tipe argumen tidak valid untuk convert(), gunakan konstanta TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "String dengan panjang 1 (karakter) yang diharapkan." +msgstr "String dengan panjang 1 (karakter) diharapkan." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "Tidak cukup byte untuk mendekode byte, atau format tidak valid." +msgstr "Tidak cukup bita untuk mendekode bita, atau format tidak valid." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" @@ -70,7 +73,7 @@ msgstr "Masukkan tidak sah %i (tidak diberikan) dalam ekspresi" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" msgstr "" -"self tidak dapat digunakan karena instance bernilai null (tidak di-passing)" +"self tidak dapat digunakan karena nilai instansi adalah null (tidak lolos)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -122,7 +125,7 @@ msgstr "EiB" #: editor/animation_bezier_editor.cpp msgid "Free" -msgstr "Bebaskan" +msgstr "Bebas" #: editor/animation_bezier_editor.cpp msgid "Balanced" @@ -557,7 +560,7 @@ msgstr "Susun Track-track dengan node atau tampilkan sebagai daftar biasa." #: editor/animation_track_editor.cpp msgid "Snap:" -msgstr "Snap:" +msgstr "Senap:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -581,7 +584,7 @@ msgstr "FPS" #: editor/project_settings_editor.cpp editor/property_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Edit" -msgstr "Edit" +msgstr "Sunting" #: editor/animation_track_editor.cpp msgid "Animation properties." @@ -1054,7 +1057,7 @@ msgstr "Resource" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings_editor.cpp msgid "Path" -msgstr "Path" +msgstr "Jalur" #: editor/dependency_editor.cpp msgid "Dependencies:" @@ -1547,7 +1550,7 @@ msgstr "Mengatur kembali Autoload-autoload" #: editor/editor_autoload_settings.cpp msgid "Can't add autoload:" -msgstr "Tidak dapat menambahkan autoload" +msgstr "Tidak dapat menambahkan autoload:" #: editor/editor_autoload_settings.cpp msgid "%s is an invalid path. File does not exist." @@ -1567,7 +1570,7 @@ msgstr "Tambahkan AutoLoad" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp msgid "Path:" -msgstr "Path:" +msgstr "Jalur:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" @@ -2130,7 +2133,7 @@ msgstr "baku:" #: editor/editor_help.cpp msgid "Methods" -msgstr "Method" +msgstr "Metode" #: editor/editor_help.cpp msgid "Theme Properties" @@ -2427,6 +2430,14 @@ msgstr "" "Tidak dapat menyimpan skena Dependensi (instance atau turunannya) mungkin " "tidak terpenuhi." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Tidak dapat menyimpan satu atau lebih skena!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Simpan Semua Skena" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Tidak bisa menimpa skena yang masih terbuka!" @@ -2548,7 +2559,7 @@ msgstr "Buka Cepat..." #: editor/editor_node.cpp msgid "Quick Open Scene..." -msgstr "Buka Cepat Skena..." +msgstr "Buka Cepat Skenario..." #: editor/editor_node.cpp msgid "Quick Open Script..." @@ -2563,6 +2574,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Simpan perubahan '%s' sebelum menutupnya?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2608,29 +2623,27 @@ msgstr "Skena saat ini belum disimpan. Buka saja?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Tidak bisa membatalkan ketika tombol mouse ditekan." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Tidak ada yang bisa dibatalkan." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Batal" +msgstr "Batal: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Tidak bisa mengulangi ketika tombol mouse ditekan." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Tidak ada yang perlu diulang." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Ulangi" +msgstr "Ulangi: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2721,8 +2734,9 @@ msgid "" "error in that script.\n" "Disabling the addon at '%s' to prevent further errors." msgstr "" -"Tidak dapat memuat script addon dari path: '%s' Mungkin ada kesalahan dalam " -"kode, mohon periksa sintaks." +"Tidak dapat memuat script addon dari jalur: '%s' Hal ini terjadi karena " +"kesalahan koda dalam skrip.\n" +"Lepaskan addon di '%s' to mencegah kesalahan kedepan." #: editor/editor_node.cpp msgid "" @@ -2913,10 +2927,6 @@ msgid "Save Scene" msgstr "Simpan Skena" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Simpan Semua Skena" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Ubah ke..." @@ -3315,9 +3325,8 @@ msgid "Merge With Existing" msgstr "Gabung dengan yang Ada" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Ubah Transformasi Animasi" +msgstr "Aplikasi Transformasi MeshInstance" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3468,6 +3477,12 @@ msgid "" "functions called by that function.\n" "Use this to find individual functions to optimize." msgstr "" +"Inklusif: Termasuk waktu dari fungsi lain yang terpanggil oleh fungsi ini.\n" +"Gunakan ini untuk menemukan perlambatan.\n" +"\n" +"Sendiri: Hanya menghitung waktu terpakai oleh fungsi tersendiri, tidak " +"termasuk fungsi yang dipanggil.\n" +"Gunakan ini untuk menemukan fungsi individual untuk optimalisasi." #: editor/editor_profiler.cpp msgid "Frame #:" @@ -3573,7 +3588,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Muat Cepat" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -4026,7 +4041,7 @@ msgstr "Buka Skena" #: editor/filesystem_dock.cpp msgid "Instance" -msgstr "Instance" +msgstr "Instansi" #: editor/filesystem_dock.cpp msgid "Add to Favorites" @@ -4388,6 +4403,18 @@ msgid "Clear Default for '%s'" msgstr "Bersihkan Baku untuk '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Impor ulang" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Impor sebagai:" @@ -4396,10 +4423,6 @@ msgid "Preset" msgstr "Prasetel" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Impor ulang" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Simpan Skena, Impor Ulang, dan Mulai Ulang" @@ -5521,13 +5544,12 @@ msgstr "" "Simpan skena Anda dan coba lagi." #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "" "No meshes to bake. Make sure they contain an UV2 channel and that the 'Use " "In Baked Light' and 'Generate Lightmap' flags are on." msgstr "" -"Tidak ada mesh-mesh untuk di bake. Pastikan mereka punya kanal UV2 dan 'Bake " -"Cahaya' menyala." +"Tidak ada mesh untuk di bake. Pastikan mesh mempunyai kanal UV2 dengan flag " +"'Use In Baked Light' dan 'Generate Lightmap' aktif." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed creating lightmap images, make sure path is writable." @@ -5668,15 +5690,13 @@ msgstr "Pindahkan CanvasItem \"%s\" ke (%d,%d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Kunci yang Dipilih" +msgstr "Terkunci" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Kelompok" +msgstr "Terkelompok" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6529,9 +6549,8 @@ msgstr "" "deteksi collision." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Simplified Convex Collision Sibling" -msgstr "Buat Saudara Tunggal Convex Collision" +msgstr "Buat saudara Convex Collision yang dipermudah" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6539,20 +6558,23 @@ msgid "" "This is similar to single collision shape, but can result in a simpler " "geometry in some cases, at the cost of accuracy." msgstr "" +"Buat bentuk convex collision dipermudah.\n" +"Ini serupa dengan bentuk collision tunggal, namun dapat menghasilkan " +"geometri mudah dalam beberapa kasus, dengan biaya pada akurasi." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Multiple Convex Collision Siblings" msgstr "Buat Beberapa Saudara Convex Collision" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "" "Creates a polygon-based collision shape.\n" "This is a performance middle-ground between a single convex collision and a " "polygon-based collision." msgstr "" -"Buat collision shape berbasis poligon.\n" -"Opsi ini kinerjanya berada di antara dua opsi di atas." +"Buat bentuk collision berbasis poligon.\n" +"Ini adalah opsi tengah performa antara convex collision tunggal dan " +"collision berbasis poligon." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." @@ -6619,14 +6641,12 @@ msgid "Remove Selected Item" msgstr "Hapus Item yang Dipilih" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Impor dari Skena" +msgstr "Impor dari Skenario (Hiraukan Transforms)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Impor dari Skena" +msgstr "Impor dari Skenario (Aplikasikan Transforms)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7207,28 +7227,24 @@ msgid "Flip Portals" msgstr "Balikkan Portal" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Room Generate Points" -msgstr "Jumlah Titik yang Dihasilkan:" +msgstr "Jumlah Titik Dihasilkan" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Generate Points" -msgstr "Jumlah Titik yang Dihasilkan:" +msgstr "Menghasilkan Nilai" #: editor/plugins/room_manager_editor_plugin.cpp msgid "Flip Portal" msgstr "Balikkan Portal" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "Bersihkan Transformasi" +msgstr "Tutup Set Transformasi" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Buat Node" +msgstr "Node Tengah" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7364,12 +7380,12 @@ msgid "Move Down" msgstr "Turunkan" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "Skrip berikutnya" +msgid "Next Script" +msgstr "Skrip Berikutnya" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "Skrip sebelumnya" +msgid "Previous Script" +msgstr "Skrip Sebelumnya" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7520,7 +7536,7 @@ msgstr "Sumber" #: editor/plugins/script_text_editor.cpp msgid "Target" -msgstr "Target" +msgstr "Sasaran" #: editor/plugins/script_text_editor.cpp msgid "" @@ -7723,26 +7739,24 @@ msgstr "" "Kerangka ini tidak memiliki pertulangan, buatlah beberapa anak node Bone2D." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Buat Pose Istirahat dari Pertulangan" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Atur Pose Istirahat ke Pertulangan" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Buat Pose Istirahat dari Pertulangan" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Atur Tulang ke Pose Istirahat" +msgstr "Atur ulang ke Pose Duduk" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Timpa" +msgstr "Timpa Pose Duduk" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7769,69 +7783,62 @@ msgid "Perspective" msgstr "Perspektif" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Atas" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Perspektif" +msgstr "Perspektif Atas" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Bawah" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Perspektif" +msgstr "Perspektif Bawah" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Kiri" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Perspektif" +msgid "Left Perspective" +msgstr "Perspektif Kiri" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Kanan" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Perspektif Kanan" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Depan" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Perspektif" +msgstr "Perspektif Depan" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Belakang" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Perspektif" +msgstr "Perspektif Belakang" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [auto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [portal aktif]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -7893,51 +7900,44 @@ msgid "Animation Key Inserted." msgstr "Kunci Animasi Dimasukkan." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Pitch:" -msgstr "Dongak" +msgstr "Dongak:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Yaw:" -msgstr "" +msgstr "Yaw:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Size:" msgstr "Ukuran:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Objects Drawn:" -msgstr "Objek Digambar" +msgstr "Objek Digambar:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Material Changes:" -msgstr "Perubahan Material" +msgstr "Perubahan Material:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Shader Changes:" -msgstr "Perubahan Shader" +msgstr "Perubahan Shader:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Surface Changes:" -msgstr "Perubahan Permukaan" +msgstr "Perubahan Permukaan:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Draw Calls:" -msgstr "Gambarkan Panggilan" +msgstr "Gambarkan Panggilan:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Vertices:" -msgstr "Titik" +msgstr "Sudut:" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" -msgstr "" +msgstr "FPS: %d (%s ms)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -8072,9 +8072,8 @@ msgid "Freelook Slow Modifier" msgstr "Pengubah Lambat Tampilan Bebas" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Camera Preview" -msgstr "Ubah Ukuran Kamera" +msgstr "Alihkan Pratinjau Kamera" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Rotation Locked" @@ -8166,6 +8165,27 @@ msgid "Right View" msgstr "Tampilan Kanan" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Tampilan Depan" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Beralih Tampilan Ortogonal/Perspektif" @@ -8607,18 +8627,16 @@ msgid "{num} font(s)" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No fonts found." -msgstr "Tidak ditemukan!" +msgstr "Font tidak ditemukan." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} icon(s)" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No icons found." -msgstr "Tidak ditemukan!" +msgstr "Ikon tidak ditemukan." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} stylebox(es)" @@ -8647,9 +8665,8 @@ msgid "Importing items {n}/{n}" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Updating the editor" -msgstr "Keluar editor?" +msgstr "Memperbarui editor" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8666,14 +8683,12 @@ msgid "With Data" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select by data type:" -msgstr "Pilih Node" +msgstr "Pilih berdasarkan tipe data:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible color items." -msgstr "Pilih Berkas untuk Dipindai" +msgstr "Pilih semua benda warna terlihat." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible color items and their data." @@ -8684,9 +8699,8 @@ msgid "Deselect all visible color items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible constant items." -msgstr "Pilih item pengaturan terlebih dahulu!" +msgstr "Pilih semua benda konstan terlihat." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible constant items and their data." @@ -8697,9 +8711,8 @@ msgid "Deselect all visible constant items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible font items." -msgstr "Pilih item pengaturan terlebih dahulu!" +msgstr "Pilih semua benda font terlihat." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible font items and their data." @@ -8710,19 +8723,16 @@ msgid "Deselect all visible font items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items." -msgstr "Pilih item pengaturan terlebih dahulu!" +msgstr "Pilih semua benda ikon terlihat." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items and their data." -msgstr "Pilih item pengaturan terlebih dahulu!" +msgstr "Pilih semua benda ikon terlihat dan data mereka." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Deselect all visible icon items." -msgstr "Pilih item pengaturan terlebih dahulu!" +msgstr "Batal pilih semua benda ikon terlihat." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible stylebox items." @@ -8743,19 +8753,16 @@ msgid "" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Collapse types." -msgstr "Lipat Semua" +msgstr "Lipat Semua." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Expand types." -msgstr "Bentangkan Semua" +msgstr "Bentangkan Semua." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all Theme items." -msgstr "Pilih berkas templat" +msgstr "Pilih semua benda Tema." #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8909,9 +8916,8 @@ msgid "Add Type:" msgstr "Jenis:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Item:" -msgstr "Tambah Item" +msgstr "Tambah benda:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8919,9 +8925,8 @@ msgid "Add StyleBox Item" msgstr "Tambahkan Semua Item" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Items:" -msgstr "Hapus item" +msgstr "Hapus benda:" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" @@ -8962,9 +8967,8 @@ msgid "Editor Theme" msgstr "Sunting Tema" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select Another Theme Resource:" -msgstr "Hapus Resource" +msgstr "Pilih Tema Lain Aset:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9007,9 +9011,8 @@ msgid "Add Item Type" msgstr "Tambah Item" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Node Types:" -msgstr "Jenis node" +msgstr "Tipe node:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9030,9 +9033,8 @@ msgid "Override all default type items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme:" -msgstr "Tema" +msgstr "Tema:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9097,9 +9099,8 @@ msgid "Checked Radio Item" msgstr "Item Radio yang Dicentang" #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Named Separator" -msgstr "Pemisah yang diberi nama." +msgstr "Pemisah yang diberi nama" #: editor/plugins/theme_editor_preview.cpp msgid "Submenu" @@ -10572,9 +10573,8 @@ msgid "VisualShader" msgstr "ShaderVisual" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property:" -msgstr "Sunting Properti Visual" +msgstr "Sunting Properti Visual:" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" @@ -11023,14 +11023,12 @@ msgid "Are you sure to run %d projects at once?" msgstr "Apakah Anda yakin menjalankan %d proyek sekaligus?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove %d projects from the list?" -msgstr "Pilih perangkat pada daftar" +msgstr "Buang proyek %d dari daftar?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove this project from the list?" -msgstr "Pilih perangkat pada daftar" +msgstr "Buang proyek ini dari daftar?" #: editor/project_manager.cpp msgid "" @@ -11167,14 +11165,14 @@ msgstr "" "mengandung paling tidak satu karakter `/`." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Kunci " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Kunci " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Tombol Joystick" @@ -11272,7 +11270,7 @@ msgstr "Indeks Sumbu Joypad:" #: editor/project_settings_editor.cpp msgid "Axis" -msgstr "Axis" +msgstr "Sumbu" #: editor/project_settings_editor.cpp msgid "Joypad Button Index:" @@ -11511,11 +11509,11 @@ msgstr "Nol" #: editor/property_editor.cpp msgid "Easing In-Out" -msgstr "Easing In-Out" +msgstr "Mempermudah Masuk-Keluar" #: editor/property_editor.cpp msgid "Easing Out-In" -msgstr "Easing Out-In" +msgstr "Mempermudah Keluar-Masuk" #: editor/property_editor.cpp msgid "File..." @@ -11636,7 +11634,7 @@ msgstr "Jumlah penghitung bertambah untuk setiap node" #: editor/rename_dialog.cpp msgid "Padding" -msgstr "Padding" +msgstr "Lapisan" #: editor/rename_dialog.cpp msgid "" @@ -12306,7 +12304,7 @@ msgstr "Sumber C++ :" #: editor/script_editor_debugger.cpp msgid "Stack Trace" -msgstr "Stack Trace" +msgstr "Jejak Tumpukan" #: editor/script_editor_debugger.cpp msgid "Errors" @@ -12648,7 +12646,7 @@ msgstr "Plane Sebelumnya" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Plane:" -msgstr "Plane:" +msgstr "Dataran:" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" @@ -12660,7 +12658,7 @@ msgstr "Floor Sebelumnya" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" -msgstr "Floor:" +msgstr "Lantai:" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Delete Selection" @@ -12685,7 +12683,7 @@ msgstr "Isi Seleksi GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" -msgstr "Grid Map" +msgstr "Peta Grid" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" @@ -12815,7 +12813,7 @@ msgstr "Akhir dari inner exception stack trace" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Bake NavMesh" -msgstr "Bake NavMesh" +msgstr "Panggang NavMesh" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." @@ -13329,14 +13327,12 @@ msgid "Running on %s" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exporting APK..." -msgstr "Mengekspor Semua" +msgstr "Mengekspor APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Uninstalling..." -msgstr "Copot Pemasangan" +msgstr "Copot Pemasangan..." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -13344,9 +13340,8 @@ msgid "Installing to device, please wait..." msgstr "Memuat, tunggu sejenak..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not install to device: %s" -msgstr "Tidak dapat memulai subproses!" +msgstr "Tidak dapat instalasi ke perangkat: %s" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -13466,16 +13461,12 @@ msgid "Signing debug %s..." msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signing release %s..." -msgstr "" -"Memindai Berkas,\n" -"Silakan Tunggu..." +msgstr "Menandatangani rilis %s..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find keystore, unable to export." -msgstr "Tidak dapat membuka templat untuk ekspor:" +msgstr "Tidak dapat menemukan keystore, tidak bisa ekspor." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -13541,9 +13532,8 @@ msgid "Could not export project files to gradle project\n" msgstr "Tidak dapat menyunting proyek gradle dalam lokasi proyek\n" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not write expansion package file!" -msgstr "Tidak dapat menulis berkas:" +msgstr "Tidak dapat menulis berkas paket ekspansi!" #: platform/android/export/export_plugin.cpp msgid "Building Android Project (gradle)" @@ -13580,11 +13570,12 @@ msgid "Creating APK..." msgstr "Membuat kontur..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Could not find template APK to export:\n" "%s" -msgstr "Tidak dapat membuka templat untuk ekspor:" +msgstr "" +"Tidak dapat menemukan contoh APK untuk ekspor:\n" +"%s" #: platform/android/export/export_plugin.cpp msgid "" @@ -13600,9 +13591,8 @@ msgid "Adding files..." msgstr "Menambahkan %s..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files" -msgstr "Tidak dapat menulis berkas:" +msgstr "Tidak dapat ekspor berkas proyek" #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -13668,14 +13658,12 @@ msgid "Could not read HTML shell:" msgstr "Tidak dapat membaca shell HTML kustom:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory:" -msgstr "Tidak dapat membuat folder." +msgstr "Tidak dapat menciptakan direktori server HTTP:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server:" -msgstr "Galat menyimpan skena." +msgstr "Kesalahan memulai server HTTP:" #: platform/osx/export/export.cpp #, fuzzy @@ -14539,6 +14527,14 @@ msgstr "" "Lingkungan Baku yang ditetapkan di Pengaturan Proyek (Rendering -> Viewport -" "> Lingkungan Baku) tidak dapat dimuat." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14553,7 +14549,10 @@ msgstr "" "beberapa node untuk ditampilkan." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +#, fuzzy +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "Ukuran viewport harus lebih besar dari 0 untuk me-render apa pun." #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/is.po b/editor/translations/is.po index 33fee00267..fcf380d7c8 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -8,6 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2020-11-20 23:08+0000\n" "Last-Translator: Jóhannes G. Þorsteinsson <johannesg@johannesg.com>\n" @@ -2364,6 +2365,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2480,6 +2489,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2801,10 +2814,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4216,15 +4225,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7143,11 +7160,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7494,11 +7511,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7558,7 +7575,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7566,6 +7583,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7904,6 +7925,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10716,11 +10757,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13859,6 +13900,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13868,7 +13917,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/it.po b/editor/translations/it.po index 0b25d41fa0..dded7242e0 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -40,7 +40,7 @@ # Mirko Soppelsa <miknsop@gmail.com>, 2019, 2020, 2021. # No <kingofwizards.kw7@gmail.com>, 2019. # StarFang208 <polaritymanx@yahoo.it>, 2019. -# Katia Piazza <gydey@ridiculousglitch.com>, 2019. +# Katia Piazza <gydey@ridiculousglitch.com>, 2019, 2021. # nickfla1 <lanterniniflavio@gmail.com>, 2019. # Fabio Iotti <fabiogiopla@gmail.com>, 2020. # Douglas Fiedler <dognew@gmail.com>, 2020. @@ -60,11 +60,16 @@ # Jusef Azzolina <rosarioazzolina33@gmail.com>, 2021. # Daniele Basso <tiziodcaio@gmail.com>, 2021. # Riteo Siuga <riteo@posteo.net>, 2021. +# Luigi <luibass92@live.it>, 2021. +# Micky <micheledevita2@gmail.com>, 2021. +# Fabio Plos <altre0cose@gmail.com>, 2021. +# Theraloss <danilo.polani@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-08-22 22:46+0000\n" +"PO-Revision-Date: 2021-11-19 08:43+0000\n" "Last-Translator: Riteo Siuga <riteo@posteo.net>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" @@ -73,7 +78,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -652,9 +657,8 @@ msgid "Go to Previous Step" msgstr "Vai al passo precedente" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Apply Reset" -msgstr "Applica reset" +msgstr "Reimposta" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -673,9 +677,8 @@ msgid "Use Bezier Curves" msgstr "Usa le curve di Bézier" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Create RESET Track(s)" -msgstr "Crea delle tracce di reimpostazione" +msgstr "Crea traccia/e di rispristino" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -1416,14 +1419,12 @@ msgid "Mute" msgstr "Muto" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Bypass" -msgstr "Bypassa" +msgstr "Aggira" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Bus Options" -msgstr "Opzioni del bus" +msgstr "Opzioni Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -1436,7 +1437,7 @@ msgstr "Ripristina il volume" #: editor/editor_audio_buses.cpp msgid "Delete Effect" -msgstr "Elimina l'effetto" +msgstr "Elimina Effetto" #: editor/editor_audio_buses.cpp msgid "Audio" @@ -1448,7 +1449,7 @@ msgstr "Aggiungi un bus audio" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "Il bus principale non può essere cancellato!" +msgstr "Il bus principale non può essere eliminato!" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" @@ -1522,7 +1523,7 @@ msgstr "Salva questa disposizione di bus in un file." #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" -msgstr "Carica i predefiniti" +msgstr "Carica predefinita" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." @@ -1546,41 +1547,35 @@ msgstr "Non deve collidere con il nome di una classe del motore esistente." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing built-in type name." -msgstr "Non deve collidere con il nome di un tipo built-in esistente." +msgstr "Non deve confliggere con il nome di un tipo predefinito già esistente." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing global constant name." msgstr "Non deve collidere con il nome di una costante globale esistente." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Keyword cannot be used as an autoload name." msgstr "Una parola chiave non può essere utilizzata come nome di un Autoload." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Autoload '%s' already exists!" msgstr "L'Autoload \"%s\" esiste già!" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Rename Autoload" -msgstr "Rinomina un Autoload" +msgstr "Rinomina Autocaricamento" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Toggle AutoLoad Globals" -msgstr "Commuta AutoLoad globals" +msgstr "Commuta Autocaricamenti Globali" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Move Autoload" -msgstr "Sposta un Autoload" +msgstr "Sposta l'Autocaricamento" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Remove Autoload" -msgstr "Rimuovi un Autoload" +msgstr "Rimuovi l'autocaricamento" #: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" @@ -1595,17 +1590,18 @@ msgid "Can't add autoload:" msgstr "Non è possibile aggiungere l'autoload:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "%s is an invalid path. File does not exist." -msgstr "File inesistente." +msgstr "%s è un path non valido. File inesistente." #: editor/editor_autoload_settings.cpp msgid "%s is an invalid path. Not in resource path (res://)." -msgstr "%s non è una strada valida. Essa non punta nelle risorse (res://)." +msgstr "" +"%s non è un percorso valido. Non si trova nel percorso delle risorse " +"(res://)." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "Aggiungi un Autoload" +msgstr "Aggiungi un AutoLoad" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp @@ -1616,7 +1612,7 @@ msgstr "Percorso:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" -msgstr "Nome del nodo:" +msgstr "Nome del Nodo:" #: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp #: editor/editor_plugin_settings.cpp editor/editor_profiler.cpp @@ -1625,9 +1621,8 @@ msgid "Name" msgstr "Nome" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Global Variable" -msgstr "Valiabile" +msgstr "Valiabile globale" #: editor/editor_data.cpp msgid "Paste Params" @@ -1659,7 +1654,7 @@ msgstr "Si prega di selezionare prima una cartella di base." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" -msgstr "Scegliere una cartella" +msgstr "Scegli una cartella" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp @@ -1700,8 +1695,8 @@ msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." msgstr "" -"La piattaforma di destinazione richiede la compressione \"ETC\" delle " -"texture per GLES2. Attiva \"Import Etc\" nelle impostazioni del progetto." +"La piattaforma di destinazione richiede la compressione 'ETC' delle texture " +"per GLES2. Attiva 'Import Etc' nelle impostazioni del progetto." #: editor/editor_export.cpp msgid "" @@ -1812,7 +1807,7 @@ msgstr "Permette di modificare gli script usando l'editor di script integrato." #: editor/editor_feature_profile.cpp msgid "Provides built-in access to the Asset Library." -msgstr "Offre un accesso alla libreria dei contenuti integrato." +msgstr "Offre un accesso incorporato alla Libreria dei Contenuti." #: editor/editor_feature_profile.cpp msgid "Allows editing the node hierarchy in the Scene dock." @@ -1840,9 +1835,8 @@ msgstr "" "individuali. Richiede il pannello del file system per funzionare." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(current)" -msgstr "(Corrente)" +msgstr "(Attuale)" #: editor/editor_feature_profile.cpp msgid "(none)" @@ -1885,19 +1879,16 @@ msgid "Enable Contextual Editor" msgstr "Abilita l'editor contestuale" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Properties:" -msgstr "Proprietà:" +msgstr "Proprietà delle classi:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Main Features:" -msgstr "Funzionalità" +msgstr "Funzionalità Principali" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Nodes and Classes:" -msgstr "Classi abilitate:" +msgstr "Nodi e Classi:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." @@ -1916,23 +1907,20 @@ msgid "Error saving profile to path: '%s'." msgstr "Errore di salvataggio del profilo nel percorso: \"%s\"." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Reset to Default" -msgstr "Ripristinare le impostazioni predefinite" +msgstr "Ripristina le impostazioni predefinite" #: editor/editor_feature_profile.cpp msgid "Current Profile:" msgstr "Profilo attuale:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Create Profile" -msgstr "Cancella il profilo" +msgstr "Crea un profilo" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Remove Profile" -msgstr "Rimuovi Tile" +msgstr "Rimuovi un profilo" #: editor/editor_feature_profile.cpp msgid "Available Profiles:" @@ -1945,21 +1933,19 @@ msgstr "Rendi attuale" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp msgid "Import" -msgstr "Importazione" +msgstr "Importa" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" msgstr "Esporta" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Configure Selected Profile:" -msgstr "Profilo attuale:" +msgstr "Configura il profilo selezionato:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Extra Options:" -msgstr "Opzioni Texture" +msgstr "Opzioni Addizionali" #: editor/editor_feature_profile.cpp msgid "Create or import a profile to edit available classes and properties." @@ -1992,9 +1978,8 @@ msgid "Select Current Folder" msgstr "Seleziona la cartella attuale" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "File exists, overwrite?" -msgstr "File esistente, sovrascriverlo?" +msgstr "File esistente, sovrascrivere?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select This Folder" @@ -2177,9 +2162,8 @@ msgid "Description" msgstr "Descrizione" #: editor/editor_help.cpp -#, fuzzy msgid "Online Tutorials" -msgstr "Tutorial Online" +msgstr "Corsi Online" #: editor/editor_help.cpp msgid "Properties" @@ -2338,9 +2322,8 @@ msgid "Clear" msgstr "Rimuovi tutto" #: editor/editor_log.cpp -#, fuzzy msgid "Clear Output" -msgstr "Svuota output" +msgstr "Svuota l'output" #: editor/editor_network_profiler.cpp editor/editor_node.cpp #: editor/editor_profiler.cpp @@ -2496,6 +2479,14 @@ msgstr "" "Impossibile salvare la scena. È probabile che le dipendenze (instanze o " "eredità) non siano state soddisfatte." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Impossibile salvare una o più scene!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Salva tutte le scene" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Impossibile sovrascrivere una scena ancora aperta!" @@ -2531,7 +2522,7 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" -"Disposzione predefinita dell'editor sovrascritta.\n" +"Disposizione predefinita dell'editor sovrascritta.\n" "Per ripristinare la disposizione predefinita alle sue impostazioni di base, " "usare l'opzione elimina layout ed eliminare la disposizione predefinita." @@ -2633,6 +2624,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Salvare le modifiche a \"%s\" prima di chiudere?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s non esiste più! Specificare una nuova posizione di salvataggio" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2641,11 +2636,12 @@ msgstr "" "sono state salvate comunque." #: editor/editor_node.cpp -#, fuzzy msgid "" "A root node is required to save the scene. You can add a root node using the " "Scene tree dock." -msgstr "È necessario un nodo radice per salvare la scena." +msgstr "" +"È necessario un nodo principale per salvare la scena. Puoi aggiungerne uno " +"nel pannello di scena" #: editor/editor_node.cpp msgid "Save Scene As..." @@ -2677,29 +2673,27 @@ msgstr "Scena attuale non salvata. Aprire comunque?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Impossible annullare quando i bottoni del mouse sono premuti" #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Niente da annullare." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" msgstr "Annulla" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Impossibile ripetere mentre si premono pulsanti del mouse." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Niente da ripetere." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Rifai" +msgstr "Ripeti: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2989,10 +2983,6 @@ msgid "Save Scene" msgstr "Salva la scena" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Salva tutte le scene" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Converti in..." @@ -3060,9 +3050,8 @@ msgid "Orphan Resource Explorer..." msgstr "Explorer di risorse orfane…" #: editor/editor_node.cpp -#, fuzzy msgid "Reload Current Project" -msgstr "Rinomina progetto" +msgstr "Rinomina il progetto corrente" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -3157,7 +3146,6 @@ msgid "Synchronize Script Changes" msgstr "Sincronizza le modifiche degli script" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, any script that is saved will be reloaded in " "the running project.\n" @@ -3182,12 +3170,10 @@ msgid "Editor Layout" msgstr "Disposizione dell'editor" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Acquisisci una schermata" +msgstr "Acquisisci la schermata" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" "Gli screenshot vengono memorizzati nella cartella Data/Settings dell'editor." @@ -3225,9 +3211,8 @@ msgid "Help" msgstr "Aiuto" #: editor/editor_node.cpp -#, fuzzy msgid "Online Documentation" -msgstr "Apri la documentazione" +msgstr "Documentazione in linea" #: editor/editor_node.cpp msgid "Questions & Answers" @@ -3238,21 +3223,18 @@ msgid "Report a Bug" msgstr "Segnala un problema" #: editor/editor_node.cpp -#, fuzzy msgid "Suggest a Feature" -msgstr "Imposta un Valore" +msgstr "Suggerisci una funzionalità" #: editor/editor_node.cpp -#, fuzzy msgid "Send Docs Feedback" -msgstr "Valuta la documentazione" +msgstr "Manda un parere sulla documentazione" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" msgstr "Comunità" #: editor/editor_node.cpp -#, fuzzy msgid "About Godot" msgstr "Informazioni su Godot" @@ -3351,14 +3333,12 @@ msgid "Manage Templates" msgstr "Gestisci i modelli d'esportazione" #: editor/editor_node.cpp -#, fuzzy msgid "Install from file" -msgstr "Installa Da File" +msgstr "Installa da un file" #: editor/editor_node.cpp -#, fuzzy msgid "Select android sources file" -msgstr "Seleziona una Mesh Sorgente:" +msgstr "Selezionare l'archivio delle sorgenti per android" #: editor/editor_node.cpp msgid "" @@ -3409,9 +3389,8 @@ msgid "Merge With Existing" msgstr "Unisci con una esistente" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Cambia la trasformazione di un'animazione" +msgstr "Applica le trasformazioni dei MeshInstance" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3448,9 +3427,8 @@ msgid "Select" msgstr "Seleziona" #: editor/editor_node.cpp -#, fuzzy msgid "Select Current" -msgstr "Seleziona la cartella attuale" +msgstr "Seleziona l'attuale" #: editor/editor_node.cpp msgid "Open 2D Editor" @@ -3487,7 +3465,7 @@ msgstr "Nessuna sottorisorsa trovata." #: editor/editor_path.cpp #, fuzzy msgid "Open a list of sub-resources." -msgstr "Nessuna sottorisorsa trovata." +msgstr "Apre una lista di sottorisorse." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -3514,14 +3492,12 @@ msgid "Update" msgstr "Aggiorna" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Version" -msgstr "Versione:" +msgstr "Versione" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Author" -msgstr "Autori" +msgstr "Autore" #: editor/editor_plugin_settings.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -3534,9 +3510,8 @@ msgid "Measure:" msgstr "Misura:" #: editor/editor_profiler.cpp -#, fuzzy msgid "Frame Time (ms)" -msgstr "Tempo fotogramma (sec)" +msgstr "Durata di un fotogramma (ms)" #: editor/editor_profiler.cpp #, fuzzy @@ -3626,7 +3601,6 @@ msgstr "" "Esse devono appartenere a una scena." #: editor/editor_properties.cpp -#, fuzzy msgid "" "Can't create a ViewportTexture on this resource because it's not set as " "local to scene.\n" @@ -3635,8 +3609,8 @@ msgid "" msgstr "" "Impossibile creare un VieportTexture su questa risorsa perché non è stata " "impostata come locale alla scena.\n" -"Per favore attivare la properietà \"local to scene\" su di essa (e su tutte " -"quelle che la contengono fino ad arrivare a un nodo)." +"Si prega di attivare la proprietà \"local to scene\" su di essa (e su tutte " +"le risorse che la contengono fino ad arrivare a un nodo)." #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Pick a Viewport" @@ -3681,13 +3655,13 @@ msgstr "" "questa proprietà (%s)." #: editor/editor_resource_picker.cpp +#, fuzzy msgid "Quick Load" -msgstr "" +msgstr "Caricamento rapido" #: editor/editor_resource_picker.cpp editor/property_editor.cpp -#, fuzzy msgid "Make Unique" -msgstr "Rendi unico" +msgstr "Rendi Unico" #: editor/editor_resource_picker.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp @@ -3760,8 +3734,8 @@ msgstr "Hai dimenticato il metodo \"_run\"?" #, fuzzy msgid "Hold %s to round to integers. Hold Shift for more precise changes." msgstr "" -"Tenere premuto il tasto Ctrl per arrotondare ai numeri interi. Tenere " -"premuto Shift per modifiche più precise." +"Tenere premuto %s per arrotondare ai numeri interi. Tenere premuto Shift per " +"modifiche più precise." #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -3811,14 +3785,13 @@ msgid "Connecting to the mirror..." msgstr "Connessione al mirror in corso..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't resolve the requested address." -msgstr "Impossibile risolvere l'hostname:" +msgstr "Impossibile risolvere l'hostname." #: editor/export_template_manager.cpp #, fuzzy msgid "Can't connect to the mirror." -msgstr "Impossibile connetersi all'host:" +msgstr "Impossibile connettersi all'host." #: editor/export_template_manager.cpp #, fuzzy @@ -3833,12 +3806,11 @@ msgstr "Richiesta fallita." #: editor/export_template_manager.cpp #, fuzzy msgid "Request ended up in a redirect loop." -msgstr "Richiesta fallita, troppi ridirezionamenti" +msgstr "Richiesta bloccata in un ciclo di reindirizzamento." #: editor/export_template_manager.cpp -#, fuzzy msgid "Request failed:" -msgstr "Richiesta fallita." +msgstr "Richiesta fallita:" #: editor/export_template_manager.cpp msgid "Download complete; extracting templates..." @@ -3853,8 +3825,8 @@ msgid "" "Templates installation failed.\n" "The problematic templates archives can be found at '%s'." msgstr "" -"Installazione del template fallita.\n" -"Gli archivi dei template problematici possono essere trovati qui: \"%s\"." +"Installazione dei modelli fallita.\n" +"Gli archivi dei modelli problematici possono essere trovati qui: \"%s\"." #: editor/export_template_manager.cpp msgid "Error getting the list of mirrors." @@ -3876,8 +3848,8 @@ msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" -"Nessun collegamento di download trovato per questa versione. I download " -"diretti sono disponibili solo per i rilasci ufficiali." +"Nessun link per il download trovato per questa versione. I download diretti " +"sono disponibili solo per i rilasci ufficiali." #: editor/export_template_manager.cpp msgid "Disconnected" @@ -3889,7 +3861,7 @@ msgstr "Risolvendo" #: editor/export_template_manager.cpp msgid "Can't Resolve" -msgstr "Impossibile Risolvere" +msgstr "Impossibile risolvere" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3924,7 +3896,7 @@ msgstr "Errore Handshake SSL" #: editor/export_template_manager.cpp #, fuzzy msgid "Can't open the export templates file." -msgstr "Impossibile aprire zip dei template d'esportazionie." +msgstr "Impossibile aprire zip dei template d'esportazione." #: editor/export_template_manager.cpp #, fuzzy @@ -3943,7 +3915,7 @@ msgstr "Errore di creazione del percorso per i template:" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" -msgstr "Estrazione Templates d'Esportazione" +msgstr "Estrazione Template d'Esportazione" #: editor/export_template_manager.cpp msgid "Importing:" @@ -3991,7 +3963,7 @@ msgstr "Disinstalla" #: editor/export_template_manager.cpp #, fuzzy msgid "Uninstall templates for the current version." -msgstr "Valore iniziale per il contatore" +msgstr "Disinstalla template dalla versione attuale." #: editor/export_template_manager.cpp #, fuzzy @@ -4029,12 +4001,11 @@ msgstr "" #: editor/export_template_manager.cpp #, fuzzy msgid "Install from File" -msgstr "Installa Da File" +msgstr "Installa da File" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install templates from a local file." -msgstr "Importa i modelli da un file ZIP" +msgstr "Importa i modelli da un file locale." #: editor/export_template_manager.cpp editor/find_in_files.cpp #: editor/progress_dialog.cpp scene/gui/dialogs.cpp @@ -4044,21 +4015,19 @@ msgstr "Annulla" #: editor/export_template_manager.cpp #, fuzzy msgid "Cancel the download of the templates." -msgstr "Impossibile aprire zip dei template d'esportazionie." +msgstr "Annulla lo scaricamento dei modelli." #: editor/export_template_manager.cpp -#, fuzzy msgid "Other Installed Versions:" -msgstr "Versioni Installate:" +msgstr "Altre Versioni Installate:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall Template" -msgstr "Disinstalla" +msgstr "Disinstalla Modello" #: editor/export_template_manager.cpp msgid "Select Template File" -msgstr "Seleziona file template" +msgstr "Seleziona File Modello" #: editor/export_template_manager.cpp msgid "Godot Export Templates" @@ -4086,7 +4055,7 @@ msgstr "" msgid "" "Importing has been disabled for this file, so it can't be opened for editing." msgstr "" -"L'importazione è stata disabilitata per questo file, perciò non possiamo " +"L'importazione è stata disabilitata per questo file, perciò non è possibile " "aprirlo per modificarlo." #: editor/filesystem_dock.cpp @@ -4119,7 +4088,7 @@ msgstr "Il nome fornito contiene caratteri non validi." #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." -msgstr "Un file o cartella con questo nome é già esistente." +msgstr "Un file o cartella con questo nome è già esistente." #: editor/filesystem_dock.cpp msgid "Name contains invalid characters." @@ -4151,15 +4120,15 @@ msgstr "Rinomina cartella:" #: editor/filesystem_dock.cpp msgid "Duplicating file:" -msgstr "Duplicando file:" +msgstr "Duplica file:" #: editor/filesystem_dock.cpp msgid "Duplicating folder:" -msgstr "Duplicando cartella:" +msgstr "Duplica cartella:" #: editor/filesystem_dock.cpp msgid "New Inherited Scene" -msgstr "Nuova scena ereditata" +msgstr "Nuova Scena Ereditata" #: editor/filesystem_dock.cpp msgid "Set As Main Scene" @@ -4167,7 +4136,7 @@ msgstr "Imposta Come Scena Principale" #: editor/filesystem_dock.cpp msgid "Open Scenes" -msgstr "Apri scene" +msgstr "Apri Scene" #: editor/filesystem_dock.cpp msgid "Instance" @@ -4175,7 +4144,7 @@ msgstr "Istanza" #: editor/filesystem_dock.cpp msgid "Add to Favorites" -msgstr "Aggiungi ai preferiti" +msgstr "Aggiungi ai Preferiti" #: editor/filesystem_dock.cpp msgid "Remove from Favorites" @@ -4195,7 +4164,7 @@ msgstr "Sposta in..." #: editor/filesystem_dock.cpp msgid "New Scene..." -msgstr "Nuova scena…" +msgstr "Nuova Scena…" #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "New Script..." @@ -4218,35 +4187,33 @@ msgid "Collapse All" msgstr "Comprimi Tutto" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort files" -msgstr "Cerca file" +msgstr "Ordina file" #: editor/filesystem_dock.cpp msgid "Sort by Name (Ascending)" -msgstr "Ordina per nome (crescente)" +msgstr "Ordina per nome (Crescente)" #: editor/filesystem_dock.cpp msgid "Sort by Name (Descending)" -msgstr "Ordina per nome (decrescente)" +msgstr "Ordina per nome (Decrescente)" #: editor/filesystem_dock.cpp msgid "Sort by Type (Ascending)" -msgstr "Ordina per tipo (crescente)" +msgstr "Ordina per tipo (Crescente)" #: editor/filesystem_dock.cpp msgid "Sort by Type (Descending)" -msgstr "Ordina per tipo (decrescente)" +msgstr "Ordina per tipo (Decrescente)" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort by Last Modified" -msgstr "Ultima Modifica" +msgstr "Ordina per Ultima Modifica" #: editor/filesystem_dock.cpp #, fuzzy msgid "Sort by First Modified" -msgstr "Ultima Modifica" +msgstr "Ordina per Prima Modifica" #: editor/filesystem_dock.cpp msgid "Duplicate..." @@ -4270,7 +4237,7 @@ msgstr "Cartella/File successivo" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" -msgstr "Riscansiona il Filesystem" +msgstr "Ri-scansiona il Filesystem" #: editor/filesystem_dock.cpp msgid "Toggle Split Mode" @@ -4313,7 +4280,7 @@ msgstr "Crea Script" #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp msgid "Find in Files" -msgstr "Trova nei file" +msgstr "Trova nei File" #: editor/find_in_files.cpp msgid "Find:" @@ -4353,8 +4320,9 @@ msgid "Replace: " msgstr "Sostituisci: " #: editor/find_in_files.cpp +#, fuzzy msgid "Replace all (no undo)" -msgstr "Sostituisci tutto (no undo)" +msgstr "Sostituisci tutto (non annullabile)" #: editor/find_in_files.cpp msgid "Searching..." @@ -4402,7 +4370,7 @@ msgstr "Gruppi" #: editor/groups_editor.cpp msgid "Nodes Not in Group" -msgstr "Nodi non nel Gruppo" +msgstr "Nodi Non nel Gruppo" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp #: editor/scene_tree_editor.cpp @@ -4411,7 +4379,7 @@ msgstr "Filtra nodi" #: editor/groups_editor.cpp msgid "Nodes in Group" -msgstr "Nodi in Gruppo" +msgstr "Nodi nel Gruppo" #: editor/groups_editor.cpp msgid "Empty groups will be automatically removed." @@ -4521,7 +4489,7 @@ msgstr "Ripristinare le impostazioni predefinite" #: editor/import_dock.cpp msgid "Keep File (No Import)" -msgstr "Mantieni il file ( Non importare)" +msgstr "Mantieni il File (Non Importare)" #: editor/import_dock.cpp msgid "%d Files" @@ -4536,6 +4504,23 @@ msgid "Clear Default for '%s'" msgstr "Elimina Predefinito per \"%s\"" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reimporta" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Hai modifiche non applicate in sospeso. Cliccare Reimporta per applicare le " +"modifiche effettuate alle opzioni di importazione.\n" +"Selezionare un'altra risorsa nel pannello del file system senza prima " +"cliccare su Reimporta annullerà le modifiche effettuate nel riquadro di " +"Importazione." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importa Come:" @@ -4544,10 +4529,6 @@ msgid "Preset" msgstr "Preimpostazione" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Reimporta" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Salva scene, re-importa e riavvia" @@ -4567,14 +4548,12 @@ msgid "Failed to load resource." msgstr "Caricamento della risorsa fallito." #: editor/inspector_dock.cpp -#, fuzzy msgid "Copy Properties" -msgstr "Proprietà" +msgstr "Copia Proprietà" #: editor/inspector_dock.cpp -#, fuzzy msgid "Paste Properties" -msgstr "Proprietà" +msgstr "Incolla Proprietà" #: editor/inspector_dock.cpp msgid "Make Sub-Resources Unique" @@ -4590,7 +4569,7 @@ msgstr "Carica una risorsa esistente dal disco e modificala." #: editor/inspector_dock.cpp msgid "Save the currently edited resource." -msgstr "Salva la risorsa in modifica." +msgstr "Salva la risorsa attualmente in modifica." #: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp @@ -4599,27 +4578,24 @@ msgid "Save As..." msgstr "Salva Come..." #: editor/inspector_dock.cpp -#, fuzzy msgid "Extra resource options." -msgstr "Non è nel percorso risorse." +msgstr "Ulteriori opzioni di risorsa." #: editor/inspector_dock.cpp -#, fuzzy msgid "Edit Resource from Clipboard" -msgstr "Modifica gli appunti delle risorse" +msgstr "Modifica la Risorsa dagli Appunti" #: editor/inspector_dock.cpp msgid "Copy Resource" msgstr "Copia Risorsa" #: editor/inspector_dock.cpp -#, fuzzy msgid "Make Resource Built-In" -msgstr "Rendi Built-In" +msgstr "Rendi Risorsa Integrata" #: editor/inspector_dock.cpp msgid "Go to the previous edited object in history." -msgstr "Vai all'ultimo oggetto modificato nella cronologia." +msgstr "Vai al precedente oggetto modificato nella cronologia." #: editor/inspector_dock.cpp msgid "Go to the next edited object in history." @@ -4630,26 +4606,24 @@ msgid "History of recently edited objects." msgstr "Cronologia di oggetti recentemente modificati." #: editor/inspector_dock.cpp -#, fuzzy msgid "Open documentation for this object." -msgstr "Apri la documentazione" +msgstr "Apri la documentazione per questo oggetto." #: editor/inspector_dock.cpp editor/scene_tree_dock.cpp msgid "Open Documentation" -msgstr "Apri la documentazione" +msgstr "Apri la Documentazione" #: editor/inspector_dock.cpp msgid "Filter properties" msgstr "Filtra proprietà" #: editor/inspector_dock.cpp -#, fuzzy msgid "Manage object properties." -msgstr "Proprietà oggetto." +msgstr "Gestisci proprietà oggetto." #: editor/inspector_dock.cpp msgid "Changes may be lost!" -msgstr "I cambiamenti potrebbero essere persi!" +msgstr "Le modifiche potrebbero essere perse!" #: editor/multi_node_edit.cpp msgid "MultiNode Set" @@ -4657,7 +4631,7 @@ msgstr "MultiNode Set" #: editor/node_dock.cpp msgid "Select a single node to edit its signals and groups." -msgstr "Seleziona un singolo nodo per eliminare i suoi segnali e gruppi." +msgstr "Seleziona un singolo nodo per modificarne i segnali e gruppi." #: editor/plugin_config_dialog.cpp msgid "Edit a Plugin" @@ -4708,6 +4682,7 @@ msgid "Create points." msgstr "Crea punti." #: editor/plugins/abstract_polygon_2d_editor.cpp +#, fuzzy msgid "" "Edit points.\n" "LMB: Move Point\n" @@ -4884,7 +4859,7 @@ msgstr "Cancella punti e triangoli." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Generate blend triangles automatically (instead of manually)" -msgstr "Genera i tringoli di fusione automaticamente (anzichè manualmente)" +msgstr "Genera i triangoli di fusione automaticamente (anziché manualmente)" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -4903,7 +4878,7 @@ msgstr "Modifica Filtri" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Output node can't be added to the blend tree." -msgstr "Il nodo di output non può essere aggiunto all'albero di fusione." +msgstr "Il nodo in output non può essere aggiunto al BlendTree." #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Add Node to BlendTree" @@ -5081,7 +5056,7 @@ msgstr "Nessuna animazione da modificare!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" msgstr "" -"Esegui la seguente animazione al contrario dalla posizione corrente (A)" +"Esegui la seguente animazione al contrario dalla posizione corrente. (A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from end. (Shift+A)" @@ -5093,11 +5068,11 @@ msgstr "Ferma il playback dell'animazione. (S)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" -msgstr "Esegui l'animazione seguente dall'inizio (Shift+D)" +msgstr "Esegui la seguente l'animazione dall'inizio. (Shift+D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from current pos. (D)" -msgstr "Esegui la seguente animazione dalla posizione corrente (D)" +msgstr "Esegui la seguente animazione dalla posizione corrente. (D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation position (in seconds)." @@ -5130,7 +5105,7 @@ msgstr "Apri nell'Inspector" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." -msgstr "Mostra una lista di animazioni nel player." +msgstr "Mostra la lista di animazioni nel player." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" @@ -5142,7 +5117,7 @@ msgstr "Abilita l'Onion Skinning" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Onion Skinning Options" -msgstr "Opzioni dell'onion skinning" +msgstr "Opzioni dell'Onion Skinning" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Directions" @@ -5302,7 +5277,7 @@ msgstr "" #: editor/plugins/animation_state_machine_editor.cpp msgid "Set the end animation. This is useful for sub-transitions." -msgstr "Assegna l'animazione finale. Questo è utile per le sotto-transizioni." +msgstr "Assegna l'animazione finale. Utile per le sotto-transizioni." #: editor/plugins/animation_state_machine_editor.cpp msgid "Transition: " @@ -5310,7 +5285,7 @@ msgstr "Transizione: " #: editor/plugins/animation_state_machine_editor.cpp msgid "Play Mode:" -msgstr "Modalità Gioco:" +msgstr "Modalità Riproduzione:" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -5344,7 +5319,7 @@ msgstr "Mischia" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Auto Restart:" -msgstr "Restart Automatico:" +msgstr "Riavvio Automatico:" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Restart (s):" @@ -5352,7 +5327,7 @@ msgstr "Riavvia (s):" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Random Restart (s):" -msgstr "Restart Casuale(i):" +msgstr "Riavvio Casuale (s):" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Start!" @@ -5495,7 +5470,7 @@ msgstr "Impossibile risolvere." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, return code:" -msgstr "Richiesta fallita, codice di return:" +msgstr "Richiesta fallita, codice ritornato:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Cannot save response to:" @@ -5511,7 +5486,7 @@ msgstr "Richiesta fallita, troppi ridirezionamenti" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Redirect loop." -msgstr "Ridirigi loop." +msgstr "Ciclo di reindirizzamento." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, timeout" @@ -5527,7 +5502,7 @@ msgstr "Fallito:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." -msgstr "Hash di download non buono, si presume il file sia stato manipolato." +msgstr "Hash di download errato, si presume il file sia stato manomesso." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" @@ -5539,11 +5514,11 @@ msgstr "Ottenuto:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed SHA-256 hash check" -msgstr "Check has SHA-256 fallito" +msgstr "Controllo hash SHA-256 fallito" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" -msgstr "Errore di scaricamento del contenuto:" +msgstr "Errore di download del contenuto:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Downloading (%s / %s)..." @@ -5579,7 +5554,7 @@ msgstr "Errore durante il download" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "Lo scaricamento di questo contenuto è già in corso!" +msgstr "Il download di questo contenuto è già in corso!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Recently Updated" @@ -5675,7 +5650,7 @@ msgstr "File ZIP dei contenuti" #: editor/plugins/audio_stream_editor_plugin.cpp msgid "Audio Preview Play/Pause" -msgstr "Avvia/Pausa l'anteprima audio" +msgstr "Riproduci/Pausa Anteprima Audio" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -5751,7 +5726,7 @@ msgstr "Passo della griglia:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Primary Line Every:" -msgstr "Line Primaria Ogni:" +msgstr "Linea Principale Ogni:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "steps" @@ -5840,15 +5815,13 @@ msgstr "Sposta CanvasItem \"%s\" a (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Blocca selezionato" +msgstr "Bloccato" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Gruppo" +msgstr "Raggruppato" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5867,7 +5840,7 @@ msgid "" "When active, moving Control nodes changes their anchors instead of their " "margins." msgstr "" -"Quando attivato, muovere i nodi Control cambia le loro ancore invece dei " +"Se è attivato, spostare i nodi Control modifica le loro ancore invece dei " "loro margini." #: editor/plugins/canvas_item_editor_plugin.cpp @@ -5908,7 +5881,7 @@ msgstr "Centro" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Left Wide" -msgstr "Lato sinistro" +msgstr "Lato Sinistro" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Top Wide" @@ -5952,13 +5925,13 @@ msgstr "Cambia Ancore" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Project Camera Override\n" "Overrides the running project's camera with the editor viewport camera." msgstr "" "Sovrascrivi Camera Gioco\n" -"Sovrascrive la camera del gioco con la camera del viewport dell'editor." +"Sovrascrive la camera del progetto in esecuzione con la camera del viewport " +"dell'editor." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5974,22 +5947,22 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" -msgstr "Blocca selezionato" +msgstr "Blocca selezionato(i)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Unlock Selected" -msgstr "Sblocca selezionati" +msgstr "Sblocca selezionato(i)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Group Selected" -msgstr "Gruppo Selezionato" +msgstr "Raggruppa Selezionato(i)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Ungroup Selected" -msgstr "Rimuovi selezionati dal gruppo" +msgstr "Rimuovi selezionato(i) dal gruppo" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" @@ -5997,7 +5970,7 @@ msgstr "Incolla Posa" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Guides" -msgstr "Rimuovi guide" +msgstr "Rimuovi Guide" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Custom Bone(s) from Node(s)" @@ -6005,7 +5978,7 @@ msgstr "Crea Ossa personalizzate a partire da uno o più Nodi" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Bones" -msgstr "Rimuovi ossa" +msgstr "Rimuovi Ossa" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" @@ -6028,40 +6001,36 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp msgid "Zoom Reset" -msgstr "Ripristina ingrandimento" +msgstr "Ripristina Zoom" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Select Mode" -msgstr "Modalità di selezione" +msgstr "Modalità di Selezione" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Drag: Rotate selected node around pivot." -msgstr "Rimuovi il nodo o la transizione selezionati." +msgstr "Trascina: Ruota il nodo selezionato attorno al perno." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Move selected node." -msgstr "Alt+Drag: Muovi" +msgstr "Alt+Trascina: Muovi nodo selezionato." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "V: Set selected node's pivot position." -msgstr "Rimuovi il nodo o la transizione selezionati." +msgstr "V: Imposta il perno di rotazione del nodo selezionato." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Alt+RMB: Show list of all nodes at position clicked, including locked." msgstr "" -"Mostra una lista di tutti gli oggetti alla posizione cliccata\n" -"(identico a Alt+RMB in modalità selezione)." +"Alt+Tasto Destro del Mouse: Mostra una lista di tutti i nodi presenti nel " +"posto cliccato, compresi quelli bloccati." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "RMB: Add node at position clicked." -msgstr "Click destro: aggiungi un nodo sulla posizione cliccata." +msgstr "Click destro: Aggiungi nodo alla posizione cliccata." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6085,7 +6054,7 @@ msgid "" "(same as Alt+RMB in select mode)." msgstr "" "Mostra una lista di tutti gli oggetti alla posizione cliccata\n" -"(identico a Alt+RMB in modalità selezione)." +"(identico a Alt+Click Destro in modalità selezione)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Click to change object's rotation pivot." @@ -6097,7 +6066,7 @@ msgstr "Modalità di Pan" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Ruler Mode" -msgstr "Modalità righello" +msgstr "Modalità Righello" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6231,6 +6200,7 @@ msgid "Always Show Grid" msgstr "Mostra sempre Griglia" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Show Helpers" msgstr "Mostra guide" @@ -6256,11 +6226,11 @@ msgstr "Mostra Gruppo e Blocca Icone" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" -msgstr "Centra selezione" +msgstr "Centra Selezione" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "Selezione frame" +msgstr "Selezione Frame" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" @@ -6301,11 +6271,11 @@ msgstr "Inserimento Automatico Chiave" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Animation Key and Pose Options" -msgstr "Chiavi d'Animazione e Opzioni Posa" +msgstr "Opzioni di Chiavi d'Animazione e Posa" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" -msgstr "Inserisci chiave (tracce esistenti)" +msgstr "Inserisci Chiave (Tracce Esistenti)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Copy Pose" @@ -6313,17 +6283,15 @@ msgstr "Copia Posa" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Pose" -msgstr "Azzera posa" +msgstr "Azzera Posa" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Add Node Here" -msgstr "Aggiungi Nodo" +msgstr "Aggiungi Nodo Qui" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Instance Scene Here" -msgstr "Istanzia Scena(e)" +msgstr "Istanzia Scena(e) Qui" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" @@ -6331,7 +6299,7 @@ msgstr "Moltiplica per 2 il passo della griglia" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "Dividi per 2 il passo della griglia" +msgstr "Divide per 2 il passo della griglia" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan View" @@ -6339,49 +6307,43 @@ msgstr "Trasla Visuale" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 3.125%" -msgstr "Ingrandisci al 3.125%" +msgstr "Zoom a 3.125%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 6.25%" -msgstr "Ingrandisci al 6.25%" +msgstr "Zoom a 6.25%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 12.5%" -msgstr "Ingrandisci al 12.5%" +msgstr "Zoom a 12.5%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 25%" -msgstr "Rimpicciolisci" +msgstr "Zoom a 25%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 50%" -msgstr "Rimpicciolisci" +msgstr "Zoom a 50%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 100%" -msgstr "Rimpicciolisci" +msgstr "Zoom a 100%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 200%" -msgstr "Rimpicciolisci" +msgstr "Zoom a 200%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 400%" -msgstr "Rimpicciolisci" +msgstr "Zoom a 400%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 800%" -msgstr "Rimpicciolisci" +msgstr "Zoom a 800%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 1600%" -msgstr "Ingrandisci al 1600%" +msgstr "Zoom a 1600%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -6414,8 +6376,8 @@ msgid "" "Drag & drop + Shift : Add node as sibling\n" "Drag & drop + Alt : Change node type" msgstr "" -"Premi & Trascina + Shift : Aggiungi nodo come fratello\n" -"Premi & Trascina + Alt : Cambia tipo del nodo" +"Trascina & Rilascia + Shift : Aggiungi nodo come fratello\n" +"Trascina & Rilascia + Alt : Cambia tipo del nodo" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Create Polygon3D" @@ -6597,7 +6559,7 @@ msgstr "Editor Lista Elementi" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" -msgstr "Crea Poligono di occlusione" +msgstr "Crea Poligono di Occlusione" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh is empty!" @@ -6710,7 +6672,7 @@ msgid "" msgstr "" "Crea una StaticBody e le assegna automaticamente una forma di collisione " "basata sui poligoni.\n" -"Questa é l'opzione piú accurata (anche se piú lenta) per il calcolo delle " +"Questa é l'opzione più accurata (anche se più lenta) per il calcolo delle " "collisioni." #: editor/plugins/mesh_instance_editor_plugin.cpp @@ -6736,7 +6698,7 @@ msgid "" "This is the fastest (but least accurate) option for collision detection." msgstr "" "Crea una singola forma di collisione convessa.\n" -"Questa é l'opzione piú veloce (anche se meno accurata) per il calcolo delle " +"Questa è l'opzione più veloce (sebbene meno accurata) per il calcolo delle " "collisioni." #: editor/plugins/mesh_instance_editor_plugin.cpp @@ -6751,22 +6713,21 @@ msgid "" "geometry in some cases, at the cost of accuracy." msgstr "" "Crea una forma di collisione convessa semplificata.\n" -"Essa è simile a una forma di collisione singola ma in alcuni casi può " -"risultare in una geometria più semplice al costo di risultare inaccurata." +"Essa è simile a una forma di collisione singola, ma in alcuni casi può " +"risultare in una geometria più semplice, al costo di risultare inaccurata." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Multiple Convex Collision Siblings" msgstr "Crea Multipli Fratelli di Collsione Convessa" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "" "Creates a polygon-based collision shape.\n" "This is a performance middle-ground between a single convex collision and a " "polygon-based collision." msgstr "" "Crea una forma di collisione basata sui poligoni.\n" -"Questa opzione é, in termini di perfomance, un compromesso tra le due " +"Questa opzione è, in termini di prestazioni, un compromesso tra le due " "opzioni prima di questa." #: editor/plugins/mesh_instance_editor_plugin.cpp @@ -6774,6 +6735,7 @@ msgid "Create Outline Mesh..." msgstr "Crea Mesh di Outline..." #: editor/plugins/mesh_instance_editor_plugin.cpp +#, fuzzy msgid "" "Creates a static outline mesh. The outline mesh will have its normals " "flipped automatically.\n" @@ -6831,7 +6793,7 @@ msgstr "Aggiungi Elemento" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Remove Selected Item" -msgstr "Rimuovi Elementi Selezionati" +msgstr "Rimuovi Elemento Selezionato" #: editor/plugins/mesh_library_editor_plugin.cpp #, fuzzy @@ -6867,7 +6829,7 @@ msgstr "Sorgente Mesh invalida (non è una MeshInstance)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (contains no Mesh resource)." -msgstr "Sorgente Mesh invalida (non contiene alcun a risorsa Mesh)." +msgstr "Sorgente Mesh invalida (non contiene alcuna risorsa Mesh)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No surface source specified." @@ -6890,6 +6852,7 @@ msgid "Select a Source Mesh:" msgstr "Seleziona una Mesh Sorgente:" #: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy msgid "Select a Target Surface:" msgstr "Seleziona una Superficie di Target:" @@ -6902,6 +6865,7 @@ msgid "Populate MultiMesh" msgstr "Popola MultiMesh" #: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy msgid "Target Surface:" msgstr "Superficie Target:" @@ -6962,7 +6926,7 @@ msgstr "Genera Rect Visibilità" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Can only set point into a ParticlesMaterial process material" msgstr "" -"É solamente possibile impostare il punto in un materiale di processo " +"È solamente possibile impostare il punto in un materiale di processo " "ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -6976,7 +6940,7 @@ msgstr "Tempo di Generazione (sec):" #: editor/plugins/particles_editor_plugin.cpp msgid "The geometry's faces don't contain any area." -msgstr "La faccia della geometria non contiene alcuna area." +msgstr "Le facce della geometria non contengono nessuna area." #: editor/plugins/particles_editor_plugin.cpp msgid "The geometry doesn't contain any faces." @@ -7020,7 +6984,7 @@ msgstr "Sorgente Emissione: " #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "Un processor material di tipo \"ParticlesMaterial\" é richiesto." +msgstr "Un processor material di tipo 'ParticlesMaterial' é richiesto." #: editor/plugins/particles_editor_plugin.cpp msgid "Generating AABB" @@ -7032,7 +6996,7 @@ msgstr "Genera Visibilità AABB" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Point from Curve" -msgstr "Rimuovi Punto da Curva" +msgstr "Rimuovi Punto dalla Curva" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Out-Control from Curve" @@ -7040,7 +7004,7 @@ msgstr "Rimuovi Out-Control dalla Curva" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove In-Control from Curve" -msgstr "Rimuovi In-Control da Curva" +msgstr "Rimuovi In-Control dalla Curva" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -7104,7 +7068,7 @@ msgstr "Elimina Punto" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Close Curve" -msgstr "Chiudi curva" +msgstr "Chiudi Curva" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -7116,12 +7080,12 @@ msgstr "Opzioni" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Mirror Handle Angles" -msgstr "Specchia maniglie angolari" +msgstr "Specchia Angoli Manico" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Mirror Handle Lengths" -msgstr "Specchia lunghezza maniglie" +msgstr "Specchia Lunghezze Manico" #: editor/plugins/path_editor_plugin.cpp msgid "Curve Point #" @@ -7157,20 +7121,20 @@ msgstr "Rimuovi Punto In-Control" #: editor/plugins/path_editor_plugin.cpp msgid "Split Segment (in curve)" -msgstr "Dividere segmento (in curva)" +msgstr "Dividere Segmento (in curva)" #: editor/plugins/physical_bone_plugin.cpp msgid "Move Joint" -msgstr "Spostare il giunto" +msgstr "Sposta Articolazione" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "The skeleton property of the Polygon2D does not point to a Skeleton2D node" -msgstr "La proprietà scheletro del Polygon2D non punta a un nodo Skeleton2D" +msgstr "La proprietà skeleton del Polygon2D non punta a un nodo Skeleton2D" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Sync Bones" -msgstr "Sincronizza ossa" +msgstr "Sincronizza Ossa" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" @@ -7178,11 +7142,11 @@ msgid "" "Set a texture to be able to edit UV." msgstr "" "Nessuna texture in questo poligono.\n" -"Impostare una texture per poter modificare UV." +"Imposta una texture per poter modificare l'UV." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" -msgstr "Creare mappa UV" +msgstr "Creare Mappa UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" @@ -7194,39 +7158,39 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create Polygon & UV" -msgstr "Crea poligono e UV" +msgstr "Crea Poligono & UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create Internal Vertex" -msgstr "Crea vertice interno" +msgstr "Crea Vertice Interno" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Remove Internal Vertex" -msgstr "Rimuovi vertice interno" +msgstr "Rimuovi Vertice Interno" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Invalid Polygon (need 3 different vertices)" -msgstr "Poligono non valido (sono necessari 3 vertici differenti)" +msgstr "Poligono non valido (sono necessari 3 vertici diversi)" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Add Custom Polygon" -msgstr "Aggiungi poligono personalizzato" +msgstr "Aggiungi Poligono Personalizzato" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Remove Custom Polygon" -msgstr "Rimuovi poligono personalizzato" +msgstr "Rimuovi Poligono Personalizzato" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Transform UV Map" -msgstr "Trasforma la mappa UV" +msgstr "Trasforma Mappa UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Transform Polygon" -msgstr "Trasforma il poligono" +msgstr "Trasforma Poligono" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint Bone Weights" -msgstr "Dipingi peso delle ossa" +msgstr "Dipingi Peso delle Ossa" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Open Polygon 2D UV editor." @@ -7291,8 +7255,8 @@ msgstr "Scala poligono" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create a custom polygon. Enables custom polygon rendering." msgstr "" -"Crea un poligono personalizzato. Abilita il rendering personalizzato dei " -"poligoni." +"Crea un poligono personalizzato. Abilita il rendering dei poligoni " +"personalizzati." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" @@ -7300,7 +7264,7 @@ msgid "" "disabled." msgstr "" "Rimuove un poligono personalizzato. Se non ne rimane nessuno, il rendering " -"personalizzato dei poligoni è disabilitato." +"dei poligoni personalizzati è disabilitato." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint weights with specified intensity." @@ -7368,7 +7332,7 @@ msgstr "Passo Y della griglia:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Sync Bones to Polygon" -msgstr "Sincronizza le ossa al poligono" +msgstr "Sincronizza Ossa a Poligono" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -7418,7 +7382,7 @@ msgstr "Carica risorsa" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ResourcePreloader" -msgstr "Preloader Risorsa" +msgstr "ResourcePreloader" #: editor/plugins/room_manager_editor_plugin.cpp #, fuzzy @@ -7446,9 +7410,8 @@ msgid "Occluder Set Transform" msgstr "Azzera la trasformazione" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Crea Nodo" +msgstr "Centra Nodo" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7460,11 +7423,11 @@ msgstr "Il percorso per AnimationPlayer non è valido" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Files" -msgstr "Elimina i file recenti" +msgstr "Pulisci file recenti" #: editor/plugins/script_editor_plugin.cpp msgid "Close and save changes?" -msgstr "Chiudere e salvare i cambiamenti?" +msgstr "Chiudi e salva le modifiche?" #: editor/plugins/script_editor_plugin.cpp msgid "Error writing TextFile:" @@ -7520,11 +7483,10 @@ msgid "Script is not in tool mode, will not be able to run." msgstr "Lo script non è in modalità tool, non sarà possibile eseguirlo." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "" "To run this script, it must inherit EditorScript and be set to tool mode." msgstr "" -"Per eseguire questo script, esso deve ereditare da EditorScript ed essere " +"Per eseguire questo script, deve ereditare da EditorScript ed essere " "impostato in modalità tool." #: editor/plugins/script_editor_plugin.cpp @@ -7586,11 +7548,11 @@ msgid "Move Down" msgstr "Sposta giù" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "Script successivo" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "Script precedente" #: editor/plugins/script_editor_plugin.cpp @@ -7603,7 +7565,7 @@ msgstr "Apri..." #: editor/plugins/script_editor_plugin.cpp msgid "Reopen Closed Script" -msgstr "Riapri lo script chiuso" +msgstr "Riapri script chiuso" #: editor/plugins/script_editor_plugin.cpp msgid "Save All" @@ -7689,7 +7651,6 @@ msgstr "Debug con un editor esterno" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp -#, fuzzy msgid "Online Docs" msgstr "Documentazione online" @@ -7699,15 +7660,15 @@ msgstr "Apri la documentazione online di Godot." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." -msgstr "Cerca Riferimenti nella documentazione." +msgstr "Cerca riferimenti nella documentazione." #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." -msgstr "Vai al documento precedentemente modificato." +msgstr "Vai al documento modificato precedente." #: editor/plugins/script_editor_plugin.cpp msgid "Go to next edited document." -msgstr "Vai al documento successivo." +msgstr "Vai al documento modificato successivo." #: editor/plugins/script_editor_plugin.cpp msgid "Discard" @@ -7718,8 +7679,8 @@ msgid "" "The following files are newer on disk.\n" "What action should be taken?:" msgstr "" -"I file seguenti sono più recenti su disco.\n" -"Che azione deve essere intrapresa?:" +"I seguenti file sono più recenti sul disco.\n" +"Che azione dovrebbe essere intrapresa?:" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" @@ -7727,7 +7688,7 @@ msgstr "Debugger" #: editor/plugins/script_editor_plugin.cpp msgid "Search Results" -msgstr "Cerca risultati" +msgstr "Risultati Ricerca" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Scripts" @@ -7889,7 +7850,7 @@ msgstr "Aiuto contestuale" #: editor/plugins/script_text_editor.cpp msgid "Toggle Bookmark" -msgstr "Commuta i segnalibri" +msgstr "Commuta segnalibro" #: editor/plugins/script_text_editor.cpp msgid "Go to Next Bookmark" @@ -7945,21 +7906,20 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Questo scheletro non ha ossa, crea dei nodi figlio Bone2D." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Crea Posizione di Riposo dalle Ossa" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Imposta Ossa in Posizione di Riposo" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Crea Posizione di Riposo dalle Ossa" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Imposta Ossa in Posizione di Riposo" +msgstr "Ripristina a Posizione di Riposo" #: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy @@ -7988,72 +7948,66 @@ msgstr "Ortogonale" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" -msgstr "Prospettiva" +msgstr "Prospettica" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Ortogonale" +msgstr "Ortogonale dall'Alto" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Prospettiva" +msgstr "Prospettica dall'Alto" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Ortogonale" +msgstr "Ortogonale dal Basso" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Prospettiva" +msgstr "Prospettica dal Basso" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Ortogonale" +msgstr "Ortogonale a Sinistra" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Prospettiva" +msgid "Left Perspective" +msgstr "Prospettica a Sinistra" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Ortogonale" +msgstr "Ortogonale a Destra" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Prospettica a Destra" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Ortogonale" +msgstr "Ortogonale di Fronte" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Prospettiva" +msgstr "Prospettica di Fronte" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Ortogonale" +msgstr "Ortogonale da Dietro" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Prospettiva" +msgstr "Prospettica da Dietro" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [auto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid " [portals active]" -msgstr "" +msgstr " [portali attivi]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8082,15 +8036,13 @@ msgid "None" msgstr "Nessuno" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rotate" -msgstr "Stato" +msgstr "Ruota" #. TRANSLATORS: This refers to the movement that changes the position of an object. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translate" -msgstr "Trasla:" +msgstr "Trasla" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale" @@ -8117,38 +8069,32 @@ msgid "Animation Key Inserted." msgstr "Chiave d'animazione inserita." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Pitch:" -msgstr "Inclinazione" +msgstr "Inclinazione:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Yaw:" msgstr "Imbardata:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size:" -msgstr "Dimensione: " +msgstr "Dimensione:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Objects Drawn:" -msgstr "Oggetti disegnati" +msgstr "Oggetti disegnati:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Material Changes:" -msgstr "Cambiamenti dei materiali" +msgstr "Cambiamenti dei materiali:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Shader Changes:" -msgstr "Cambiamenti degli shader" +msgstr "Cambiamenti degli shader:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Surface Changes:" -msgstr "Cambiamenti delle superfici" +msgstr "Cambiamenti delle superfici:" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -8156,9 +8102,8 @@ msgid "Draw Calls:" msgstr "Draw Calls" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Vertices:" -msgstr "Vertici" +msgstr "Vertici:" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" @@ -8294,12 +8239,11 @@ msgstr "Modificatore Velocità Vista Libera" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Slow Modifier" -msgstr "Modificatore Vista Libera Velocità Lenta" +msgstr "Modificatore Velocità Lenta Vista Libera" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Camera Preview" -msgstr "Cambia dimensione Telecamera" +msgstr "Cambia Anteprima Telecamera" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Rotation Locked" @@ -8318,13 +8262,12 @@ msgid "" "It cannot be used as a reliable indication of in-game performance." msgstr "" "Nota: Il valore di FPS mostrato è relativo al framerate dell'editor.\n" -"Non può essere usato come indicatore affidabile delle performance durante il " +"Non può essere usato come indicatore affidabile delle prestazioni durante il " "gioco." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Convert Rooms" -msgstr "Converti in %s" +msgstr "Converti Stanze" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" @@ -8340,7 +8283,7 @@ msgid "" msgstr "" "Fare clic per passare da uno stato di visibilità all'altro.\n" "\n" -"Apri gli occhi: Gizmo è visibile.\n" +"Occhio aperto: Gizmo è visibile.\n" "Occhio chiuso: Gizmo è nascosto.\n" "Occhio semiaperto: Gizmo è visibile anche attraverso superfici opache " "(\"raggi X\")." @@ -8361,9 +8304,8 @@ msgid "Use Local Space" msgstr "Usa Spazio Locale" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Use Snap" -msgstr "Scatta" +msgstr "Usa Scatto" #: editor/plugins/spatial_editor_plugin.cpp msgid "Converts rooms for portal culling." @@ -8394,6 +8336,27 @@ msgid "Right View" msgstr "Vista laterale destra" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Vista frontale" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Cambia tra vista prospettica/ortogonale" @@ -8465,14 +8428,12 @@ msgid "View Grid" msgstr "Visualizza Griglia" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Portal Culling" -msgstr "Impostazioni Viewport" +msgstr "Visualizza Eliminazione Portali" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Impostazioni Viewport" +msgstr "Visualizza Eliminazione Occlusioni" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8529,7 +8490,7 @@ msgstr "Ruota (gradi):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale (ratio):" -msgstr "Scala (rateo):" +msgstr "Scala (rapporto):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Type" @@ -8544,9 +8505,8 @@ msgid "Post" msgstr "Post" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "Progetto Senza Nome" +msgstr "Gizmo Senza Nome" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -8578,7 +8538,7 @@ msgstr "Crea LightOccluder2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "LightOccluder2D Preview" -msgstr "Crea LightOccluder2D" +msgstr "Anteprima LightOccluder2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" @@ -8636,7 +8596,7 @@ msgstr "Rimpicciolisci (Pixels): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " -msgstr "Aumento (Pixels): " +msgstr "Ingrandisci (Pixels): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" @@ -8652,7 +8612,7 @@ msgstr "Nessun Frame selezionato" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" -msgstr "Aggiungi %d frame(s)" +msgstr "Aggiungi %d frame" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" @@ -8680,7 +8640,7 @@ msgstr "Aggiungi vuoto" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation FPS" -msgstr "Cambia FPS ANimazione" +msgstr "Cambia FPS Animazione" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" @@ -8716,7 +8676,7 @@ msgstr "Aggiungi una Texture da File" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" -msgstr "Aggiungi Frames da uno Spritesheet" +msgstr "Aggiungi Frame da uno Spritesheet" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -8806,14 +8766,12 @@ msgid "Colors" msgstr "Colore" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Fonts" msgstr "Font" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Icons" -msgstr "Icona" +msgstr "Icone" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8825,47 +8783,40 @@ msgid "{num} color(s)" msgstr "{num} colori" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No colors found." -msgstr "Nessuna sottorisorsa trovata." +msgstr "Nessun colore trovato." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "{num} constant(s)" -msgstr "Costanti" +msgstr "{num} costanti" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No constants found." -msgstr "Costante di colore." +msgstr "Nessuna costante trovata." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "{num} font(s)" -msgstr "{num} caratteri" +msgstr "{num} font" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No fonts found." -msgstr "Non trovato!" +msgstr "Nessun font trovato." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} icon(s)" msgstr "{num} icone" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No icons found." -msgstr "Non trovato!" +msgstr "Nessuna icona trovata." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} stylebox(es)" msgstr "{num} stylebox" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No styleboxes found." -msgstr "Nessuna sottorisorsa trovata." +msgstr "Nessun stylebox trovato." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} currently selected" @@ -8873,7 +8824,7 @@ msgstr "{num} selezionati" #: editor/plugins/theme_editor_plugin.cpp msgid "Nothing was selected for the import." -msgstr "" +msgstr "Non è stato selezionato nulla da importare." #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8895,13 +8846,12 @@ msgid "Finalizing" msgstr "Analizzando" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Filter:" -msgstr "Filtro:" +msgstr "Filtra:" #: editor/plugins/theme_editor_plugin.cpp msgid "With Data" -msgstr "" +msgstr "Con i Dati" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8979,6 +8929,8 @@ msgid "" "Caution: Adding icon data may considerably increase the size of your Theme " "resource." msgstr "" +"Attenzione: Aggiungere i dati delle icone potrebbe aumentare notevolmente il " +"peso della tua risorsa Tema." #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8996,27 +8948,24 @@ msgid "Select all Theme items." msgstr "Seleziona file template" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select With Data" -msgstr "Selezione Punti" +msgstr "Selezione con data" #: editor/plugins/theme_editor_plugin.cpp msgid "Select all Theme items with item data." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Deselect All" -msgstr "Seleziona tutto" +msgstr "Deseleziona tutto" #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all Theme items." -msgstr "" +msgstr "Deseleziona tutti gli elementi del Tema." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Import Selected" -msgstr "Importa Scena" +msgstr "Importa Selezionati" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -9118,13 +9067,12 @@ msgid "Rename Stylebox Item" msgstr "Rimuovi Elementi Selezionati" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Invalid file, not a Theme resource." -msgstr "File non valido, non è una disposizione di un bus audio." +msgstr "File non valido, non una risorsa Tema." #: editor/plugins/theme_editor_plugin.cpp msgid "Invalid file, same as the edited Theme resource." -msgstr "" +msgstr "File non valido, corrisponde alla risorsa Tema in modifica." #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9147,9 +9095,8 @@ msgid "Add Type:" msgstr "Tipo:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Item:" -msgstr "Aggiungi Elemento" +msgstr "Aggiungi Elemento:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9157,42 +9104,36 @@ msgid "Add StyleBox Item" msgstr "Aggiungi Tutti gli Elementi" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Items:" -msgstr "Rimuovi l'elemento" +msgstr "Rimuovi elementi:" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" msgstr "Rimuovi Elementi di Classe" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Custom Items" -msgstr "Rimuovi Elementi di Classe" +msgstr "Rimuovi Elementi Personalizzati" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Items" msgstr "Rimuovi tutti gli elementi" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Theme Item" -msgstr "Elementi Tema GUI" +msgstr "Aggiungi Elemento di Tema" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Old Name:" -msgstr "Nome del nodo:" +msgstr "Nome precedente:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Import Items" -msgstr "Importa tema" +msgstr "Importa Elementi" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Default Theme" -msgstr "Predefinito" +msgstr "Tema Predefinito" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9220,9 +9161,8 @@ msgid "Cancel Item Rename" msgstr "Rinomina in blocco" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Override Item" -msgstr "Sovrascrizioni" +msgstr "Sovrascrivi Elemento" #: editor/plugins/theme_editor_plugin.cpp msgid "Unpin this StyleBox as a main style." @@ -9257,20 +9197,19 @@ msgstr "Carica i predefiniti" #: editor/plugins/theme_editor_plugin.cpp msgid "Show default type items alongside items that have been overridden." msgstr "" +"Mostra elementi predefiniti assieme ad elementi che sono stati sovrascritti." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Override All" -msgstr "Sovrascrizioni" +msgstr "Sovrascrivi tutti" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." -msgstr "" +msgstr "Sovrascrivi tutti gli elementi predefiniti." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme:" -msgstr "Tema" +msgstr "Tema:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9391,19 +9330,21 @@ msgstr "Ha,Molte,Opzioni" #: editor/plugins/theme_editor_preview.cpp msgid "Invalid path, the PackedScene resource was probably moved or removed." msgstr "" +"Percorso non valido, la risorsa PackedScene è stata probabilmente spostata o " +"rimossa." #: editor/plugins/theme_editor_preview.cpp msgid "Invalid PackedScene resource, must have a Control node at its root." msgstr "" +"Risorsa PackedScene non valida, deve avere un nodo Control alla radice." #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Invalid file, not a PackedScene resource." -msgstr "File non valido, non è una disposizione di un bus audio." +msgstr "File non valido, non è una risorsa PackedScene." #: editor/plugins/theme_editor_preview.cpp msgid "Reload the scene to reflect its most actual state." -msgstr "" +msgstr "Ricarica la scena per riflettere i suo stato più reale." #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" @@ -9818,7 +9759,7 @@ msgstr "Rimuovi Poligono di Navigazione" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Priority" -msgstr "Modifica Priorità Tile" +msgstr "Modifica Priorità della Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Z Index" @@ -9850,7 +9791,7 @@ msgstr "TileSet" #: editor/plugins/version_control_editor_plugin.cpp msgid "No VCS addons are available." -msgstr "Non sono disponibili addons VCS." +msgstr "Non sono disponibili estensioni VCS." #: editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -9866,7 +9807,7 @@ msgstr "Commit" #: editor/plugins/version_control_editor_plugin.cpp msgid "VCS Addon is not initialized" -msgstr "L'Addon VCS non è inizializzato" +msgstr "L'Estenzione VCS non è inizializzata" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9914,7 +9855,7 @@ msgstr "Stage Tutto" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" -msgstr "Commit Cambiamenti" +msgstr "Commit Modifiche" #: editor/plugins/version_control_editor_plugin.cpp msgid "View file diffs before committing them to the latest version" @@ -9956,11 +9897,11 @@ msgstr "Sampler" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" -msgstr "Aggiungi porta di Input" +msgstr "Aggiungi porta di input" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" -msgstr "Aggiungi porta di Output" +msgstr "Aggiungi porta di output" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change input port type" @@ -9972,11 +9913,11 @@ msgstr "Cambia tipo di porta di output" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change input port name" -msgstr "Cambia Nome porta Input" +msgstr "Cambia nome porta Input" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change output port name" -msgstr "Cambia Nome porta Input" +msgstr "Cambia nome porta Input" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Remove input port" @@ -10130,11 +10071,11 @@ msgstr "Uguale (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "Maggiore Di (>)" +msgstr "Maggiore di (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "Maggiore o uguale (>=)" +msgstr "Maggiore o Uguale a (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -10162,11 +10103,11 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "Minore Di (<)" +msgstr "Minore di (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "Minore o Uguale (<=)" +msgstr "Minore o Uguale a (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" @@ -10403,9 +10344,8 @@ msgid "Finds the nearest even integer to the parameter." msgstr "Trova il numero intero pari più vicino al parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Clamps the value between 0.0 and 1.0." -msgstr "Blocca il valore tra 0.0 e 1.0." +msgstr "Limita il valore tra 0.0 e 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." @@ -10424,7 +10364,6 @@ msgid "Returns the square root of the parameter." msgstr "Restituisce la radice quadrata del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" "\n" @@ -10513,7 +10452,6 @@ 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" @@ -10527,10 +10465,10 @@ msgstr "" "\n" "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" -"\"." +"(matrice con una sola riga) ed esegue una moltiplicazione algebrica lineare " +"di matrici \"c * r\", creando una matrice il quale numero di righe è il " +"numero di componenti di \"c\" e il cui numero di colonne è il numero di " +"componenti in \"r\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." @@ -10647,7 +10585,6 @@ msgid "Returns the vector that points in the direction of refraction." msgstr "Restituisce un vettore che punta nella direzione della refrazione." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" "\n" @@ -10657,12 +10594,11 @@ msgid "" msgstr "" "SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" "\n" -"Restituisce 0.0 se \"x\" è minore di \"edge0\", e 1.0 se \"x\" è più grande " +"Restituisce 0.0 se \"x\" è minore di \"edge0\", o 1.0 se \"x\" è più grande " "di \"edge1\". Altrimenti, il valore di ritorno è interpolato tra 0.0 e 1.0 " "usando i polinomiali di Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" "\n" @@ -10672,7 +10608,7 @@ msgid "" msgstr "" "SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" "\n" -"Restituisce 0.0 se \"x\" è minore di \"edge0\", e 1.0 se \"x\" è più grande " +"Restituisce 0.0 se \"x\" è minore di \"edge0\", o 1.0 se \"x\" è più grande " "di \"edge1\". Altrimenti, il valore di ritorno è interpolato tra 0.0 e 1.0 " "usando i polinomiali di Hermite." @@ -10725,16 +10661,15 @@ msgid "Vector uniform." msgstr "Uniforme vettore." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Custom Godot Shader Language expression, with custom amount of input and " "output ports. This is a direct injection of code into the vertex/fragment/" "light function, do not use it to write the function declarations inside." msgstr "" -"Una espressione del Custom Godot Shader Language, con quantità " -"personalizzabile di porte input e output. Questa è una iniezione diretta di " -"codice nella funzione vertex/fragment/light. Non usarla per scrivere le " -"dichiarazione della funzione all'interno." +"Una espressione personalizzata in Godot Shader Language, con quantità " +"variabile di porte input e output. Questa è una iniezione diretta di codice " +"nella funzione vertex/fragment/light, non usarla per scrivere dichiarazioni " +"di funzioni al suo interno." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -10751,30 +10686,29 @@ msgid "" "it later in the Expressions. You can also declare varyings, uniforms and " "constants." msgstr "" -"Espressione custom per il Godot Shader Language, la quale sarà " -"sovraposizionata allo shader risultante. Puoi piazzare varie definizioni di " -"funzioni all'interno e chiamarla dopo nelle Espressioni. Puoi anche " +"Espressione personalizzata per il Godot Shader Language, la quale sarà " +"sovrapposta allo shader risultante. Puoi piazzare varie definizioni di " +"funzioni all'interno e chiamarla in seguito nelle Espressioni. Puoi anche " "dichiarare varianti, uniformi e costanti." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "A reference to an existing uniform." -msgstr "Un riferimento a una uniform esistente." +msgstr "Un riferimento a una uniforme esistente." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Scalar derivative function." -msgstr "(Solo modalità Fragment/Light) Fuzione derivata scalare." +msgstr "(Solo in modalità Fragment/Light) Funzione derivata scalare." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Vector derivative function." -msgstr "(Solo modalità Fragment/Light) Fuzione derivata vettoriale." +msgstr "(Solo in modalità Fragment/Light) Funzione derivata vettoriale." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." msgstr "" -"(Solo modalità Fragment/Light) (Vettore) Derivata in \"x\" usando la " +"(Solo in modalità Fragment/Light) (Vettore) Derivata in \"x\" usando la " "differenziazione locale." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10782,7 +10716,7 @@ msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." msgstr "" -"(Solo modalità Fragment/Light) (Scalare) Derivata in \"x\" usando la " +"(Solo in modalità Fragment/Light) (Scalare) Derivata in \"x\" usando la " "differeziazione locale." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10790,7 +10724,7 @@ msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." msgstr "" -"(Soltanto modalità Fragment/Light) (Vettore) Derivata in \"y\" usando la " +"(Solo in modalità Fragment/Light) (Vettore) Derivata in \"y\" usando la " "differenziazione locale." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10798,35 +10732,32 @@ msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." msgstr "" -"(Soltanto modalità Fragment/Light) (Scalare) Derivata in \"y\" usando la " +"(Solo in modalità Fragment/Light) (Scalare) Derivata in \"y\" usando la " "differenziazione locale." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Soltanto modalità Fragment/Light) (Vettore) Somma delle derivate assolute " -"in \"x\" e \"y\"." +"(Solo in modalità Fragment/Light) (Vettore) Somma delle derivate assolute in " +"\"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 "" -"(Soltanto modalità Fragment/Light) (Scalare) Somma delle derivate assolute " -"in \"x\" e \"y\"." +"(Solo in modalità Fragment/Light) (Scalare) Somma delle derivate assolute in " +"\"x\" e \"y\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" msgstr "VisualShader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property:" -msgstr "Modifica Proprietà Visive" +msgstr "Modifica Proprietà Visive:" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" @@ -10845,17 +10776,16 @@ msgid "" "Failed to export the project for platform '%s'.\n" "Export templates seem to be missing or invalid." msgstr "" -"Impossibile esportare il progetto per la piattaforma \"%s\".\n" +"Non è stato possibile esportare il progetto per la piattaforma \"%s\".\n" "I template di esportazione sembrano essere mancanti o non validi." #: editor/project_export.cpp -#, fuzzy msgid "" "Failed to export the project for platform '%s'.\n" "This might be due to a configuration issue in the export preset or your " "export settings." msgstr "" -"Impossibile esportare il progetto per la piattaforma \"%s\".\n" +"Non è stato possibile esportare il progetto per la piattaforma \"%s\".\n" "Questo potrebbe essere dovuto a un problema di configurazione nel preset di " "esportazione o nelle impostazioni di esportazione." @@ -10927,7 +10857,7 @@ msgid "" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" "Filtri per esportare file/cartelle che non sono risorse\n" -"(separati da virgole, per sempio: *.json, *.txt, docs/*)" +"(separati da virgole, per esempio: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "" @@ -10935,7 +10865,7 @@ msgid "" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" "Filtri per escludere file/cartelle dal progetto\n" -"(separati da virgole, per sempio: *.json, *.txt, docs/*)" +"(separati da virgole, per esempio: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Features" @@ -10954,9 +10884,8 @@ msgid "Script" msgstr "Script" #: editor/project_export.cpp -#, fuzzy msgid "GDScript Export Mode:" -msgstr "Modalità Esportazione Script:" +msgstr "Modalità Esportazione GDScript:" #: editor/project_export.cpp msgid "Text" @@ -10964,21 +10893,20 @@ msgstr "Testo" #: editor/project_export.cpp msgid "Compiled Bytecode (Faster Loading)" -msgstr "" +msgstr "Compilato in Bytecode (Caricamento più Veloce)" #: editor/project_export.cpp msgid "Encrypted (Provide Key Below)" msgstr "Criptato (Fornisci la Chiave Sotto)" #: editor/project_export.cpp -#, fuzzy msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" -msgstr "Chiave Crittografica non Valida (deve essere lunga 64 caratteri)" +msgstr "" +"Chiave Crittografica non Valida (deve essere lunga 64 caratteri esadecimali)" #: editor/project_export.cpp -#, fuzzy msgid "GDScript Encryption Key (256-bits as hexadecimal):" -msgstr "Chiave di Crittografia Script (256-bits come esadecimali):" +msgstr "Chiave di Crittografia GDScript (256 bit in esadecimale):" #: editor/project_export.cpp msgid "Export PCK/Zip" @@ -10986,7 +10914,7 @@ msgstr "Esporta PCK/Zip" #: editor/project_export.cpp msgid "Export Project" -msgstr "Esporta progetto" +msgstr "Esporta Progetto" #: editor/project_export.cpp msgid "Export mode?" @@ -11018,7 +10946,7 @@ msgstr "Esporta Con Debug" #: editor/project_manager.cpp msgid "The path specified doesn't exist." -msgstr "Il percorso specificato non é esistente." +msgstr "Il percorso specificato non esiste." #: editor/project_manager.cpp msgid "Error opening package file (it's not in ZIP format)." @@ -11037,7 +10965,7 @@ msgstr "Si prega di scegliere una cartella vuota." #: editor/project_manager.cpp msgid "Please choose a \"project.godot\" or \".zip\" file." -msgstr "Perfavore, scegli un file \"project.godot\" o \".zip\"." +msgstr "Si prega di scegliere un file \"project.godot\" o \".zip\"." #: editor/project_manager.cpp msgid "This directory already contains a Godot project." @@ -11052,9 +10980,8 @@ msgid "Imported Project" msgstr "Progetto Importato" #: editor/project_manager.cpp -#, fuzzy msgid "Invalid project name." -msgstr "Nome Progetto non Valido." +msgstr "Nome del progetto non valido." #: editor/project_manager.cpp msgid "Couldn't create folder." @@ -11070,7 +10997,7 @@ msgstr "Sarebbe una buona idea dare un nome al tuo progetto." #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." -msgstr "Percorso di progetto invalido (cambiato qualcosa?)." +msgstr "Percorso del progetto invalido (cambiato qualcosa?)." #: editor/project_manager.cpp msgid "" @@ -11082,13 +11009,14 @@ msgstr "" #: editor/project_manager.cpp msgid "Couldn't edit project.godot in project path." -msgstr "Impossibile modificare project.godot nel percorso di progetto." +msgstr "Impossibile modificare project.godot nel percorso del progetto." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." -msgstr "Impossibile creare project.godot nel percorso di progetto." +msgstr "Impossibile creare project.godot nel percorso del progetto." #: editor/project_manager.cpp +#, fuzzy msgid "Error opening package file, not in ZIP format." msgstr "Errore nell'apertura del file del pacchetto, non è in formato ZIP." @@ -11102,7 +11030,7 @@ msgstr "Pacchetto installato con successo!" #: editor/project_manager.cpp msgid "Rename Project" -msgstr "Rinomina progetto" +msgstr "Rinomina Progetto" #: editor/project_manager.cpp msgid "Import Existing Project" @@ -11138,7 +11066,7 @@ msgstr "Percorso Progetto:" #: editor/project_manager.cpp msgid "Project Installation Path:" -msgstr "Percorso Progetto di Installazione:" +msgstr "Percorso Installazione del Progetto:" #: editor/project_manager.cpp msgid "Renderer:" @@ -11161,7 +11089,7 @@ msgid "" msgstr "" "Qualità visiva migliore\n" "Tutte le funzionalità disponibili\n" -"Incompatibile con vecchi hardware\n" +"Incompatibile con hardware poco recente\n" "Non consigliato per giochi web" #: editor/project_manager.cpp @@ -11177,14 +11105,14 @@ msgid "" msgstr "" "Qualità visiva inferiore\n" "Alcune funzionalità non disponibili\n" -"Funziona sulla maggior parte degli hardware\n" -"Raccomandato per giochi web" +"Funziona sulla maggior parte di hardware\n" +"Consigliato per giochi web" #: editor/project_manager.cpp msgid "Renderer can be changed later, but scenes may need to be adjusted." msgstr "" "Il renderer può essere cambiato in seguito, ma potrebbe essere necessario " -"regolare le scene." +"rivedere le scene." #: editor/project_manager.cpp msgid "Unnamed Project" @@ -11279,22 +11207,20 @@ msgid "Are you sure to run %d projects at once?" msgstr "Sei sicuro di voler eseguire %d progetti contemporaneamente?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove %d projects from the list?" -msgstr "Seleziona il dispositivo dall'elenco" +msgstr "Rimuovere %d progetti dall'elenco?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove this project from the list?" -msgstr "Seleziona il dispositivo dall'elenco" +msgstr "Rimuovere questo progetto dall'elenco?" #: editor/project_manager.cpp msgid "" "Remove all missing projects from the list?\n" "The project folders' contents won't be modified." msgstr "" -"Rimuovere tutti i progetti mancanti dalla lista?\n" -"I contenuti delle cartelle di progetto non saranno modificati." +"Rimuovere tutti i progetti mancanti dall'elenco?\n" +"Il contenuto delle cartelle di progetto non verrà modificato." #: editor/project_manager.cpp msgid "" @@ -11310,9 +11236,9 @@ msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" "This could take a while." msgstr "" -"Sei sicuro di voler scannerizzare %s cartelle per progetti Godot già " +"Sei sicuro di voler scansionare %s cartelle per progetti Godot già " "esistenti?\n" -"Per questo potrebbe volerci un pò." +"Potrebbe volerci un po' di tempo." #. TRANSLATORS: This refers to the application where users manage their Godot projects. #: editor/project_manager.cpp @@ -11320,9 +11246,8 @@ msgid "Project Manager" msgstr "Gestore dei progetti" #: editor/project_manager.cpp -#, fuzzy msgid "Local Projects" -msgstr "Progetti" +msgstr "Progetti Locali" #: editor/project_manager.cpp msgid "Loading, please wait..." @@ -11333,23 +11258,20 @@ msgid "Last Modified" msgstr "Ultima Modifica" #: editor/project_manager.cpp -#, fuzzy msgid "Edit Project" -msgstr "Esporta progetto" +msgstr "Modifica Progetto" #: editor/project_manager.cpp -#, fuzzy msgid "Run Project" -msgstr "Rinomina progetto" +msgstr "Esegui progetto" #: editor/project_manager.cpp msgid "Scan" -msgstr "Esamina" +msgstr "Scansiona" #: editor/project_manager.cpp -#, fuzzy msgid "Scan Projects" -msgstr "Progetti" +msgstr "Scansiona Progetti" #: editor/project_manager.cpp msgid "Select a Folder to Scan" @@ -11360,18 +11282,16 @@ msgid "New Project" msgstr "Nuovo Progetto" #: editor/project_manager.cpp -#, fuzzy msgid "Import Project" -msgstr "Progetto Importato" +msgstr "Importa Progetto" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Project" -msgstr "Rinomina progetto" +msgstr "Rimuovi Progetto" #: editor/project_manager.cpp msgid "Remove Missing" -msgstr "Rimuovi mancante" +msgstr "Rimuovi Mancanti" #: editor/project_manager.cpp msgid "About" @@ -11391,7 +11311,7 @@ msgstr "Rimuovi Tutto" #: editor/project_manager.cpp msgid "Also delete project contents (no undo!)" -msgstr "" +msgstr "Elimina anche i contenuti del progetto (non reversibile!)" #: editor/project_manager.cpp msgid "Can't run project" @@ -11406,29 +11326,26 @@ msgstr "" "Esplorare i progetti di esempio ufficiali nella libreria dei contenuti?" #: editor/project_manager.cpp -#, fuzzy msgid "Filter projects" -msgstr "Filtra proprietà" +msgstr "Filtra progetti" #: editor/project_manager.cpp -#, fuzzy msgid "" "This field filters projects by name and last path component.\n" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" -"La casella di ricerca filtra i progetti per nome e l'ultimo componente del " -"percorso.\n" +"Questo campo filtra i progetti per nome e ultimo componente del percorso.\n" "Per filtrare i progetti per nome e percorso completo, la query deve " "contenere almeno un carattere `/`." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Tasto " +msgid "Physical Key" +msgstr "Tasto Fisico" #: editor/project_settings_editor.cpp -msgid "Physical Key" -msgstr "" +msgid "Key " +msgstr "Tasto " #: editor/project_settings_editor.cpp msgid "Joy Button" @@ -11452,7 +11369,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "An action with the name '%s' already exists." -msgstr "Un'azione col nome \"%s\" è già esistente." +msgstr "Un'azione con il nome \"%s\" è già esistente." #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -11476,7 +11393,7 @@ msgstr "Dispositivo" #: editor/project_settings_editor.cpp msgid " (Physical)" -msgstr "" +msgstr " (Fisico)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." @@ -11508,19 +11425,19 @@ msgstr "Pulsante Rotellina Giù" #: editor/project_settings_editor.cpp msgid "Wheel Left Button" -msgstr "Pulsante Sinistro della Rotellina" +msgstr "Pulsante Rotellina Sinistro" #: editor/project_settings_editor.cpp msgid "Wheel Right Button" -msgstr "Pulsante Destro della Rotellina" +msgstr "Pulsante Rotellina Destro" #: editor/project_settings_editor.cpp msgid "X Button 1" -msgstr "Tasto X 1" +msgstr "Pulsante X 1" #: editor/project_settings_editor.cpp msgid "X Button 2" -msgstr "Tasto X 2" +msgstr "Pulsante X 2" #: editor/project_settings_editor.cpp msgid "Joypad Axis Index:" @@ -11556,15 +11473,15 @@ msgstr "Pulsante Sinistro." #: editor/project_settings_editor.cpp msgid "Right Button." -msgstr "Pulsante DEstro." +msgstr "Pulsante Destro." #: editor/project_settings_editor.cpp msgid "Middle Button." -msgstr "Pulsante centrale." +msgstr "Pulsante Centrale." #: editor/project_settings_editor.cpp msgid "Wheel Up." -msgstr "Rotellina su." +msgstr "Rotellina Su." #: editor/project_settings_editor.cpp msgid "Wheel Down." @@ -11576,7 +11493,7 @@ msgstr "Aggiungi Proprietà Globale" #: editor/project_settings_editor.cpp msgid "Select a setting item first!" -msgstr "Prima seleziona un oggetto di impostazione!" +msgstr "Seleziona prima un elemento di impostazione!" #: editor/project_settings_editor.cpp msgid "No property '%s' exists." @@ -11600,7 +11517,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Add Input Action" -msgstr "Aggiungi azione di input" +msgstr "Aggiungi Azione di Input" #: editor/project_settings_editor.cpp msgid "Error saving settings." @@ -11619,27 +11536,25 @@ msgid "Override for Feature" msgstr "Sovrascrivi per Caratteristica" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Add %d Translations" -msgstr "Aggiungi Traduzione" +msgstr "Aggiungi %d Traduzioni" #: editor/project_settings_editor.cpp msgid "Remove Translation" msgstr "Rimuovi Traduzione" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Translation Resource Remap: Add %d Path(s)" -msgstr "Remap Risorse Aggiungi Remap" +msgstr "Rimappatura Risorse per la Traduzione: Aggiungi %d Percorso(i)" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Translation Resource Remap: Add %d Remap(s)" -msgstr "Remap Risorse Aggiungi Remap" +msgstr "Rimappatura Risorse per la Traduzione: Aggiungi %d Remap" #: editor/project_settings_editor.cpp +#, fuzzy msgid "Change Resource Remap Language" -msgstr "Cambia Lingua Remap Risorse" +msgstr "Cambia Lingua per il Remap Risorse" #: editor/project_settings_editor.cpp msgid "Remove Resource Remap" @@ -11711,7 +11626,7 @@ msgstr "Traduzioni:" #: editor/project_settings_editor.cpp msgid "Remaps" -msgstr "Remaps" +msgstr "Rimappature" #: editor/project_settings_editor.cpp msgid "Resources:" @@ -11719,7 +11634,7 @@ msgstr "Risorse:" #: editor/project_settings_editor.cpp msgid "Remaps by Locale:" -msgstr "Remaps per Locale:" +msgstr "Rimappature per Locale:" #: editor/project_settings_editor.cpp msgid "Locale" @@ -11807,7 +11722,7 @@ msgstr "Seleziona Proprietà" #: editor/property_selector.cpp msgid "Select Virtual Method" -msgstr "Seleziona il Metodo Virtuale" +msgstr "Seleziona Metodo Virtuale" #: editor/property_selector.cpp msgid "Select Method" @@ -11835,7 +11750,7 @@ msgstr "Usa Espressioni Regolari" #: editor/rename_dialog.cpp msgid "Advanced Options" -msgstr "Opzioni avanzate" +msgstr "Opzioni Avanzate" #: editor/rename_dialog.cpp msgid "Substitute" @@ -11888,7 +11803,7 @@ msgstr "Passo" #: editor/rename_dialog.cpp msgid "Amount by which counter is incremented for each node" -msgstr "Importo di cui il contatore viene incrementato per ogni nodo" +msgstr "Quantità di cui viene incrementato il contatore per ogni nodo" #: editor/rename_dialog.cpp msgid "Padding" @@ -11923,6 +11838,7 @@ msgid "snake_case to PascalCase" msgstr "snake_case a PascalCase" #: editor/rename_dialog.cpp +#, fuzzy msgid "Case" msgstr "Caso" @@ -11936,7 +11852,7 @@ msgstr "In Maiuscolo" #: editor/rename_dialog.cpp msgid "Reset" -msgstr "Reset" +msgstr "Ripristina" #: editor/rename_dialog.cpp msgid "Regular Expression Error:" @@ -11952,7 +11868,7 @@ msgstr "Reparent Nodo" #: editor/reparent_dialog.cpp msgid "Reparent Location (Select new Parent):" -msgstr "Posizione Reparent (Seleziona nuovo genitore):" +msgstr "Posizione di Reparent (Seleziona nuovo Genitore):" #: editor/reparent_dialog.cpp msgid "Keep Global Transform" @@ -12004,7 +11920,7 @@ msgstr "Istanzia Scena(e)" #: editor/scene_tree_dock.cpp msgid "Replace with Branch Scene" -msgstr "Sostituisci con la Scena Branch" +msgstr "Sostituisci con Scena Ramo" #: editor/scene_tree_dock.cpp msgid "Instance Child Scene" @@ -12012,7 +11928,7 @@ msgstr "Istanzia Scena Figlia" #: editor/scene_tree_dock.cpp msgid "Can't paste root node into the same scene." -msgstr "Non si può incollare il noto root nella stessa scena." +msgstr "Non si può incollare il nodo radice nella stessa scena." #: editor/scene_tree_dock.cpp msgid "Paste Node(s)" @@ -12080,12 +11996,16 @@ msgstr "Elimina il nodo \"%s\"?" msgid "" "Saving the branch as a scene requires having a scene open in the editor." msgstr "" +"Per salvare un ramo come scena è necessario avere una scene aperta " +"nell'editor." #: editor/scene_tree_dock.cpp msgid "" "Saving the branch as a scene requires selecting only one node, but you have " "selected %d nodes." msgstr "" +"Per salvare un ramo come scena è necessario selezionare un solo nodo, ma ne " +"sono stati selezionati %s." #: editor/scene_tree_dock.cpp msgid "" @@ -12094,6 +12014,11 @@ msgid "" "FileSystem dock context menu\n" "or create an inherited scene using Scene > New Inherited Scene... instead." msgstr "" +"Impossibile salvare il ramo del nodo radice come una scena istanziata.\n" +"Per creare una copia modificabile della scena corrente, duplicala tramite il " +"menu contestuale del pannello file system\n" +"altrimenti crea una scena ereditata attraverso Scena > Nuova Scena " +"Ereditata... ." #: editor/scene_tree_dock.cpp msgid "" @@ -12101,6 +12026,10 @@ msgid "" "To create a variation of a scene, you can make an inherited scene based on " "the instanced scene using Scene > New Inherited Scene... instead." msgstr "" +"Impossibile salvare il ramo di una scena già istanziata.\n" +"Per creare una variazione di una scena, potresti invece creare una scena " +"ereditata basata sulla scena istanziata attraverso Scena > Nuova Scena " +"Ereditata... ." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -12119,7 +12048,7 @@ msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"Abilitare \"Carica Come Placeholder\" disabiliterà \"Figlio Modificabile\" e " +"Abilitare \"Carica come Placeholder\" disabiliterà \"Figli Modificabili\" e " "riporterà tutte le proprietà del nodo ai loro valori predefiniti." #: editor/scene_tree_dock.cpp @@ -12152,7 +12081,7 @@ msgstr "Altro nodo" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" -msgstr "Impossibile operare su nodi da scena esterna!" +msgstr "Impossibile operare su nodi di una scena esterna!" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes the current scene inherits from!" @@ -12160,7 +12089,7 @@ msgstr "Impossibile operare su nodi da cui la scena corrente eredita!" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." -msgstr "Questa operazione no può essere eseguita su scene istanziate." +msgstr "Questa operazione non può essere eseguita su scene istanziate." #: editor/scene_tree_dock.cpp msgid "Attach Script" @@ -12172,27 +12101,27 @@ msgstr "Taglia Nodo(i)" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" -msgstr "Rimuovi nodo(i)" +msgstr "Rimuovi Nodo(i)" #: editor/scene_tree_dock.cpp msgid "Change type of node(s)" -msgstr "Cambia il tipo del/i nodo/i" +msgstr "Cambia il tipo di nodo(i)" #: editor/scene_tree_dock.cpp msgid "" "Couldn't save new scene. Likely dependencies (instances) couldn't be " "satisfied." msgstr "" -"Impossibile salvare la scena. Probabili dipendenze (istanze) non hanno " -"potuto essere soddisfatte." +"Impossibile salvare una nuova scena. È probabile che le dipendenze (istanze) " +"non siano state soddisfatte." #: editor/scene_tree_dock.cpp msgid "Error saving scene." -msgstr "Errore salvando la scena." +msgstr "Errore durante il salvataggio della scena." #: editor/scene_tree_dock.cpp msgid "Error duplicating scene to save it." -msgstr "Errore duplicando la scena per salvarla." +msgstr "Errore nel duplicare la scena per salvarla." #: editor/scene_tree_dock.cpp msgid "Sub-Resources" @@ -12200,15 +12129,15 @@ msgstr "Sotto-Risorse" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" -msgstr "Liberare ereditarietà" +msgstr "Libera Ereditarietà" #: editor/scene_tree_dock.cpp msgid "Editable Children" -msgstr "Figlio Modificabile" +msgstr "Figli Modificabili" #: editor/scene_tree_dock.cpp msgid "Load As Placeholder" -msgstr "Carica come placeholder" +msgstr "Carica come Placeholder" #: editor/scene_tree_dock.cpp msgid "" @@ -12226,7 +12155,7 @@ msgstr "Aggiungi un nodo figlio" #: editor/scene_tree_dock.cpp msgid "Expand/Collapse All" -msgstr "Espandi/Collassa tutto" +msgstr "Espandi/Comprimi tutto" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -12234,7 +12163,7 @@ msgstr "Cambia Tipo" #: editor/scene_tree_dock.cpp msgid "Reparent to New Node" -msgstr "Reparent a Nuovo Nodo" +msgstr "Riparenta a Nuovo Nodo" #: editor/scene_tree_dock.cpp msgid "Make Scene Root" @@ -12242,7 +12171,7 @@ msgstr "Rendi Scena Radice" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" -msgstr "Unisci Da Scena" +msgstr "Unisci da Scena" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Save Branch as Scene" @@ -12266,7 +12195,7 @@ msgid "" "exists." msgstr "" "Istanzia un file scena come Nodo. Crea una scena ereditata se nessun nodo di " -"root esiste." +"radice esiste." #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script to the selected node." @@ -12274,7 +12203,7 @@ msgstr "Allega un nuovo script o uno già esistente al nodo selezionato." #: editor/scene_tree_dock.cpp msgid "Detach the script from the selected node." -msgstr "Rimuovi lo script per il nodo selezionato." +msgstr "Rimuovi lo script dal nodo selezionato." #: editor/scene_tree_dock.cpp msgid "Remote" @@ -12288,7 +12217,7 @@ msgid "" msgstr "" "Se selezionato, il pannello della scena remota farà ricaricare il progetto " "ogni volta che viene aggiornato.\n" -"Tornare al pannello della scena locale per migliorare le prestazioni." +"Torna al pannello della scena locale per migliorare le prestazioni." #: editor/scene_tree_dock.cpp msgid "Local" @@ -12296,7 +12225,7 @@ msgstr "Locale" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" -msgstr "Liberare ereditarietà? (No Undo!)" +msgstr "Liberare Ereditarietà? (Non Annullabile!)" #: editor/scene_tree_editor.cpp msgid "Toggle Visible" @@ -12308,7 +12237,7 @@ msgstr "Sblocca nodo" #: editor/scene_tree_editor.cpp msgid "Button Group" -msgstr "Gruppo pulsanti" +msgstr "Gruppo Pulsanti" #: editor/scene_tree_editor.cpp msgid "(Connecting From)" @@ -12316,7 +12245,7 @@ msgstr "(Collegamento da)" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" -msgstr "Avviso confugurazione nodo:" +msgstr "Avviso configurazione nodo:" #: editor/scene_tree_editor.cpp msgid "" @@ -12324,7 +12253,7 @@ msgid "" "Click to show signals dock." msgstr "" "Il nodo ha %s connessioni e %s gruppi.\n" -"Cliccare per mostrare il pannello dei segnali." +"Clicca per mostrare il pannello dei segnali." #: editor/scene_tree_editor.cpp msgid "" @@ -12332,7 +12261,7 @@ msgid "" "Click to show signals dock." msgstr "" "Il nodo ha %s connessioni.\n" -"Cliccare per mostrare il pannello dei segnali." +"Clicca per mostrare il pannello dei segnali." #: editor/scene_tree_editor.cpp msgid "" @@ -12344,7 +12273,7 @@ msgstr "" #: editor/scene_tree_editor.cpp msgid "Open Script:" -msgstr "Apri script:" +msgstr "Apri Script:" #: editor/scene_tree_editor.cpp msgid "" @@ -12372,7 +12301,7 @@ msgid "" "Click to unpin." msgstr "" "AnimationPlayer è bloccato.\n" -"Fare clic per sbloccare." +"Fai clic per sbloccare." #: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" @@ -12428,7 +12357,7 @@ msgstr "Selezionata estensione errata." #: editor/script_create_dialog.cpp msgid "Error loading template '%s'" -msgstr "Errore caricamento template \"%s\"" +msgstr "Errore di caricamento template \"%s\"" #: editor/script_create_dialog.cpp msgid "Error - Could not create script in filesystem." @@ -12436,7 +12365,7 @@ msgstr "Errore - Impossibile creare script in filesystem." #: editor/script_create_dialog.cpp msgid "Error loading script from %s" -msgstr "Errore caricamento script da %s" +msgstr "Errore di caricamento script da %s" #: editor/script_create_dialog.cpp msgid "Overrides" @@ -12472,7 +12401,7 @@ msgstr "Nome o percorso genitore ereditato non valido." #: editor/script_create_dialog.cpp msgid "Script path/name is valid." -msgstr "Il nome e la path dello script sono validi." +msgstr "Il nome/percorso dello script sono validi." #: editor/script_create_dialog.cpp msgid "Allowed: a-z, A-Z, 0-9, _ and ." @@ -12480,7 +12409,7 @@ msgstr "Consentiti: a-z, A-Z, 0-9, _ e ." #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." -msgstr "Script incorporato (nel file della scena)." +msgstr "Script integrato (nel file della scena)." #: editor/script_create_dialog.cpp msgid "Will create a new script file." @@ -12499,14 +12428,16 @@ msgid "" "Note: Built-in scripts have some limitations and can't be edited using an " "external editor." msgstr "" -"Note: Gli script pre-installati hanno alcune limitazioni e non possono " -"essere modificati utilizzando un editor esterno." +"Nota: Gli script integrati hanno alcune limitazioni e non possono essere " +"modificati tramite un editor esterno." #: editor/script_create_dialog.cpp msgid "" "Warning: Having the script name be the same as a built-in type is usually " "not desired." msgstr "" +"Avviso: In genere non è ideale avere il nome dello script uguale a quello di " +"un tipo predefinito." #: editor/script_create_dialog.cpp msgid "Class Name:" @@ -12518,7 +12449,7 @@ msgstr "Template:" #: editor/script_create_dialog.cpp msgid "Built-in Script:" -msgstr "Script Built-In:" +msgstr "Script Integrato:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -12530,7 +12461,7 @@ msgstr "Remoto " #: editor/script_editor_debugger.cpp msgid "Bytes:" -msgstr "Bytes:" +msgstr "Byte:" #: editor/script_editor_debugger.cpp msgid "Warning:" @@ -12570,7 +12501,7 @@ msgstr "Errori" #: editor/script_editor_debugger.cpp msgid "Child process connected." -msgstr "Processo Figlio Connesso." +msgstr "Processo figlio connesso." #: editor/script_editor_debugger.cpp msgid "Copy Error" @@ -12578,7 +12509,7 @@ msgstr "Copia Errore" #: editor/script_editor_debugger.cpp msgid "Open C++ Source on GitHub" -msgstr "" +msgstr "Apri Sorgente C++ su Github" #: editor/script_editor_debugger.cpp msgid "Video RAM" @@ -12586,7 +12517,7 @@ msgstr "RAM Video" #: editor/script_editor_debugger.cpp msgid "Skip Breakpoints" -msgstr "Salta i breakpoint" +msgstr "Salta i punti di interruzione" #: editor/script_editor_debugger.cpp msgid "Inspect Previous Instance" @@ -12598,7 +12529,7 @@ msgstr "Ispeziona Istanza Successiva" #: editor/script_editor_debugger.cpp msgid "Stack Frames" -msgstr "Impila Frame" +msgstr "Stack Frame" #: editor/script_editor_debugger.cpp msgid "Profiler" @@ -12622,7 +12553,7 @@ msgstr "Monitor" #: editor/script_editor_debugger.cpp msgid "Pick one or more items from the list to display the graph." -msgstr "Scegli uno o più oggetti dalla lista per mostrare il grafico." +msgstr "Scegli uno o più elementi dall'elenco per mostrare il grafico." #: editor/script_editor_debugger.cpp msgid "List of Video Memory Usage by Resource:" @@ -12658,11 +12589,11 @@ msgstr "Vari" #: editor/script_editor_debugger.cpp msgid "Clicked Control:" -msgstr "Clicked Control:" +msgstr "Control Cliccato:" #: editor/script_editor_debugger.cpp msgid "Clicked Control Type:" -msgstr "Tipo Clicked Control:" +msgstr "Tipo Control Cliccato:" #: editor/script_editor_debugger.cpp msgid "Live Edit Root:" @@ -12690,7 +12621,7 @@ msgstr "Cambia Scorciatoia" #: editor/settings_config_dialog.cpp msgid "Editor Settings" -msgstr "Impostazioni editor" +msgstr "Impostazioni Editor" #: editor/settings_config_dialog.cpp msgid "Shortcuts" @@ -12757,24 +12688,20 @@ msgid "Change Ray Shape Length" msgstr "Cambia lunghezza Ray Shape" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Room Point Position" -msgstr "Imposta Posizione Punto Curva" +msgstr "Imposta Posizione Punto Stanza" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Portal Point Position" -msgstr "Imposta Posizione Punto Curva" +msgstr "Imposta Posizione Punto Portale" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Modifica Raggio di Forma del Cilindro" +msgstr "Imposta Raggio della Sfera Occlusore" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "Imposta Curva In Posizione" +msgstr "Imposta Posizione della Sfera Occlusore" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12866,34 +12793,34 @@ msgstr "Non si basa su un file risorsa" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary format (missing @path)" -msgstr "Istanza invalida formato dizionario (manca @path)" +msgstr "Formato del dizionario dell'istanza non valido (manca @path)" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary format (can't load script at @path)" msgstr "" -"Istanza invalida formato dizionario (impossibile caricare script in @path)" +"Formato del dizionario dell'istanza non valido (impossibile caricare script " +"in @path)" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary format (invalid script at @path)" -msgstr "Istanza invalida formato dizionario (script invalido in @path)" +msgstr "" +"Formato del dizionario dell'istanza non valido (script invalido in @path)" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary (invalid subclasses)" -msgstr "Istanza invalida formato dizionario (sottoclassi invalide)" +msgstr "Formato del dizionario dell'istanza non valido (sottoclassi invalide)" #: modules/gdscript/gdscript_functions.cpp msgid "Object can't provide a length." msgstr "L'oggetto non può fornire una lunghezza." #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp -#, fuzzy msgid "Export Mesh GLTF2" -msgstr "Esporta una libreria di Mesh" +msgstr "Esporta Mesh GLTF2" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp -#, fuzzy msgid "Export GLTF..." -msgstr "Esporta..." +msgstr "Esporta GLTF..." #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -12909,11 +12836,11 @@ msgstr "Piano:" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Floor" -msgstr "Prossimo Piano" +msgstr "Pavimento Successivo" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Previous Floor" -msgstr "Piano Precedente" +msgstr "Pavimento Precedente" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Floor:" @@ -12928,6 +12855,7 @@ msgid "GridMap Fill Selection" msgstr "GridMap Riempi Selezione" #: modules/gridmap/grid_map_editor_plugin.cpp +#, fuzzy msgid "GridMap Paste Selection" msgstr "Sezione GridMap incolla" @@ -12945,9 +12873,8 @@ msgid "Grid Map" msgstr "Mappa di Griglia" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Snap View" -msgstr "Scatta la vista" +msgstr "Scatta Visuale" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy @@ -13028,7 +12955,8 @@ msgstr "Filtra mesh" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Give a MeshLibrary resource to this GridMap to use its meshes." -msgstr "Dai una risorsa MeshLibrary a questa GridMap per usare le sue mesh." +msgstr "" +"Assegna una risorsa MeshLibrary a questa GridMap per usare le sue mesh." #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" @@ -13063,17 +12991,17 @@ msgid "Class name can't be a reserved keyword" msgstr "Il nome della classe non può essere una parola chiave riservata" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Riempi Selezione" +msgstr "Crea Soluzione" #: modules/mono/mono_gd/gd_mono_utils.cpp +#, fuzzy msgid "End of inner exception stack trace" msgstr "Fine dell'analisi dell’eccezione interna dello stack" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Bake NavMesh" -msgstr "Preprocessa NavMesh" +msgstr "Prepara NavMesh" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." @@ -13136,24 +13064,24 @@ msgid "" "A node yielded without working memory, please read the docs on how to yield " "properly!" msgstr "" -"Un nodo ha ceduto senza memoria di lavoro, si prega di leggere la " -"documentazione riguardo a come cedere in maniera corretta!" +"Un nodo ha reso (yield) senza memoria di lavoro, si prega di leggere la " +"documentazione su come rendere correttamente!" #: modules/visual_script/visual_script.cpp msgid "" "Node yielded, but did not return a function state in the first working " "memory." msgstr "" -"Il nodo ha ceduto, ma non ha ritornato uno stato di funzione nella prima " -"memoria di lavoro." +"Il nodo ha reso (yield), ma non ha ritornato uno stato di funzione nella " +"prima memoria di lavoro." #: modules/visual_script/visual_script.cpp msgid "" "Return value must be assigned to first element of node working memory! Fix " "your node please." msgstr "" -"Il valore di return deve essere assegnato al primo elemento della memoria di " -"lavoro del nodo! Si prega di aggiustare il nodo." +"Il valore restituito (return) deve essere assegnato al primo elemento della " +"memoria di lavoro del nodo! Si prega di correggere il nodo." #: modules/visual_script/visual_script.cpp msgid "Node returned an invalid sequence output: " @@ -13196,18 +13124,16 @@ msgid "Add Output Port" msgstr "Aggiungi Porta Output" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Port Type" -msgstr "Cambia Tipo" +msgstr "Cambia Tipo Porta" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Port Name" -msgstr "Cambia Nome porta Input" +msgstr "Cambia Nome Porta" #: modules/visual_script/visual_script_editor.cpp msgid "Override an existing built-in function." -msgstr "Sovrascrivi una funzione built-in esistente." +msgstr "Sovrascrivi una funzione integrata esistente." #: modules/visual_script/visual_script_editor.cpp msgid "Create a new function." @@ -13215,7 +13141,7 @@ msgstr "Crea una nuova funzione." #: modules/visual_script/visual_script_editor.cpp msgid "Variables:" -msgstr "Valiabili:" +msgstr "Variabili:" #: modules/visual_script/visual_script_editor.cpp msgid "Create a new variable." @@ -13255,7 +13181,7 @@ msgstr "Aggiungi Funzione" #: modules/visual_script/visual_script_editor.cpp msgid "Delete input port" -msgstr "Rimuovi Porta Input" +msgstr "Elimina porta input" #: modules/visual_script/visual_script_editor.cpp msgid "Add Variable" @@ -13294,8 +13220,8 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Mantieni premuto Control per rilasciare un Getter. Mantieni premuto Shift " -"per rilasciare una firma generica." +"Mantieni premuto Ctrl per rilasciare un Getter. Mantieni premuto Shift per " +"rilasciare una firma generica." #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a simple reference to the node." @@ -13318,9 +13244,8 @@ msgid "Add Preload Node" msgstr "Aggiungi Nodo Preload" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Node(s)" -msgstr "Aggiungi Nodo" +msgstr "Aggiungi Nodo(i)" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -13333,7 +13258,7 @@ msgid "" msgstr "" "Impossibile lasciare le proprietà perché lo script \"%s\" non è usato nella " "scena.\n" -"Lascia andare premendo \"Shift (Maiuscolo)\" per copiare solo la firma." +"Lascia andare tenendo premuto \"Shift\" per copiare solo la firma." #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" @@ -13393,7 +13318,7 @@ msgstr "Incolla Nodi VisualScript" #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function with a function node." -msgstr "Impossibile creare funzioni con il nodo funzione." +msgstr "Impossibile creare funzioni con un nodo funzione." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." @@ -13588,37 +13513,31 @@ msgstr "Seleziona il dispositivo dall'elenco" #: platform/android/export/export_plugin.cpp msgid "Running on %s" -msgstr "" +msgstr "Esecuzione su %s" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exporting APK..." -msgstr "Esportando Tutto" +msgstr "Esportando APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Uninstalling..." -msgstr "Disinstalla" +msgstr "Disinstallando..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Installing to device, please wait..." -msgstr "Caricamento, per favore attendere..." +msgstr "Installazione sul dispositivo, per favore attendere..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not install to device: %s" -msgstr "Impossibile istanziare la scena!" +msgstr "Impossibile installare sul dispositivo: %s" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Running on device..." -msgstr "Eseguendo Script Personalizzato..." +msgstr "In esecuzione sul dispositivo..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not execute on device." -msgstr "Impossibile creare la cartella." +msgstr "Impossibile eseguire sul dispositivo." #: platform/android/export/export_plugin.cpp msgid "Unable to find the 'apksigner' tool." @@ -13637,6 +13556,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Devono essere configurate le impostazioni Debug Keystore, Debug User E Debug " +"Password, altrimenti nessuna di esse." #: platform/android/export/export_plugin.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -13648,6 +13569,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Devono essere configurate le impostazioni Release Keystore, Release User E " +"Release Password, altrimenti nessuna di esse." #: platform/android/export/export_plugin.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13661,7 +13584,7 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "Invalid Android SDK path in Editor Settings." -msgstr "Un percorso invalido per il SDK Android nelle Impostazioni Editor." +msgstr "Percorso per il SDK Android non valido nelle Impostazioni Editor." #: platform/android/export/export_plugin.cpp msgid "Missing 'platform-tools' directory!" @@ -13702,7 +13625,7 @@ msgid "" "Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " "project setting (changed in Godot 3.2.2).\n" msgstr "" -"Modulo \"GodotPaymentV3\" non valido incluso nelle impostazione del progetto " +"Modulo \"GodotPaymentV3\" non valido incluso nell'impostazione del progetto " "\"android/moduli\" (modificato in Godot 3.2.2).\n" #: platform/android/export/export_plugin.cpp @@ -13728,35 +13651,34 @@ msgid "" "directory.\n" "The resulting %s is unsigned." msgstr "" +"Non è stato possibile trovare \"apksigner\".\n" +"Verificare che il comando sia disponibile nella directory degli strumenti di " +"compilazione Android SDK.\n" +"Il %s risultato non è firmato." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signing release %s..." -msgstr "" -"Scansione File,\n" -"Si prega di attendere..." +msgstr "Firmando rilascio %s..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find keystore, unable to export." -msgstr "Impossibile aprire il template per l'esportazione:" +msgstr "Non è stato possibile trovare keystore, impossible esportare." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" -msgstr "" +msgstr "'apksigner' ha restituito con errore #%d" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Verifying %s..." -msgstr "Aggiungendo %s..." +msgstr "Verificando %s..." #: platform/android/export/export_plugin.cpp msgid "'apksigner' verification of %s failed." -msgstr "" +msgstr "Verifica 'apksigner' di %s non riuscita." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -13765,7 +13687,8 @@ msgstr "Esportazione per Android" #: platform/android/export/export_plugin.cpp msgid "Invalid filename! Android App Bundle requires the *.aab extension." -msgstr "Nome file invalido! Il Bundle Android App richiede l'estensione *.aab." +msgstr "" +"Nome file non valido! Il Bundle Android App richiede l'estensione *.aab." #: platform/android/export/export_plugin.cpp msgid "APK Expansion not compatible with Android App Bundle." @@ -13773,19 +13696,19 @@ msgstr "L'estensione APK non è compatibile con il Bundle Android App." #: platform/android/export/export_plugin.cpp msgid "Invalid filename! Android APK requires the *.apk extension." -msgstr "Nome file invalido! L'APK Android richiede l'estensione *.apk." +msgstr "Nome file non valido! L'APK Android richiede l'estensione *.apk." #: platform/android/export/export_plugin.cpp msgid "Unsupported export format!\n" -msgstr "" +msgstr "Formato d'esportazione non supportato!\n" #: platform/android/export/export_plugin.cpp msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" -"Tentativo di costruire da un template build personalizzato, ma nesuna " -"informazione sulla sua versione esiste. Perfavore, reinstallalo dal menu " +"Tentato di costruire da un template build personalizzato, ma nessuna " +"informazione sulla sua versione esiste. Per favore, reinstallalo dal menu " "\"Progetto\"." #: platform/android/export/export_plugin.cpp @@ -13798,22 +13721,22 @@ msgstr "" "Versione build di Android non coerente:\n" " Template installato: %s\n" " Versione Godot: %s\n" -"Perfavore, reinstalla il build template di Android dal menu \"Progetto\"." +"Per favore, reinstalla il build template di Android dal menu \"Progetto\"." #: platform/android/export/export_plugin.cpp msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name" msgstr "" +"Impossibile sovrascrivere i file res://android/build/res/*.xml con il nome " +"del progetto" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project\n" -msgstr "Impossibile creare project.godot nel percorso di progetto." +msgstr "Impossibile esportare i file del progetto in un progetto gradle\n" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not write expansion package file!" -msgstr "Impossibile scrivere il file:" +msgstr "Impossibile scrivere il file del pacchetto di espansione!" #: platform/android/export/export_plugin.cpp msgid "Building Android Project (gradle)" @@ -13824,7 +13747,7 @@ msgid "" "Building of Android project failed, check output for the error.\n" "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"Costruzione del progetto Android fallita, controlla l'output per vedere gli " +"Compilazione del progetto Android fallita, controlla l'output per vedere gli " "errori.\n" "In alternativa, visita docs.godotengine.org per la documentazione della " "build Android." @@ -13842,21 +13765,20 @@ msgstr "" "directory del progetto gradle per gli output." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: %s" -msgstr "Animazione non trovata: \"%s\"" +msgstr "Pacchetto non trovato: \"%s\"" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Creating APK..." -msgstr "Creazione contorni..." +msgstr "Creazione APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Could not find template APK to export:\n" "%s" -msgstr "Impossibile aprire il template per l'esportazione:" +msgstr "" +"Impossibile trovare il template APK per l'esportazione:\n" +"%s" #: platform/android/export/export_plugin.cpp msgid "" @@ -13865,28 +13787,30 @@ msgid "" "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" +"Mancano librerie nel template di esportazione per le architetture " +"selezionate: %s.\n" +"Si prega di costruire un template con tutte le librerie richieste, o " +"deselezionare le architetture mancanti nel preset di esportazione." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Adding files..." -msgstr "Aggiungendo %s..." +msgstr "Aggiungendo file..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files" -msgstr "Impossibile scrivere il file:" +msgstr "Impossibile esportare i file del progetto" #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." -msgstr "" +msgstr "Allineamento APK..." #: platform/android/export/export_plugin.cpp msgid "Could not unzip temporary unaligned APK." -msgstr "" +msgstr "Impossibile decomprimere l'APK temporaneamente non allineato." #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Identifier is missing." -msgstr "L'identificatore è mancante." +msgstr "Identificatore mancante." #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "The character '%s' is not allowed in Identifier." @@ -13930,49 +13854,44 @@ msgid "Could not write file:" msgstr "Impossibile scrivere il file:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file:" -msgstr "Impossibile scrivere il file:" +msgstr "Impossibile leggere il file:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell:" -msgstr "Impossibile leggere la shell HTML personalizzata:" +msgstr "Impossibile leggere la shell HTML:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory:" -msgstr "Impossibile creare la cartella." +msgstr "Impossibile creare la directory per il server HTTP:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server:" -msgstr "Errore salvando la scena." +msgstr "Errore all'avvio del server HTTP:" #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid bundle identifier:" -msgstr "Identificatore non valido:" +msgstr "Identificatore del bundle non valido:" #: platform/osx/export/export.cpp msgid "Notarization: code signing required." -msgstr "" +msgstr "Autenticazione: è richiesta la firma del codice." #: platform/osx/export/export.cpp msgid "Notarization: hardened runtime required." -msgstr "" +msgstr "Autenticazione: è richiesto un runtime rafforzato." #: platform/osx/export/export.cpp msgid "Notarization: Apple ID name not specified." -msgstr "" +msgstr "Autenticazione: nome Apple ID non specificato." #: platform/osx/export/export.cpp msgid "Notarization: Apple ID password not specified." -msgstr "" +msgstr "Autenticazione: password Apple ID non specificato." #: platform/uwp/export/export.cpp msgid "Invalid package short name." -msgstr "Nome pacchetto invalido, troppo corto." +msgstr "Nome breve del pacchetto non valido." #: platform/uwp/export/export.cpp msgid "Invalid package unique name." @@ -13992,9 +13911,10 @@ msgstr "GUID publisher invalido." #: platform/uwp/export/export.cpp msgid "Invalid background color." -msgstr "Colore di background invalido." +msgstr "Colore di sfondo non valido." #: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid Store Logo image dimensions (should be 50x50)." msgstr "" "Dimensioni dell'immagine dello Store Logo invalide (dovrebbero essere 50x50)." @@ -14032,7 +13952,7 @@ msgstr "" #: platform/uwp/export/export.cpp msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" -"Dimensioni non valide dell'immagine dello splash screen (dovrebbero essere " +"Dimensioni per l'immagine dello splash screen non valide (dovrebbero essere " "620x300)." #: scene/2d/animated_sprite.cpp @@ -14041,7 +13961,7 @@ msgid "" "order for AnimatedSprite to display frames." msgstr "" "Una risorsa SpriteFrames deve essere creata o impostata nella proprietà " -"\"Frames\" in modo da far mostrare i frame dal nodo AnimatedSprite." +"\"Frames\" per permettere a AnimatedSprite di visualizzare i frame." #: scene/2d/canvas_modulate.cpp msgid "" @@ -14049,7 +13969,7 @@ msgid "" "scenes). The first created one will work, while the rest will be ignored." msgstr "" "Solamente un CanvasModulate visibile è consentito per scena (o insieme di " -"scene istanziate). Il primo creato funzionerà, mentre i restanti saranno " +"scene istanziate). Il primo creato funzionerà, mentre gli altri saranno " "ignorati." #: scene/2d/collision_object_2d.cpp @@ -14060,8 +13980,8 @@ msgid "" msgstr "" "Questo nodo non ha una forma, non può quindi collidere o interagire con gli " "altri oggetti.\n" -"Devi aggiungere come figlio un CollisionShape2D oppure un CollisionPolygon2D " -"per definire la sua forma." +"Aggiungi come figlio un CollisionShape2D o un CollisionPolygon2D per " +"definire la sua forma." #: scene/2d/collision_polygon_2d.cpp msgid "" @@ -14070,7 +13990,7 @@ msgid "" "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" "CollisionPolygon2D serve a fornire una forma di collisione a un nodo " -"derivato di CollisionObject2D. Si prega di utilizzarlo solamente come figlio " +"derivato da CollisionObject2D. Si prega di utilizzarlo solamente come figlio " "di Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. in modo da " "dargli una forma." @@ -14091,16 +14011,15 @@ msgstr "" "costruzione \"Segmenti\"." #: scene/2d/collision_shape_2d.cpp -#, fuzzy msgid "" "CollisionShape2D only serves to provide a collision shape to a " "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D serve a fornire una forma di collisione a un nodo derivato " -"da CollisionObject2D. Si prega di utilizzarlo solamente come figlio di " -"Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. in modo da dargli " -"una forma." +"CollisionShape2D serve solo a fornire una forma di collisione a un nodo " +"derivato da CollisionObject2D. Si prega di utilizzarlo solamente come figlio " +"di Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. in modo da " +"dargli una forma." #: scene/2d/collision_shape_2d.cpp msgid "" @@ -14115,9 +14034,9 @@ msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" -"Le forme basate sui poligoni non sono state fatte per essere usate nè " -"modificate direttamente tramite il nodo CollisionShape2D. Per piacere usa " -"invece il nodo CollisionPolygon2D." +"Le forme basate sui poligoni non sono dovrebbero essere usate né modificate " +"direttamente tramite il nodo CollisionShape2D. Si prega di usare invece il " +"nodo CollisionPolygon2D." #: scene/2d/cpu_particles_2d.cpp msgid "" @@ -14145,14 +14064,14 @@ msgstr "Il giunto non è collegato a due PhysicsBody2D" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be different PhysicsBody2Ds" -msgstr "Il Nodo A e il Nodo B devono essere PhysicsBody2D diversi" +msgstr "Nodo A e Nodo B devono essere PhysicsBody2D diversi" #: scene/2d/light_2d.cpp msgid "" "A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" -"Una texture con una forma della luce deve essere fornita alla proprietà " +"Una texture con la forma della luce deve essere fornita alla proprietà " "\"Texture\"." #: scene/2d/light_occluder_2d.cpp @@ -14165,7 +14084,7 @@ msgstr "" #: scene/2d/light_occluder_2d.cpp msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" -"Il poligono per questo occluder è vuoto. Perfavore, disegna un poligono." +"Il poligono per questo occluder è vuoto. Si prega di disegnare un poligono." #: scene/2d/navigation_polygon.cpp msgid "" @@ -14182,14 +14101,14 @@ msgid "" "node. It only provides navigation data." msgstr "" "NavigationPolygonInstance deve essere figlio o nipote di un nodo " -"Navigation2D. Fornisce solamente dati di navigazione." +"Navigation2D. Esso fornisce solamente dati di navigazione." #: scene/2d/parallax_layer.cpp msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -"Il nodo ParallaxLayer funziona solamente quando impostato come figlio di un " -"nodo ParallaxBackground." +"Il nodo ParallaxLayer funziona solamente se impostato come figlio di un nodo " +"ParallaxBackground." #: scene/2d/particles_2d.cpp msgid "" @@ -14206,8 +14125,8 @@ msgid "" "A material to process the particles is not assigned, so no behavior is " "imprinted." msgstr "" -"Un materiale per processare le particelle non é assegnato, pertanto nessun " -"comportamento é impresso." +"Non è assegnato un materiale per processare le particelle, pertanto nessun " +"comportamento viene impresso." #: scene/2d/particles_2d.cpp msgid "" @@ -14220,8 +14139,7 @@ msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." msgstr "" -"PathFollow2D funziona solamente quando impostato come figlio di un nodo " -"Path2D." +"PathFollow2D funziona solamente se impostato come figlio di un nodo Path2D." #: scene/2d/physics_body_2d.cpp msgid "" @@ -14230,11 +14148,10 @@ msgid "" "Change the size in children collision shapes instead." msgstr "" "I cambiamenti di dimensione a RigidBody2D (in modalità rigida o carattere) " -"saranno sovrascritti dal motore fisico quando in esecuzione.\n" +"saranno sovrascritti dal motore fisico durante l'esecuzione.\n" "Modifica invece la dimensione nelle forme di collisione figlie." #: scene/2d/remote_transform_2d.cpp -#, fuzzy msgid "Path property must point to a valid Node2D node to work." msgstr "La proprietà path deve puntare a un nodo Node2D valido per funzionare." @@ -14262,16 +14179,16 @@ msgid "" "KinematicBody2D, etc. to give them a shape." msgstr "" "TileMap con Use Parent abilitato richiede un genitore CollisionObject2D per " -"dargli forma. Perfavore, usalo come figlio di Area2D, StaticBody2D, " -"RigidBody2D, KinematicBody2D, etc. per dargli una forma." +"dargli forma. Si prega di usalo come figlio di Area2D, StaticBody2D, " +"RigidBody2D, KinematicBody2D, ecc. per dare loro una forma." #: scene/2d/visibility_notifier_2d.cpp msgid "" "VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" -"VisibilityEnabler2D funziona meglio quando usato con il nodo principale " -"della scena ereditata direttamente come genitore." +"VisibilityEnabler2D funziona meglio se usato con il nodo radice della scena " +"modificata direttamente come genitore." #: scene/3d/arvr_nodes.cpp msgid "ARVRCamera must have an ARVROrigin node as its parent." @@ -14282,13 +14199,12 @@ msgid "ARVRController must have an ARVROrigin node as its parent." msgstr "ARVRController deve avere un nodo ARVROrigin come genitore." #: 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 "" -"L'id del controller non deve essere 0 o non verrà associato a un controller " -"attuale." +"L'ID del controller non deve essere 0 o esso non verrà associato a un vero " +"controller." #: scene/3d/arvr_nodes.cpp msgid "ARVRAnchor must have an ARVROrigin node as its parent." @@ -14300,8 +14216,8 @@ msgid "" "The anchor ID must not be 0 or this anchor won't be bound to an actual " "anchor." msgstr "" -"L'ID dell'ancora non deve essere 0 oppure non verrà associato a un'ancora " -"attuale." +"L'ID dell'ancora non deve essere 0 oppure essa non verrà associata a " +"un'ancora vera." #: scene/3d/arvr_nodes.cpp msgid "ARVROrigin requires an ARVRCamera child node." @@ -14321,11 +14237,11 @@ msgstr "Preparazione Ambiente" #: scene/3d/baked_lightmap.cpp msgid "Generating capture" -msgstr "Generando cattura" +msgstr "Generazione cattura" #: scene/3d/baked_lightmap.cpp msgid "Saving lightmaps" -msgstr "Salvando Lightmap" +msgstr "Salvataggio Lightmap" #: scene/3d/baked_lightmap.cpp msgid "Done" @@ -14343,7 +14259,6 @@ msgstr "" "definire la sua forma." #: scene/3d/collision_polygon.cpp -#, fuzzy msgid "" "CollisionPolygon only serves to provide a collision shape to a " "CollisionObject derived node. Please only use it as a child of Area, " @@ -14351,30 +14266,31 @@ msgid "" msgstr "" "CollisionPolygon serve solamente a fornire una forma di collisione a un nodo " "derivato da CollisionObject. Si prega di usarlo solamente come figlio di " -"Area, StaticBody, RigidBody, KinematicBody, etc. in modo da dargli una forma." +"Area, StaticBody, RigidBody, KinematicBody, ecc. in modo da dare loro una " +"forma." #: scene/3d/collision_polygon.cpp msgid "An empty CollisionPolygon has no effect on collision." msgstr "Un CollisionPolygon vuoto non ha effetti in collisione." #: scene/3d/collision_shape.cpp -#, fuzzy msgid "" "CollisionShape only serves to provide a collision shape to a CollisionObject " "derived node. Please only use it as a child of Area, StaticBody, RigidBody, " "KinematicBody, etc. to give them a shape." msgstr "" -"CollisionShape serve a fornire una forma di collisione a un nodo derivato da " -"CollisionObject. Si prega di utilizzarlo solamente come figlio di Area, " -"StaticBody, RigidBody, KinematicBody, etc. in modo da dargli una forma." +"CollisionShape serve solamente a fornire una forma di collisione a un nodo " +"derivato da CollisionObject. Si prega di usarlo solamente come figlio di " +"Area, StaticBody, RigidBody, KinematicBody, etc. in modo da dare loro una " +"forma." #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " "shape resource for it." msgstr "" -"Una forma deve essere fornita per il CollisionShape per farlo funzionare. " -"Perfavore, creali una risorsa \"forma\"." +"È necessario fornire una forma al CollisionShape per farlo funzionare. " +"Perciò, si prega di creare una risorsa forma (shape)." #: scene/3d/collision_shape.cpp msgid "" @@ -14424,6 +14340,9 @@ msgid "" "longer has any effect.\n" "To remove this warning, disable the GIProbe's Compress property." msgstr "" +"La proprietà GIProbe Compress è stata deprecata a causa di bug noti e non ha " +"più alcun effetto.\n" +"Per rimuovere questo avviso, disattiva la proprietà Compress di GIProbe." #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." @@ -14433,7 +14352,7 @@ msgstr "" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" -"Una risorsa NavigationMesh deve essere creata o impostata affinché questo " +"È necessario creare o impostare una risorsa NavigationMesh affinché questo " "nodo funzioni." #: scene/3d/navigation_mesh.cpp @@ -14446,11 +14365,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "Nessuna forma è impostata." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Solo scale uniformi sono supportate." #: scene/3d/particles.cpp msgid "" @@ -14472,8 +14391,8 @@ msgid "" "Particles animation requires the usage of a SpatialMaterial whose Billboard " "Mode is set to \"Particle Billboard\"." msgstr "" -"Le animazioni delle particelle richiedono l'uso di un SpatialMaterial la cui " -"modalità Billboard è impostata a \"Particle Billboard\"." +"L'animazione delle particelle richiede l'uso di un SpatialMaterial la cui " +"Modalità Billboard è impostata a \"Particle Billboard\"." #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." @@ -14484,7 +14403,7 @@ msgid "" "PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " "parent Path's Curve resource." msgstr "" -"Il flag ROTATION_ORIENTED di un PathFollow richiede \"Up Vector\" di essere " +"Il flag ROTATION_ORIENTED di PathFollow richiede che \"Up Vector\" sia " "abilitato nella risorsa Curve del genitore Path." #: scene/3d/physics_body.cpp @@ -14493,41 +14412,41 @@ msgid "" "by the physics engine when running.\n" "Change the size in children collision shapes instead." msgstr "" -"I cambiamenti di dimensione a RigidBody (nel personaggio o nelle modalità " -"rigide) saranno sovrascritti dal motore fisico quando in esecuzione.\n" -"Modifica invece la dimensione in sagome di collisione figlie." +"I cambiamenti di dimensione a RigidBody (in modalità rigida o carattere) " +"saranno sovrascritti dal motore fisico durante l'esecuzione.\n" +"Modifica invece la dimensione nelle forme di collisione figlie." #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" -msgstr "Il Nodo A e il Nodo B devono essere PhysicsBodies" +msgstr "Nodo A e Nodo B devono essere PhysicsBodies" #: scene/3d/physics_joint.cpp msgid "Node A must be a PhysicsBody" -msgstr "Il Nodo A deve essere un PhysicsBody" +msgstr "Nodo A deve essere un PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Node B must be a PhysicsBody" -msgstr "Il Nodo B deve essere un PhysicsBody" +msgstr "Nodo B deve essere un PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Joint is not connected to any PhysicsBodies" -msgstr "Il giunto non è collegato a dei PhysicsBodies" +msgstr "Il giunto non è collegato a nessun PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be different PhysicsBodies" -msgstr "Il Nodo A e il Nodo B devono essere PhysicsBodies diversi" +msgstr "Nodo A e Nodo B devono essere PhysicsBody diversi" #: scene/3d/portal.cpp msgid "The RoomManager should not be a child or grandchild of a Portal." -msgstr "" +msgstr "Il RoomManager non deve essere figlio o nipote di un Portal." #: scene/3d/portal.cpp msgid "A Room should not be a child or grandchild of a Portal." -msgstr "" +msgstr "Un nodo Room non dovrebbe essere figlio o nipote di un Portal." #: scene/3d/portal.cpp msgid "A RoomGroup should not be a child or grandchild of a Portal." -msgstr "" +msgstr "Un RoomGroup non dovrebbe essere figlio o nipote di un Portal." #: scene/3d/remote_transform.cpp msgid "" @@ -14539,83 +14458,108 @@ msgstr "" #: scene/3d/room.cpp msgid "A Room cannot have another Room as a child or grandchild." -msgstr "" +msgstr "Un Room non può avere un altro Room come figlio o nipote." #: scene/3d/room.cpp msgid "The RoomManager should not be placed inside a Room." -msgstr "" +msgstr "Il RoomManager non dovrebbe collocato all'interno di un Room." #: scene/3d/room.cpp msgid "A RoomGroup should not be placed inside a Room." -msgstr "" +msgstr "Un RoomGroup non dovrebbe essere collocato all'interno di un Room." #: scene/3d/room.cpp msgid "" "Room convex hull contains a large number of planes.\n" "Consider simplifying the room bound in order to increase performance." msgstr "" +"L'hull converso del Room contiene un gran numero di piani.\n" +"Si consiglia di semplificare i vincoli della stanza per aumentare le " +"prestazioni." #: scene/3d/room_group.cpp msgid "The RoomManager should not be placed inside a RoomGroup." msgstr "" +"Il RoomManager non dovrebbe essere collocato all'interno di un RoomGroup." #: scene/3d/room_manager.cpp msgid "The RoomList has not been assigned." -msgstr "" +msgstr "Il RoomList non è stato assegnato." #: scene/3d/room_manager.cpp msgid "The RoomList node should be a Spatial (or derived from Spatial)." msgstr "" +"Il nodo RoomList dovrebbe essere di tipo Spatial (o derivato da Spatial)." #: scene/3d/room_manager.cpp msgid "" "Portal Depth Limit is set to Zero.\n" "Only the Room that the Camera is in will render." msgstr "" +"Portal Depth Limit è impostato a Zero.\n" +"Verrà renderizzata soltanto la Stanza in cui si trova la telecamera." #: scene/3d/room_manager.cpp msgid "There should only be one RoomManager in the SceneTree." -msgstr "" +msgstr "Ci dovrebbe essere un solo RoomManager nello SceneTree." #: scene/3d/room_manager.cpp msgid "" "RoomList path is invalid.\n" "Please check the RoomList branch has been assigned in the RoomManager." msgstr "" +"Percorso per il RoomList non valido.\n" +"Assicurarsi che il ramo RoomList sia stato assegnato nel RoomManager." #: scene/3d/room_manager.cpp +#, fuzzy msgid "RoomList contains no Rooms, aborting." -msgstr "" +msgstr "RoomList non contiene Stanze, interruzione." #: scene/3d/room_manager.cpp msgid "Misnamed nodes detected, check output log for details. Aborting." msgstr "" +"Rilevati nodi con nomi errati, controlla il registro di output per i " +"dettagli. Interruzione." #: scene/3d/room_manager.cpp +#, fuzzy msgid "Portal link room not found, check output log for details." msgstr "" +"Collegamento stanza del Portale non trovato. Controlla il registro di output " +"per i dettagli." #: scene/3d/room_manager.cpp msgid "" "Portal autolink failed, check output log for details.\n" "Check the portal is facing outwards from the source room." msgstr "" +"Collegamento automatico portali fallito, controlla il registro di output per " +"i dettagli.\n" +"Assicurarsi che il portale sia rivolto verso l'esterno della stanza di " +"origine." #: scene/3d/room_manager.cpp msgid "" "Room overlap detected, cameras may work incorrectly in overlapping area.\n" "Check output log for details." msgstr "" +"Rilevata sovrapposizione di stanze, le telecamere potrebbero non funzionare " +"correttamente nell'area sovrapposta.\n" +"Controlla il registro di output per i dettagli." #: scene/3d/room_manager.cpp +#, fuzzy msgid "" "Error calculating room bounds.\n" "Ensure all rooms contain geometry or manual bounds." msgstr "" +"Errore durante il calcolo dei confini della stanza.\n" +"Assicurarsi che tutte le stanze contengano geometria o confini manuali." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." -msgstr "Questo corpo verrà ignorato fino a quando non imposterai una mesh." +msgstr "Questo corpo verrà ignorato finché non imposterai una mesh." #: scene/3d/soft_body.cpp msgid "" @@ -14625,7 +14569,7 @@ msgid "" msgstr "" "Le modifiche alle dimensioni di SoftBody saranno sovrascritte dal motore " "fisico durante l'esecuzione.\n" -"Cambiare invece le dimensioni nelle forme di collisioni figlie." +"Modifica invece la dimensione nelle forme di collisione figlie." #: scene/3d/sprite_3d.cpp msgid "" @@ -14633,7 +14577,7 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" "Una risorsa SpriteFrames deve essere creata o impostata nella proprietà " -"\"Frames\" in modo da far mostrare i frame dall'AnimatedSprite3D." +"\"Frames\" per permettere a AnimatedSprite3D di visualizzare i frame." #: scene/3d/vehicle_body.cpp msgid "" @@ -14648,23 +14592,24 @@ msgid "" "WorldEnvironment requires its \"Environment\" property to contain an " "Environment to have a visible effect." msgstr "" -"WordEnvironment richiede la sua proprietà \"Environment\" di contenere un " +"WordEnvironment richiede che la sua proprietà \"Environment\" contenga un " "Environment per avere un effetto visibile." #: scene/3d/world_environment.cpp msgid "" "Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." msgstr "" -"Solamente un WorldEnvironment è consentito per scena (o insieme di scene " -"istanziate)." +"Solamente un solo WorldEnvironment è consentito per scena (o insieme di " +"scene istanziate)." #: scene/3d/world_environment.cpp msgid "" "This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set " "this environment's Background Mode to Canvas (for 2D scenes)." msgstr "" -"Questo WorldEnvironment viene ignorato. Aggiungere una Telecamera (per le " -"scene 3D) o impostare questo ambiente Modalità Canvas (per le scene in 2D)." +"Questo WorldEnvironment è ignorato. Aggiungi una Telecamera (per le scene " +"3D) oppure imposta il Background Mode di questo ambiente su Canvas (per le " +"scene in 2D)." #: scene/animation/animation_blend_tree.cpp msgid "On BlendTree node '%s', animation not found: '%s'" @@ -14675,8 +14620,9 @@ msgid "Animation not found: '%s'" msgstr "Animazione non trovata: \"%s\"" #: scene/animation/animation_player.cpp +#, fuzzy msgid "Anim Apply Reset" -msgstr "" +msgstr "Applica Ripristino Anim." #: scene/animation/animation_tree.cpp msgid "In node '%s', invalid animation: '%s'." @@ -14688,7 +14634,7 @@ msgstr "Animazione non valida: \"%s\"." #: scene/animation/animation_tree.cpp msgid "Nothing connected to input '%s' of node '%s'." -msgstr "Nulla collegato all'ingresso \"%s\" del nodo \"%s\"." +msgstr "Niente collegato all'input \"%s\" del nodo \"%s\"." #: scene/animation/animation_tree.cpp msgid "No root AnimationNode for the graph is set." @@ -14697,7 +14643,7 @@ msgstr "Non è stato impostato alcun AnimationNode root per il grafico." #: scene/animation/animation_tree.cpp msgid "Path to an AnimationPlayer node containing animations is not set." msgstr "" -"Il Percorso di un nodo AnimationPlayer contenente animazioni non è impostato." +"Il percorso di un nodo AnimationPlayer contenente animazioni non è impostato." #: scene/animation/animation_tree.cpp msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." @@ -14707,11 +14653,11 @@ msgstr "" #: scene/animation/animation_tree.cpp msgid "The AnimationPlayer root node is not a valid node." -msgstr "Il nodo root dell'AnimationPlayer non è valido." +msgstr "Il nodo radice dell'AnimationPlayer non è valido." #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." -msgstr "Questo nodo è stato deprecato. In alternativa, usa un AnimationTree." +msgstr "Questo nodo è stato deprecato. Usa invece un AnimationTree." #: scene/gui/color_picker.cpp msgid "" @@ -14749,17 +14695,19 @@ msgid "" "children placement behavior.\n" "If you don't intend to add a script, use a plain Control node instead." msgstr "" -"Il Contanier da se non serve alcuna funzione affinché uno script non " -"configura il comportamento di posizione dei figli.\n" -"Se non intendi aggiungere uno script, usa un semplice nodo Control." +"Il Container di per sé non serve a nulla, a meno che uno script non " +"configuri il suo comportamento di posizionamento figli.\n" +"Se non intendi aggiungere uno script, utilizza invece un semplice nodo " +"Control." #: scene/gui/control.cpp msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" -"Il tooltip non comparirà poiché il Mouse filter del control è impostato a " -"\"Ignore\". Per risolvere questo, impostalo a \"Stop\" o \"Pass\"." +"Il Tooltip non apparirà poiché la proprietà Mouse Filter del Control è " +"impostata su \"Ignore\". Per risolvere questo problema, imposta Mouse Filter " +"su \"Stop\" o \"Pass\"." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -14784,6 +14732,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Le opzioni Tile e Tile Fit per le proprietà Axis Stretch hanno effetto solo " +"se si utilizza il rendering back-end GLES3.\n" +"Poiché il back-end GLES2 è attualmente in uso, queste modalità si " +"comporteranno invece come Stretch." #: scene/gui/popup.cpp msgid "" @@ -14791,8 +14743,8 @@ msgid "" "functions. Making them visible for editing is fine, but they will hide upon " "running." msgstr "" -"I popup saranno nascosti di default finchè non chiami popup(), o una delle " -"qualsiasi funzioni popup*(). Farli diventare visibili per modificarli va " +"I popup saranno nascosti di default finché non chiami popup(), o una " +"qualsiasi delle funzioni popup*(). Renderli visibili per modificarli va " "bene, ma scompariranno durante l'esecuzione." #: scene/gui/range.cpp @@ -14800,15 +14752,15 @@ msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "Se \"Exp Edit\" è abilitato, \"Min Value\" deve essere maggiore di 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 è inteso per funzionare con un singolo figlio di controllo.\n" -"Usa un container come figlio (VBox, HBox, ect.), oppure un nodo Control e " -"imposta la dimensione minima personalizzata manualmente." +"ScrollContainer è progettato per funzionare con un singolo figlio di " +"controllo.\n" +"Usa un container come figlio (VBox, HBox, ect.), oppure un nodo Control, " +"impostando la dimensione minima personalizzata manualmente." #: scene/gui/tree.cpp msgid "(Other)" @@ -14820,7 +14772,19 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" "Non è stato possibile caricare l'Ambiente predefinito come specificato nelle " -"Impostazioni Progetto (Rendering -> Ambiente -> Ambiente Predefinito)." +"Impostazioni Progetto (Rendering -> Environment -> Default Environment)." + +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"I tempi d'attesa dei Timer molto brevi (< 0.05 seconds) potrebbero " +"comportarsi in modo poco incoerente, a seconda del framerate di rendering o " +"fisico.\n" +"Si consiglia invece di affidarsi a un Timer per tempi d'attesa molto brevi." #: scene/main/viewport.cpp msgid "" @@ -14830,31 +14794,35 @@ msgid "" "texture to some node for display." msgstr "" "Questo viewport non è impostato come target di render. Se si vuole che il " -"suo contenuto venga direttamente mostrato a schermo, renderlo figlio di un " -"Control, in modo che possa ottenere una dimensione. Altrimenti, renderlo un " -"RenderTarget e assegnare alla sua texture interna qualche nodo da mostrare." +"suo contenuto venga direttamente visualizzato sullo schermo, renderlo figlio " +"di un Control, in modo che possa ottenere una dimensione. Altrimenti, " +"renderlo un RenderTarget e assegnare la sua texture interna a qualche nodo " +"per la visualizzazione." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" -"La dimensione del Viewport deve essere maggiore di 0 affinché qualcosa sia " -"visibile." +"La dimensione del Viewport deve essere maggiore o uguale a 2 pixel su " +"entrambi i lati per visualizzare qualcosa." #: scene/resources/occluder_shape.cpp +#, fuzzy msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "Imposta Sfere OccluderShapeSphere" #: scene/resources/visual_shader_nodes.cpp msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." msgstr "" -"La porta del sampler è connessa ma mai usata. Considera cambiare la sorgente " -"a \"SamplerPort\"." +"La porta del sampler è connessa ma mai usata. Considera di cambiare la " +"sorgente a \"SamplerPort\"." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." -msgstr "Fonte non valida per l'anteprima." +msgstr "Sorgente non valida per l'anteprima." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." @@ -14865,26 +14833,30 @@ msgid "Invalid comparison function for that type." msgstr "Funzione di confronto non valida per quel tipo." #: servers/visual/shader_language.cpp -#, fuzzy msgid "Varying may not be assigned in the '%s' function." -msgstr "" -"Le variabili possono essere assegnate soltanto in funzione del vertice." +msgstr "Le variabili non possono essere assegnate nella funzione \"%s\"." #: servers/visual/shader_language.cpp msgid "" "Varyings which assigned in 'vertex' function may not be reassigned in " "'fragment' or 'light'." msgstr "" +"Le variabili assegnate nella funzione \"vertex\" non possono essere " +"riassegnate in \"fragment\" o \"light\"." #: servers/visual/shader_language.cpp msgid "" "Varyings which assigned in 'fragment' function may not be reassigned in " "'vertex' or 'light'." msgstr "" +"Le variabili assegnate nella funzione \"fragment\" non possono essere " +"riassegnate in \"vertex\" o \"light\"." #: servers/visual/shader_language.cpp msgid "Fragment-stage varying could not been accessed in custom function!" msgstr "" +"Non è stato possibile accedere a variabile in fase di Fragment nella " +"funzione personalizzata!" #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -16535,9 +16507,6 @@ msgstr "Le constanti non possono essere modificate." #~ msgid "Couldn't save atlas image:" #~ msgstr "Impossibile salvare l'immagine di atlas:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "Impossibile salvare la texture convertita:" - #~ msgid "Invalid translation source!" #~ msgstr "Sorgente traduzione invalida!" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 20cd8fc7da..91af3e6757 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -34,11 +34,13 @@ # BinotaLIU <me@binota.org>, 2020, 2021. # 都築 本成 <motonari728@gmail.com>, 2021. # Nanjakkun <nanjakkun@gmail.com>, 2021. +# Lemoney <railkill@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-11 20:05+0000\n" +"PO-Revision-Date: 2021-11-14 11:41+0000\n" "Last-Translator: nitenook <admin@alterbaum.net>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" @@ -47,7 +49,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -74,15 +76,15 @@ msgstr "インスタンスが null (渡されない) であるため、self は #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "演算子 %s に対する無効なオペランドです: %s と %s。" +msgstr "演算子 %s に対するオペランド %s および %s は無効です。" #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "型 %s のインデックスが無効、これは基底型 %s 用です" +msgstr "%s型のインデックスは、元の%s型に対して無効です" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "インデックス '%s' (基底型 %s) は無効な名前です" +msgstr "名前付きインデックス '%s' は、元の%s型に対して無効です" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" @@ -186,7 +188,7 @@ msgstr "アニメーションキーフレームの値を変更" #: editor/animation_track_editor.cpp msgid "Anim Change Call" -msgstr "アニメーション呼出しの変更" +msgstr "アニメーション呼び出しの変更" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -206,7 +208,7 @@ msgstr "アニメーションキーフレームの値を複数変更" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Call" -msgstr "アニメーション呼出しを複数変更" +msgstr "アニメーション呼び出しを複数変更" #: editor/animation_track_editor.cpp msgid "Change Animation Length" @@ -227,7 +229,7 @@ msgstr "3Dトランスフォームトラック" #: editor/animation_track_editor.cpp msgid "Call Method Track" -msgstr "メソッド呼出しトラック" +msgstr "メソッド呼び出しトラック" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" @@ -406,8 +408,8 @@ msgstr "アニメーション" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." msgstr "" -"アニメーションプレイヤーは他のプレイヤーだけをアニメーション化することはでき" -"ません。" +"AnimationPlayerは自分自身をアニメーションすることはできず、他のプレイヤーをア" +"ニメーションさせることができます。" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp @@ -452,8 +454,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Animation tracks can only point to AnimationPlayer nodes." -msgstr "" -"アニメーショントラックはアニメーションプレイヤーノードのみ指定できます。" +msgstr "アニメーショントラックはAnimationPlayerノードのみ指定できます。" #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" @@ -546,7 +547,8 @@ msgstr "警告:インポートしたアニメーションを編集していま #: editor/animation_track_editor.cpp msgid "Select an AnimationPlayer node to create and edit animations." msgstr "" -"アニメーションを作って編集するには、 AnimationPlayer ノードを選択して下さい。" +"アニメーションを作って編集するには、 AnimationPlayer ノードを選択してくださ" +"い。" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -643,9 +645,8 @@ msgid "Use Bezier Curves" msgstr "ベジェ曲線を使用" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Create RESET Track(s)" -msgstr "トラックを貼り付け" +msgstr "RESETトラックを作成" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -742,7 +743,7 @@ msgstr "行番号:" #: editor/code_editor.cpp msgid "%d replaced." -msgstr "%d を置換しました。" +msgstr "%d件を置換しました。" #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." @@ -856,11 +857,11 @@ msgstr "除去" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" -msgstr "呼出し引数を追加:" +msgstr "呼び出し引数を追加:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "追加の呼出し引数:" +msgstr "追加の呼び出し引数:" #: editor/connections_dialog.cpp msgid "Receiver Method:" @@ -1034,7 +1035,7 @@ msgid "" "Changes will only take effect when reloaded." msgstr "" "シーン '%s' は現在編集中です。\n" -"変更は再読込み後に反映されます。" +"変更は再読み込み後に反映されます。" #: editor/dependency_editor.cpp msgid "" @@ -1042,7 +1043,7 @@ msgid "" "Changes will only take effect when reloaded." msgstr "" "リソース '%s' は使用中です。\n" -"変更は再読込み後に反映されます。" +"変更は再読み込み後に反映されます。" #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -1068,7 +1069,7 @@ msgstr "修復" #: editor/dependency_editor.cpp msgid "Dependency Editor" -msgstr "依存関係エディタ" +msgstr "依存関係エディター" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" @@ -1117,11 +1118,11 @@ msgstr "除去不可:" #: editor/dependency_editor.cpp msgid "Error loading:" -msgstr "読込みエラー:" +msgstr "読み込みエラー:" #: editor/dependency_editor.cpp msgid "Load failed due to missing dependencies:" -msgstr "依存関係が見つからないため、シーンを読込めません:" +msgstr "依存関係が見つからないため、読み込めません:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" @@ -1292,7 +1293,7 @@ msgstr "アセットの内容 \"%s\" - %d 個のファイルがプロジェク #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - No files conflict with your project:" -msgstr "アセットの内容 \"%s\" - %d 個のファイルがプロジェクトと競合します:" +msgstr "アセットの内容 \"%s\" - プロジェクトと競合するファイルはありません:" #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" @@ -1304,7 +1305,7 @@ msgstr "次のファイルをアセット \"%s\" から展開できませんで #: editor/editor_asset_installer.cpp msgid "(and %s more files)" -msgstr "(および %s 個のファイル)" +msgstr "(さらに %s個のファイル)" #: editor/editor_asset_installer.cpp msgid "Asset \"%s\" installed successfully!" @@ -1468,11 +1469,11 @@ msgstr "新規オーディオバスをこのレイアウトに追加する。" #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Load" -msgstr "読込み" +msgstr "読み込み" #: editor/editor_audio_buses.cpp msgid "Load an existing Bus Layout." -msgstr "既存のバスレイアウトを読込む。" +msgstr "既存のバスレイアウトを読み込む。" #: editor/editor_audio_buses.cpp msgid "Save As" @@ -1484,11 +1485,11 @@ msgstr "このバスレイアウトをファイルに保存。" #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" -msgstr "デフォルトを読込む" +msgstr "デフォルトを読み込む" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "デフォルトのバスレイアウトを読込みます。" +msgstr "デフォルトのバスレイアウトを読み込む。" #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." @@ -1508,7 +1509,7 @@ msgstr "既存のエンジンクラス名と重複してはなりません。" #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing built-in type name." -msgstr "既存の組込み型名と重複してはいけません。" +msgstr "既存の組み込み型名と重複してはいけません。" #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing global constant name." @@ -1520,23 +1521,23 @@ msgstr "キーワードは自動ロード名として使用できません。" #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "自動読込み '%s' は既に存在します!" +msgstr "自動読み込み '%s' はすでに存在します!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "自動読込みの名前変更" +msgstr "自動読み込みの名前変更" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" -msgstr "グローバルの自動読込みをオン / オフ" +msgstr "グローバルの自動読み込みをオン / オフ" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" -msgstr "自動読込みを移動" +msgstr "自動読み込みを移動" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" -msgstr "自動読込みを除去" +msgstr "自動読み込みを除去" #: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" @@ -1544,7 +1545,7 @@ msgstr "有効" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" -msgstr "自動読込みの並べ替え" +msgstr "自動読み込みの並べ替え" #: editor/editor_autoload_settings.cpp msgid "Can't add autoload:" @@ -1560,7 +1561,7 @@ msgstr "%s は無効なパスです。リソースパス (res://) に存在し #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "自動読込みを追加" +msgstr "自動読み込みを追加" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp @@ -1619,7 +1620,7 @@ msgstr "ディレクトリを選択" #: editor/filesystem_dock.cpp editor/project_manager.cpp #: scene/gui/file_dialog.cpp msgid "Create Folder" -msgstr "フォルダを作成" +msgstr "フォルダーを作成" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp @@ -1631,7 +1632,7 @@ msgstr "名前:" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp msgid "Could not create folder." -msgstr "フォルダを作成できませんでした。" +msgstr "フォルダーを作成できませんでした。" #: editor/editor_dir_dialog.cpp msgid "Choose" @@ -1729,11 +1730,11 @@ msgstr "" #: editor/editor_feature_profile.cpp msgid "3D Editor" -msgstr "3Dエディタ" +msgstr "3Dエディター" #: editor/editor_feature_profile.cpp msgid "Script Editor" -msgstr "スクリプトエディタ" +msgstr "スクリプトエディター" #: editor/editor_feature_profile.cpp msgid "Asset Library" @@ -1761,7 +1762,7 @@ msgstr "3Dシーンの表示と編集ができます。" #: editor/editor_feature_profile.cpp msgid "Allows to edit scripts using the integrated script editor." -msgstr "内臓のスクリプトエディタを使用してスクリプトを編集できます。" +msgstr "内臓のスクリプトエディターを使用してスクリプトを編集できます。" #: editor/editor_feature_profile.cpp msgid "Provides built-in access to the Asset Library." @@ -1809,11 +1810,11 @@ msgstr "" #: editor/editor_feature_profile.cpp msgid "Profile with this name already exists." -msgstr "この名前のプロファイルは既に存在します。" +msgstr "この名前のプロファイルはすでに存在します。" #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "(エディタ無効、プロパティ無効)" +msgstr "(エディター無効、プロパティ無効)" #: editor/editor_feature_profile.cpp msgid "(Properties Disabled)" @@ -1821,7 +1822,7 @@ msgstr "(プロパティ無効)" #: editor/editor_feature_profile.cpp msgid "(Editor Disabled)" -msgstr "(エディタ無効)" +msgstr "(エディター無効)" #: editor/editor_feature_profile.cpp msgid "Class Options:" @@ -1829,7 +1830,7 @@ msgstr "クラスオプション:" #: editor/editor_feature_profile.cpp msgid "Enable Contextual Editor" -msgstr "コンテキストエディタを有効にする" +msgstr "コンテキストエディターを有効にする" #: editor/editor_feature_profile.cpp msgid "Class Properties:" @@ -1924,19 +1925,19 @@ msgstr "プロファイルのエクスポート" #: editor/editor_feature_profile.cpp msgid "Manage Editor Feature Profiles" -msgstr "エディタ機能のプロファイルの管理" +msgstr "エディター機能のプロファイルの管理" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" -msgstr "現在のフォルダを選択" +msgstr "現在のフォルダーを選択" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File exists, overwrite?" -msgstr "ファイルが既に存在します。上書きしますか?" +msgstr "ファイルがすでに存在します。上書きしますか?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select This Folder" -msgstr "このフォルダを選択" +msgstr "このフォルダーを選択" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Copy Path" @@ -1953,12 +1954,12 @@ msgstr "ファイルマネージャーで表示" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "New Folder..." -msgstr "新規フォルダ..." +msgstr "新規フォルダー..." #: editor/editor_file_dialog.cpp editor/find_in_files.cpp #: editor/plugins/version_control_editor_plugin.cpp msgid "Refresh" -msgstr "再読込" +msgstr "再読み込み" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" @@ -2018,7 +2019,7 @@ msgstr "お気に入りにする / しない" #: editor/editor_file_dialog.cpp msgid "Toggle Mode" -msgstr "モード切替え" +msgstr "モード切り替え" #: editor/editor_file_dialog.cpp msgid "Focus Path" @@ -2034,15 +2035,15 @@ msgstr "お気に入りを下へ" #: editor/editor_file_dialog.cpp msgid "Go to previous folder." -msgstr "前のフォルダへ移動する。" +msgstr "前のフォルダーへ移動する。" #: editor/editor_file_dialog.cpp msgid "Go to next folder." -msgstr "次のフォルダへ移動する。" +msgstr "次のフォルダーへ移動する。" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." -msgstr "親フォルダへ移動する。" +msgstr "親フォルダーへ移動する。" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Refresh files." @@ -2050,7 +2051,7 @@ msgstr "ファイルの一覧をリフレッシュする。" #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." -msgstr "現在のフォルダをお気に入りにする / しない。" +msgstr "現在のフォルダーをお気に入りにする / しない。" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Toggle the visibility of hidden files." @@ -2086,8 +2087,8 @@ msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" -"ファイル %s をポイントしている異なるタイプの複数のインポータがあります。イン" -"ポートは中断されました" +"ファイル %s をポイントしている異なるタイプの複数のインポーターがあります。イ" +"ンポートは中断されました" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -2294,11 +2295,11 @@ msgstr "%s/s" #: editor/editor_network_profiler.cpp msgid "Down" -msgstr "下" +msgstr "下り" #: editor/editor_network_profiler.cpp msgid "Up" -msgstr "上" +msgstr "上り" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" @@ -2306,19 +2307,19 @@ msgstr "ノード" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" -msgstr "RPC入力" +msgstr "RPC受信" #: editor/editor_network_profiler.cpp msgid "Incoming RSET" -msgstr "入力RSET" +msgstr "RSET受信" #: editor/editor_network_profiler.cpp msgid "Outgoing RPC" -msgstr "出力RPC" +msgstr "RPC送信" #: editor/editor_network_profiler.cpp msgid "Outgoing RSET" -msgstr "出力RSET" +msgstr "RSET送信" #: editor/editor_node.cpp editor/project_manager.cpp msgid "New Window" @@ -2330,13 +2331,13 @@ msgid "" "Update Continuously is enabled, which can increase power usage. Click to " "disable it." msgstr "" -"エディタウィンドウの再描画時にスピンします。\n" +"エディターウィンドウの再描画時にスピンします。\n" "継続的に更新 が有効になっており、電力消費量が増加する可能性があります。クリッ" "クで無効化します。" #: editor/editor_node.cpp msgid "Spins when the editor window redraws." -msgstr "エディタ ウィンドウの再描画時にスピンします。" +msgstr "エディター ウィンドウの再描画時にスピンします。" #: editor/editor_node.cpp msgid "Imported resources can't be saved." @@ -2357,8 +2358,8 @@ msgid "" "This resource can't be saved because it does not belong to the edited scene. " "Make it unique first." msgstr "" -"このリソースは編集したシーンに属していないため保存できません。まず一意にしま" -"す。" +"このリソースは編集したシーンに属していないため保存できません。まずユニーク化" +"してください。" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As..." @@ -2366,7 +2367,7 @@ msgstr "リソースを別名で保存..." #: editor/editor_node.cpp msgid "Can't open file for writing:" -msgstr "書込むファイルを開けません:" +msgstr "書き込むファイルを開けません:" #: editor/editor_node.cpp msgid "Requested file format unknown:" @@ -2391,11 +2392,11 @@ msgstr "ファイル '%s' が予期せず終了しました。" #: editor/editor_node.cpp msgid "Missing '%s' or its dependencies." -msgstr "'%s' 、または依存関係が見つかりません。" +msgstr "'%s' またはその依存関係が見つかりません。" #: editor/editor_node.cpp msgid "Error while loading '%s'." -msgstr "'%s' の読込み中にエラーが発生しました。" +msgstr "'%s' の読み込み中にエラーが発生しました。" #: editor/editor_node.cpp msgid "Saving Scene" @@ -2407,7 +2408,7 @@ msgstr "分析中" #: editor/editor_node.cpp msgid "Creating Thumbnail" -msgstr "サムネイルを作成" +msgstr "サムネイルを作成中" #: editor/editor_node.cpp msgid "This operation can't be done without a tree root." @@ -2429,13 +2430,21 @@ msgstr "" "シーンを保存できませんでした。 おそらく、依存関係 (インスタンスまたは継承) を" "満たせませんでした。" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "一つまたは複数のシーンを保存できませんでした!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "すべてのシーンを保存" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "開いているシーンを上書きすることはできません!" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "マージするメッシュライブラリーが読込めません!" +msgstr "マージするメッシュライブラリーが読み込めません!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" @@ -2443,7 +2452,7 @@ msgstr "メッシュライブラリーの保存エラー!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" -msgstr "マージするタイルセットが読込めません!" +msgstr "マージするタイルセットが読み込めません!" #: editor/editor_node.cpp msgid "Error saving TileSet!" @@ -2454,8 +2463,8 @@ msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" -"エディタのレイアウトを保存しようとした際にエラーが発生しました。\n" -"エディタのユーザーデータ用パスが書き込み可能であることを確認してください。" +"エディターのレイアウトを保存しようとした際にエラーが発生しました。\n" +"エディターのユーザーデータ用パスが書き込み可能であることを確認してください。" #: editor/editor_node.cpp msgid "" @@ -2463,7 +2472,7 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" -"既定のエディタレイアウトが上書きされました。\n" +"既定のエディターレイアウトが上書きされました。\n" "既定のレイアウトを基本設定に戻すには、[レイアウトの削除] オプションを使用し" "て、既定のレイアウトを削除します。" @@ -2565,6 +2574,10 @@ msgid "Save changes to '%s' before closing?" msgstr "閉じる前に、'%s' への変更を保存しますか?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s は存在しなくなりました!新しい保存先を指定してください。" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2610,29 +2623,27 @@ msgstr "現在のシーンは保存されていません。それでも開きま #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "マウスボタンが押されている間は元に戻せません。" #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "元に戻すものがありません。" #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "元に戻す" +msgstr "元に戻す: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "マウスボタンが押されている間はやり直せません。" #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "やり直すものがありません。" #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "やり直す" +msgstr "やり直す: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2664,7 +2675,7 @@ msgstr "はい" #: editor/editor_node.cpp msgid "Exit the editor?" -msgstr "エディタを終了しますか?" +msgstr "エディターを終了しますか?" #: editor/editor_node.cpp msgid "Open Project Manager?" @@ -2713,7 +2724,7 @@ msgstr "アドオンプラグインのスクリプトフィールドが '%s' で #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." -msgstr "パス '%s' からアドオンスクリプトを読込めません。" +msgstr "パス '%s' からアドオンスクリプトを読み込めません。" #: editor/editor_node.cpp msgid "" @@ -2729,14 +2740,14 @@ msgstr "" msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" -"パス '%s' からアドオンスクリプトを読込めません。基底型が EditorPlugin ではあ" -"りません。" +"パス '%s' からアドオンスクリプトを読み込めません。基底型が EditorPlugin では" +"ありません。" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" -"パス '%s' からアドオンスクリプトを読込めません。スクリプトがツールモードでは" -"ありません。" +"パス '%s' からアドオンスクリプトを読み込めません。スクリプトがツールモードで" +"はありません。" #: editor/editor_node.cpp msgid "" @@ -2751,7 +2762,7 @@ msgid "" "Error loading scene, it must be inside the project path. Use 'Import' to " "open the scene, then save it inside the project path." msgstr "" -"シーン読込み中にエラーが発生しました。プロジェクトパス内にある必要がありま" +"シーン読み込み中にエラーが発生しました。プロジェクトパス内にある必要がありま" "す。このシーンを開くには 'インポート' を使用し、プロジェクトパス内に保存して" "ください。" @@ -2839,15 +2850,15 @@ msgstr "シーンタブを切り替え" #: editor/editor_node.cpp msgid "%d more files or folders" -msgstr "%d 以上のファイルとフォルダ" +msgstr "さらに %d個のファイルとフォルダー" #: editor/editor_node.cpp msgid "%d more folders" -msgstr "%d 以上のフォルダ" +msgstr "さらに %d個のフォルダー" #: editor/editor_node.cpp msgid "%d more files" -msgstr "%d 以上のファイル" +msgstr "さらに %d個のファイル" #: editor/editor_node.cpp msgid "Dock Position" @@ -2914,10 +2925,6 @@ msgid "Save Scene" msgstr "シーンを保存" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "すべてのシーンを保存" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "変換..." @@ -2974,7 +2981,7 @@ msgstr "Androidビルドテンプレートのインストール..." #: editor/editor_node.cpp msgid "Open Project Data Folder" -msgstr "プロジェクトのデータフォルダを開く" +msgstr "プロジェクトのデータフォルダーを開く" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3015,7 +3022,7 @@ msgstr "" "グすることができます。\n" "このオプションは、リモートデバッグに使用することを意図しています (通常はモバ" "イルデバイスにおいて)。\n" -"ローカルで GDScript デバッガを使用するためには有効にする必要はありません。" +"ローカルで GDScript デバッガーを使用するためには有効にする必要はありません。" #: editor/editor_node.cpp msgid "Small Deploy with Network Filesystem" @@ -3032,8 +3039,8 @@ msgid "" msgstr "" "このオプションを有効にすると、Androidへのワンクリック・デプロイ時にプロジェク" "ト用データ無しの実行可能ファイルのみをエクスポートします。\n" -"ファイルシステムは、エディタによってプロジェクトからネットワークを通じて供給" -"されます。\n" +"ファイルシステムは、エディターによってプロジェクトからネットワークを通じて供" +"給されます。\n" "Androidでは、デプロイはUSBケーブルの利用でさらに高速になります。このオプショ" "ンは大きなアセットのあるプロジェクトでテストを高速化できます。" @@ -3072,8 +3079,8 @@ msgid "" "When used remotely on a device, this is more efficient when the network " "filesystem option is enabled." msgstr "" -"このオプションを有効にすると、エディタからシーンに加えられた変更が、実行中の" -"プロジェクトに反映されるようになります。\n" +"このオプションを有効にすると、エディターからシーンに加えられた変更が、実行中" +"のプロジェクトに反映されるようになります。\n" "リモートのデバイス上で使用する場合、ネットワークファイルシステムのオプション" "も有効であればより効率的になります。" @@ -3095,15 +3102,15 @@ msgstr "" #: editor/editor_node.cpp editor/script_create_dialog.cpp msgid "Editor" -msgstr "エディタ" +msgstr "エディター" #: editor/editor_node.cpp msgid "Editor Settings..." -msgstr "エディタ設定..." +msgstr "エディター設定..." #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "エディタレイアウト" +msgstr "エディターレイアウト" #: editor/editor_node.cpp msgid "Take Screenshot" @@ -3111,7 +3118,8 @@ msgstr "スクリーンショットを撮る" #: editor/editor_node.cpp msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "スクリーンショットはEditor Data / Settingsフォルダに保存されています。" +msgstr "" +"スクリーンショットは エディターのデータ / 設定フォルダー に保存されています。" #: editor/editor_node.cpp msgid "Toggle Fullscreen" @@ -3123,19 +3131,19 @@ msgstr "システムコンソールを有効化 / 無効化" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" -msgstr "エディタのデータ / 設定フォルダを開く" +msgstr "エディターのデータ / 設定フォルダーを開く" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "エディタのデータフォルダを開く" +msgstr "エディターのデータフォルダーを開く" #: editor/editor_node.cpp msgid "Open Editor Settings Folder" -msgstr "エディタ設定のフォルダを開く" +msgstr "エディター設定のフォルダーを開く" #: editor/editor_node.cpp msgid "Manage Editor Features..." -msgstr "エディタ機能の管理..." +msgstr "エディター機能の管理..." #: editor/editor_node.cpp msgid "Manage Export Templates..." @@ -3215,7 +3223,7 @@ msgstr "カスタムシーンを実行" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." -msgstr "ビデオドライバの変更にはエディタの再起動が必要です。" +msgstr "ビデオドライバーの変更にはエディターの再起動が必要です。" #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp @@ -3240,7 +3248,7 @@ msgstr "ファイルシステム" #: editor/editor_node.cpp msgid "Inspector" -msgstr "インスペクタ" +msgstr "インスペクター" #: editor/editor_node.cpp msgid "Expand Bottom Panel" @@ -3283,12 +3291,12 @@ msgid "" "preset." msgstr "" "この操作は \"res://android/build\" にソーステンプレートをインストールし、" -"Androidのカスタムビルドを設定します。\n" +"Androidのカスタムビルドの設定がプロジェクトにセットアップされます。\n" "後から設定に変更を加えたり、エクスポート時にカスタムAPKをビルドできます (モ" -"ジュールを追加する、AndroidManifest.xmlを変更する等)。\n" -"APKビルドの初期設定の代わりにカスタムビルド設定を使うためには、Androidのエク" -"スポート設定の「Use Custom Build (カスタムビルドを使用する)」のオプションが有" -"効化されている必要があることに注意してください。" +"ジュールを追加する、AndroidManifest.xmlを変更するなど)。\n" +"ビルド済みAPKの代わりにカスタムビルドをするためには、Androidのエクスポート設" +"定の「Use Custom Build (カスタムビルドを使用する)」のオプションが有効化されて" +"いる必要があることに注意してください。" #: editor/editor_node.cpp msgid "" @@ -3315,12 +3323,11 @@ msgstr "ライブラリのエクスポート" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "既存の(ライブラリを)マージ" +msgstr "既存のものとマージする" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "アニメーションのトランスフォームを変更" +msgstr "MeshInstanceのトランスフォームを適用" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3337,7 +3344,7 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Reload" -msgstr "再読込" +msgstr "再読み込み" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3350,28 +3357,27 @@ msgstr "新規の継承" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "読込みエラー" +msgstr "読み込みエラー" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" msgstr "選択" #: editor/editor_node.cpp -#, fuzzy msgid "Select Current" -msgstr "現在のフォルダを選択" +msgstr "現在のものを選択" #: editor/editor_node.cpp msgid "Open 2D Editor" -msgstr "2Dエディタを開く" +msgstr "2Dエディターを開く" #: editor/editor_node.cpp msgid "Open 3D Editor" -msgstr "3Dエディタを開く" +msgstr "3Dエディターを開く" #: editor/editor_node.cpp msgid "Open Script Editor" -msgstr "スクリプトエディタを開く" +msgstr "スクリプトエディターを開く" #: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" @@ -3379,11 +3385,11 @@ msgstr "アセットライブラリを開く" #: editor/editor_node.cpp msgid "Open the next Editor" -msgstr "次のエディタを開く" +msgstr "次のエディターを開く" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "前のエディタを開く" +msgstr "前のエディターを開く" #: editor/editor_node.h msgid "Warning!" @@ -3399,7 +3405,7 @@ msgstr "サブリソースのリストを開く。" #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" -msgstr "メッシュプレビューを作成" +msgstr "メッシュプレビューを作成中" #: editor/editor_plugin.cpp msgid "Thumbnail..." @@ -3489,7 +3495,7 @@ msgstr "時間" #: editor/editor_profiler.cpp msgid "Calls" -msgstr "呼出し" +msgstr "呼び出し" #: editor/editor_properties.cpp msgid "Edit Text:" @@ -3501,7 +3507,7 @@ msgstr "オン" #: editor/editor_properties.cpp msgid "Layer" -msgstr "レイヤ" +msgstr "レイヤー" #: editor/editor_properties.cpp msgid "Bit %d, value %d" @@ -3517,7 +3523,7 @@ msgstr "割り当て.." #: editor/editor_properties.cpp msgid "Invalid RID" -msgstr "無効な RID" +msgstr "無効なRID" #: editor/editor_properties.cpp msgid "" @@ -3536,8 +3542,8 @@ msgid "" msgstr "" "このリソースはシーンに対してローカルに設定されていないため、ViewportTextureを" "作成できません。\n" -"'シーンにローカル 'プロパティをオンにしてください(ノードまでを含むすべてのリ" -"ソース)。" +"'local to scene'プロパティをオンにしてください(ノードまでを含むすべてのリソー" +"ス)。" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Pick a Viewport" @@ -3582,7 +3588,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "クイックロード" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -3634,7 +3640,7 @@ msgstr "ロジックを _run() メソッドに記述する。" #: editor/editor_run_script.cpp msgid "There is an edited scene already." -msgstr "既に編集されたシーンがあります。" +msgstr "すでに編集されたシーンがあります。" #: editor/editor_run_script.cpp msgid "Couldn't instance script:" @@ -3674,7 +3680,7 @@ msgstr "ノードからインポート:" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." -msgstr "これらのテンプレートがあるフォルダを開きます。" +msgstr "これらのテンプレートがあるフォルダーを開きます。" #: editor/export_template_manager.cpp msgid "Uninstall these templates." @@ -3751,7 +3757,7 @@ msgstr "ミラーリストのJSONの解析に失敗しました。この問題 #: editor/export_template_manager.cpp msgid "Best available mirror" -msgstr "有効な最良のミラー" +msgstr "利用可能な最良のミラー" #: editor/export_template_manager.cpp msgid "" @@ -3855,11 +3861,12 @@ msgstr "エクスポート テンプレートはインストールされてお #: editor/export_template_manager.cpp msgid "Open Folder" -msgstr "フォルダを開く" +msgstr "フォルダーを開く" #: editor/export_template_manager.cpp msgid "Open the folder containing installed templates for the current version." -msgstr "現在のバージョンのテンプレートがインストールされたフォルダを開きます。" +msgstr "" +"現在のバージョンのテンプレートがインストールされたフォルダーを開きます。" #: editor/export_template_manager.cpp msgid "Uninstall" @@ -3879,7 +3886,7 @@ msgstr "Webブラウザで開く" #: editor/export_template_manager.cpp msgid "Copy Mirror URL" -msgstr "エラーのURLをコピー" +msgstr "ミラーのURLをコピー" #: editor/export_template_manager.cpp msgid "Download and Install" @@ -3895,7 +3902,7 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Official export templates aren't available for development builds." -msgstr "公式の書き出しテンプレートは開発用ビルドの場合は使用できません。" +msgstr "公式のエクスポートテンプレートは開発用ビルドの場合は使用できません。" #: editor/export_template_manager.cpp msgid "Install from File" @@ -3936,7 +3943,7 @@ msgid "" "You may experience a short editor freeze when they finish." msgstr "" "テンプレートのダウンロードは継続されます。\n" -"完了時に、短い間エディタがフリーズする可能性があります。" +"完了時に、短い間エディターがフリーズする可能性があります。" #: editor/filesystem_dock.cpp msgid "Favorites" @@ -3946,7 +3953,7 @@ msgstr "お気に入り" msgid "Status: Import of file failed. Please fix file and reimport manually." msgstr "" "ステータス: ファイルのインポートに失敗しました。ファイルを修正して手動で再イ" -"ンポートして下さい。" +"ンポートしてください。" #: editor/filesystem_dock.cpp msgid "" @@ -3961,7 +3968,7 @@ msgstr "ルートのリソースは移動/リネームできません。" #: editor/filesystem_dock.cpp msgid "Cannot move a folder into itself." -msgstr "フォルダをフォルダ自身の中に移動することはできません。" +msgstr "フォルダーをフォルダー自身の中に移動することはできません。" #: editor/filesystem_dock.cpp msgid "Error moving:" @@ -3985,7 +3992,7 @@ msgstr "名前に使用できない文字が含まれています。" #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." -msgstr "同名のファイルまたはフォルダがあります。" +msgstr "同名のファイルまたはフォルダーがあります。" #: editor/filesystem_dock.cpp msgid "Name contains invalid characters." @@ -4000,7 +4007,7 @@ msgid "" "\n" "Do you wish to overwrite them?" msgstr "" -"以下のファイルまたはフォルダは、対象の場所 '%s' にある項目と競合していま" +"以下のファイルまたはフォルダーは、対象の場所 '%s' にある項目と競合していま" "す。\n" "\n" "%s\n" @@ -4013,7 +4020,7 @@ msgstr "ファイル名を変更:" #: editor/filesystem_dock.cpp msgid "Renaming folder:" -msgstr "フォルダ名を変更:" +msgstr "フォルダー名を変更:" #: editor/filesystem_dock.cpp msgid "Duplicating file:" @@ -4021,7 +4028,7 @@ msgstr "ファイルを複製:" #: editor/filesystem_dock.cpp msgid "Duplicating folder:" -msgstr "フォルダを複製:" +msgstr "フォルダーを複製:" #: editor/filesystem_dock.cpp msgid "New Inherited Scene" @@ -4125,11 +4132,11 @@ msgstr "検索ボックスにフォーカス" #: editor/filesystem_dock.cpp msgid "Previous Folder/File" -msgstr "前のフォルダ/ファイル" +msgstr "前のフォルダー/ファイル" #: editor/filesystem_dock.cpp msgid "Next Folder/File" -msgstr "次のフォルダ/ファイル" +msgstr "次のフォルダー/ファイル" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" @@ -4149,7 +4156,7 @@ msgid "" "Please Wait..." msgstr "" "ファイルのスキャン中\n" -"しばらくお待ち下さい..." +"しばらくお待ちください..." #: editor/filesystem_dock.cpp msgid "Move" @@ -4184,11 +4191,11 @@ msgstr "検索:" #: editor/find_in_files.cpp msgid "Folder:" -msgstr "フォルダ:" +msgstr "フォルダー:" #: editor/find_in_files.cpp msgid "Filters:" -msgstr "フィルタ:" +msgstr "フィルター:" #: editor/find_in_files.cpp msgid "" @@ -4244,7 +4251,7 @@ msgstr "グループから除去" #: editor/groups_editor.cpp msgid "Group name already exists." -msgstr "グループ名が既にあります。" +msgstr "グループ名がすでに存在します。" #: editor/groups_editor.cpp msgid "Invalid group name." @@ -4264,12 +4271,12 @@ msgstr "グループ" #: editor/groups_editor.cpp msgid "Nodes Not in Group" -msgstr "グループがノードありません" +msgstr "グループ内にないノード" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp #: editor/scene_tree_editor.cpp msgid "Filter nodes" -msgstr "ノードのフィルタ" +msgstr "ノードを絞り込む" #: editor/groups_editor.cpp msgid "Nodes in Group" @@ -4281,7 +4288,7 @@ msgstr "空のグループは自動的に削除されます。" #: editor/groups_editor.cpp msgid "Group Editor" -msgstr "グループエディタ" +msgstr "グループエディター" #: editor/groups_editor.cpp msgid "Manage Groups" @@ -4289,7 +4296,7 @@ msgstr "グループの管理" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" -msgstr "単一のシーンとして読込む" +msgstr "単一のシーンとして読み込む" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Animations" @@ -4350,7 +4357,7 @@ msgstr "カスタムスクリプトの実行中..." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" -msgstr "インポート済のスクリプトを読込めませんでした:" +msgstr "インポート済のスクリプトを読み込めませんでした:" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" @@ -4371,11 +4378,11 @@ msgstr "保存中..." #: editor/import_defaults_editor.cpp msgid "Select Importer" -msgstr "インポータを選択" +msgstr "インポーターを選択" #: editor/import_defaults_editor.cpp msgid "Importer:" -msgstr "インポータ:" +msgstr "インポーター:" #: editor/import_defaults_editor.cpp msgid "Reset to Defaults" @@ -4398,6 +4405,22 @@ msgid "Clear Default for '%s'" msgstr "'%s' のデフォルトをクリア" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "再インポート" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"まだ適用されていない保留中の変更があります。再インポートをクリックすると、イ" +"ンポートのオプションに加えた変更を適用します。\n" +"再インポートをクリックせずにファイルシステム ドックから他のリソースを選択する" +"と、インポートのドックで加えた変更は破棄されます。" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "名前を付けてインポート:" @@ -4406,16 +4429,12 @@ msgid "Preset" msgstr "プリセット" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "再インポート" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "シーンを保存し、再インポートしてから、再起動します" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." -msgstr "インポートしたファイルのタイプの変更にはエディタの再起動が必要です。" +msgstr "インポートしたファイルのタイプの変更にはエディターの再起動が必要です。" #: editor/import_dock.cpp msgid "" @@ -4426,7 +4445,7 @@ msgstr "" #: editor/inspector_dock.cpp msgid "Failed to load resource." -msgstr "リソースの読込みに失敗しました。" +msgstr "リソースの読み込みに失敗しました。" #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -4446,7 +4465,7 @@ msgstr "新規リソースをメモリ上に作成して編集する。" #: editor/inspector_dock.cpp msgid "Load an existing resource from disk and edit it." -msgstr "既存のリソースをディスクから読込み編集する。" +msgstr "既存のリソースをディスクから読み込み編集する。" #: editor/inspector_dock.cpp msgid "Save the currently edited resource." @@ -4476,11 +4495,11 @@ msgstr "リソースを組み込みにする" #: editor/inspector_dock.cpp msgid "Go to the previous edited object in history." -msgstr "履歴内の編集済オブジェクトを前へ。" +msgstr "履歴内の前に編集したオブジェクトに移動する。" #: editor/inspector_dock.cpp msgid "Go to the next edited object in history." -msgstr "履歴内の編集済オブジェクトを次へ。" +msgstr "履歴内の次に編集したオブジェクトに移動する。" #: editor/inspector_dock.cpp msgid "History of recently edited objects." @@ -4496,7 +4515,7 @@ msgstr "ドキュメントを開く" #: editor/inspector_dock.cpp msgid "Filter properties" -msgstr "フィルタプロパティ" +msgstr "プロパティを絞り込む" #: editor/inspector_dock.cpp msgid "Manage object properties." @@ -4528,7 +4547,7 @@ msgstr "プラグイン名:" #: editor/plugin_config_dialog.cpp msgid "Subfolder:" -msgstr "サブフォルダ:" +msgstr "サブフォルダー:" #: editor/plugin_config_dialog.cpp msgid "Author:" @@ -4654,8 +4673,8 @@ msgid "" "Activate to enable playback, check node warnings if activation fails." msgstr "" "アニメーションツリーが非アクティブです。\n" -"再生を有効にするためにアクティベートします。アクティベートに失敗した場合は" -"ノードの警告を確認してください。" +"再生を有効にするためにアクティブ化します。アクティブ化に失敗した場合はノード" +"の警告を確認してください。" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4681,7 +4700,7 @@ msgstr "点" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Open Editor" -msgstr "エディタで開く" +msgstr "エディターで開く" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4692,7 +4711,7 @@ msgstr "アニメーションノードを開く" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Triangle already exists." -msgstr "三角形が既に存在します。" +msgstr "三角形がすでに存在します。" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Add Triangle" @@ -4716,7 +4735,7 @@ msgstr "BlendSpace2Dの三角形を削除する" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "BlendSpace2D does not belong to an AnimationTree node." -msgstr "ブレンドシェイプ2Dはアニメーションツリー ノードに属しません。" +msgstr "BlendSpace2Dはアニメーションツリー ノードに属しません。" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "No triangles exist, so no blending can take place." @@ -4745,12 +4764,12 @@ msgstr "ブレンド:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Parameter Changed:" -msgstr "パラメータが変更されました:" +msgstr "パラメーターが変更されました:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Edit Filters" -msgstr "フィルタの編集" +msgstr "フィルターの編集" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Output node can't be added to the blend tree." @@ -4794,16 +4813,15 @@ msgstr "ノードを削除" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" -msgstr "フィルタの オン/オフ を切り替え" +msgstr "フィルターの オン/オフ を切り替え" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Change Filter" -msgstr "フィルタを変更" +msgstr "フィルターを変更" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "No animation player set, so unable to retrieve track names." -msgstr "" -"アニメーションプレイヤーが設定されていないため、トラック名を取得できません。" +msgstr "AnimationPlayerが設定されていないため、トラック名を取得できません。" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Player path set is invalid, so unable to retrieve track names." @@ -4881,7 +4899,7 @@ msgstr "アニメーション名が無効です!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation name already exists!" -msgstr "アニメーション名は既に存在します!" +msgstr "アニメーション名はすでに存在します!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -4898,7 +4916,7 @@ msgstr "ブレンド時間の変更" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load Animation" -msgstr "アニメーション読込み" +msgstr "アニメーション読み込み" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" @@ -4971,7 +4989,7 @@ msgstr "トランジションの編集..." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Open in Inspector" -msgstr "インスペクタで開く" +msgstr "インスペクターで開く" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." @@ -4979,7 +4997,7 @@ msgstr "プレーヤーのアニメーションリストを表示する。" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" -msgstr "読込み後、自動再生" +msgstr "読み込み後、自動再生" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Enable Onion Skinning" @@ -5292,11 +5310,11 @@ msgstr "アニメーションをインポート..." #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Edit Node Filters" -msgstr "ノードフィルタの編集" +msgstr "ノードフィルターの編集" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Filters..." -msgstr "フィルタ..." +msgstr "フィルター..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -5348,7 +5366,7 @@ msgstr "レスポンスを保存できません:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Write error." -msgstr "エラーを書いてください。" +msgstr "書き込みエラー。" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" @@ -5360,11 +5378,11 @@ msgstr "リダイレクトのループ。" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, timeout" -msgstr "リクエスト失敗、時間切れ" +msgstr "リクエスト失敗、タイムアウト" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Timeout." -msgstr "時間切れ。" +msgstr "タイムアウト。" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" @@ -5425,7 +5443,7 @@ msgstr "ダウンロードエラー" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "このアセットのダウンロードは既に進行中!" +msgstr "このアセットのダウンロードはすでに進行中です!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Recently Updated" @@ -5564,7 +5582,7 @@ msgstr "" msgid "" "Godot editor was built without ray tracing support, lightmaps can't be baked." msgstr "" -"Godotエディタがレイトレーシングのサポートなしでビルドされているため、ライト" +"Godotエディターがレイトレーシングのサポートなしでビルドされているため、ライト" "マップのベイクができません。" #: editor/plugins/baked_lightmap_editor_plugin.cpp @@ -5682,15 +5700,13 @@ msgstr "CanvasItem \"%s\" を (%d, %d) に移動" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "選択対象をロック" +msgstr "ロック済み" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "グループ" +msgstr "グループ化済み" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5798,8 +5814,8 @@ msgid "" "Overrides the running project's camera with the editor viewport camera." msgstr "" "プロジェクトのカメラのオーバーライド\n" -"実行中のプロジェクトのカメラを、エディタのビューポートカメラでオーバーライド" -"します。" +"実行中のプロジェクトのカメラを、エディターのビューポートカメラでオーバーライ" +"ドします。" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5940,7 +5956,7 @@ msgstr "スマート スナッピングをオン / オフ。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Smart Snap" -msgstr "スマートスナップを使う" +msgstr "スマートスナップを使用" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle grid snapping." @@ -5948,7 +5964,7 @@ msgstr "グリッド スナッピングをオン / オフ。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Grid Snap" -msgstr "グリッドスナップを使う" +msgstr "グリッドスナップを使用" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" @@ -5956,11 +5972,11 @@ msgstr "スナッピングオプション" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" -msgstr "回転スナップを使う" +msgstr "回転スナップを使用" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Scale Snap" -msgstr "スケールスナップを使う" +msgstr "スケールスナップを使用" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" @@ -6263,7 +6279,7 @@ msgstr "放出マスクをクリア" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Particles" -msgstr "Particles" +msgstr "パーティクル" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -6356,11 +6372,11 @@ msgstr "ポイントを削除" #: editor/plugins/curve_editor_plugin.cpp msgid "Left Linear" -msgstr "左線形文法" +msgstr "左線形" #: editor/plugins/curve_editor_plugin.cpp msgid "Right Linear" -msgstr "右線形文法" +msgstr "右線形" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Preset" @@ -6400,7 +6416,7 @@ msgstr "アイテム" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item List Editor" -msgstr "アイテムリストのエディタ" +msgstr "アイテムリストのエディター" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" @@ -6557,14 +6573,14 @@ msgid "Create Multiple Convex Collision Siblings" msgstr "複数の凸型コリジョンの兄弟を作成" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "" "Creates a polygon-based collision shape.\n" "This is a performance middle-ground between a single convex collision and a " "polygon-based collision." msgstr "" "ポリゴンベースのコリジョンシェイプを作成します。\n" -"これは、上記の2つのオプションの中間的なパフォーマンスです。" +"これは、単一の凸型コリジョンとポリゴンベースのコリジョンの中間的なパフォーマ" +"ンスです。" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." @@ -6608,7 +6624,7 @@ msgstr "UVチャンネル デバッグ" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Remove item %d?" -msgstr "アイテム%dを取り除きますか?" +msgstr "アイテム %d を取り除きますか?" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "" @@ -6631,14 +6647,12 @@ msgid "Remove Selected Item" msgstr "選択したアイテムを取り除く" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "シーンからインポート" +msgstr "シーンからインポート (トランスフォームを無視)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "シーンからインポート" +msgstr "シーンからインポート (トランスフォームを適用)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -6693,11 +6707,11 @@ msgstr "ターゲットサーフェスを選択:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate Surface" -msgstr "サーフェスを満たす" +msgstr "サーフェスを投入する" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate MultiMesh" -msgstr "マルチメッシュの設定" +msgstr "MultiMeshを投入する" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Target Surface:" @@ -7024,11 +7038,11 @@ msgstr "ボーンウェイトをペイント" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Open Polygon 2D UV editor." -msgstr "Polygon 2D UV エディタを開く。" +msgstr "Polygon 2D UV エディターを開く。" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon 2D UV Editor" -msgstr "Polygon 2D UV エディタ" +msgstr "Polygon 2D UV エディター" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "UV" @@ -7202,7 +7216,7 @@ msgstr "型:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp msgid "Open in Editor" -msgstr "エディタで開く" +msgstr "エディターで開く" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Load Resource" @@ -7217,28 +7231,24 @@ msgid "Flip Portals" msgstr "ポータルを反転" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Room Generate Points" -msgstr "生成したポイントの数:" +msgstr "Roomのポイントを生成" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Generate Points" -msgstr "生成したポイントの数:" +msgstr "ポイントを生成" #: editor/plugins/room_manager_editor_plugin.cpp msgid "Flip Portal" msgstr "ポータルを反転" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "トランスフォームをクリア" +msgstr "オクルーダーのトランスフォームをセット" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "ノードを生成" +msgstr "中央ノード" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7348,7 +7358,7 @@ msgstr "前を検索" #: editor/plugins/script_editor_plugin.cpp msgid "Filter scripts" -msgstr "スクリプトのフィルタ" +msgstr "スクリプトを絞り込む" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." @@ -7356,7 +7366,7 @@ msgstr "メソッドリストのアルファベット順ソートを切り替え #: editor/plugins/script_editor_plugin.cpp msgid "Filter methods" -msgstr "フィルタメソッド" +msgstr "メソッドを絞り込む" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -7375,12 +7385,12 @@ msgid "Move Down" msgstr "下に移動" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "次のスクリプト" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "直前のスクリプト" +msgid "Previous Script" +msgstr "前のスクリプト" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7470,11 +7480,11 @@ msgstr "続行" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" -msgstr "デバッガを開いたままにする" +msgstr "デバッガーを開いたままにする" #: editor/plugins/script_editor_plugin.cpp msgid "Debug with External Editor" -msgstr "外部エディタでデバッグ" +msgstr "外部エディターでデバッグ" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -7511,7 +7521,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "デバッガ" +msgstr "デバッガー" #: editor/plugins/script_editor_plugin.cpp msgid "Search Results" @@ -7733,26 +7743,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "このskeletonにはボーンがありません。子Bone2Dノードを追加してください。" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "ボーンからレストポーズを作成" +msgid "Set Rest Pose to Bones" +msgstr "ボーンへレストポーズを設定する" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" -msgstr "ボーンへレスト・ポーズを設定する" +msgid "Create Rest Pose from Bones" +msgstr "ボーンからレストポーズを作成" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "レスト・ポーズへボーンを設定する" +msgstr "レストポーズへリセット" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "上書き" +msgstr "レストポーズを上書き" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7768,7 +7776,7 @@ msgstr "物理スケルトンを作成する" #: editor/plugins/skeleton_ik_editor_plugin.cpp msgid "Play IK" -msgstr "IK(Inverse kinematics)を実行する" +msgstr "IKを再生" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" @@ -7779,69 +7787,62 @@ msgid "Perspective" msgstr "透視投影" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "平行投影" +msgstr "上面 平行投影" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "透視投影" +msgstr "上面 透視投影" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "平行投影" +msgstr "下面 平行投影" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "透視投影" +msgstr "下面 透視投影" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "平行投影" +msgstr "左側面 平行投影" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "透視投影" +msgid "Left Perspective" +msgstr "左側面 透視投影" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "平行投影" +msgstr "右側面 平行投影" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "右側面 透視投影" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "平行投影" +msgstr "正面 平行投影" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "透視投影" +msgstr "正面 透視投影" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "平行投影" +msgstr "後面 平行投影" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "透視投影" +msgstr "後面 透視投影" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [自動]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [ポータル有効]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -7980,7 +7981,7 @@ msgstr "子をインスタンス化するための親が見つかりません。 #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "This operation requires a single selected node." -msgstr "単一の選択されたノードがないと、この操作は行えません。" +msgstr "この操作には選択されたノードが1つ必要です。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Auto Orthogonal Enabled" @@ -8094,13 +8095,12 @@ msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" -"注意: 表示されるFPS値は、エディタのフレームレートです。\n" +"注意: 表示されるFPS値は、エディターのフレームレートです。\n" "ゲーム内のパフォーマンスを確実に示すものとして使用することはできません。" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Convert Rooms" -msgstr "%s に変換" +msgstr "Roomを変換" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" @@ -8134,11 +8134,11 @@ msgstr "ローカル空間を使用" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" -msgstr "スナップを使う" +msgstr "スナップを使用" #: editor/plugins/spatial_editor_plugin.cpp msgid "Converts rooms for portal culling." -msgstr "" +msgstr "ポータルカリング用にRoomを変換します。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" @@ -8165,6 +8165,26 @@ msgid "Right View" msgstr "右側面図" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "オービットビュー 下" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "オービットビュー 左" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "オービットビュー 右" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "オービットビュー 上" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "オービットビュー 180" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "透視投影 / 平行投影の切り替え" @@ -8238,9 +8258,8 @@ msgid "View Portal Culling" msgstr "ポータルカリングを表示" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "ポータルカリングを表示" +msgstr "オクルージョンカリングを表示" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8253,7 +8272,7 @@ msgstr "スナップの設定" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" -msgstr "スナップを移動:" +msgstr "スナップの移動:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" @@ -8308,9 +8327,8 @@ msgid "Post" msgstr "後" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "名無しのプロジェクト" +msgstr "名無しのギズモ" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -8634,7 +8652,7 @@ msgstr "アイテムをインポート中 {n}/{n}" #: editor/plugins/theme_editor_plugin.cpp msgid "Updating the editor" -msgstr "エディタをアップデート中" +msgstr "エディターをアップデート中" #: editor/plugins/theme_editor_plugin.cpp msgid "Finalizing" @@ -8642,16 +8660,15 @@ msgstr "終了処理中" #: editor/plugins/theme_editor_plugin.cpp msgid "Filter:" -msgstr "フィルタ:" +msgstr "フィルター:" #: editor/plugins/theme_editor_plugin.cpp msgid "With Data" msgstr "データ付" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select by data type:" -msgstr "ノードを選択" +msgstr "データのタイプから選択:" #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible color items." @@ -8718,21 +8735,20 @@ msgid "" "Caution: Adding icon data may considerably increase the size of your Theme " "resource." msgstr "" -"注意: アイコンデータを追加するとテーマ リソースのサイズが大幅に増加します。" +"注意: アイコンデータを追加するとテーマリソースのサイズが大幅に増加する可能性" +"があります。" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Collapse types." -msgstr "すべて折りたたむ" +msgstr "タイプを折りたたむ。" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Expand types." -msgstr "すべて展開" +msgstr "タイプを展開。" #: editor/plugins/theme_editor_plugin.cpp msgid "Select all Theme items." -msgstr "すべてのテーマ アイテムを選択する。" +msgstr "すべてのテーマアイテムを選択する。" #: editor/plugins/theme_editor_plugin.cpp msgid "Select With Data" @@ -8740,7 +8756,7 @@ msgstr "データ付きで選択" #: editor/plugins/theme_editor_plugin.cpp msgid "Select all Theme items with item data." -msgstr "すべてのテーマ アイテムを、アイテムのデータ付きで選択する。" +msgstr "すべてのテーマアイテムを、アイテムのデータ付きで選択する。" #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect All" @@ -8748,12 +8764,11 @@ msgstr "すべて選択解除" #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all Theme items." -msgstr "すべてのテーマ アイテムの選択を解除する。" +msgstr "すべてのテーマアイテムの選択を解除する。" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Import Selected" -msgstr "シーンをインポート" +msgstr "選択されたものをインポート" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -8761,12 +8776,18 @@ msgid "" "closing this window.\n" "Close anyway?" msgstr "" +"アイテムのインポート タブでアイテムが選択されています。ウィンドウを閉じると選" +"択は失われます。\n" +"それでも閉じますか?" #: editor/plugins/theme_editor_plugin.cpp msgid "" "Select a theme type from the list to edit its items.\n" "You can add a custom type or import a type with its items from another theme." msgstr "" +"リストからテーマタイプを選択して、そのアイテムを編集できます。\n" +"カスタムタイプを追加したり、他のテーマからタイプとそのアイテムをインポートで" +"きます。" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Color Items" @@ -8797,6 +8818,8 @@ msgid "" "This theme type is empty.\n" "Add more items to it manually or by importing from another theme." msgstr "" +"このテーマタイプは空です。\n" +"手動もしくは他のテーマからインポートして、アイテムを追加してください。" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Color Item" @@ -8840,15 +8863,15 @@ msgstr "StyleBox アイテム名の変更" #: editor/plugins/theme_editor_plugin.cpp msgid "Invalid file, not a Theme resource." -msgstr "無効なファイルです。テーマ リソースではありません。" +msgstr "無効なファイルです。テーマリソースではありません。" #: editor/plugins/theme_editor_plugin.cpp msgid "Invalid file, same as the edited Theme resource." -msgstr "" +msgstr "無効なファイルです。編集済みのテーマリソースと同じです。" #: editor/plugins/theme_editor_plugin.cpp msgid "Manage Theme Items" -msgstr "テーマ アイテムの管理" +msgstr "テーマアイテムの管理" #: editor/plugins/theme_editor_plugin.cpp msgid "Edit Items" @@ -8876,11 +8899,11 @@ msgstr "アイテムを除去:" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" -msgstr "クラスアイテム削除" +msgstr "クラスアイテムを除去" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Custom Items" -msgstr "" +msgstr "カスタムアイテムを除去" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Items" @@ -8888,7 +8911,7 @@ msgstr "すべてのアイテムを除去" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Theme Item" -msgstr "テーマ アイテムを追加" +msgstr "テーマアイテムを追加" #: editor/plugins/theme_editor_plugin.cpp msgid "Old Name:" @@ -8928,28 +8951,27 @@ msgstr "アイテムを上書き" #: editor/plugins/theme_editor_plugin.cpp msgid "Unpin this StyleBox as a main style." -msgstr "" +msgstr "このStyleBoxをメインスタイルから固定解除します。" #: editor/plugins/theme_editor_plugin.cpp msgid "" "Pin this StyleBox as a main style. Editing its properties will update the " "same properties in all other StyleBoxes of this type." msgstr "" +"このStyleBoxをメインスタイルに固定します。そのプロパティを編集すると、他すべ" +"てのこのタイプのStyleBoxで同じプロパティが更新されます。" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Type" -msgstr "タイプ(型)" +msgstr "タイプを追加" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Item Type" -msgstr "アイテムを追加" +msgstr "アイテムのタイプを追加" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Node Types:" -msgstr "ノードタイプ" +msgstr "ノードのタイプ:" #: editor/plugins/theme_editor_plugin.cpp msgid "Show Default" @@ -8958,6 +8980,7 @@ msgstr "デフォルトの表示" #: editor/plugins/theme_editor_plugin.cpp msgid "Show default type items alongside items that have been overridden." msgstr "" +"デフォルトタイプのアイテムを、オーバーライドされたアイテムと一緒に表示する。" #: editor/plugins/theme_editor_plugin.cpp msgid "Override All" @@ -8965,7 +8988,7 @@ msgstr "すべて上書き" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." -msgstr "" +msgstr "すべてのデフォルトタイプのアイテムをオーバーライドする。" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -8996,6 +9019,8 @@ msgid "" "Toggle the control picker, allowing to visually select control types for " "edit." msgstr "" +"コントロールピッカーを切り替えて、コントロールタイプを視覚的に選択して編集で" +"きるようにします。" #: editor/plugins/theme_editor_preview.cpp msgid "Toggle Button" @@ -9030,9 +9055,8 @@ msgid "Checked Radio Item" msgstr "チェック済みラジオ アイテム" #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Named Separator" -msgstr "名前付き分類。" +msgstr "名前付きセパレーター" #: editor/plugins/theme_editor_preview.cpp msgid "Submenu" @@ -9085,6 +9109,7 @@ msgstr "Has,Many,Options" #: editor/plugins/theme_editor_preview.cpp msgid "Invalid path, the PackedScene resource was probably moved or removed." msgstr "" +"無効なパスです。おそらくPackedSceneリソースは移動または削除されています。" #: editor/plugins/theme_editor_preview.cpp msgid "Invalid PackedScene resource, must have a Control node at its root." @@ -9096,7 +9121,7 @@ msgstr "無効なファイルです。PackedScene のリソースではありま #: editor/plugins/theme_editor_preview.cpp msgid "Reload the scene to reflect its most actual state." -msgstr "" +msgstr "最も実際の状態を反映させるためにシーンをリロードします。" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" @@ -9347,7 +9372,7 @@ msgstr "領域 Rect 内のポリゴンを保持します。" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." -msgstr "スナップとグリッドの表示を有効にする (インスペクタから設定可能)。" +msgstr "スナップとグリッドの表示を有効にする (インスペクターから設定可能)。" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" @@ -9373,7 +9398,7 @@ msgstr "除去するテクスチャが選択されていません。" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene? This will overwrite all current tiles." msgstr "" -"シーンから作成しますか?これにより、現在のすべてのタイルが上書きされます。" +"シーンから作成しますか?これにより、現在のすべてのタイルが上書きされます。" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" @@ -9583,19 +9608,19 @@ msgstr "変更点" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" -msgstr "変更された箇所" +msgstr "変更済み" #: editor/plugins/version_control_editor_plugin.cpp msgid "Renamed" -msgstr "名前の変更された" +msgstr "名前変更済み" #: editor/plugins/version_control_editor_plugin.cpp msgid "Deleted" -msgstr "削除された" +msgstr "削除済み" #: editor/plugins/version_control_editor_plugin.cpp msgid "Typechange" -msgstr "タイプの変更" +msgstr "タイプ変更" #: editor/plugins/version_control_editor_plugin.cpp msgid "Stage Selected" @@ -9611,7 +9636,7 @@ msgstr "変更をコミットする" #: editor/plugins/version_control_editor_plugin.cpp msgid "View file diffs before committing them to the latest version" -msgstr "最新のバージョンにコミットする前にファイルの差分を見る" +msgstr "最新のバージョンにコミットする前にファイルの差分を表示" #: editor/plugins/version_control_editor_plugin.cpp msgid "No file diff is active" @@ -9619,7 +9644,7 @@ msgstr "有効なファイル差分はありません" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect changes in file diff" -msgstr "ファイルの差分に変更を確認" +msgstr "ファイル差分の変更を検知" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -9687,7 +9712,7 @@ msgstr "VisualShaderノードのサイズを変更" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" -msgstr "統一名を設定" +msgstr "Uniform名を設定" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Input Default Port" @@ -9792,7 +9817,7 @@ msgstr "Lighten演算子。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Overlay operator." -msgstr "オーバーレイ処理。" +msgstr "オーバーレイ演算子。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Screen operator." @@ -9812,7 +9837,7 @@ msgstr "Colorのuniform。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "2つのパラメータ間の %s 比較のブール結果を返します。" +msgstr "2つのパラメーター間の %s 比較のブール結果を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" @@ -9838,13 +9863,13 @@ msgstr "" msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." -msgstr "INFとスカラパラメータの比較の結果をブール値で返します。" +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とスカラパラメータの比較の結果をブール値で返します。" +msgstr "NaNとスカラーパラメーターの比較の結果をブール値で返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" @@ -9872,13 +9897,13 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the comparison between two parameters." -msgstr "2つのパラメータ間の比較の結果をブール値で返します。" +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 "INF(またはNaN)とスカラパラメータとの比較のブール結果を返します。" +msgstr "INF(またはNaN)とスカラパラメーターとの比較のブール結果を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." @@ -9894,16 +9919,15 @@ msgstr "すべてのシェーダーモードの '%s' 入力パラメーター。 #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Input parameter." -msgstr "入力パラメータ。" +msgstr "入力パラメーター。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "" -"'%s' は頂点シェーダーとフラグメントシェーダーのためのパラメータを入力します。" +msgstr "頂点、フラグメントシェーダーモード(複数)の '%s' 入力パラメーター。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment and light shader modes." -msgstr "フラグメントモードとライトシェーダーモードの '%s' 入力パラメーター。" +msgstr "フラグメント、ライトシェーダーモード(複数)の '%s' 入力パラメーター。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment shader mode." @@ -9911,16 +9935,15 @@ msgstr "フラグメントシェーダーモードの '%s' 入力パラメータ #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for light shader mode." -msgstr "ライトシェーダーモードの '%s' 入力パラメータ。" +msgstr "ライトシェーダーモードの '%s' 入力パラメーター。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex shader mode." -msgstr "頂点シェーダーモードの '%s' 入力パラメータ。" +msgstr "頂点シェーダーモードの '%s' 入力パラメーター。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "" -"頂点シェーダーモード、フラグメントシェーダーモードの '%s' 入力パラメータ。" +msgstr "頂点、フラグメントシェーダーモードの '%s' 入力パラメーター。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar function." @@ -9964,40 +9987,40 @@ msgstr "Sqrt2定数(1.414214)。2の平方根。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the absolute value of the parameter." -msgstr "パラメータの絶対値を返します。" +msgstr "パラメーターの絶対値を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-cosine of the parameter." -msgstr "パラメータの逆コサインを返します。" +msgstr "パラメーターの逆コサインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "パラメータの逆双曲線余弦を返します。" +msgstr "パラメーターの逆双曲線余弦を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." -msgstr "パラメータの逆サインを返します。" +msgstr "パラメーターの逆サインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "パラメータの双曲線逆サインを返します。" +msgstr "パラメーターの双曲線逆サインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." -msgstr "パラメータの逆タンジェントを返します。" +msgstr "パラメーターの逆タンジェントを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameters." -msgstr "複数パラメータの逆タンジェントを返します。" +msgstr "複数パラメーターの逆タンジェントを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "パラメータの双曲線逆タンジェントを返します。" +msgstr "パラメーターの双曲線逆タンジェントを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Finds the nearest integer that is greater than or equal to the parameter." -msgstr "パラメータ以上の最も近い整数を検索します。" +msgstr "パラメーターと等しいかより大きい、最も近い整数を求めます。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." @@ -10005,11 +10028,11 @@ msgstr "値をさらに2つの値の間にあるように制約します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the cosine of the parameter." -msgstr "パラメータのコサインを返します。" +msgstr "パラメーターのコサインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic cosine of the parameter." -msgstr "パラメータの双曲線コサインを返します。" +msgstr "パラメーターの双曲線コサインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -10025,7 +10048,7 @@ msgstr "2を底とする指数。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer less than or equal to the parameter." -msgstr "パラメータ以下の最も近い整数を検索します。" +msgstr "パラメーターと等しいかより小さい、最も近い整数を求めます。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Computes the fractional part of the argument." @@ -10033,7 +10056,7 @@ msgstr "引数の小数部を計算します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." -msgstr "パラメータの平方根の逆数を返します。" +msgstr "パラメーターの平方根の逆数を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Natural logarithm." @@ -10053,11 +10076,11 @@ msgstr "2つの値のうち小さい方を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." -msgstr "2つのスカラ間のリニア補間。" +msgstr "2つのスカラー間のリニア補間。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the opposite value of the parameter." -msgstr "パラメータの反対の値を返します。" +msgstr "パラメーターの反対の値を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - scalar" @@ -10066,7 +10089,7 @@ msgstr "1.0 - スカラー" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the value of the first parameter raised to the power of the second." -msgstr "最初のパラメータの値を2のべき乗で返した値を返します。" +msgstr "最初のパラメーターの値を2のべき乗で返した値を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in degrees to radians." @@ -10078,11 +10101,11 @@ msgstr "1.0 / スカラー" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer to the parameter." -msgstr "パラメータに最も近い整数を検索します。" +msgstr "パラメーターに最も近い整数を求めます。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest even integer to the parameter." -msgstr "パラメータに最も近い偶数の整数を検索します。" +msgstr "パラメーターに最も近い偶数の整数を求めます。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -10090,19 +10113,19 @@ msgstr "値を0.0から1.0の間に固定します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." -msgstr "パラメータの符号を抽出します。" +msgstr "パラメーターの符号を抽出します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the sine of the parameter." -msgstr "パラメータのサインを返します。" +msgstr "パラメーターのサインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic sine of the parameter." -msgstr "パラメータの双曲サインを返します。" +msgstr "パラメーターの双曲サインを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." -msgstr "パラメータの平方根を返します。" +msgstr "パラメーターの平方根を返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -10130,15 +10153,15 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." -msgstr "パラメータのタンジェントを返します。" +msgstr "パラメーターのタンジェントを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic tangent of the parameter." -msgstr "パラメータの双曲タンジェントを返します。" +msgstr "パラメーターの双曲タンジェントを返します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the truncated value of the parameter." -msgstr "パラメータのトランケートされた値を検索します。" +msgstr "パラメーターを切り捨てた値を求めます。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -10204,10 +10227,10 @@ msgid "" msgstr "" "ベクトルのペアの外積を計算します。\n" "\n" -"OuterProductは、最初のパラメータ 'c' を列ベクトル(1列の行列)として、2番目のパ" -"ラメータ 'r' を行ベクトル(1行の行列)として処理し、線形代数行列乗算 'c * r' を" -"実行して、行の数が 'c' のコンポーネントの数で、列の数が 'r' のコンポーネント" -"の数である行列を生成します。" +"OuterProductは、最初のパラメーター 'c' を列ベクトル(1列の行列)として、2番目の" +"パラメータ 'r' を行ベクトル(1行の行列)として処理し、線形代数行列乗算 'c * r' " +"を実行して、行の数が 'c' のコンポーネントの数で、列の数が 'r' のコンポーネン" +"トの数である行列を生成します。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." @@ -10421,8 +10444,8 @@ msgid "" "it later in the Expressions. You can also declare varyings, uniforms and " "constants." msgstr "" -"カスタムGodotシェーダー言語の表現は、シェーディング結果の最後に位置します。" -"様々な関数をその中で定義し、表現の中で呼び出すことができます。またvarying変" +"カスタムGodotシェーダー言語の表現は、シェーディング結果の最後に位置します。さ" +"まざまな関数をその中で定義し、表現の中で呼び出すことができます。またvarying変" "数、uniform変数、定数を宣言することができます。" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10552,8 +10575,8 @@ msgid "" "If checked, the preset will be available for use in one-click deploy.\n" "Only one preset per platform may be marked as runnable." msgstr "" -"チェックを入れると、1クリック・デプロイでもこのプリセットが使われるようにな" -"ります。\n" +"チェックを入れると、ワンクリック・デプロイでもこのプリセットが使われるように" +"なります。\n" "ひとつのプラットフォームに対し、ひとつのプリセットのみが実行可能としてマーク" "できます。" @@ -10590,7 +10613,7 @@ msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"リソース以外のファイル/フォルダをエクスポートするためのフィルタ\n" +"リソース以外のファイル/フォルダーをエクスポートするためのフィルター\n" "(コンマ区切り、 例: *.json, *.txt, docs/*)" #: editor/project_export.cpp @@ -10598,7 +10621,7 @@ msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"プロジェクトからファイル/フォルダを除外するフィルタ\n" +"プロジェクトからファイル/フォルダーを除外するフィルター\n" "(コンマ区切り、 例: *.json, *.txt, docs/*)" #: editor/project_export.cpp @@ -10631,7 +10654,7 @@ msgstr "コンパイルされたバイトコード (より高速なローディ #: editor/project_export.cpp msgid "Encrypted (Provide Key Below)" -msgstr "暗号化(下にキーを入力)" +msgstr "暗号化 (下にキーを入力)" #: editor/project_export.cpp msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" @@ -10651,7 +10674,7 @@ msgstr "プロジェクトのエクスポート" #: editor/project_export.cpp msgid "Export mode?" -msgstr "エクスポート モード?" +msgstr "エクスポートのモードは?" #: editor/project_export.cpp msgid "Export All" @@ -10695,7 +10718,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Please choose an empty folder." -msgstr "空のフォルダを選択してください。" +msgstr "空のフォルダーを選択してください。" #: editor/project_manager.cpp msgid "Please choose a \"project.godot\" or \".zip\" file." @@ -10719,11 +10742,11 @@ msgstr "無効なプロジェクト名です。" #: editor/project_manager.cpp msgid "Couldn't create folder." -msgstr "フォルダを作成できませんでした。" +msgstr "フォルダーを作成できませんでした。" #: editor/project_manager.cpp msgid "There is already a folder in this path with the specified name." -msgstr "このパスには、指定された名前のフォルダが既に存在します。" +msgstr "このパスには、指定された名前のフォルダーがすでに存在します。" #: editor/project_manager.cpp msgid "It would be a good idea to name your project." @@ -10811,7 +10834,7 @@ msgstr "OpenGL ES 3.0" #: editor/project_manager.cpp msgid "Not supported by your GPU drivers." -msgstr "お使いのGPUドライバではサポートされていません。" +msgstr "お使いのGPUドライバーではサポートされていません。" #: editor/project_manager.cpp msgid "" @@ -10856,7 +10879,7 @@ msgstr "プロジェクトがありません" #: editor/project_manager.cpp msgid "Error: Project is missing on the filesystem." -msgstr "エラー: プロジェクトはファイルシステムを見つけられません。" +msgstr "エラー: ファイルシステム上にプロジェクトが見つかりません。" #: editor/project_manager.cpp msgid "Can't open project at '%s'." @@ -10949,7 +10972,7 @@ msgid "" "The project folders' contents won't be modified." msgstr "" "見つからないすべてのプロジェクトを一覧から削除しますか?\n" -"プロジェクトフォルダの内容は変更されません。" +"プロジェクトフォルダーの内容は変更されません。" #: editor/project_manager.cpp msgid "" @@ -10957,15 +10980,15 @@ msgid "" "The interface will update after restarting the editor or project manager." msgstr "" "言語が変更されました。\n" -"エディタまたはプロジェクトマネージャーの再起動後にインターフェースが更新され" -"ます。" +"エディターまたはプロジェクトマネージャーの再起動後にインターフェースが更新さ" +"れます。" #: editor/project_manager.cpp msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" "This could take a while." msgstr "" -"既存のGodotプロジェクトの%sフォルダをスキャンしますか?\n" +"%s個のフォルダー内に存在するGodotプロジェクトをスキャンしますか?\n" "これにはしばらく時間がかかります。" #. TRANSLATORS: This refers to the application where users manage their Godot projects. @@ -10975,7 +10998,7 @@ msgstr "プロジェクトマネージャー" #: editor/project_manager.cpp msgid "Local Projects" -msgstr "ローカル プロジェクト" +msgstr "ローカルのプロジェクト" #: editor/project_manager.cpp msgid "Loading, please wait..." @@ -11003,7 +11026,7 @@ msgstr "プロジェクトをスキャン" #: editor/project_manager.cpp msgid "Select a Folder to Scan" -msgstr "スキャンするフォルダを選択" +msgstr "スキャンするフォルダーを選択" #: editor/project_manager.cpp msgid "New Project" @@ -11039,7 +11062,7 @@ msgstr "すべて除去" #: editor/project_manager.cpp msgid "Also delete project contents (no undo!)" -msgstr "プロジェクトの内容も削除されます (もとに戻せません!)" +msgstr "プロジェクトの内容も削除する (もとに戻せません!)" #: editor/project_manager.cpp msgid "Can't run project" @@ -11055,7 +11078,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Filter projects" -msgstr "プロジェクトのフィルタ" +msgstr "プロジェクトを絞り込む" #: editor/project_manager.cpp msgid "" @@ -11069,12 +11092,12 @@ msgstr "" "とも1つ必要です。" #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "キー " +msgid "Physical Key" +msgstr "物理キー" #: editor/project_settings_editor.cpp -msgid "Physical Key" -msgstr "" +msgid "Key " +msgstr "キー " #: editor/project_settings_editor.cpp msgid "Joy Button" @@ -11098,7 +11121,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "An action with the name '%s' already exists." -msgstr "'%s' という名前のアクションが既に存在します。" +msgstr "'%s' という名前のアクションがすでに存在します。" #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -11122,7 +11145,7 @@ msgstr "デバイス" #: editor/project_settings_editor.cpp msgid " (Physical)" -msgstr "" +msgstr " (物理的)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." @@ -11174,7 +11197,7 @@ msgstr "ジョイパッドの方向キー/スティックのインデックス:" #: editor/project_settings_editor.cpp msgid "Axis" -msgstr "アナログ" +msgstr "軸" #: editor/project_settings_editor.cpp msgid "Joypad Button Index:" @@ -11241,8 +11264,8 @@ msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'." msgstr "" -"無効なアクション名です。空もしくは'/'、':'、'='、'\\' 、'\"'を含めることはで" -"きません。" +"無効なアクション名です。空もしくは'/'、':'、'='、'\\'、'\"'を含めることはでき" +"ません。" #: editor/project_settings_editor.cpp msgid "Add Input Action" @@ -11273,22 +11296,20 @@ msgid "Remove Translation" msgstr "翻訳を除去" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Translation Resource Remap: Add %d Path(s)" -msgstr "リソース再マップが再マップを追加" +msgstr "翻訳リソースの再マップ: %d個のパスを追加" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Translation Resource Remap: Add %d Remap(s)" -msgstr "リソース再マップが再マップを追加" +msgstr "翻訳リソースの再マップ: %d個の再マップを追加" #: editor/project_settings_editor.cpp msgid "Change Resource Remap Language" -msgstr "リソースリマップ言語を変更" +msgstr "リソースの再マップ言語を変更" #: editor/project_settings_editor.cpp msgid "Remove Resource Remap" -msgstr "リソースのリマップを削除" +msgstr "リソースの再マップを削除" #: editor/project_settings_editor.cpp msgid "Remove Resource Remap Option" @@ -11296,11 +11317,11 @@ msgstr "リソース再マップオプションを削除" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter" -msgstr "ロケールフィルタの変更" +msgstr "ロケールフィルターの変更" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" -msgstr "ロケールフィルタモードの変更" +msgstr "ロケールフィルターモードの変更" #: editor/project_settings_editor.cpp msgid "Project Settings (project.godot)" @@ -11316,7 +11337,7 @@ msgstr "上書きします..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "The editor must be restarted for changes to take effect." -msgstr "変更を有効にするには、エディタを再起動する必要があります。" +msgstr "変更を有効にするには、エディターを再起動する必要があります。" #: editor/project_settings_editor.cpp msgid "Input Map" @@ -11356,7 +11377,7 @@ msgstr "翻訳:" #: editor/project_settings_editor.cpp msgid "Remaps" -msgstr "リマップ" +msgstr "再マップ" #: editor/project_settings_editor.cpp msgid "Resources:" @@ -11364,7 +11385,7 @@ msgstr "リソース:" #: editor/project_settings_editor.cpp msgid "Remaps by Locale:" -msgstr "ロケールに従いリマップ:" +msgstr "ロケールに従い再マップ:" #: editor/project_settings_editor.cpp msgid "Locale" @@ -11372,7 +11393,7 @@ msgstr "ロケール" #: editor/project_settings_editor.cpp msgid "Locales Filter" -msgstr "ロケールフィルタ" +msgstr "ロケールフィルター" #: editor/project_settings_editor.cpp msgid "Show All Locales" @@ -11384,7 +11405,7 @@ msgstr "選択したロケールのみ表示" #: editor/project_settings_editor.cpp msgid "Filter mode:" -msgstr "フィルタモード:" +msgstr "フィルターモード:" #: editor/project_settings_editor.cpp msgid "Locales:" @@ -11511,8 +11532,8 @@ msgid "" "Sequential integer counter.\n" "Compare counter options." msgstr "" -"シーケンシャル整数カウンタ。\n" -"カウンタオプションを比較します。" +"シーケンシャル整数カウンター。\n" +"カウンターオプションを比較します。" #: editor/rename_dialog.cpp msgid "Per-level Counter" @@ -11520,11 +11541,11 @@ msgstr "レベルごとのカウンター" #: editor/rename_dialog.cpp msgid "If set, the counter restarts for each group of child nodes." -msgstr "設定すると、子ノードのグループごとにカウンタが再起動します。" +msgstr "設定すると、子ノードのグループごとにカウンターが再起動します。" #: editor/rename_dialog.cpp msgid "Initial value for the counter" -msgstr "カウンタの初期値" +msgstr "カウンターの初期値" #: editor/rename_dialog.cpp msgid "Step" @@ -11532,7 +11553,7 @@ msgstr "ステップ" #: editor/rename_dialog.cpp msgid "Amount by which counter is incremented for each node" -msgstr "各ノードのカウンタの増分量" +msgstr "各ノードのカウンターの増分量" #: editor/rename_dialog.cpp msgid "Padding" @@ -11543,7 +11564,7 @@ msgid "" "Minimum number of digits for the counter.\n" "Missing digits are padded with leading zeros." msgstr "" -"カウンタの最小桁数。\n" +"カウンターの最小桁数。\n" "欠落した数字は、先頭にゼロが埋め込まれます。" #: editor/rename_dialog.cpp @@ -11701,11 +11722,11 @@ msgstr "ノードをルートにする" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes and any children?" -msgstr "%d ノードとその子ノードすべてを削除しますか?" +msgstr "%d個のノードとその子ノードすべてを削除しますか?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" -msgstr "%d ノードを削除しますか?" +msgstr "%d個のノードを削除しますか?" #: editor/scene_tree_dock.cpp msgid "Delete the root node \"%s\"?" @@ -11723,8 +11744,8 @@ msgstr "\"%s\" ノードを削除しますか?" msgid "" "Saving the branch as a scene requires having a scene open in the editor." msgstr "" -"ブランチをシーンとして保存するには、エディタでシーンを開いている必要がありま" -"す。" +"ブランチをシーンとして保存するには、エディターでシーンを開いている必要があり" +"ます。" #: editor/scene_tree_dock.cpp msgid "" @@ -11741,6 +11762,11 @@ msgid "" "FileSystem dock context menu\n" "or create an inherited scene using Scene > New Inherited Scene... instead." msgstr "" +"ルートノードのブランチはインスタンス化されたシーンとして保存できません。\n" +"現在のシーンの編集可能なコピーを作成するには、FileSystemドックのコンテキスト" +"メニューを使用して複製するか、\n" +"代わりに シーン > 新しい継承シーン... を使用して継承シーンを作成してくださ" +"い。" #: editor/scene_tree_dock.cpp msgid "" @@ -11748,6 +11774,9 @@ msgid "" "To create a variation of a scene, you can make an inherited scene based on " "the instanced scene using Scene > New Inherited Scene... instead." msgstr "" +"すでにインスタンス化されているシーンのブランチは保存できません。\n" +"そのシーンのバリエーションを作成するには、代わりにインスタンス化されたシーン" +"をベースに シーン > 新しい継承シーン... から継承シーンを作成してください。" #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -11864,7 +11893,7 @@ msgid "" "disabled." msgstr "" "スクリプトをアタッチできません: 言語がひとつも登録されていません。\n" -"おそらくこのエディタは、すべての言語モジュールを無効化してビルドされていま" +"おそらくこのエディターは、すべての言語モジュールを無効化してビルドされていま" "す。" #: editor/scene_tree_dock.cpp @@ -11933,6 +11962,10 @@ msgid "" "every time it updates.\n" "Switch back to the Local scene tree dock to improve performance." msgstr "" +"選択した場合、リモートのシーンツリードックが更新されるたびに、プロジェクトに" +"カクつきが発生します。\n" +"パフォーマンスを向上させるには、ローカルのシーンツリードックに切り替えてくだ" +"さい。" #: editor/scene_tree_dock.cpp msgid "Local" @@ -11996,7 +12029,7 @@ msgid "" "Click to unlock it." msgstr "" "ノードはロックされています。\n" -"クリックしてロックを外してください。" +"クリックでロックを外す。" #: editor/scene_tree_editor.cpp msgid "" @@ -12020,7 +12053,7 @@ msgstr "" #: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" -msgstr "不正なノード名.以下の文字は使えません:" +msgstr "無効なノード名。以下の文字は使えません:" #: editor/scene_tree_editor.cpp msgid "Rename Node" @@ -12056,7 +12089,7 @@ msgstr "無効なベースパスです。" #: editor/script_create_dialog.cpp msgid "A directory with the same name exists." -msgstr "同名のフォルダが存在します。" +msgstr "同名のフォルダーが存在します。" #: editor/script_create_dialog.cpp msgid "File does not exist." @@ -12100,7 +12133,7 @@ msgstr "スクリプトを開く" #: editor/script_create_dialog.cpp msgid "File exists, it will be reused." -msgstr "ファイルが既に存在します。そちらを再利用します。" +msgstr "ファイルがすでに存在します。そちらを再利用します。" #: editor/script_create_dialog.cpp msgid "Invalid path." @@ -12108,7 +12141,7 @@ msgstr "パスが無効です。" #: editor/script_create_dialog.cpp msgid "Invalid class name." -msgstr "無効なクラス名。" +msgstr "無効なクラス名です。" #: editor/script_create_dialog.cpp msgid "Invalid inherited parent name or path." @@ -12120,7 +12153,7 @@ msgstr "スクリプトのパス/名前は有効です。" #: editor/script_create_dialog.cpp 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)." @@ -12132,26 +12165,27 @@ msgstr "新規スクリプトファイルを作成。" #: editor/script_create_dialog.cpp msgid "Will load an existing script file." -msgstr "既存のスクリプトファイルを読み込む。" +msgstr "既存のスクリプトファイルが読み込まれます。" #: editor/script_create_dialog.cpp msgid "Script file already exists." -msgstr "スクリプトファイルが既にあります。" +msgstr "スクリプトファイルがすでに存在します。" #: editor/script_create_dialog.cpp msgid "" "Note: Built-in scripts have some limitations and can't be edited using an " "external editor." msgstr "" -"注: 組み込みスクリプトにはいくつか制約があり、また外部のエディタでは編集でき" -"ません。" +"注: 組み込みスクリプトにはいくつか制約があり、また外部のエディターでは編集で" +"きません。" #: editor/script_create_dialog.cpp msgid "" "Warning: Having the script name be the same as a built-in type is usually " "not desired." msgstr "" -"警告: スクリプト名を組み込み型と同じにすることは、通常は望ましくありません。" +"警告: スクリプト名を組み込み型の名前と同じにすることは、通常は望ましくありま" +"せん。" #: editor/script_create_dialog.cpp msgid "Class Name:" @@ -12279,7 +12313,7 @@ msgstr "合計:" #: editor/script_editor_debugger.cpp msgid "Export list to a CSV file" -msgstr "CSVファイルにリストをエクスポート" +msgstr "リストをCSVファイルにエクスポート" #: editor/script_editor_debugger.cpp msgid "Resource Path" @@ -12335,7 +12369,7 @@ msgstr "ショートカットを変更" #: editor/settings_config_dialog.cpp msgid "Editor Settings" -msgstr "エディタ設定" +msgstr "エディター設定" #: editor/settings_config_dialog.cpp msgid "Shortcuts" @@ -12410,14 +12444,12 @@ msgid "Set Portal Point Position" msgstr "Portal ポイントの位置を設定" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "円柱シェイプの半径を変更" +msgstr "オクルーダーの球形の半径をセット" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "曲線のIn-Controlの位置を指定" +msgstr "オクルーダーの球形の位置をセット" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12702,9 +12734,8 @@ msgid "Class name can't be a reserved keyword" msgstr "クラス名を予約キーワードにすることはできません" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "選択部の塗り潰し" +msgstr "ソリューションをビルド" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -12716,7 +12747,7 @@ msgstr "NavMeshを焼き込む" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." -msgstr "ナビメッシュ(ナビゲーションメッシュ)の消去。" +msgstr "ナビゲーションメッシュの消去。" #: modules/recast/navigation_mesh_generator.cpp msgid "Setting up Configuration..." @@ -12760,7 +12791,7 @@ msgstr "ネイティブナビゲーションメッシュに変換しています #: modules/recast/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" -msgstr "ナビメッシュ(ナビゲーションメッシュ)生成設定:" +msgstr "ナビゲーションメッシュ生成設定:" #: modules/recast/navigation_mesh_generator.cpp msgid "Parsing Geometry..." @@ -12790,22 +12821,22 @@ msgid "" "Return value must be assigned to first element of node working memory! Fix " "your node please." msgstr "" -"戻り値はノードの作業用メモリの最初の要素に割り当てなければなりません!ノードを" -"修正してください。" +"戻り値はノードの作業用メモリの最初の要素に割り当てなければなりません!ノード" +"を修正してください。" #: modules/visual_script/visual_script.cpp msgid "Node returned an invalid sequence output: " -msgstr "ノードは無効なシークエンス出力を返しました: " +msgstr "ノードは無効なシーケンス出力を返しました: " #: modules/visual_script/visual_script.cpp msgid "Found sequence bit but not the node in the stack, report bug!" msgstr "" -"スタックにシークエンスビットを見つけましたが、ノードではありません。バグ報告" +"スタックにシーケンスビットを見つけましたが、ノードではありません。バグ報告" "を!" #: modules/visual_script/visual_script.cpp msgid "Stack overflow with stack depth: " -msgstr "スタックオーバーフロー スタックの深さ: " +msgstr "スタックオーバーフロー発生 スタックの深さ: " #: modules/visual_script/visual_script_editor.cpp msgid "Change Signal Arguments" @@ -12845,7 +12876,7 @@ msgstr "ポート名を変更" #: modules/visual_script/visual_script_editor.cpp msgid "Override an existing built-in function." -msgstr "既存の組込み関数をオーバーライド。" +msgstr "既存の組み込み関数をオーバーライド。" #: modules/visual_script/visual_script_editor.cpp msgid "Create a new function." @@ -12873,7 +12904,7 @@ msgstr "この名前は無効な識別子です:" #: modules/visual_script/visual_script_editor.cpp msgid "Name already in use by another func/var/signal:" -msgstr "他の関数/変数/シグナルにより既に使われている名前:" +msgstr "他の関数/変数/シグナルによりすでに使われている名前:" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Function" @@ -12885,7 +12916,7 @@ msgstr "変数名を変更" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Signal" -msgstr "シグナルの名前を変える" +msgstr "シグナル名を変更" #: modules/visual_script/visual_script_editor.cpp msgid "Add Function" @@ -12926,8 +12957,8 @@ msgstr "VisualScriptノードを複製" #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"%sを押したままGetterを(ドラッグ&)ドロップする。Shiftを押したまま汎用署名を" -"(ドラッグ&)ドロップする。" +"%sを押したままGetterを(ドラッグ&)ドロップする。Shiftを押したまま汎用シグネ" +"チャを(ドラッグ&)ドロップする。" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." @@ -12971,8 +13002,8 @@ msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" -"このシーンではスクリプト '%s'が使用されていないため、プロパティを削除できませ" -"ん。\n" +"このシーンではスクリプト '%s'が使用されていないため、プロパティをドロップでき" +"ません。\n" "「Shift」を押しながらドロップすると、署名がコピーされます。" #: modules/visual_script/visual_script_editor.cpp @@ -13013,7 +13044,7 @@ msgstr "ノードシーケンスに接続" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" -msgstr "スクリプトに関数 '%s'が既にあります" +msgstr "スクリプトに関数 '%s'がすでに存在します" #: modules/visual_script/visual_script_editor.cpp msgid "Change Input Value" @@ -13045,7 +13076,7 @@ msgstr "シーケンス ポートを持つノードを少なくとも 1 つ選 #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." -msgstr "セクションでは唯一つのシーケンス入力を持つようにしてください。" +msgstr "選択するシーケンス入力は1つだけにしてください。" #: modules/visual_script/visual_script_editor.cpp msgid "Create Function" @@ -13129,11 +13160,11 @@ msgstr "メンバーを編集" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " -msgstr "入力タイプを反復できません: " +msgstr "入力タイプは反復可能ではありません: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" -msgstr "イテレータが無効になりました" +msgstr "イテレーターが無効になりました" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid: " @@ -13141,7 +13172,7 @@ msgstr "イテレーターが無効になりました: " #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name." -msgstr "インデックスプロパティ名が無効です。" +msgstr "インデックスのプロパティ名が無効です。" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Base object is not a Node!" @@ -13180,8 +13211,8 @@ msgid "" "Invalid return value from _step(), must be integer (seq out), or string " "(error)." msgstr "" -"_step()の無効な戻り値 integer (seq out)またはstring (error)でないといけませ" -"ん。" +"_step()の戻り値が無効です。integer (seq out)またはstring (error)でなければな" +"りません。" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -13264,16 +13295,20 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Debug Keystore, Debug User, Debug Passwordは、すべて設定されているか、すべて" +"空である必要があります。" #: platform/android/export/export_plugin.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." -msgstr "デバッグキーストアがエディタ設定にもプリセットにも設定されていません。" +msgstr "Debug Keystoreがエディター設定にもプリセットにも設定されていません。" #: platform/android/export/export_plugin.cpp msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Release Keystore, Release User, Release Passwordは、すべて設定されているか、" +"すべて空である必要があります。" #: platform/android/export/export_plugin.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13281,11 +13316,11 @@ msgstr "エクスポート設定にてリリース キーストアが誤って #: platform/android/export/export_plugin.cpp msgid "A valid Android SDK path is required in Editor Settings." -msgstr "エディタ設定でAndroid SDKパスの指定が必要です。" +msgstr "エディター設定でAndroid SDKパスの指定が必要です。" #: platform/android/export/export_plugin.cpp msgid "Invalid Android SDK path in Editor Settings." -msgstr "エディタ設定のAndroid SDKパスが無効です。" +msgstr "エディター設定のAndroid SDKパスが無効です。" #: platform/android/export/export_plugin.cpp msgid "Missing 'platform-tools' directory!" @@ -13297,7 +13332,8 @@ msgstr "Android SDK platform-toolsのadbコマンドが見つかりません。" #: platform/android/export/export_plugin.cpp msgid "Please check in the Android SDK directory specified in Editor Settings." -msgstr "エディタ設定で指定されたAndroid SDKのディレクトリを確認してください。" +msgstr "" +"エディター設定で指定されたAndroid SDKのディレクトリを確認してください。" #: platform/android/export/export_plugin.cpp msgid "Missing 'build-tools' directory!" @@ -13383,8 +13419,7 @@ msgstr "Android用にエクスポート中" #: platform/android/export/export_plugin.cpp msgid "Invalid filename! Android App Bundle requires the *.aab extension." -msgstr "" -"無効なファイル名です! Android App Bundle には拡張子 *.aab が必要です。" +msgstr "無効なファイル名です!Android App Bundle には拡張子 *.aab が必要です。" #: platform/android/export/export_plugin.cpp msgid "APK Expansion not compatible with Android App Bundle." @@ -13423,6 +13458,7 @@ msgstr "" msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name" msgstr "" +"res://android/build/res/*.xml ファイルをプロジェクト名で上書きできません" #: platform/android/export/export_plugin.cpp msgid "Could not export project files to gradle project\n" @@ -13481,6 +13517,10 @@ msgid "" "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" +"選択されたアーキテクチャ: %s のエクスポートテンプレートのライブラリが不足して" +"います。\n" +"必要なライブラリをすべて含むテンプレートを作成するか、エクスポートのプリセッ" +"トで、不足しているアーキテクチャのチェックを外してください。" #: platform/android/export/export_plugin.cpp msgid "Adding files..." @@ -13496,7 +13536,7 @@ msgstr "APKを最適化..." #: platform/android/export/export_plugin.cpp msgid "Could not unzip temporary unaligned APK." -msgstr "" +msgstr "temporary unaligned APKを展開できませんでした。" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Identifier is missing." @@ -13604,35 +13644,38 @@ msgstr "無効な背景色です。" #: platform/uwp/export/export.cpp msgid "Invalid Store Logo image dimensions (should be 50x50)." -msgstr "Storeロゴの画像サイズが無効です(縦横50x50でないといけません)。" +msgstr "Storeロゴの画像サイズが無効です(縦横50x50でなければなりません)。" #: platform/uwp/export/export.cpp msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." -msgstr "44X44の正方形ロゴの画像サイズが無効です(縦横44x44でないといけません)。" +msgstr "" +"44X44の正方形ロゴの画像サイズが無効です(縦横44x44でなければなりません)。" #: platform/uwp/export/export.cpp msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." -msgstr "71x71の正方形ロゴの画像サイズが無効です(縦横71x71でないといけません)。" +msgstr "" +"71x71の正方形ロゴの画像サイズが無効です(縦横71x71でなければなりません)。" #: platform/uwp/export/export.cpp msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." msgstr "" -"150X150の正方形ロゴの画像サイズが無効です(縦横150x150でないといけません)。" +"150X150の正方形ロゴの画像サイズが無効です(縦横150x150でなければなりません)。" #: platform/uwp/export/export.cpp msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." msgstr "" -"310X310の正方形ロゴの画像サイズが無効です(縦横310x310でないといけません)。" +"310X310の正方形ロゴの画像サイズが無効です(縦横310x310でなければなりません)。" #: platform/uwp/export/export.cpp msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." msgstr "" -"310X150のワイドロゴの画像サイズが無効です(縦横310x150でないといけません)。" +"310X150のワイドロゴの画像サイズが無効です(縦横310x150でなければなりません)。" #: platform/uwp/export/export.cpp msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" -"スプラッシュスクリーンの画像サイズが無効です(縦横620x300でないといけません)。" +"スプラッシュスクリーンの画像サイズが無効です(縦横620x300でなければなりませ" +"ん)。" #: scene/2d/animated_sprite.cpp msgid "" @@ -13679,10 +13722,12 @@ msgstr "空の CollisionPolygon2D は、衝突判定を持ちません。" #: scene/2d/collision_polygon_2d.cpp msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." msgstr "" +"無効なポリゴンです。'Solids' ビルドモードでは最低3つのポイントが必要です。" #: scene/2d/collision_polygon_2d.cpp msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." msgstr "" +"無効なポリゴンです。'Segments' ビルドモードでは最低2つのポイントが必要です。" #: scene/2d/collision_shape_2d.cpp msgid "" @@ -13699,8 +13744,8 @@ msgid "" "A shape must be provided for CollisionShape2D to function. Please create a " "shape resource for it!" msgstr "" -"関数に対して CollisionShape2D の形状 (シェイプ) を指定する必要があります。そ" -"のためのシェイプリソースを作成してください!" +"CollisionShape2D が機能するにはシェイプを指定する必要があります。そのための" +"シェイプリソースを作成してください!" #: scene/2d/collision_shape_2d.cpp msgid "" @@ -13749,8 +13794,8 @@ msgstr "" msgid "" "An occluder polygon must be set (or drawn) for this occluder to take effect." msgstr "" -"この遮蔽を有効にして、オクルーダ ポリゴンを設定 (または描画) する必要がありま" -"す。" +"この遮蔽を有効にして、オクルーダーポリゴンを設定 (または描画) する必要があり" +"ます。" #: scene/2d/light_occluder_2d.cpp msgid "The occluder polygon for this occluder is empty. Please draw a polygon." @@ -13785,7 +13830,8 @@ msgid "" "Use the CPUParticles2D node instead. You can use the \"Convert to " "CPUParticles\" option for this purpose." msgstr "" -"GPUベースのパーティクルは、GLES2ビデオドライバではサポートされていません。\n" +"GPUベースのパーティクルは、GLES2ビデオドライバーではサポートされていませ" +"ん。\n" "代わりにCPUParticles2Dノードを使用してください。この目的のために \"CPUパー" "ティクルに変換\" オプションを使用できます。" @@ -13794,8 +13840,8 @@ msgid "" "A material to process the particles is not assigned, so no behavior is " "imprinted." msgstr "" -"パーティクルを処理するマテリアルは割り当てられていないため、動作はインプリン" -"トされません。" +"パーティクルを処理するマテリアルが割り当てられていないため、動作を反映できま" +"せんでした。" #: scene/2d/particles_2d.cpp msgid "" @@ -13818,7 +13864,7 @@ msgid "" msgstr "" "RigidBody2D (CharacterモードまたはRigidモード) に対するサイズ変更は、実行時に" "物理エンジンによって上書きされます。\n" -"代わりに、子のコリジョン シェイプのサイズを変更してください。" +"代わりに、子のコリジョンシェイプのサイズを変更してください。" #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." @@ -13873,8 +13919,8 @@ msgid "" "The controller ID must not be 0 or this controller won't be bound to an " "actual controller." msgstr "" -"コントローラIDを0にすることはできません。0にすると、このコントローラは実際の" -"コントローラにバインドされません。" +"コントローラーIDを0にすることはできません。0にすると、このコントローラーは実" +"際のコントローラーにバインドされません。" #: scene/3d/arvr_nodes.cpp msgid "ARVRAnchor must have an ARVROrigin node as its parent." @@ -13905,9 +13951,8 @@ msgid "Preparing environment" msgstr "環境を準備中" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generating capture" -msgstr "ライトマップの生成" +msgstr "キャプチャーを生成中" #: scene/3d/baked_lightmap.cpp msgid "Saving lightmaps" @@ -13957,8 +14002,8 @@ msgid "" "A shape must be provided for CollisionShape to function. Please create a " "shape resource for it." msgstr "" -"関数の CollisionShape の形状を指定する必要があります。それのためのシェイプリ" -"ソースを作成してください。" +"CollisionShape が機能するにはシェイプを指定する必要があります。そのためのシェ" +"イプリソースを作成してください。" #: scene/3d/collision_shape.cpp msgid "" @@ -14000,7 +14045,7 @@ msgid "" "GIProbes are not supported by the GLES2 video driver.\n" "Use a BakedLightmap instead." msgstr "" -"GIProbesはGLES2ビデオドライバではサポートされていません。\n" +"GIProbesはGLES2ビデオドライバーではサポートされていません。\n" "代わりにBakedLightmapを使用してください。" #: scene/3d/gi_probe.cpp @@ -14033,11 +14078,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "シェイプが設定されていません。" #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "uniform スケールのみサポートされています。" #: scene/3d/particles.cpp msgid "" @@ -14045,7 +14090,8 @@ msgid "" "Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" "\" option for this purpose." msgstr "" -"GPUベースのパーティクルは、GLES2ビデオドライバではサポートされていません。\n" +"GPUベースのパーティクルは、GLES2ビデオドライバーではサポートされていませ" +"ん。\n" "代わりにCPUParticlesノードを使用してください。この目的のために \"CPUパーティ" "クルに変換\" オプションを使用できます。" @@ -14141,6 +14187,8 @@ msgid "" "Room convex hull contains a large number of planes.\n" "Consider simplifying the room bound in order to increase performance." msgstr "" +"Roomの凸包に大量の平面が含まれています。\n" +"パフォーマンスの向上のために、Roomの境界の単純化を検討してください。" #: scene/3d/room_group.cpp msgid "The RoomManager should not be placed inside a RoomGroup." @@ -14187,13 +14235,15 @@ msgstr "" #: scene/3d/room_manager.cpp msgid "Portal link room not found, check output log for details." -msgstr "" +msgstr "Portal link room が見つかりません。詳細は出力ログを確認してください。" #: scene/3d/room_manager.cpp msgid "" "Portal autolink failed, check output log for details.\n" "Check the portal is facing outwards from the source room." msgstr "" +"Portalの自動リンクに失敗しました。詳細は出力ログを確認してください。\n" +"ポータルが元のRoomから外側を向いていることを確認してください。" #: scene/3d/room_manager.cpp msgid "" @@ -14209,6 +14259,9 @@ msgid "" "Error calculating room bounds.\n" "Ensure all rooms contain geometry or manual bounds." msgstr "" +"Roomの境界の計算に失敗しました。\n" +"すべてのRoomにジオメトリまたはマニュアルの境界が含まれていることを確認してく" +"ださい。" #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -14245,8 +14298,8 @@ msgid "" "WorldEnvironment requires its \"Environment\" property to contain an " "Environment to have a visible effect." msgstr "" -"Environmentが可視エフェクトを持つために、WorldEnvironmentの「Environment」プ" -"ロパティが必要です。" +"WorldEnvironmentには、視覚効果を与えるために\"Environment\"プロパティに" +"Environmentが含まれている必要があります。" #: scene/3d/world_environment.cpp msgid "" @@ -14321,7 +14374,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." -msgstr "エディタウィンドウから色を選択。" +msgstr "エディターウィンドウから色を選択。" #: scene/gui/color_picker.cpp msgid "HSV" @@ -14347,17 +14400,17 @@ msgid "" msgstr "" "コンテナ自体は、スクリプトで子の配置動作を設定しない限り、何の役割も果たしま" "せん。\n" -"スクリプトを追加しない場合は、代わりに普通の「コントロール 」ノードを使用して" -"ください。" +"スクリプトを追加しない場合は、代わりに生のコントロールノードを使用してくださ" +"い。" #: scene/gui/control.cpp msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" -"コントロールのマウスフィルタが「無視」に設定されているため、ヒントツールチッ" -"プは表示されません。これを解決するには、マウスフィルタを「停止」または「パ" -"ス」に設定します。" +"コントロールのマウスフィルターが「無視」に設定されているため、ヒントツール" +"チップは表示されません。これを解決するには、マウスフィルターを「停止」または" +"「パス」に設定します。" #: scene/gui/dialogs.cpp msgid "Alert!" @@ -14365,7 +14418,7 @@ msgstr "警告!" #: scene/gui/dialogs.cpp msgid "Please Confirm..." -msgstr "確認..." +msgstr "確認" #: scene/gui/file_dialog.cpp msgid "Must use a valid extension." @@ -14382,6 +14435,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Axis StretchプロパティのTileおよびTile Fitオプションは、GLES3レンダリングバッ" +"クエンドを使用している場合にのみ有効です。\n" +"現在GLES2バックエンドが使用されているため、これらのモードは代わりにStretchの" +"ように振る舞います。" #: scene/gui/popup.cpp msgid "" @@ -14419,6 +14476,18 @@ msgstr "" "プロジェクト設定で指定されている既定の環境 (Rendering -> Environment -> " "Default Environment) を読み込めませんでした。" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"タイマーの待ち時間が非常に短い (0.05秒未満) の場合、描画または物理フレーム" +"レートに応じて大幅に動作が異なる可能性があります。\n" +"非常に短い待ち時間の場合、Timerを使用せずにスクリプトのprocessループを使用す" +"ることを検討してください。" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14432,18 +14501,23 @@ msgstr "" "当てます。" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." -msgstr "レンダーするにはビューポートのサイズが 0 より大きい必要があります。" +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." +msgstr "" +"レンダーするにはViewportの縦横それぞれが2ピクセル以上である必要があります。" #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "OccluderShapeSphereの球形をセット" #: scene/resources/visual_shader_nodes.cpp msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." msgstr "" +"サンプラーポートは接続されていますが、使用されていません。ソースを " +"'SamplerPort'に変更すること検討してください。" #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." @@ -14479,7 +14553,7 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Fragment-stage varying could not been accessed in custom function!" -msgstr "" +msgstr "カスタム関数内でFragment-stageのVaryingにアクセスできませんでした!" #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -16232,10 +16306,6 @@ msgstr "定数は変更できません。" #~ msgid "Couldn't save atlas image:" #~ msgstr "アトラスイメージを保存できませんでした:" -#, fuzzy -#~ msgid "Couldn't save converted texture:" -#~ msgstr "変換したテクスチャを保存できませんでした:" - #~ msgid "Invalid translation source!" #~ msgstr "不正な翻訳ソース!" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index 5e4f5d0094..aeb8023ba4 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -9,6 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2019-03-10 09:58+0000\n" "Last-Translator: Rati Nikolaishvili <rati.nikolaishvili@gmail.com>\n" @@ -2443,6 +2444,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2560,6 +2569,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2885,10 +2898,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4328,6 +4337,18 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "" @@ -4337,10 +4358,6 @@ msgid "Preset" msgstr "ზუმის საწყისზე დაყენება" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -7315,12 +7332,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "დამოკიდებულებების შემსწორებელი" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "წინამდებარე ნაბიჯზე გადასვლა" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7681,11 +7700,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7746,7 +7765,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7754,6 +7773,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8096,6 +8119,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10961,11 +11004,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14150,6 +14193,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14159,7 +14210,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/km.po b/editor/translations/km.po index a5b6139d08..4a61c9969d 100644 --- a/editor/translations/km.po +++ b/editor/translations/km.po @@ -7,6 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2021-04-19 22:33+0000\n" "Last-Translator: Withuse <withuse@gmail.com>\n" "Language-Team: Khmer (Central) <https://hosted.weblate.org/projects/godot-" @@ -2320,6 +2321,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2436,6 +2445,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2755,10 +2768,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4159,15 +4168,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7051,11 +7068,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7401,11 +7418,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7465,7 +7482,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7473,6 +7490,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7810,6 +7831,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10555,11 +10596,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13667,6 +13708,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13676,7 +13725,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/ko.po b/editor/translations/ko.po index c288a2b7e7..096d8a3ee8 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -24,11 +24,16 @@ # Henry LeRoux <henry.leroux@ocsbstudent.ca>, 2021. # Postive_ Cloud <postive12@gmail.com>, 2021. # dewcked <dewcked@protonmail.ch>, 2021. +# SteamB23 <steamb23@outlook.com>, 2021. +# Jaemin Park <ppparkje@naver.com>, 2021. +# 신동규 <rlsl0422@gmail.com>, 2021. +# Kiroo <elusive1102@naver.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-21 15:22+0000\n" +"PO-Revision-Date: 2021-11-19 08:43+0000\n" "Last-Translator: Myeongjin Lee <aranet100@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" @@ -37,13 +42,13 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: 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 "" -"convert() 메서드의 인수 유형이 올바르지 않습니다. TYPE_* 상수를 사용하세요." +"convert() 메서드의 인수 타입이 올바르지 않습니다. TYPE_* 상수를 사용하세요." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -69,11 +74,11 @@ msgstr "연산자 %s, %s, %s의 피연산자가 올바르지 않습니다." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "자료형 %s 의 인덱스가 기본형 %s 기준으로 올바르지 않습니다" +msgstr "타입 %s의 인덱스가 기본 타입 %s에 올바르지 않습니다" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "인덱스 이름 '%s' 이 기본형 %s 기준으로 올바르지 않습니다" +msgstr "타입 '%s'의 인덱스 이름이 기본 타입 %s에 올바르지 않습니다" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" @@ -436,7 +441,7 @@ msgid "" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" msgstr "" -"오디오 트랙은 다음 형식의 노드만 가리킬 수 있습니다.\n" +"오디오 트랙은 다음 타입의 노드만 가리킬 수 있습니다:\n" "-AudioStreamPlayer\n" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" @@ -463,7 +468,7 @@ msgstr "트랙 경로가 올바르지 않아 키를 추가할 수 없습니다." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" -msgstr "트랙이 Spatial 형식이 아니어서 키를 추가할 수 없습니다" +msgstr "트랙이 Spatial 타입이 아니므로 키를 추가할 수 없습니다" #: editor/animation_track_editor.cpp msgid "Add Transform Track Key" @@ -520,10 +525,11 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" -"이 애니메이션은 가져온 씬에 속해 있습니다. 가져온 트랙의 변경 사항은 저장되" -"지 않습니다.\n" +"이 애니메이션은 가져온 씬에 속해 있습니다. 가져온 트랙의 변경사항은 저장되지 " +"않습니다.\n" "\n" -"저장 기능을 활성화하려면 맞춤 트랙을 추가하고, 씬의 가져오기 설정으로 가서\n" +"저장 기능을 활성화하려면 커스텀 트랙을 추가하고, 씬의 가져오기 설정으로 가" +"서\n" "\"Animation > Storage\" 설정을 \"Files\"로, \"Animation > Keep Custom Tracks" "\" 설정을 활성화한 뒤, 다시 가져오십시오.\n" "아니면 가져오기 프리셋으로 애니메이션을 별도의 파일로 가져올 수도 있습니다." @@ -712,7 +718,7 @@ msgstr "배열 크기 바꾸기" #: editor/array_property_edit.cpp msgid "Change Array Value Type" -msgstr "배열 값 유형 바꾸기" +msgstr "배열 값 타입 바꾸기" #: editor/array_property_edit.cpp msgid "Change Array Value" @@ -961,7 +967,7 @@ msgstr "메서드로 이동" #: editor/create_dialog.cpp msgid "Change %s Type" -msgstr "%s 유형 바꾸기" +msgstr "%s 타입 바꾸기" #: editor/create_dialog.cpp editor/project_settings_editor.cpp msgid "Change" @@ -1022,7 +1028,7 @@ msgid "" "Changes will only take effect when reloaded." msgstr "" "씬 '%s'이(가) 현재 편집되고 있습니다.\n" -"변경 사항은 다시 불러온 뒤에 반영됩니다." +"변경사항은 다시 불러온 뒤에 반영됩니다." #: editor/dependency_editor.cpp msgid "" @@ -1030,7 +1036,7 @@ msgid "" "Changes will only take effect when reloaded." msgstr "" "리소스 '%s'이(가) 현재 사용 중입니다.\n" -"변경 사항은 다시 불러온 뒤에 반영됩니다." +"변경사항은 다시 불러온 뒤에 반영됩니다." #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -1494,7 +1500,7 @@ msgstr "엔진에 이미 있는 클래스 이름과 겹치지 않아야 합니 #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing built-in type name." -msgstr "기존 내장 자료형과 이름과 겹치지 않아야 합니다." +msgstr "기존 내장 타입과 이름과 겹치지 않아야 합니다." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing global constant name." @@ -1579,7 +1585,7 @@ msgstr "씬 업데이트 중" #: editor/editor_data.cpp msgid "Storing local changes..." -msgstr "지역 변경 사항을 저장 중..." +msgstr "로컬 변경사항을 저장하는 중..." #: editor/editor_data.cpp msgid "Updating scene..." @@ -1633,7 +1639,7 @@ msgstr "예상 경로에서 내보내기 템플릿을 찾을 수 없습니다:" #: editor/editor_export.cpp msgid "Packing" -msgstr "묶는 중" +msgstr "패킹 중" #: editor/editor_export.cpp msgid "" @@ -1695,13 +1701,13 @@ msgstr "" #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom debug template not found." -msgstr "사용자 지정 디버그 템플릿을 찾을 수 없습니다." +msgstr "커스텀 디버그 템플릿을 찾을 수 없습니다." #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom release template not found." -msgstr "사용자 지정 출시 템플릿을 찾을 수 없습니다." +msgstr "커스텀 릴리스 템플릿을 찾을 수 없습니다." #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:" @@ -1924,12 +1930,12 @@ msgstr "경로 복사" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Open in File Manager" -msgstr "파일 탐색기에서 열기" +msgstr "파일 매니저에서 열기" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp msgid "Show in File Manager" -msgstr "파일 탐색기에서 보기" +msgstr "파일 매니저에서 보기" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "New Folder..." @@ -2051,7 +2057,7 @@ msgstr "디렉토리 & 파일:" #: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp #: editor/plugins/style_box_editor_plugin.cpp editor/rename_dialog.cpp msgid "Preview:" -msgstr "미리 보기:" +msgstr "미리보기:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File:" @@ -2065,11 +2071,13 @@ msgstr "소스 스캔중" msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" -msgstr "파일 % 에 해당하는 가져오기 포맷이 여러 종류입니다. 가져오기 중단됨" +msgstr "" +"파일 %s을(를) 가리키고 있는 다른 타입의 여러 개의 임포터가 있으므로 가져오기" +"가 중단되었습니다" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" -msgstr "애셋 (다시) 가져오기" +msgstr "애셋 (다시) 가져오는 중" #: editor/editor_help.cpp msgid "Top" @@ -2102,7 +2110,7 @@ msgstr "속성" #: editor/editor_help.cpp msgid "override:" -msgstr "재정의:" +msgstr "오버라이드:" #: editor/editor_help.cpp msgid "default:" @@ -2195,7 +2203,7 @@ msgstr "테마 속성만 표시" #: editor/editor_help_search.cpp msgid "Member Type" -msgstr "멤버 유형" +msgstr "멤버 타입" #: editor/editor_help_search.cpp msgid "Class" @@ -2406,6 +2414,14 @@ msgstr "" "씬을 저장할 수 없습니다. (인스턴스 또는 상속과 같은) 종속 관계를 성립할 수 없" "는 것 같습니다." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "하나 이상의 장면을 저장할수 없습니다!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "모든 씬 저장" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "열려있는 씬은 덮어쓸 수 없습니다!" @@ -2468,7 +2484,7 @@ msgid "" "Changes to it won't be kept when saving the current scene." msgstr "" "이 리소스는 인스턴스되거나 상속된 씬에 속해 있습니다.\n" -"현재 씬을 저장해도 리소스의 변경 사항이 유지되지 않을 것입니다." +"현재 씬을 저장해도 리소스의 변경사항이 유지되지 않을 것입니다." #: editor/editor_node.cpp msgid "" @@ -2485,7 +2501,7 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" -"이 씬은 가져온 것이므로 변경 사항이 유지되지 않습니다.\n" +"이 씬은 가져온 것이므로 변경사항이 유지되지 않습니다.\n" "이 씬을 인스턴스화하거나 상속하면 편집할 수 있습니다.\n" "이 워크플로를 이해하려면 씬 가져오기(Importing Scenes)와 관련된 문서를 읽어주" "세요." @@ -2537,7 +2553,11 @@ msgstr "저장 & 닫기" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "닫기 전에 '%s'에 변경 사항을 저장할까요?" +msgstr "닫기 전에 '%s'에 변경사항을 저장하시겠습니까?" + +#: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s은(는) 더 이상 존재하지 않습니다! 새 저장 위치를 지정해 주세요." #: editor/editor_node.cpp msgid "" @@ -2585,29 +2605,27 @@ msgstr "현재 씬이 저장되어 있지 않습니다. 무시하고 여시겠 #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "마우스 버튼을 누르고 있는 동안에는 실행 취소할 수 없습니다." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "실행 취소할 것이 없습니다." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "되돌리기" +msgstr "실행 취소: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "마우스 버튼을 누르고 있는 동안에는 다시 실행할 수 없습니다." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "다시 실행할 것이 없습니다." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "다시 실행" +msgstr "다시 실행: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2651,19 +2669,19 @@ msgstr "저장 & 종료" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" -msgstr "종료하기 전에 해당 씬의 변경 사항을 저장하시겠습니까?" +msgstr "종료하기 전에 해당 씬의 변경사항을 저장하시겠습니까?" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before opening Project Manager?" -msgstr "프로젝트 매니터를 열기 전에 해당 씬의 변경 사항을 저장하시겠습니까?" +msgstr "프로젝트 매니저를 열기 전에 해당 씬의 변경사항을 저장하시겠습니까?" #: editor/editor_node.cpp msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" -"이 옵션은 사용되지 않습니다. 강제로 새로 고침해야 하는 상황은 이제 버그로 간" -"주됩니다. 신고해주세요." +"이 옵션은 사용되지 않습니다. 강제로 새로고침해야 하는 상황은 이제 버그로 간주" +"됩니다. 신고해주세요." #: editor/editor_node.cpp msgid "Pick a Main Scene" @@ -2706,7 +2724,7 @@ msgstr "" msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" -"다음 경로에서 애드온 스크립트를 불러올 수 없음: '%s' 기본 유형이 EditorPlugin" +"다음 경로에서 애드온 스크립트를 불러올 수 없음: '%s' 기본 타입이 EditorPlugin" "이 아닙니다." #: editor/editor_node.cpp @@ -2889,10 +2907,6 @@ msgid "Save Scene" msgstr "씬 저장" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "모든 씬 저장" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "다음으로 변환..." @@ -2907,7 +2921,7 @@ msgstr "타일셋..." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Undo" -msgstr "되돌리기" +msgstr "실행 취소" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -2916,7 +2930,7 @@ msgstr "다시 실행" #: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." -msgstr "프로젝트 또는 씬 관련 여러가지 도구들." +msgstr "프로젝트 또는 씬 관련 여러가지 툴." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp @@ -2953,7 +2967,7 @@ msgstr "프로젝트 데이터 폴더 열기" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" -msgstr "도구" +msgstr "툴" #: editor/editor_node.cpp msgid "Orphan Resource Explorer..." @@ -3180,7 +3194,7 @@ msgstr "씬 실행" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "씬을 지정해서 실행합니다" +msgstr "커스텀 씬 실행" #: editor/editor_node.cpp msgid "Play Custom Scene" @@ -3217,7 +3231,7 @@ msgstr "인스펙터" #: editor/editor_node.cpp msgid "Expand Bottom Panel" -msgstr "하단 패널 확장" +msgstr "아래쪽 패널 확장" #: editor/editor_node.cpp msgid "Output" @@ -3253,12 +3267,12 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" -"\"res://android/build\"에 소스 템플릿을 설치해서, 프로젝트를 맞춤 Android 빌" -"드에 맞게 설정할 것입니다.\n" -"그런 다음 수정 사항을 적용하고 맞춤 APK를 만들어 내보낼 수 있습니다 (모듈 추" -"가, AndroidManifest.xml 바꾸기 등).\n" -"미리 빌드된 APK를 사용하는 대신 맞춤 빌드를 만들려면, Android 내보내기 프리셋" -"에서 \"맞춤 빌드 사용\" 설정을 활성화해야 합니다." +"\"res://android/build\"에 소스 템플릿을 설치해서 프로젝트를 커스텀 Android 빌" +"드에 맞게 설정합니다.\n" +"그런 다음 수정 사항을 적용하고 커스텀 APK를 빌드해서 내보낼 수 있습니다(모듈 " +"추가, AndroidManifest.xml 변경 등).\n" +"미리 빌드된 APK를 사용하는 대신 커스텀 빌드를 만들려면, Android 내보내기 프리" +"셋에서 \"커스텀 빌드 사용(Use Custom Build)\" 설정을 활성화해야 합니다." #: editor/editor_node.cpp msgid "" @@ -3285,12 +3299,11 @@ msgstr "라이브러리 내보내기" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "기존의 것과 병합" +msgstr "기존의 것과 병합하기" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "애니메이션 변형 바꾸기" +msgstr "MeshInstance 변형 적용" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3368,7 +3381,7 @@ msgstr "하위 리소스의 목록을 엽니다." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" -msgstr "메시 미리 보기 만드는 중" +msgstr "메시 미리보기 만드는 중" #: editor/editor_plugin.cpp msgid "Thumbnail..." @@ -3545,11 +3558,11 @@ msgstr "키/값 쌍 추가" msgid "" "The selected resource (%s) does not match any type expected for this " "property (%s)." -msgstr "선택한 리소스(%s)가 이 속성(%s)에 적합한 모든 유형에 맞지 않습니다." +msgstr "선택한 리소스(%s)가 이 속성(%s)에 적합한 모든 타입에 맞지 않습니다." #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "빠른 불러오기" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -3694,7 +3707,7 @@ msgstr "요청 실패됨:" #: editor/export_template_manager.cpp msgid "Download complete; extracting templates..." -msgstr "다운로드를 완료하여 템플릿을 압축 해제 중..." +msgstr "다운로드 완료. 템플릿 압축 해제 중..." #: editor/export_template_manager.cpp msgid "Cannot remove temporary file:" @@ -3910,7 +3923,7 @@ msgstr "즐겨찾기" #: editor/filesystem_dock.cpp msgid "Status: Import of file failed. Please fix file and reimport manually." msgstr "" -"상태: 파일 가져오기에 실패했습니다. 수동으로 파일을 수정하고 다시 가져 와주세" +"상태: 파일 가져오기에 실패했습니다. 수동으로 파일을 수정하고 다시 가져와주세" "요." #: editor/filesystem_dock.cpp @@ -4060,11 +4073,11 @@ msgstr "이름순 정렬 (내림차순)" #: editor/filesystem_dock.cpp msgid "Sort by Type (Ascending)" -msgstr "유형별 정렬 (오름차순)" +msgstr "타입별 정렬 (오름차순)" #: editor/filesystem_dock.cpp msgid "Sort by Type (Descending)" -msgstr "유형별 정렬 (내림차순)" +msgstr "타입별 정렬 (내림차순)" #: editor/filesystem_dock.cpp msgid "Sort by Last Modified" @@ -4112,7 +4125,7 @@ msgid "" "Please Wait..." msgstr "" "파일 스캔중.\n" -"기다려주십시오..." +"잠시만 기다려주세요..." #: editor/filesystem_dock.cpp msgid "Move" @@ -4158,8 +4171,8 @@ msgid "" "Include the files with the following extensions. Add or remove them in " "ProjectSettings." msgstr "" -"해당 확장자 이름을 갖는 파일이 포함되어 있습니다. 프로젝트 설정에 파일을 추가" -"하거나 제거하세요." +"다음 확장자의 파일을 포함하세요. 프로젝트 설정에서 파일을 추가하거나 제거하세" +"요." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4257,31 +4270,31 @@ msgstr "단일 씬으로 가져오기" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Animations" -msgstr "애니메이션을 분리해서 가져오기" +msgstr "별도의 애니메이션으로 가져오기" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials" -msgstr "머티리얼을 분리해서 가져오기" +msgstr "별도의 머티리얼로 가져오기" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "오브젝트를 분리해서 가져오기" +msgstr "별도의 오브젝트로 가져오기" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "오브젝트와 머티리얼을 분리해서 가져오기" +msgstr "별도의 오브젝트와 머티리얼로 가져오기" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Animations" -msgstr "오브젝트와 애니메이션을 분리해서 가져오기" +msgstr "별도의 오브젝트와 애니메이션으로 가져오기" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" -msgstr "머티리얼과 애니메이션을 분리해서 가져오기" +msgstr "별도의 머티리얼과 애니메이션으로 가져오기" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "오브젝트, 머티리얼, 애니메이션을 분리해서 가져오기" +msgstr "별도의 오브젝트, 머티리얼과 애니메이션으로 가져오기" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" @@ -4310,23 +4323,23 @@ msgstr "메시 용으로 생성 중: " #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." -msgstr "맞춤 스크립트 실행 중..." +msgstr "커스텀 스크립트 실행 중..." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" -msgstr "후 가져오기 스크립트를 불러올 수 없음:" +msgstr "post-import 스크립트를 불러올 수 없음:" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" -msgstr "후 가져오기 용 스크립트가 잘못됨/망가짐 (콘솔을 확인하세요):" +msgstr "post-impot용 스크립트가 잘못되거나 망가짐 (콘솔을 확인하세요):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" -msgstr "후 가져오기 스크립트 실행 중 오류:" +msgstr "post-import 스크립트 실행 중 오류:" #: editor/import/resource_importer_scene.cpp msgid "Did you return a Node-derived object in the `post_import()` method?" -msgstr "`post_import()` 메소드에서 Node에서 상속받은 오브젝트를 반환했습니까?" +msgstr "`post_import()` 메서드에서 Node에서 상속받은 오브젝트를 반환했습니까?" #: editor/import/resource_importer_scene.cpp msgid "Saving..." @@ -4354,13 +4367,29 @@ msgstr "파일 %d개" #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "'%s'을(를) 디폴트으로 설정" +msgstr "'%s'을(를) 디폴트로 설정" #: editor/import_dock.cpp msgid "Clear Default for '%s'" msgstr "'%s'을(를) 디폴트에서 지우기" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "다시 가져오기" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"아직 적용되지 않은 보류 중인 변경사항이 있습니다. 가져오기 옵션에 대한 변경사" +"항을 적용하려면 다시 가져오기를 클릭하세요.\n" +"다시 가져오기를 먼저 클릭하지 않고 파일시스템 독에서 다른 리소스를 선택하면 " +"가져오기 독의 변경사항은 버려집니다." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "다음 형식으로 가져오기:" @@ -4369,16 +4398,12 @@ msgid "Preset" msgstr "프리셋" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "다시 가져오기" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "씬 저장, 다시 가져오기 및 다시 시작" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." -msgstr "가져온 파일의 유형을 바꾸려면 에디터를 다시 시작해야 합니다." +msgstr "가져온 파일의 타입을 바꾸려면 에디터를 다시 시작해야 합니다." #: editor/import_dock.cpp msgid "" @@ -4467,7 +4492,7 @@ msgstr "오브젝트 속성을 관리합니다." #: editor/inspector_dock.cpp msgid "Changes may be lost!" -msgstr "변경 사항을 잃을 수도 있습니다!" +msgstr "변경사항을 잃을 수도 있습니다!" #: editor/multi_node_edit.cpp msgid "MultiNode Set" @@ -4588,7 +4613,7 @@ msgstr "BlendSpace1D 라벨 바꾸기" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "This type of node can't be used. Only root nodes are allowed." -msgstr "이 유형의 노드를 사용할 수 없습니다. 루트 노드만 쓸 수 있습니다." +msgstr "이 타입의 노드를 사용할 수 없습니다. 루트 노드만 쓸 수 있습니다." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4780,8 +4805,8 @@ msgid "" "Animation player has no valid root node path, so unable to retrieve track " "names." msgstr "" -"애니메이션 플레이어가 잘못된 루트 경로를 갖고 있습니다. 그래서 트랙 이름을 검" -"색할 수 없습니다." +"애니메이션 플레이어의 루트 노드 경로가 유효하지 않으므로 트랙 이름을 검색할 " +"수 없습니다." #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Anim Clips" @@ -4919,7 +4944,7 @@ msgstr "노드의 애니메이션 재생 스케일를 전체적으로 조절합 #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" -msgstr "애니메이션 도구" +msgstr "애니메이션 툴" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation" @@ -4944,7 +4969,7 @@ msgstr "애니메이션 목록을 표시합니다." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" -msgstr "불러올 시 자동으로 재생" +msgstr "불러오면 자동 재생" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Enable Onion Skinning" @@ -4984,7 +5009,7 @@ msgstr "3단계" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Differences Only" -msgstr "변경 사항만" +msgstr "차이만" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Force White Modulate" @@ -5336,7 +5361,7 @@ msgstr "실패함:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." -msgstr "잘못된 다운로드 해시. 파일이 변조된 것 같아요." +msgstr "잘못된 다운로드 해시. 파일이 변조된 것 같습니다." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" @@ -5484,7 +5509,7 @@ msgstr "애셋 ZIP 파일" #: editor/plugins/audio_stream_editor_plugin.cpp msgid "Audio Preview Play/Pause" -msgstr "오디오 미리 보기 재생/일시 정지" +msgstr "오디오 미리보기 재생/일시 정지" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -5537,7 +5562,7 @@ msgstr "라이트맵을 구울 파일 선택:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Preview" -msgstr "미리 보기" +msgstr "미리보기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" @@ -5641,21 +5666,19 @@ msgstr "CanvasItem \"%s\"를 (%d, %d)로 이동" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "선택 항목 잠그기" +msgstr "잠김" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "그룹" +msgstr "그룹됨" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" "Children of containers have their anchors and margins values overridden by " "their parent." -msgstr "컨테이너의 자손은 부모로 인해 재정의된 앵커와 여백 값을 가집니다." +msgstr "컨테이너의 자식은 부모로 인해 오버라이드된 앵커와 여백 값을 가집니다." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Presets for the anchors and margins values of a Control node." @@ -5753,8 +5776,8 @@ msgid "" "Project Camera Override\n" "Overrides the running project's camera with the editor viewport camera." msgstr "" -"프로젝트 카메라 재정의\n" -"실행 중인 프로젝트의 카메라를 에디터 뷰포트 카메라로 재정의합니다." +"프로젝트 카메라 오버라이드\n" +"실행 중인 프로젝트의 카메라를 에디터 뷰포트 카메라로 오버라이드합니다." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5763,7 +5786,7 @@ msgid "" "No project instance running. Run the project from the editor to use this " "feature." msgstr "" -"프로젝트 카메라 재정의\n" +"프로젝트 카메라 오버라이드\n" "실행 중인 프로젝트 인스턴스가 없습니다. 이 기능을 사용하려면 에디터에서 프로" "젝트를 실행하세요." @@ -5797,7 +5820,7 @@ msgstr "가이드 지우기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Custom Bone(s) from Node(s)" -msgstr "노드에서 맞춤 본 만들기" +msgstr "노드에서 커스텀 본 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Bones" @@ -5815,7 +5838,7 @@ msgstr "IK 체인 지우기" msgid "" "Warning: Children of a container get their position and size determined only " "by their parent." -msgstr "경고: 컨테이너의 자손 위치와 크기는 부모에 의해 결정됩니다." +msgstr "경고: 컨테이너의 자식 위치와 크기는 부모에 의해 결정됩니다." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -5947,7 +5970,7 @@ msgstr "노드 옆면에 스냅" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Node Center" -msgstr "노드 중심에 스냅" +msgstr "노드 중앙에 스냅" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Other Nodes" @@ -5970,12 +5993,12 @@ msgstr "선택된 오브젝트를 잠금에서 풉니다 (움직일 수 있습 #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Makes sure the object's children are not selectable." -msgstr "오브젝트의 자손을 선택하지 않도록 합니다." +msgstr "오브젝트의 자식을 선택하지 않도록 합니다." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Restores the object's children's ability to be selected." -msgstr "오브젝트의 자손을 선택할 수 있도록 복원합니다." +msgstr "오브젝트의 자식을 선택할 수 있도록 복원합니다." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton Options" @@ -5987,11 +6010,11 @@ msgstr "본 보이기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make Custom Bone(s) from Node(s)" -msgstr "노드에서 맞춤 본 만들기" +msgstr "노드에서 커스텀 본 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Custom Bones" -msgstr "맞춤 본 지우기" +msgstr "커스텀 본 지우기" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6036,7 +6059,7 @@ msgstr "프레임 선택" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" -msgstr "캔버스 스케일 미리 보기" +msgstr "캔버스 스케일 미리보기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." @@ -6170,7 +6193,7 @@ msgstr "'%s'에서 씬 인스턴스 중 오류" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Default Type" -msgstr "디폴트 유형 바꾸기" +msgstr "디폴트 타입 바꾸기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6178,7 +6201,7 @@ msgid "" "Drag & drop + Alt : Change node type" msgstr "" "드래그 & 드롭 + Shift : 동기 노드로 추가\n" -"드래그 & 드롭 + Alt : 노드 유형 바꾸기" +"드래그 & 드롭 + Alt : 노드 타입 바꾸기" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Create Polygon3D" @@ -6414,7 +6437,7 @@ msgstr "내비게이션 메시 만들기" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Contained Mesh is not of type ArrayMesh." -msgstr "갖고 있는 메시가 ArrayMesh 유형이 아닙니다." +msgstr "포함된 메시가 ArrayMesh 타입이 아닙니다." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "UV Unwrap failed, mesh may not be manifold?" @@ -6438,7 +6461,7 @@ msgstr "메시에 윤곽선을 만들 표면이 없습니다!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!" -msgstr "메시 기본 유형이 PRIMITIVE_TRIANGLES이 아닙니다!" +msgstr "메시 기본 타입이 PRIMITIVE_TRIANGLES이 아닙니다!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Could not create outline!" @@ -6582,14 +6605,12 @@ msgid "Remove Selected Item" msgstr "선택한 항목 제거" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "씬에서 가져오기" +msgstr "씬에서 가져오기 (변형 무시)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "씬에서 가져오기" +msgstr "씬에서 가져오기 (변형 적용)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -6766,7 +6787,7 @@ msgstr "방출 소스: " #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "'ParticlesMaterial' 유형의 프로세서 머티리얼이 필요합니다." +msgstr "'ParticlesMaterial' 타입의 프로세서 머티리얼이 필요합니다." #: editor/plugins/particles_editor_plugin.cpp msgid "Generating AABB" @@ -6826,7 +6847,7 @@ msgstr "클릭: 점 추가" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Left Click: Split Segment (in curve)" -msgstr "좌클릭: (곡선에서) 선분 가르기" +msgstr "좌클릭: (곡선에서) 세그먼트 가르기" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -6903,7 +6924,7 @@ msgstr "인-컨트롤 점 제거" #: editor/plugins/path_editor_plugin.cpp msgid "Split Segment (in curve)" -msgstr "(곡선에서) 선분 가르기" +msgstr "(곡선에서) 세그먼트 가르기" #: editor/plugins/physical_bone_plugin.cpp msgid "Move Joint" @@ -6955,11 +6976,11 @@ msgstr "잘못된 폴리곤 (3개의 다른 꼭짓점이 필요합니다)" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Add Custom Polygon" -msgstr "맞춤 폴리곤 추가" +msgstr "커스텀 폴리곤 추가" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Remove Custom Polygon" -msgstr "맞춤 폴리곤 제거" +msgstr "커스텀 폴리곤 제거" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Transform UV Map" @@ -7035,15 +7056,15 @@ msgstr "폴리곤 스케일 조절" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create a custom polygon. Enables custom polygon rendering." -msgstr "맞춤 폴리곤을 만듭니다. 맞춤 폴리곤 렌더링을 활성화합니다." +msgstr "커스텀 폴리곤을 만듭니다. 커스텀 폴리곤 렌더링을 활성화합니다." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "Remove a custom polygon. If none remain, custom polygon rendering is " "disabled." msgstr "" -"맞춤 폴리곤을 제거합니다. 남아있는 맞춤 폴리곤이 없으면, 맞춤 폴리곤 렌더링" -"은 비활성화됩니다." +"커스텀 폴리곤을 제거합니다. 남아있는 커스텀 폴리곤이 없으면 커스텀 폴리곤 렌" +"더링은 비활성화됩니다." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint weights with specified intensity." @@ -7148,7 +7169,7 @@ msgstr "인스턴스:" #: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Type:" -msgstr "유형:" +msgstr "타입:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp @@ -7180,14 +7201,12 @@ msgid "Flip Portal" msgstr "포털 뒤집기" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "변형 지우기" +msgstr "어클루더 세트 변형" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "노드 만들기" +msgstr "중앙 노드" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7323,11 +7342,11 @@ msgid "Move Down" msgstr "아래로 이동" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "다음 스크립트" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "이전 스크립트" #: editor/plugins/script_editor_plugin.cpp @@ -7677,29 +7696,27 @@ msgstr "셰이더" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "This skeleton has no bones, create some children Bone2D nodes." -msgstr "이 스켈레톤에는 본이 없습니다. Bone2D노드를 자손으로 만드세요." - -#: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "본의 대기 자세 만들기" +msgstr "이 스켈레톤에는 본이 없습니다. Bone2D노드를 자식으로 만드세요." #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "본에게 대기 자세 설정" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "본의 대기 자세 만들기" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "스켈레톤2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "본을 대기 자세로 설정" +msgstr "대기 자세로 재설정" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "덮어 쓰기" +msgstr "대기 자세 덮어 쓰기" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7726,69 +7743,62 @@ msgid "Perspective" msgstr "원근" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "직교" +msgstr "상단 직교" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "원근" +msgstr "상단 원근" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "직교" +msgstr "하단 직교" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "원근" +msgstr "하단 원근" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "직교" +msgstr "좌측 직교" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "원근" +msgid "Left Perspective" +msgstr "좌측 원근" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "직교" +msgstr "우측 직교" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "우측 원근" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "직교" +msgstr "정면 직교" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "원근" +msgstr "정면 원근" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "직교" +msgstr "후면 직교" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "원근" +msgstr "후면 원근" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [자동]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [포털 활성]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -7923,7 +7933,7 @@ msgstr "회전을 뷰에 정렬" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." -msgstr "자손을 인스턴스할 부모가 없습니다." +msgstr "자식을 인스턴스화할 부모가 없습니다." #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "This operation requires a single selected node." @@ -7983,7 +7993,7 @@ msgstr "파동 왜곡 활성화" #: editor/plugins/spatial_editor_plugin.cpp msgid "Cinematic Preview" -msgstr "시네마틱 미리 보기" +msgstr "시네마틱 미리보기" #: editor/plugins/spatial_editor_plugin.cpp msgid "Not available when using the GLES2 renderer." @@ -8023,7 +8033,7 @@ msgstr "자유 시점 느린 수정자" #: editor/plugins/spatial_editor_plugin.cpp msgid "Toggle Camera Preview" -msgstr "카메라 미리 보기 토글" +msgstr "카메라 미리보기 토글" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Rotation Locked" @@ -8086,11 +8096,11 @@ msgstr "포털 컬링을 위한 룸을 변환합니다." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" -msgstr "하단 뷰" +msgstr "아래쪽 뷰" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View" -msgstr "상단 뷰" +msgstr "위쪽 뷰" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View" @@ -8109,6 +8119,26 @@ msgid "Right View" msgstr "우측 뷰" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "선회 뷰 아래로" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "선회 뷰 왼쪽으로" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "선회 뷰 오른쪽으로" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "선회 뷰 위로" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "선회 뷰 180으로" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "원근/직교 뷰 전환" @@ -8182,9 +8212,8 @@ msgid "View Portal Culling" msgstr "포털 컬링 보기" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "포털 컬링 보기" +msgstr "어클루전 컬링 보기" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8241,7 +8270,7 @@ msgstr "스케일 (비율):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Type" -msgstr "변형 유형" +msgstr "변형 타입" #: editor/plugins/spatial_editor_plugin.cpp msgid "Pre" @@ -8252,9 +8281,8 @@ msgid "Post" msgstr "후" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "이름 없는 프로젝트" +msgstr "이름 없는 기즈모" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -8262,7 +8290,7 @@ msgstr "Mesh2D 만들기" #: editor/plugins/sprite_editor_plugin.cpp msgid "Mesh2D Preview" -msgstr "Mesh2D 미리 보기" +msgstr "Mesh2D 미리보기" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Polygon2D" @@ -8270,7 +8298,7 @@ msgstr "Polygon2D 만들기" #: editor/plugins/sprite_editor_plugin.cpp msgid "Polygon2D Preview" -msgstr "Polygon2D 미리 보기" +msgstr "Polygon2D 미리보기" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create CollisionPolygon2D" @@ -8278,7 +8306,7 @@ msgstr "CollisionPolygon2D 만들기" #: editor/plugins/sprite_editor_plugin.cpp msgid "CollisionPolygon2D Preview" -msgstr "CollisionPolygon2D 미리 보기" +msgstr "CollisionPolygon2D 미리보기" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create LightOccluder2D" @@ -8286,7 +8314,7 @@ msgstr "LightOccluder2D 만들기" #: editor/plugins/sprite_editor_plugin.cpp msgid "LightOccluder2D Preview" -msgstr "LightOccluder2D 미리 보기" +msgstr "LightOccluder2D 미리보기" #: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" @@ -8346,7 +8374,7 @@ msgstr "성장 (픽셀): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" -msgstr "업데이트 미리 보기" +msgstr "업데이트 미리보기" #: editor/plugins/sprite_editor_plugin.cpp msgid "Settings:" @@ -8574,7 +8602,7 @@ msgstr "테마 항목을 가져오는 중" #: editor/plugins/theme_editor_plugin.cpp msgid "Importing items {n}/{n}" -msgstr "항목 {n}/{n} 가져오는 중" +msgstr "항목 {n}/{n}을 가져오는 중" #: editor/plugins/theme_editor_plugin.cpp msgid "Updating the editor" @@ -8594,7 +8622,7 @@ msgstr "데이터와 함께" #: editor/plugins/theme_editor_plugin.cpp msgid "Select by data type:" -msgstr "데이터 유형 별 선택:" +msgstr "데이터 타입별 선택:" #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible color items." @@ -8665,11 +8693,11 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Collapse types." -msgstr "유형을 접습니다." +msgstr "타입을 접습니다." #: editor/plugins/theme_editor_plugin.cpp msgid "Expand types." -msgstr "유형을 펼칩니다." +msgstr "타입을 펼칩니다." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all Theme items." @@ -8710,8 +8738,8 @@ msgid "" "Select a theme type from the list to edit its items.\n" "You can add a custom type or import a type with its items from another theme." msgstr "" -"테마의 항목을 편집하려면 목록에서 테마 유형을 선택하세요.\n" -"맞춤 유형을 추가하거나 다른 테마에서 테마 항목으로 유형을 가져올 수 있습니다." +"테마의 항목을 편집하려면 목록에서 테마 타입을 선택하세요.\n" +"커스텀 타입을 추가하거나 다른 테마의 항목과 함께 타입을 가져올 수 있습니다." #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Color Items" @@ -8742,7 +8770,7 @@ msgid "" "This theme type is empty.\n" "Add more items to it manually or by importing from another theme." msgstr "" -"이 테마 유형은 비어 있습니다.\n" +"이 테마 타입은 비어 있습니다.\n" "직접 또는 다른 테마에서 가져와서 테마에 더 많은 항목을 추가하세요." #: editor/plugins/theme_editor_plugin.cpp @@ -8803,11 +8831,11 @@ msgstr "항목 편집" #: editor/plugins/theme_editor_plugin.cpp msgid "Types:" -msgstr "유형:" +msgstr "타입:" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Type:" -msgstr "유형 추가:" +msgstr "타입 추가:" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Item:" @@ -8827,7 +8855,7 @@ msgstr "클래스 항목 제거" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Custom Items" -msgstr "맞춤 항목 제거" +msgstr "커스텀 항목 제거" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Items" @@ -8871,7 +8899,7 @@ msgstr "항목 이름 바꾸기 취소" #: editor/plugins/theme_editor_plugin.cpp msgid "Override Item" -msgstr "항목 재정의" +msgstr "항목 오버라이드" #: editor/plugins/theme_editor_plugin.cpp msgid "Unpin this StyleBox as a main style." @@ -8882,20 +8910,20 @@ msgid "" "Pin this StyleBox as a main style. Editing its properties will update the " "same properties in all other StyleBoxes of this type." msgstr "" -"스타일박스를 주 스타일로 고정합니다. 속성을 편집하면 이 유형의 다른 모든 스타" +"스타일박스를 주 스타일로 고정합니다. 속성을 편집하면 이 타입의 다른 모든 스타" "일박스에서 같은 속성이 업데이트됩니다." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Type" -msgstr "유형 추가" +msgstr "타입 추가" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Item Type" -msgstr "항목 유형 추가" +msgstr "항목 타입 추가" #: editor/plugins/theme_editor_plugin.cpp msgid "Node Types:" -msgstr "노드 유형:" +msgstr "노드 타입:" #: editor/plugins/theme_editor_plugin.cpp msgid "Show Default" @@ -8903,15 +8931,15 @@ msgstr "디폴트 보이기" #: editor/plugins/theme_editor_plugin.cpp msgid "Show default type items alongside items that have been overridden." -msgstr "재정의된 항목 옆에 디폴트 유형 항목을 보여줍니다." +msgstr "오버라이드된 항목 옆에 디폴트 타입 항목을 보여줍니다." #: editor/plugins/theme_editor_plugin.cpp msgid "Override All" -msgstr "모두 재정의" +msgstr "모두 오버라이드" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." -msgstr "모든 디폴트 유형 항목을 재정의합니다." +msgstr "모든 디폴트 타입 항목을 오버라이드합니다." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -8927,11 +8955,11 @@ msgstr "테마 항목을 추가, 제거, 구성 및 가져옵니다." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Preview" -msgstr "미리 보기 추가" +msgstr "미리보기 추가" #: editor/plugins/theme_editor_plugin.cpp msgid "Default Preview" -msgstr "디폴트 미리 보기" +msgstr "디폴트 미리보기" #: editor/plugins/theme_editor_plugin.cpp msgid "Select UI Scene:" @@ -8942,7 +8970,7 @@ msgid "" "Toggle the control picker, allowing to visually select control types for " "edit." msgstr "" -"컨트롤 선택기를 토글하여, 편집할 컨트롤 유형을 시각적으로 선택할 수 있게 합니" +"컨트롤 선택기를 토글하여, 편집할 컨트롤 타입을 시각적으로 선택할 수 있게 합니" "다." #: editor/plugins/theme_editor_preview.cpp @@ -9027,7 +9055,7 @@ msgstr "하위 트리" #: editor/plugins/theme_editor_preview.cpp msgid "Has,Many,Options" -msgstr "많은,옵션,갖춤" +msgstr "갖춤,많은,옵션" #: editor/plugins/theme_editor_preview.cpp msgid "Invalid path, the PackedScene resource was probably moved or removed." @@ -9518,11 +9546,11 @@ msgstr "스테이징 영역" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" -msgstr "새 변경 사항 감지" +msgstr "새 변경사항 감지" #: editor/plugins/version_control_editor_plugin.cpp msgid "Changes" -msgstr "변경 사항" +msgstr "변경사항" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -9550,7 +9578,7 @@ msgstr "모두 스테이지로 보내기" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" -msgstr "커밋 변경 사항" +msgstr "커밋 변경사항" #: editor/plugins/version_control_editor_plugin.cpp msgid "View file diffs before committing them to the latest version" @@ -9562,7 +9590,7 @@ msgstr "파일 diff가 켜져 있지 않습니다" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect changes in file diff" -msgstr "파일 diff에서 감지한 변경 사항" +msgstr "파일 차이에서 감지한 변경사항" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -9598,11 +9626,11 @@ msgstr "출력 포트 추가" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change input port type" -msgstr "입력 포트 유형 바꾸기" +msgstr "입력 포트 타입 바꾸기" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change output port type" -msgstr "출력 포트 유형 바꾸기" +msgstr "출력 포트 타입 바꾸기" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change input port name" @@ -9659,7 +9687,7 @@ msgstr "노드 삭제" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" -msgstr "비주얼 셰이더 입력 유형 변경됨" +msgstr "비주얼 셰이더 입력 타입 변경됨" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "UniformRef Name Changed" @@ -9675,7 +9703,7 @@ msgstr "프래그먼트" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Light" -msgstr "조명" +msgstr "라이트" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Show resulted shader code." @@ -9731,7 +9759,7 @@ msgstr "하드 라이트 연산자." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." -msgstr "밝음 연산자." +msgstr "Lighten 연산자." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Overlay operator." @@ -9844,7 +9872,7 @@ msgstr "꼭짓점과 프래그먼트 셰이더 모드에 대한 '%s' 입력 매 #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment and light shader modes." -msgstr "프래그먼트과 조명 셰이더 모드에 대한 '%s' 입력 매개변수." +msgstr "프래그먼트와 라이트 셰이더 모드에 대한 '%s' 입력 매개변수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment shader mode." @@ -10145,8 +10173,8 @@ msgstr "" "\n" "OuterProduct는 첫 매개변수 'c'를 열 벡터로 취급하고 (1열로 이루어진 행렬) 두 " "번째 매개변수 'r'을 행 벡터로 취급합니다 (1행으로 이루어진 행렬), 그리고 선" -"형 대수 행렬에 'c * r'을 곱해서 행렬을 산출하는데, 행 수는 'c'의 구성 요소 수" -"이고 열 수는 'r'의 구성 요소 수가 됩니다." +"형 대수 행렬에 'c * r'을 곱해서 행렬을 산출하는데, 행 수는 'c'의 컴포넌트 수" +"이고 열 수는 'r'의 컴포넌트 수가 됩니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." @@ -10339,9 +10367,9 @@ msgid "" "output ports. This is a direct injection of code into the vertex/fragment/" "light function, do not use it to write the function declarations inside." msgstr "" -"맞춤 입력 및 출력 포트로 이루어진, 맞춤 Godot 셰이더 언어 명령문. 꼭짓점/프래" -"그먼트/조명 함수에 직접 코드를 넣는 것이므로 코드 안에 함수 선언을 작성하는 " -"용도로 쓰지 마세요." +"커스텀 입력 및 출력 포트로 이루어진, 커스텀 Godot 셰이더 언어 표현식. 꼭짓점/" +"프래그먼트/라이트 함수에 직접 코드를 넣는 것이므로 코드 안에 함수 선언을 작성" +"하는 용도로 쓰지 마세요." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -10358,59 +10386,62 @@ msgid "" "it later in the Expressions. You can also declare varyings, uniforms and " "constants." msgstr "" -"결과 셰이더 위에 배치된, 맞춤 Godot 셰이더 언어 표현식. 다양한 함수 선언을 안" -"에 놓은 뒤 나중에 표현식에서 호출할 수 있습니다. Varying, Uniform, 상수도 선" -"언할 수 있습니다." +"결과 셰이더 위에 배치되는, 커스텀 Godot 셰이더 언어 표현식. 안에 다양한 함수 " +"선언을 작성하고 표현식에서 호출할 수 있습니다. Varying, Uniform, 상수도 선언" +"할 수 있습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "A reference to an existing uniform." -msgstr "기존 유니폼에 대한 참조입니다." +msgstr "기존 Uniform에 대한 참조입니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Scalar derivative function." -msgstr "(프래그먼트/조명 모드만 가능) 스칼라 미분 함수." +msgstr "(프래그먼트/라이트 모드만 가능) 스칼라 미분 함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Vector derivative function." -msgstr "(프래그먼트/조명 모드만 가능) 벡터 미분 함수." +msgstr "(프래그먼트/라이트 모드만 가능) 벡터 미분 함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." -msgstr "(프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'x'의 (벡터) 도함수." +msgstr "" +"(프래그먼트/라이트 모드만 가능) 지역 차분을 이용한 'x'의 (벡터) 도함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." msgstr "" -"(프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'x'의 (스칼라) 도함수." +"(프래그먼트/라이트 모드만 가능) 지역 차분을 이용한 'x'의 (스칼라) 도함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." -msgstr "(프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'y'의 (벡터) 도함수." +msgstr "" +"(프래그먼트/라이트 모드만 가능) 지역 차분을 이용한 'y'의 (벡터) 도함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." msgstr "" -"(프래그먼트/조명 모드만 가능) 지역 차분을 이용한 'y'의 (스칼라) 도함수." +"(프래그먼트/라이트 모드만 가능) 지역 차분을 이용한 'y'의 (스칼라) 도함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." -msgstr "(프래그먼트/조명 모드만 가능) (벡터) 'x'와 'y'의 절대 미분 값의 합." +msgstr "(프래그먼트/라이트 모드만 가능) (벡터) 'x'와 'y'의 절대 미분 값의 합." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." -msgstr "(프래그먼트/조명 모드만 가능) (스칼라) 'x'와 'y'의 절대 미분 값의 합." +msgstr "" +"(프래그먼트/라이트 모드만 가능) (스칼라) 'x'와 'y'의 절대 미분 값의 합." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -10531,7 +10562,7 @@ msgstr "기능" #: editor/project_export.cpp msgid "Custom (comma-separated):" -msgstr "맞춤 (쉼표로 구분):" +msgstr "커스텀(쉼표로 구분):" #: editor/project_export.cpp msgid "Feature List:" @@ -10988,14 +11019,14 @@ msgstr "" "상 포함시켜야 합니다." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "키 " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "물리 키" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "키 " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "조이스틱 버튼" @@ -11181,7 +11212,7 @@ msgstr "입력 액션 이벤트 이동함" #: editor/project_settings_editor.cpp msgid "Override for Feature" -msgstr "기능 재정의" +msgstr "기능 오버라이드" #: editor/project_settings_editor.cpp msgid "Add %d Translations" @@ -11229,11 +11260,11 @@ msgstr "일반" #: editor/project_settings_editor.cpp msgid "Override For..." -msgstr "재정의 대상..." +msgstr "오버라이드 대상..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "The editor must be restarted for changes to take effect." -msgstr "변경 사항을 반영하려면 에디터를 다시 시작해야 합니다." +msgstr "변경사항을 반영하려면 에디터를 다시 시작해야 합니다." #: editor/project_settings_editor.cpp msgid "Input Map" @@ -11413,7 +11444,7 @@ msgstr "노드의 부모 이름 (사용 가능한 경우)" #: editor/rename_dialog.cpp msgid "Node type" -msgstr "노드 유형" +msgstr "노드 타입" #: editor/rename_dialog.cpp msgid "Current scene name" @@ -11437,7 +11468,7 @@ msgstr "단계별 카운터" #: editor/rename_dialog.cpp msgid "If set, the counter restarts for each group of child nodes." -msgstr "설정하면 각 그룹의 자손 노드의 카운터를 다시 시작합니다." +msgstr "설정하면 각 그룹의 자식 노드의 카운터를 다시 시작합니다." #: editor/rename_dialog.cpp msgid "Initial value for the counter" @@ -11567,7 +11598,7 @@ msgstr "가지 씬으로 교체" #: editor/scene_tree_dock.cpp msgid "Instance Child Scene" -msgstr "자손 씬 인스턴스화" +msgstr "자식 씬 인스턴스화" #: editor/scene_tree_dock.cpp msgid "Can't paste root node into the same scene." @@ -11617,7 +11648,7 @@ msgstr "노드를 루트로 만들기" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes and any children?" -msgstr "%d 개의 노드와 모든 자손 노드를 삭제할까요?" +msgstr "%d 개의 노드와 모든 자식 노드를 삭제할까요?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -11629,7 +11660,7 @@ msgstr "루트 노드 \"%s\"을(를) 삭제할까요?" #: editor/scene_tree_dock.cpp msgid "Delete node \"%s\" and its children?" -msgstr "노드 \"%s\"와(과) 자손을 삭제할까요?" +msgstr "노드 \"%s\"와(과) 자식을 삭제할까요?" #: editor/scene_tree_dock.cpp msgid "Delete node \"%s\"?" @@ -11686,7 +11717,7 @@ msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"\"자리 표시자로 불러오기\"를 활성화하면 \"편집할 수 있는 자손\" 설정이 비활성" +"\"자리 표시자로 불러오기\"를 활성화하면 \"편집할 수 있는 자식\" 설정이 비활성" "화되고, 그러면 그 노드의 모든 속성이 디폴트로 복원됩니다." #: editor/scene_tree_dock.cpp @@ -11711,7 +11742,7 @@ msgstr "3D 씬" #: editor/scene_tree_dock.cpp msgid "User Interface" -msgstr "사용자 인터페이스" +msgstr "유저 인터페이스" #: editor/scene_tree_dock.cpp msgid "Other Node" @@ -11743,7 +11774,7 @@ msgstr "노드 제거" #: editor/scene_tree_dock.cpp msgid "Change type of node(s)" -msgstr "노드 유형 바꾸기" +msgstr "노드 타입 바꾸기" #: editor/scene_tree_dock.cpp msgid "" @@ -11770,7 +11801,7 @@ msgstr "상속 지우기" #: editor/scene_tree_dock.cpp msgid "Editable Children" -msgstr "편집할 수 있는 자손" +msgstr "편집할 수 있는 자식" #: editor/scene_tree_dock.cpp msgid "Load As Placeholder" @@ -11787,7 +11818,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Add Child Node" -msgstr "자손 노드 추가" +msgstr "자식 노드 추가" #: editor/scene_tree_dock.cpp msgid "Expand/Collapse All" @@ -11795,7 +11826,7 @@ msgstr "모두 펼치기/접기" #: editor/scene_tree_dock.cpp msgid "Change Type" -msgstr "유형 바꾸기" +msgstr "타입 바꾸기" #: editor/scene_tree_dock.cpp msgid "Reparent to New Node" @@ -11811,7 +11842,7 @@ msgstr "다른 씬에서 병합하기" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Save Branch as Scene" -msgstr "가지를 씬으로 저장" +msgstr "가지를 씬으로 저장하기" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Copy Node Path" @@ -11830,7 +11861,7 @@ msgid "" "Instance a scene file as a Node. Creates an inherited scene if no root node " "exists." msgstr "" -"씬 파일을 노드로 인스턴스합니다. 루트 노드가 없으면 상속된 씬을 만듭니다." +"씬 파일을 노드로 인스턴스화합니다. 루트 노드가 없으면 상속된 씬을 만듭니다." #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script to the selected node." @@ -11887,16 +11918,16 @@ msgid "" "Node has %s connection(s) and %s group(s).\n" "Click to show signals dock." msgstr "" -"노드가 %s 연결과 %s 그룹을 갖고 있습니다.\n" -"클릭하면 시그널 독을 보여줘요." +"노드에 %s 연결과 %s 그룹이 있습니다.\n" +"클릭하여 시그널 독을 봅니다." #: editor/scene_tree_editor.cpp msgid "" "Node has %s connection(s).\n" "Click to show signals dock." msgstr "" -"노드가 %s 연결을 갖고 있습니다.\n" -"클릭하면 시그널 독을 보여줘요." +"노드에 %s 연결이 있습니다.\n" +"클릭하여 시그널 독을 봅니다." #: editor/scene_tree_editor.cpp msgid "" @@ -11923,7 +11954,7 @@ msgid "" "Children are not selectable.\n" "Click to make selectable." msgstr "" -"자손을 선택할 수 없습니다.\n" +"자식을 선택할 수 없습니다.\n" "클릭하면 선택할 수 있습니다." #: editor/scene_tree_editor.cpp @@ -12004,7 +12035,7 @@ msgstr "'%s' 스크립트 불러오는 중 오류" #: editor/script_create_dialog.cpp msgid "Overrides" -msgstr "재정의" +msgstr "오버라이드" #: editor/script_create_dialog.cpp msgid "N/A" @@ -12020,11 +12051,11 @@ msgstr "스크립트 열기" #: editor/script_create_dialog.cpp msgid "File exists, it will be reused." -msgstr "파일이 있습니다. 다시 사용할 것입니다." +msgstr "파일이 있습니다. 재사용될 것입니다." #: editor/script_create_dialog.cpp msgid "Invalid path." -msgstr "올바르지 않은 경로입니다." +msgstr "잘못된 경로." #: editor/script_create_dialog.cpp msgid "Invalid class name." @@ -12071,7 +12102,7 @@ msgid "" "Warning: Having the script name be the same as a built-in type is usually " "not desired." msgstr "" -"경고: 스크립트 이름을 내장 유형과 같게 정하는 적은 일반적으로 바람직하지 않습" +"경고: 스크립트 이름을 내장 타입과 같게 정하는 것은 일반적으로 바람직하지 않습" "니다." #: editor/script_create_dialog.cpp @@ -12136,11 +12167,11 @@ msgstr "오류" #: editor/script_editor_debugger.cpp msgid "Child process connected." -msgstr "자손 프로세스 연결됨." +msgstr "자식 프로세스 연결됨." #: editor/script_editor_debugger.cpp msgid "Copy Error" -msgstr "복사 오류" +msgstr "오류 복사" #: editor/script_editor_debugger.cpp msgid "Open C++ Source on GitHub" @@ -12208,7 +12239,7 @@ msgstr "리소스 경로" #: editor/script_editor_debugger.cpp msgid "Type" -msgstr "유형" +msgstr "타입" #: editor/script_editor_debugger.cpp msgid "Format" @@ -12216,7 +12247,7 @@ msgstr "형식" #: editor/script_editor_debugger.cpp msgid "Usage" -msgstr "사용" +msgstr "사용례" #: editor/script_editor_debugger.cpp msgid "Misc" @@ -12228,7 +12259,7 @@ msgstr "클릭된 Control:" #: editor/script_editor_debugger.cpp msgid "Clicked Control Type:" -msgstr "클릭된 Control 유형:" +msgstr "클릭된 컨트롤 타입:" #: editor/script_editor_debugger.cpp msgid "Live Edit Root:" @@ -12268,7 +12299,7 @@ msgstr "바인딩" #: editor/spatial_editor_gizmos.cpp msgid "Change Light Radius" -msgstr "조명 반경 바꾸기" +msgstr "라이트 반경 바꾸기" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" @@ -12331,14 +12362,12 @@ msgid "Set Portal Point Position" msgstr "포털 점 위치 설정" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "캡슐 모양 반지름 바꾸기" +msgstr "어클루더 구체 반지름 설정" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "곡선의 인 위치 설정" +msgstr "어클루더 구체 위치 설정" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12602,7 +12631,7 @@ msgstr "버퍼 생성" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Direct lighting" -msgstr "조명 방향" +msgstr "직접 조명" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Indirect lighting" @@ -12614,16 +12643,15 @@ msgstr "후처리" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Plotting lightmaps" -msgstr "구분하는 조명" +msgstr "라이트맵 그리는 중" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" msgstr "클래스 이름은 키워드가 될 수 없습니다" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "선택 항목 채우기" +msgstr "솔루션 빌드" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -12731,7 +12759,7 @@ msgstr "시그널 인수 바꾸기" #: modules/visual_script/visual_script_editor.cpp msgid "Change Argument Type" -msgstr "인수 유형 바꾸기" +msgstr "인수 타입 바꾸기" #: modules/visual_script/visual_script_editor.cpp msgid "Change Argument name" @@ -12743,7 +12771,7 @@ msgstr "변수 기본값 설정" #: modules/visual_script/visual_script_editor.cpp msgid "Set Variable Type" -msgstr "변수 유형 설정" +msgstr "변수 타입 설정" #: modules/visual_script/visual_script_editor.cpp msgid "Add Input Port" @@ -12755,7 +12783,7 @@ msgstr "출력 포트 추가하기" #: modules/visual_script/visual_script_editor.cpp msgid "Change Port Type" -msgstr "포트 유형 바꾸기" +msgstr "포트 타입 바꾸기" #: modules/visual_script/visual_script_editor.cpp msgid "Change Port Name" @@ -12763,7 +12791,7 @@ msgstr "포트 이름 바꾸기" #: modules/visual_script/visual_script_editor.cpp msgid "Override an existing built-in function." -msgstr "존재하는 내장 함수를 재정의합니다." +msgstr "기존의 내장 함수를 오버라이드합니다." #: modules/visual_script/visual_script_editor.cpp msgid "Create a new function." @@ -12900,7 +12928,7 @@ msgstr "Setter 속성 추가" #: modules/visual_script/visual_script_editor.cpp msgid "Change Base Type" -msgstr "기본 유형 바꾸기" +msgstr "기본 타입 바꾸기" #: modules/visual_script/visual_script_editor.cpp msgid "Move Node(s)" @@ -12928,7 +12956,7 @@ msgstr "노드 시퀀스 연결" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" -msgstr "스크립트가 이미 '%s' 함수를 갖고 있습니다" +msgstr "스크립트에 이미 '%s' 함수가 있습니다" #: modules/visual_script/visual_script_editor.cpp msgid "Change Input Value" @@ -12988,7 +13016,7 @@ msgstr "시그널 편집:" #: modules/visual_script/visual_script_editor.cpp msgid "Make Tool:" -msgstr "도구 만들기:" +msgstr "툴 만들기:" #: modules/visual_script/visual_script_editor.cpp msgid "Members:" @@ -12996,7 +13024,7 @@ msgstr "멤버:" #: modules/visual_script/visual_script_editor.cpp msgid "Change Base Type:" -msgstr "기본 유형 바꾸기:" +msgstr "기본 타입 바꾸기:" #: modules/visual_script/visual_script_editor.cpp msgid "Add Nodes..." @@ -13020,7 +13048,7 @@ msgstr "선택 항목 삭제" #: modules/visual_script/visual_script_editor.cpp msgid "Find Node Type" -msgstr "노드 유형 찾기" +msgstr "노드 타입 찾기" #: modules/visual_script/visual_script_editor.cpp msgid "Copy Nodes" @@ -13044,7 +13072,7 @@ msgstr "멤버 편집" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " -msgstr "반복할 수 없는 입력 유형: " +msgstr "반복할 수 없는 입력 타입: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" @@ -13072,7 +13100,7 @@ msgstr "노드 %s 안에 인덱스 속성 이름 '%s'이(가) 잘못되었습니 #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " -msgstr ": 잘못된 인수 유형: " +msgstr ": 잘못된 인수 타입: " #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid arguments: " @@ -13088,7 +13116,7 @@ msgstr "VariableSet을 스크립트에서 찾을 수 없음: " #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." -msgstr "맞춤 노드에 _step() 메서드가 없습니다. 그래프를 처리할 수 없습니다." +msgstr "커스텀 노드에 _step() 메서드가 없습니다. 그래프를 처리할 수 없습니다." #: modules/visual_script/visual_script_nodes.cpp msgid "" @@ -13164,7 +13192,7 @@ msgstr "기기에서 실행할 수 없었습니다." #: platform/android/export/export_plugin.cpp msgid "Unable to find the 'apksigner' tool." -msgstr "'apksigner' 도구를 찾을 수 없습니다." +msgstr "'apksigner' 툴을 찾을 수 없습니다." #: platform/android/export/export_plugin.cpp msgid "" @@ -13316,8 +13344,8 @@ msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" -"맞춤 빌드 템플릿으로 빌드하려 했으나, 버전 정보가 없습니다. '프로젝트' 메뉴에" -"서 다시 설치해주세요." +"커스텀 빌드 템플릿으로 빌드하려 했으나, 버전 정보가 없습니다. '프로젝트" +"(Project)' 메뉴에서 다시 설치해주세요." #: platform/android/export/export_plugin.cpp msgid "" @@ -13568,7 +13596,7 @@ msgid "" "define its shape." msgstr "" "이 노드는 모양이 없습니다, 다른 물체와 충돌하거나 상호 작용할 수 없습니다.\n" -"CollisionShape2D 또는 CollisionPolygon2D를 자손 노드로 추가하여 모양을 정의하" +"CollisionShape2D 또는 CollisionPolygon2D를 자식 노드로 추가하여 모양을 정의하" "는 것을 고려하세요." #: scene/2d/collision_polygon_2d.cpp @@ -13579,7 +13607,7 @@ msgid "" msgstr "" "CollisionPolygon2D는 CollisionObject2D에 콜리전 모양을 지정하는 용도로만 사용" "됩니다. 모양을 정의해야 하는 Area2D, StaticBody2D, RigidBody2D, " -"KinematicBody2D 등의 자손으로만 사용해주세요." +"KinematicBody2D 등의 자식으로만 사용해주세요." #: scene/2d/collision_polygon_2d.cpp msgid "An empty CollisionPolygon2D has no effect on collision." @@ -13601,7 +13629,7 @@ msgid "" msgstr "" "CollisionShape2D는 CollisionObject2D에 콜리전 모양을 지정하는 용도로만 사용됩" "니다. 모양을 정의해야 하는 Area2D, StaticBody2D, RigidBody2D, " -"KinematicBody2D 등의 자손으로만 사용해주세요." +"KinematicBody2D 등의 자식으로만 사용해주세요." #: scene/2d/collision_shape_2d.cpp msgid "" @@ -13651,7 +13679,7 @@ msgstr "노드 A와 노드 B는 서로 다른 PhysicsBody2D여야 합니다" msgid "" "A texture with the shape of the light must be supplied to the \"Texture\" " "property." -msgstr "조명의 모양을 나타낼 텍스처를 \"Texture\" 속성에 지정해야 합니다." +msgstr "라이트 모양의 텍스처는 반드시 \"Texture\" 속성에 지정해야 합니다." #: scene/2d/light_occluder_2d.cpp msgid "" @@ -13676,14 +13704,14 @@ msgid "" "NavigationPolygonInstance must be a child or grandchild to a Navigation2D " "node. It only provides navigation data." msgstr "" -"NavigationPolygonInstance는 Navigation2D 노드의 자손이나 손주에 있어야 합니" +"NavigationPolygonInstance는 Navigation2D 노드의 자식이나 손주에 있어야 합니" "다. 이것은 내비게이션 데이터만을 제공합니다." #: scene/2d/parallax_layer.cpp msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -"ParallaxLayer는 ParallaxBackground 노드의 자손 노드로 있을 때만 작동합니다." +"ParallaxLayer는 ParallaxBackground 노드의 자식 노드로 있을 때만 작동합니다." #: scene/2d/particles_2d.cpp msgid "" @@ -13713,7 +13741,7 @@ msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." -msgstr "PathFollow2D는 Path2D 노드의 자손 노드로 있을 때만 작동합니다." +msgstr "PathFollow2D는 Path2D 노드의 자식 노드로 있을 때만 작동합니다." #: scene/2d/physics_body_2d.cpp msgid "" @@ -13723,7 +13751,7 @@ msgid "" msgstr "" "(캐릭터나 리지드 모드에서) RigidBody2D의 크기 변경은 물리 엔진이 작동하는 동" "안 큰 부담이 됩니다.\n" -"대신 자손 콜리전 모양의 크기를 변경해보세요." +"대신 자식 콜리전 모양의 크기를 변경해보세요." #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." @@ -13752,7 +13780,7 @@ msgid "" msgstr "" "Use Parent가 켜진 TileMap은 모양을 주는 부모 CollisionObject2D가 필요합니다. " "모양을 주기 위해 Area2D, StaticBody2D, RigidBody2D, KinematicBody2D 등을 자" -"손 노드로 사용해주세요." +"식 노드로 사용해주세요." #: scene/2d/visibility_notifier_2d.cpp msgid "" @@ -13764,11 +13792,11 @@ msgstr "" #: scene/3d/arvr_nodes.cpp msgid "ARVRCamera must have an ARVROrigin node as its parent." -msgstr "ARVRCamera는 반드시 ARVROrigin 노드를 부모로 갖고 있어야 합니다." +msgstr "ARVRCamera의 부모 노드는 반드시 ARVROrigin이어야 합니다." #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." -msgstr "ARVRController는 반드시 ARVROrigin 노드를 부모로 갖고 있어야 합니다." +msgstr "ARVRController의 부모 노드는 반드시 ARVROrigin이어야 합니다." #: scene/3d/arvr_nodes.cpp msgid "" @@ -13779,7 +13807,7 @@ msgstr "" #: scene/3d/arvr_nodes.cpp msgid "ARVRAnchor must have an ARVROrigin node as its parent." -msgstr "ARVRAnchor는 반드시 ARVROrigin 노드를 부모로 갖고 있어야 합니다." +msgstr "ARVRAnchor의 부모 노드는 반드시 ARVROrigin이어야 합니다." #: scene/3d/arvr_nodes.cpp msgid "" @@ -13789,11 +13817,11 @@ msgstr "앵커 ID가 0이 되면 앵커가 실제 앵커에 바인딩하지 않 #: scene/3d/arvr_nodes.cpp msgid "ARVROrigin requires an ARVRCamera child node." -msgstr "ARVROrigin은 자손으로 ARVRCamera 노드가 필요합니다." +msgstr "ARVROrigin은 자식으로 ARVRCamera 노드가 필요합니다." #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "메시 및 조명을 찾는 중" +msgstr "메시 및 라이트를 찾는 중" #: scene/3d/baked_lightmap.cpp msgid "Preparing geometry (%d/%d)" @@ -13809,7 +13837,7 @@ msgstr "캡처 생성 중" #: scene/3d/baked_lightmap.cpp msgid "Saving lightmaps" -msgstr "라이트맵을 저장 중" +msgstr "라이트맵 저장 중" #: scene/3d/baked_lightmap.cpp msgid "Done" @@ -13822,7 +13850,7 @@ msgid "" "its shape." msgstr "" "이 노드는 모양이 없습니다. 다른 물체와 충돌하거나 상호 작용할 수 없습니다.\n" -"CollisionShape 또는 CollisionPolygon을 자손 노드로 추가해서 모양을 정의하는 " +"CollisionShape 또는 CollisionPolygon을 자식 노드로 추가해서 모양을 정의하는 " "것을 고려하세요." #: scene/3d/collision_polygon.cpp @@ -13832,7 +13860,7 @@ msgid "" "StaticBody, RigidBody, KinematicBody, etc. to give them a shape." msgstr "" "CollisionPolygon은 CollisionObject에 콜리전 모양을 지정하는 용도로만 사용됩니" -"다. Area, StaticBody, RigidBody, KinematicBody 등에 자손 노드로 추가해서 사용" +"다. Area, StaticBody, RigidBody, KinematicBody 등에 자식 노드로 추가해서 사용" "해주세요." #: scene/3d/collision_polygon.cpp @@ -13846,7 +13874,7 @@ msgid "" "KinematicBody, etc. to give them a shape." msgstr "" "CollisionShape은 CollisionObject에 콜리전 모양을 지정하는 용도로만 사용됩니" -"다. Area, StaticBody, RigidBody, KinematicBody 등에 자손 노드로 추가해서 사용" +"다. Area, StaticBody, RigidBody, KinematicBody 등에 자식 노드로 추가해서 사용" "해주세요." #: scene/3d/collision_shape.cpp @@ -13912,7 +13940,7 @@ msgstr "" #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." -msgstr "SpotLight의 각도를 90도 이상으로 잡게되면 그림자를 투영할 수 없습니다." +msgstr "SpotLight의 각도를 90도 이상으로 잡으면 그림자를 투영할 수 없습니다." #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -13924,16 +13952,16 @@ msgid "" "NavigationMeshInstance must be a child or grandchild to a Navigation node. " "It only provides navigation data." msgstr "" -"NavigationMeshInstance는 Navigation 노드의 자손이나 손주에 있어야 합니다. 이" +"NavigationMeshInstance는 Navigation 노드의 자식이나 손주에 있어야 합니다. 이" "것은 내비게이션 데이터만 제공합니다." #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "설정할 모양이 없습니다." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Uniform 스케일만 지원됩니다." #: scene/3d/particles.cpp msgid "" @@ -13960,7 +13988,7 @@ msgstr "" #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." -msgstr "PathFollow는 Path 노드의 자손으로 있을 때만 작동합니다." +msgstr "PathFollow는 Path 노드의 자식으로 있을 때만 작동합니다." #: scene/3d/path.cpp msgid "" @@ -13978,7 +14006,7 @@ msgid "" msgstr "" "(캐릭터나 리지드 모드에서) RigidBody의 크기 변경은 물리 엔진이 작동하는 동안 " "큰 부담이 됩니다.\n" -"대신 자손 콜리전 모양의 크기를 변경하세요." +"대신 자식 콜리전 모양의 크기를 변경하세요." #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" @@ -14002,15 +14030,15 @@ msgstr "노드 A와 노드 B는 서로 다른 PhysicsBody여야 합니다" #: scene/3d/portal.cpp msgid "The RoomManager should not be a child or grandchild of a Portal." -msgstr "RoomManager는 Portal의 자손이나 손주가 아니어야 합니다." +msgstr "RoomManager는 Portal의 자식이나 손주가 아니어야 합니다." #: scene/3d/portal.cpp msgid "A Room should not be a child or grandchild of a Portal." -msgstr "Room은 Portal의 자손이나 손주가 아니어야 합니다." +msgstr "Room은 Portal의 자식이나 손주가 아니어야 합니다." #: scene/3d/portal.cpp msgid "A RoomGroup should not be a child or grandchild of a Portal." -msgstr "RoomGroup은 Portal의 자손이나 손주가 아니어야 합니다." +msgstr "RoomGroup은 Portal의 자식이나 손주가 아니어야 합니다." #: scene/3d/remote_transform.cpp msgid "" @@ -14022,7 +14050,7 @@ msgstr "" #: scene/3d/room.cpp msgid "A Room cannot have another Room as a child or grandchild." -msgstr "Room은 다른 Room을 자손이나 손주로 가질 수 없습니다." +msgstr "Room은 다른 Room을 자식이나 손주로 가질 수 없습니다." #: scene/3d/room.cpp msgid "The RoomManager should not be placed inside a Room." @@ -14120,8 +14148,8 @@ msgid "" "running.\n" "Change the size in children collision shapes instead." msgstr "" -"실행 중에 SoftBody의 크기 변경은 물리 엔진에 의해 재정의됩니다.\n" -"대신 자손 콜리전 모양의 크기를 변경하세요." +"실행 중에 SoftBody의 크기 변경은 물리 엔진에 의해 오버라이드됩니다.\n" +"대신 자식 콜리전 모양의 크기를 변경하세요." #: scene/3d/sprite_3d.cpp msgid "" @@ -14137,7 +14165,7 @@ msgid "" "it as a child of a VehicleBody." msgstr "" "VehicleWheel은 VehicleBody로 바퀴 시스템을 제공하는 역할입니다. VehicleBody" -"의 자손으로 사용해주세요." +"의 자식으로 사용해주세요." #: scene/3d/world_environment.cpp msgid "" @@ -14191,8 +14219,7 @@ msgstr "그래프를 위한 루트 AnimationNode를 설정하지 않았습니다 #: scene/animation/animation_tree.cpp msgid "Path to an AnimationPlayer node containing animations is not set." -msgstr "" -"애니메이션을 갖고 있는 AnimationPlayer 노드의 경로를 설정하지 않았습니다." +msgstr "애니메이션을 포함한 AnimationPlayer 노드의 경로를 설정하지 않았습니다." #: scene/animation/animation_tree.cpp msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." @@ -14244,7 +14271,7 @@ msgid "" "children placement behavior.\n" "If you don't intend to add a script, use a plain Control node instead." msgstr "" -"Container 자체는 자손 배치 작업을 구성하는 스크립트 외에는 목적이 없습니다.\n" +"Container 자체는 자식 배치 작업을 구성하는 스크립트 외에는 목적이 없습니다.\n" "스크립트를 추가하는 의도가 없으면, 순수한 Control 노드를 사용해주세요." #: scene/gui/control.cpp @@ -14279,6 +14306,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"축 스트레치 속성에 대한 타일 및 타일 맞춤 옵션은 GLES3 렌더링 백엔드를 사용" +"할 때만 효과적입니다.\n" +"GLES2 백엔드가 현재 사용 중이므로, 이러한 모드는 대신 스트레치처럼 작동합니" +"다." #: scene/gui/popup.cpp msgid "" @@ -14299,9 +14330,9 @@ msgid "" "Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" -"ScrollContainer는 단일 자손 Control을 작업하기 위한 것입니다.\n" -"(VBox, HBox 등) 컨테이너를 자손으로 사용하거나, Control을 사용하고 맞춤 최소 " -"수치를 수동으로 설정하세요." +"ScrollContainer는 단일 자식 Control을 작업하기 위한 것입니다.\n" +"(VBox, HBox 등) 컨테이너를 자식으로 사용하거나, Control을 사용하고 사용자 지" +"정 최소 수치를 수동으로 설정하세요." #: scene/gui/tree.cpp msgid "(Other)" @@ -14315,6 +14346,18 @@ msgstr "" "프로젝트 설정 (Rendering -> Environment -> Default Environment)에 지정한 디폴" "트 환경을 불러올 수 없습니다." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"매우 짧은 타이머 대기 시간(< 0.05초)은 렌더링된 프레임 레이트나 물리 프레임 " +"레이트에 따라 상당히 다른 방식으로 작동할 수 있습니다.\n" +"대기 시간이 매우 짧다면 타이머에 의존하는 대신 스크립트의 프로세스 루프를 사" +"용하는 것이 좋습니다." + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14323,17 +14366,20 @@ msgid "" "texture to some node for display." msgstr "" "뷰포트를 렌더 대상으로 설정하지 않았습니다. 뷰포트의 내용을 화면에 직접 표시" -"하려면, Control의 자손 노드로 만들어서 크기를 얻어야 합니다. 그렇지 않을 경" +"하려면, Control의 자식 노드로 만들어서 크기를 얻어야 합니다. 그렇지 않을 경" "우, 화면에 표시하기 위해서는 뷰포트를 RenderTarget으로 만들고 내부적인 텍스처" "를 다른 노드에 지정해야 합니다." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." -msgstr "무엇이든 렌더링하려면 뷰포트 크기가 0보다 커야 합니다." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." +msgstr "" +"무엇이든 렌더링하려면 뷰포트 크기가 양쪽 차원에서 2픽셀 이상이어야 합니다." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "OccluderShapeSphere를 구체로 설정" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -14345,7 +14391,7 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." -msgstr "미리 보기에 잘못된 소스." +msgstr "미리보기에 잘못된 소스." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." @@ -14353,7 +14399,7 @@ msgstr "셰이더에 잘못된 소스." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid comparison function for that type." -msgstr "해당 유형에 잘못된 비교 함수." +msgstr "해당 타입에 잘못된 비교 함수." #: servers/visual/shader_language.cpp msgid "Varying may not be assigned in the '%s' function." @@ -14377,7 +14423,7 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Fragment-stage varying could not been accessed in custom function!" -msgstr "맞춤 함수에서 Fragment-stage varying에 접근할 수 없습니다!" +msgstr "커스텀 함수에서 Fragment-stage varying에 접근할 수 없습니다!" #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -16167,9 +16213,6 @@ msgstr "상수는 수정할 수 없습니다." #~ msgid "Couldn't save atlas image:" #~ msgstr "아틀라스 이미지를 저장할 수 없음:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "변환된 텍스쳐를 저장할 수 없음:" - #~ msgid "Invalid translation source!" #~ msgstr "유효하지 않은 번역 소스!" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index a853757f43..f4cdcf8c89 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -6,12 +6,14 @@ # Kornelijus <kornelijus.github@gmail.com>, 2017, 2018. # Ignotas Gražys <ignotas.gr@gmail.com>, 2020. # Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>, 2020, 2021. +# Lukas Hamm <ideallygrey@tuta.io>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-21 10:51+0000\n" -"Last-Translator: Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>\n" +"PO-Revision-Date: 2021-10-15 04:33+0000\n" +"Last-Translator: Lukas Hamm <ideallygrey@tuta.io>\n" "Language-Team: Lithuanian <https://hosted.weblate.org/projects/godot-engine/" "godot/lt/>\n" "Language: lt\n" @@ -20,7 +22,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 0 : n%10>=2 && (n%100<10 || n" "%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3;\n" -"X-Generator: Weblate 4.5\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -640,7 +642,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Optimize" -msgstr "" +msgstr "Optimizuoti" #: editor/animation_track_editor.cpp msgid "Remove invalid keys" @@ -660,7 +662,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Clean-Up" -msgstr "" +msgstr "Išvalyti" #: editor/animation_track_editor.cpp msgid "Scale Ratio:" @@ -711,11 +713,11 @@ msgstr "" #: editor/code_editor.cpp msgid "Go to Line" -msgstr "" +msgstr "Eik į Eilutę" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "" +msgstr "Eilės Numeris:" #: editor/code_editor.cpp msgid "%d replaced." @@ -739,11 +741,11 @@ msgstr "" #: editor/code_editor.cpp msgid "Replace" -msgstr "" +msgstr "Pakeisti" #: editor/code_editor.cpp msgid "Replace All" -msgstr "" +msgstr "Pakeisti Visus" #: editor/code_editor.cpp msgid "Selection Only" @@ -892,7 +894,7 @@ msgstr "Užverti" #: editor/connections_dialog.cpp msgid "Connect" -msgstr "" +msgstr "Prijungti" #: editor/connections_dialog.cpp #, fuzzy @@ -996,7 +998,7 @@ msgstr "Naujausi:" #: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp #: modules/visual_script/visual_script_property_selector.cpp msgid "Search:" -msgstr "" +msgstr "Ieškoti:" #: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp #: editor/property_selector.cpp editor/quick_open.cpp @@ -1035,16 +1037,16 @@ msgstr "" #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Dependencies" -msgstr "" +msgstr "Priklausomybės" #: editor/dependency_editor.cpp editor/editor_resource_picker.cpp msgid "Resource" -msgstr "" +msgstr "Ištekliai" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings_editor.cpp msgid "Path" -msgstr "" +msgstr "Takas" #: editor/dependency_editor.cpp msgid "Dependencies:" @@ -1052,7 +1054,7 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Fix Broken" -msgstr "" +msgstr "Pataisymas Sugedęs" #: editor/dependency_editor.cpp msgid "Dependency Editor" @@ -1138,11 +1140,11 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp #: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp msgid "Delete" -msgstr "" +msgstr "Ištrinti" #: editor/dependency_editor.cpp msgid "Owns" -msgstr "" +msgstr "Priklauso" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" @@ -1185,11 +1187,11 @@ msgstr "" #: editor/editor_about.cpp msgid "Developers" -msgstr "" +msgstr "Kūrėjai" #: editor/editor_about.cpp msgid "Authors" -msgstr "" +msgstr "Autoriai" #: editor/editor_about.cpp msgid "Platinum Sponsors" @@ -1225,11 +1227,11 @@ msgstr "" #: editor/editor_about.cpp msgid "Donors" -msgstr "" +msgstr "Donorai" #: editor/editor_about.cpp msgid "License" -msgstr "" +msgstr "Licencija" #: editor/editor_about.cpp msgid "Third-party Licenses" @@ -1253,7 +1255,7 @@ msgstr "" #: editor/editor_about.cpp msgid "Licenses" -msgstr "" +msgstr "Licencijas" #: editor/editor_asset_installer.cpp msgid "Error opening asset file for \"%s\" (not in ZIP format)." @@ -1290,11 +1292,11 @@ msgstr "" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "" +msgstr "Sėkmė!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp msgid "Install" -msgstr "" +msgstr "Diegti" #: editor/editor_asset_installer.cpp #, fuzzy @@ -1303,7 +1305,7 @@ msgstr "(Įdiegta)" #: editor/editor_audio_buses.cpp msgid "Speakers" -msgstr "" +msgstr "Garsiakalbiai" #: editor/editor_audio_buses.cpp msgid "Add Effect" @@ -1351,7 +1353,7 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "" +msgstr "Solo" #: editor/editor_audio_buses.cpp msgid "Mute" @@ -1359,7 +1361,7 @@ msgstr "Nutildyti" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "" +msgstr "Apeiti" #: editor/editor_audio_buses.cpp #, fuzzy @@ -1448,7 +1450,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Load" -msgstr "" +msgstr "Įkelti" #: editor/editor_audio_buses.cpp msgid "Load an existing Bus Layout." @@ -1520,7 +1522,7 @@ msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" -msgstr "" +msgstr "Įgalinti" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" @@ -1547,7 +1549,7 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp msgid "Path:" -msgstr "" +msgstr "Kelias:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" @@ -1557,7 +1559,7 @@ msgstr "" #: editor/editor_plugin_settings.cpp editor/editor_profiler.cpp #: editor/project_manager.cpp editor/settings_config_dialog.cpp msgid "Name" -msgstr "" +msgstr "Vardas" #: editor/editor_autoload_settings.cpp msgid "Global Variable" @@ -1606,7 +1608,7 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp #: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp msgid "Name:" -msgstr "" +msgstr "Vardas:" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp @@ -1615,7 +1617,7 @@ msgstr "" #: editor/editor_dir_dialog.cpp msgid "Choose" -msgstr "" +msgstr "Pasirinkite" #: editor/editor_export.cpp msgid "Storing File:" @@ -2399,6 +2401,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2516,6 +2526,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2841,10 +2855,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4300,6 +4310,18 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "" @@ -4309,10 +4331,6 @@ msgid "Preset" msgstr "Atstatyti Priartinimą" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -7297,12 +7315,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Atidaryti Skriptų Editorių" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Pasirinkite Nodus, kuriuos norite importuoti" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7374,7 +7394,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Search" -msgstr "" +msgstr "Ieškoti" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" @@ -7656,11 +7676,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7721,7 +7741,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7729,6 +7749,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8070,6 +8094,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10945,11 +10989,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14136,6 +14180,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14145,7 +14197,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 26674cb5b8..808a13782b 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -8,12 +8,14 @@ # Anonymous <noreply@weblate.org>, 2020. # StiLins <aigars.skilins@gmail.com>, 2020. # Rihards Kubilis <oldcar@inbox.lv>, 2020. +# M E <gruffy7932@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-11-15 12:43+0000\n" -"Last-Translator: Rihards Kubilis <oldcar@inbox.lv>\n" +"PO-Revision-Date: 2021-11-15 10:49+0000\n" +"Last-Translator: M E <gruffy7932@gmail.com>\n" "Language-Team: Latvian <https://hosted.weblate.org/projects/godot-engine/" "godot/lv/>\n" "Language: lv\n" @@ -22,7 +24,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " "19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -46,7 +48,7 @@ msgstr "Nederīga ievade %i (nav padota) izteikumā" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "'self' nevar izmantot, jo instance ir 'null' (nav padota)" +msgstr "'self' nevar izmantot, jo instance ir tukša (nav norādīta)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -372,13 +374,12 @@ msgstr "Anim ievietot" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp msgid "node '%s'" -msgstr "" +msgstr "mezgls '%s'" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "animation" -msgstr "Funkcijas:" +msgstr "animācija" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." @@ -387,7 +388,7 @@ msgstr "AnimationPlayer nevar animēt pats sevi, tikai citus spēlētājus." #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp msgid "property '%s'" -msgstr "" +msgstr "vērtība '%s'" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -476,7 +477,7 @@ msgstr "Anim Pārvietot Atslēgas" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Clipboard is empty!" -msgstr "" +msgstr "Starpliktuve ir tukša!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -594,12 +595,11 @@ msgstr "Doties uz Nākamo Soli" #: editor/animation_track_editor.cpp msgid "Go to Previous Step" -msgstr "Doties uz Iepriekšējo Soli" +msgstr "Doties uz iepriekšejo soli" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Apply Reset" -msgstr "Atiestatīt tālummaiņu" +msgstr "Pielietot atiestatīšanu" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -618,9 +618,8 @@ msgid "Use Bezier Curves" msgstr "Izmanto Bezjē Līknes" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Create RESET Track(s)" -msgstr "Ielīmēt celiņus" +msgstr "Izveidot atiestatīšanas celiņu(s)" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -787,9 +786,8 @@ msgid "Method in target node must be specified." msgstr "Metodi mērķa mezglā nepieciešams specificēt." #: editor/connections_dialog.cpp -#, fuzzy msgid "Method name must be a valid identifier." -msgstr "Metodi mērķa mezglā nepieciešams specificēt." +msgstr "Metodes nosaukumam jābūt korektam identifikātoram." #: editor/connections_dialog.cpp msgid "" @@ -909,7 +907,7 @@ msgstr "Savieno..." #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Disconnect" -msgstr "Atvieno" +msgstr "Atvienot" #: editor/connections_dialog.cpp msgid "Connect a Signal to a Method" @@ -929,9 +927,8 @@ msgid "Signals" msgstr "Signāli" #: editor/connections_dialog.cpp -#, fuzzy msgid "Filter signals" -msgstr "No Signāla:" +msgstr "Filtrēt signālus" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from this signal?" @@ -940,16 +937,15 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Disconnect All" -msgstr "Atvienot Visu" +msgstr "Atvienot visu" #: editor/connections_dialog.cpp msgid "Edit..." msgstr "Rediģēt..." #: editor/connections_dialog.cpp -#, fuzzy msgid "Go to Method" -msgstr "Doties Uz Metodi" +msgstr "Doties uz Metodi" #: editor/create_dialog.cpp msgid "Change %s Type" @@ -965,11 +961,11 @@ msgstr "Izveidot Jaunu %s" #: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Nav rezultātu \"%s\"." #: editor/create_dialog.cpp editor/property_selector.cpp msgid "No description available for %s." -msgstr "" +msgstr "Apraksts nav pieejams priekš %s." #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp @@ -1031,7 +1027,7 @@ msgstr "Atkarības" #: editor/dependency_editor.cpp editor/editor_resource_picker.cpp msgid "Resource" -msgstr "Resurs" +msgstr "Resurss" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings_editor.cpp @@ -1052,7 +1048,7 @@ msgstr "Atkarību Redaktors" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" -msgstr "Meklēt Aizstājēja Resursu:" +msgstr "Meklēt aizstājēja resursu:" #: editor/dependency_editor.cpp editor/editor_file_dialog.cpp #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -1069,15 +1065,16 @@ msgid "Owners Of:" msgstr "Īpašnieki:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." -msgstr "Vai noņemt izvēlētos failus no projekta? (Netiks atjaunoti)" +msgstr "" +"Vai noņemt izvēlētos failus no projekta? (Netiks atjaunoti)\n" +"Atšķirībā no failu sistēmas konfigurācijas, faili tiks aizvākti uz sistēmas " +"atkritni vai dzēsti pilnībā." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1085,9 +1082,11 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"Faili, kurus Jūs vēlaties noņemt ir nepieciešami citiem resursiem lai tie " +"Faili, kurus Jūs vēlaties noņemt ir nepieciešami citiem resursiem, lai tie " "varētu strādāt.\n" -"Tik un tā noņemt tos? (Nevar atsaukt)" +"Tik un tā noņemt tos? (Nevar atsaukt)\n" +"Atšķirībā no jūsu failu sistēmas konfigurācijas, faili tiks aizvākti uz " +"sistēmas atkritni vai dzēsti pilnībā." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1143,7 +1142,7 @@ msgstr "Pieder" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" -msgstr "Resursi Bez Skaidra Īpašnieka:" +msgstr "Resursi bez izteiktas piederības:" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" @@ -1159,7 +1158,7 @@ msgstr "Paldies no Godot sabiedrības!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Klikšķini, lai kopētu." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1197,14 +1196,12 @@ msgid "Gold Sponsors" msgstr "Zelta Sponsori" #: editor/editor_about.cpp -#, fuzzy msgid "Silver Sponsors" -msgstr "Sudraba Donors" +msgstr "Sudraba Sponsors" #: editor/editor_about.cpp -#, fuzzy msgid "Bronze Sponsors" -msgstr "Bronzas Donors" +msgstr "Bronzas Sponsors" #: editor/editor_about.cpp msgid "Mini Sponsors" @@ -1259,41 +1256,36 @@ msgid "Licenses" msgstr "Licences" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Error opening asset file for \"%s\" (not in ZIP format)." -msgstr "Kļūme atverot arhīvu failu, nav ZIP formātā." +msgstr "Kļūme atverot pakotnes failu \"%s\" (nav ZIP formātā)." #: editor/editor_asset_installer.cpp -#, fuzzy msgid "%s (already exists)" -msgstr "%s (Jau Eksistē)" +msgstr "%s (jau eksistē)" #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" -msgstr "" +msgstr "Pakotnes \"%s\" saturs - %d fails(-i) konfliktē ar tavu projektu:" #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - No files conflict with your project:" -msgstr "" +msgstr "Pakotnes \"%s\" saturs - Neviens fails nekonfliktē ar tavu projektu:" #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" msgstr "Nekompresēti Līdzekļi" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "The following files failed extraction from asset \"%s\":" -msgstr "Sekojošie faili netika izvilkti no paketes:" +msgstr "Sekojošie faili netika izvilkti no paketes \"%s\":" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "(and %s more files)" -msgstr "Un %s vēl faili." +msgstr "(un vēl %s faili)" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset \"%s\" installed successfully!" -msgstr "Pakete instalēta sekmīgi!" +msgstr "Pakete \"%s\" instalēta sekmīgi!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -1305,7 +1297,6 @@ msgid "Install" msgstr "Ieinstalēt" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset Installer" msgstr "Paketes Instalētājs" @@ -1359,7 +1350,7 @@ msgstr "Velc un atlaid, lai pārkārtotu." #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "Solo" +msgstr "Individuāli" #: editor/editor_audio_buses.cpp msgid "Mute" @@ -1370,18 +1361,17 @@ msgid "Bypass" msgstr "Šunts" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Bus Options" -msgstr "Kopnes iestatījumi" +msgstr "Kopnes Iestatījumi" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "Izveidot Dublikātu" +msgstr "Izveidot dublikātu" #: editor/editor_audio_buses.cpp msgid "Reset Volume" -msgstr "" +msgstr "Atiestatīt Skaļumu" #: editor/editor_audio_buses.cpp msgid "Delete Effect" @@ -1397,47 +1387,47 @@ msgstr "Pievienot Audio Kopni" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "Master kopni nevar idzēst!" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" -msgstr "" +msgstr "Izdzēst Audio Kopni" #: editor/editor_audio_buses.cpp msgid "Duplicate Audio Bus" -msgstr "" +msgstr "Dubultot Audio Kopni" #: editor/editor_audio_buses.cpp msgid "Reset Bus Volume" -msgstr "" +msgstr "Atiestatīt Kopnes Skaļumu" #: editor/editor_audio_buses.cpp msgid "Move Audio Bus" -msgstr "" +msgstr "Pārvietot Audio Kopni" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As..." -msgstr "" +msgstr "Saglabāt Audio Kopņu Izkārtojumu Kā...." #: editor/editor_audio_buses.cpp msgid "Location for New Layout..." -msgstr "" +msgstr "Jaunā izkārtojuma lokācija..." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Atvērt audio kopnes izkārtojumu" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "" +msgstr "Fails '%s' neeksistē." #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" -msgstr "" +msgstr "Izkārtojums" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." -msgstr "" +msgstr "Nepareizs fails, nav audio kopnes izkārtojuma." #: editor/editor_audio_buses.cpp msgid "Error saving file: %s" @@ -1449,7 +1439,7 @@ msgstr "Pievienot Kopni" #: editor/editor_audio_buses.cpp msgid "Add a new Audio Bus to this layout." -msgstr "" +msgstr "Pievienot jaunu Audio Kopni šim izkārtojumam." #: editor/editor_audio_buses.cpp editor/editor_resource_picker.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1479,7 +1469,7 @@ msgstr "Ielādēt Kopnes Izkārtojuma noklusējumu." #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." -msgstr "" +msgstr "Izveidot jaunu Kopnes izkārtojumu." #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1505,27 +1495,27 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "Atslēgvārdu nedrīkst lietot kā auto-ielādes vārdu." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "" +msgstr "Auto-ielāde '%s' jau eksistē!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "" +msgstr "Pārsaukt Auto-ielādi" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" -msgstr "" +msgstr "Pārslēgt Auto-ielādes Globālās vērtības" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" -msgstr "" +msgstr "Pārvietot Auto-ielādi" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" -msgstr "" +msgstr "Izdzēst Auto-ielādi" #: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" @@ -1533,34 +1523,34 @@ msgstr "Iespējot" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" -msgstr "" +msgstr "Pārkārtot Auto-ielādes" #: editor/editor_autoload_settings.cpp msgid "Can't add autoload:" -msgstr "" +msgstr "Nevar pievienot Auto-ielādi:" #: editor/editor_autoload_settings.cpp msgid "%s is an invalid path. File does not exist." -msgstr "" +msgstr "%s ir nederīgs ceļš. Fails neeksistē." #: editor/editor_autoload_settings.cpp msgid "%s is an invalid path. Not in resource path (res://)." -msgstr "" +msgstr "%s ir nederīgs ceļš. Nav resursu ceļā (res://)." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "" +msgstr "Pievienot Auto-ielādi" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp msgid "Path:" -msgstr "" +msgstr "Ceļš:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" -msgstr "" +msgstr "Mezgla Vārds:" #: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp #: editor/editor_plugin_settings.cpp editor/editor_profiler.cpp @@ -1570,11 +1560,11 @@ msgstr "Nosaukums" #: editor/editor_autoload_settings.cpp msgid "Global Variable" -msgstr "" +msgstr "Globāls mainīgais" #: editor/editor_data.cpp msgid "Paste Params" -msgstr "" +msgstr "Ielīmēt Parametrus" #: editor/editor_data.cpp msgid "Updating Scene" @@ -1582,11 +1572,11 @@ msgstr "Atjaunina Ainu" #: editor/editor_data.cpp msgid "Storing local changes..." -msgstr "" +msgstr "Saglabā lokālās izmaiņas..." #: editor/editor_data.cpp msgid "Updating scene..." -msgstr "" +msgstr "Atjauno ainu...." #: editor/editor_data.cpp editor/editor_resource_picker.cpp msgid "[empty]" @@ -1598,57 +1588,61 @@ msgstr "[nesaglabāts]" #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first." -msgstr "" +msgstr "Lūdzu vispirms izvēlaties bāzes mapi." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" -msgstr "" +msgstr "Izvēlēties Direktoriju" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp #: scene/gui/file_dialog.cpp msgid "Create Folder" -msgstr "" +msgstr "Izveidot mapi" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp #: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp msgid "Name:" -msgstr "" +msgstr "Nosaukums:" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp msgid "Could not create folder." -msgstr "" +msgstr "Neizdevās izveidot mapi." #: editor/editor_dir_dialog.cpp msgid "Choose" -msgstr "" +msgstr "Izvēlaties" #: editor/editor_export.cpp msgid "Storing File:" -msgstr "" +msgstr "Faila saglabāšana:" #: editor/editor_export.cpp msgid "No export template found at the expected path:" -msgstr "" +msgstr "Norādītajā ceļā nav atrasta eksporta veidne:" #: editor/editor_export.cpp msgid "Packing" -msgstr "" +msgstr "Pako" #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." msgstr "" +"Mērķa platforma pieprasa 'ETC' tekstūru saspiešanu priekš GLES2. Iespējo " +"'Importēt Etc' projekta iestatījumos." #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." msgstr "" +"Mērķa platforma pieprasa 'ETC2' tekstūru saspiešanu priekš GLES3. Iespējo " +"'Importēt Etc 2' projekta iestatījumos." #: editor/editor_export.cpp msgid "" @@ -1657,18 +1651,26 @@ msgid "" "Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"Mērķa platforma pieprasa 'ETC' tekstūru saspiešanu priekš draivera atkāpes " +"uz GLES2.\n" +"Iespējo 'Importēt Etc' projekta iestatījumos vai atslēdz 'Draivera atkāpe " +"ieslēgta'." #: editor/editor_export.cpp msgid "" "Target platform requires 'PVRTC' texture compression for GLES2. Enable " "'Import Pvrtc' in Project Settings." msgstr "" +"Mērķa platforma pieprasa 'PVRTV' tekstūru saspiešanu priekš GLES2. Iespējo " +"'Importēt Pvrtc' projekta iestatījumos." #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC2' or 'PVRTC' texture compression for GLES3. " "Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." msgstr "" +"Mērķa platforma pieprasa 'ETC2' vai 'PVRTC' tekstūru saspiešanu priekš " +"GLES3. Iespējo 'Importēt Etc 2' vai 'Importēt Pvrtc' projekta iestatījumos." #: editor/editor_export.cpp msgid "" @@ -1677,26 +1679,30 @@ msgid "" "Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"Mērķa platforma pieprasa 'PVRTC' tekstūru saspiešanu priekš draivera atkāpes " +"uz GLES2.\n" +"Iespējo 'Importēt Pvrtc' projekta iestatījumos vai atslēdz 'Draivera atkāpe " +"ieslēgta'." #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom debug template not found." -msgstr "" +msgstr "Pielāgots atkļūdošanas šablons nav atrasts." #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom release template not found." -msgstr "" +msgstr "Pielāgots relīzes sablons nav atrasts." #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:" -msgstr "" +msgstr "Šablona fails nav atrasts:" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." -msgstr "" +msgstr "Pie 32-bitu eksportēšanas, iepakotais PCK nevar būt lielāks par 4GB." #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -1704,87 +1710,90 @@ msgstr "3D Redaktors" #: editor/editor_feature_profile.cpp msgid "Script Editor" -msgstr "" +msgstr "Skripta redaktors" #: editor/editor_feature_profile.cpp msgid "Asset Library" -msgstr "" +msgstr "Līdzekļu bibliotēka" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" -msgstr "" +msgstr "Ainas koka rediģēšana" #: editor/editor_feature_profile.cpp msgid "Node Dock" -msgstr "" +msgstr "Mezgla doks" #: editor/editor_feature_profile.cpp msgid "FileSystem Dock" -msgstr "" +msgstr "Failu sistēmas doks" #: editor/editor_feature_profile.cpp msgid "Import Dock" -msgstr "" +msgstr "Importēt doku" #: editor/editor_feature_profile.cpp msgid "Allows to view and edit 3D scenes." -msgstr "" +msgstr "Atļauj skatīt un rediģēt visas 3D ainas." #: editor/editor_feature_profile.cpp msgid "Allows to edit scripts using the integrated script editor." -msgstr "" +msgstr "Atļauj rediģēt skriptus izmantojot iebūvēto skriptu redaktoru." #: editor/editor_feature_profile.cpp msgid "Provides built-in access to the Asset Library." -msgstr "" +msgstr "Nodrošina iebūvēto piekļuvi līdzekļu bibliotēkai." #: editor/editor_feature_profile.cpp msgid "Allows editing the node hierarchy in the Scene dock." -msgstr "" +msgstr "Atļauj mezgla hierarhijas rediģēšanu ainu dokā." #: editor/editor_feature_profile.cpp msgid "" "Allows to work with signals and groups of the node selected in the Scene " "dock." -msgstr "" +msgstr "Atļauj strādāt ar signāliem un grupām izvēlētā mezgla ainu dokā." #: editor/editor_feature_profile.cpp msgid "Allows to browse the local file system via a dedicated dock." -msgstr "" +msgstr "Atļauj pārlūkot lokālo failu sistēmu atvēlētajā dokā." #: editor/editor_feature_profile.cpp msgid "" "Allows to configure import settings for individual assets. Requires the " "FileSystem dock to function." msgstr "" +"Atļauj konfigurēt importēšanas iestatījumus individuāliem līdzekļiem. " +"Pieprasa failu sistēmas doku, lai funkcionētu." #: editor/editor_feature_profile.cpp msgid "(current)" -msgstr "" +msgstr "(current) / pašreizējs" #: editor/editor_feature_profile.cpp msgid "(none)" -msgstr "" +msgstr "(neviens)" #: editor/editor_feature_profile.cpp msgid "Remove currently selected profile, '%s'? Cannot be undone." -msgstr "" +msgstr "Noņemt pašreiz izvēlēto profilu '%s' ? Nevar atsaukt." #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" msgstr "" +"Profila nosaukumam jābūt derīgam faila nosaukumam un tas nedrīkst iekļaut '.'" #: editor/editor_feature_profile.cpp msgid "Profile with this name already exists." -msgstr "" +msgstr "Profils ar šādu nosaukumu jau eksistē." #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "" +msgstr "(Redaktors atslēgts, iestatījumi atslēgti)" #: editor/editor_feature_profile.cpp msgid "(Properties Disabled)" -msgstr "" +msgstr "(Iestatījumi atslēgti)" #: editor/editor_feature_profile.cpp msgid "(Editor Disabled)" @@ -1796,53 +1805,51 @@ msgstr "Klases Iespējas:" #: editor/editor_feature_profile.cpp msgid "Enable Contextual Editor" -msgstr "" +msgstr "Iespējot kontekstuālo redaktoru" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Properties:" -msgstr "Ieslēgtie Mainīgie:" +msgstr "Klases iestatījumi:" #: editor/editor_feature_profile.cpp msgid "Main Features:" -msgstr "" +msgstr "Galvenās iespējas:" #: editor/editor_feature_profile.cpp msgid "Nodes and Classes:" -msgstr "" +msgstr "Mezgli un klases:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "" +msgstr "Faila '%s' formāts ir nepareizs, importēšana atcelta." #: editor/editor_feature_profile.cpp msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" +"Profils '%s' jau eksistē. Vispirms to noņem pirms importēšanas. Importēšana " +"atcelta." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." msgstr "Kļūda saglabājot profilu uz ceļu: '%s'." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Reset to Default" -msgstr "Ielādēt Noklusējumu" +msgstr "Atiestatīt uz noklusējumu" #: editor/editor_feature_profile.cpp msgid "Current Profile:" -msgstr "" +msgstr "Pašreizējais profils:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Create Profile" -msgstr "Izveidot" +msgstr "Izveidot profilu" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Remove Profile" -msgstr "Noņemt" +msgstr "Noņemt profilu" #: editor/editor_feature_profile.cpp msgid "Available Profiles:" @@ -1855,52 +1862,52 @@ msgstr "Aktualizēt" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp msgid "Import" -msgstr "" +msgstr "Importēt" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" -msgstr "" +msgstr "Eksportēt" #: editor/editor_feature_profile.cpp msgid "Configure Selected Profile:" -msgstr "" +msgstr "Konfigurēt izvēlēto profilu:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Extra Options:" -msgstr "Klases Iespējas:" +msgstr "Papildus iespējas:" #: editor/editor_feature_profile.cpp msgid "Create or import a profile to edit available classes and properties." msgstr "" +"Izveidot vai importēt profilu, lai rediģētu pieejamās klases un iestatījumus." #: editor/editor_feature_profile.cpp msgid "New profile name:" -msgstr "" +msgstr "Jaunais profila nosaukums:" #: editor/editor_feature_profile.cpp msgid "Godot Feature Profile" -msgstr "" +msgstr "Godot iespēju profils" #: editor/editor_feature_profile.cpp msgid "Import Profile(s)" -msgstr "" +msgstr "Importēt profilu(s)" #: editor/editor_feature_profile.cpp msgid "Export Profile" -msgstr "" +msgstr "Eksportēt profilu" #: editor/editor_feature_profile.cpp msgid "Manage Editor Feature Profiles" -msgstr "" +msgstr "Pārvaldīt redaktora iespēju profilus" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" -msgstr "" +msgstr "Izvēlēties pašreizējo mapi" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File exists, overwrite?" -msgstr "" +msgstr "Fails eksistē. Pārrakstīt ?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select This Folder" @@ -1908,7 +1915,7 @@ msgstr "Izvēlēties Šo Mapi" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "" +msgstr "Kopēt celiņu" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Open in File Manager" @@ -1917,40 +1924,40 @@ msgstr "Atvērt Failu Pārlūkā" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp msgid "Show in File Manager" -msgstr "" +msgstr "Parādīt failu menedžerī" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "New Folder..." -msgstr "" +msgstr "Jauna mape..." #: editor/editor_file_dialog.cpp editor/find_in_files.cpp #: editor/plugins/version_control_editor_plugin.cpp msgid "Refresh" -msgstr "" +msgstr "Atsvaidzināt" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" -msgstr "" +msgstr "Viss atpazīts" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Files (*)" -msgstr "" +msgstr "Visi faili (*)" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a File" -msgstr "" +msgstr "Atvērt failu" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open File(s)" -msgstr "" +msgstr "Atvērt failu(s)" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a Directory" -msgstr "" +msgstr "Atvērt mapi" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a File or Directory" -msgstr "" +msgstr "Atvērt failu vai mapi" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/editor_resource_picker.cpp editor/import_defaults_editor.cpp @@ -1958,47 +1965,47 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" -msgstr "" +msgstr "Saglabāt" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Save a File" -msgstr "" +msgstr "Saglabāt failu" #: editor/editor_file_dialog.cpp msgid "Go Back" -msgstr "" +msgstr "Doties atpakaļ" #: editor/editor_file_dialog.cpp msgid "Go Forward" -msgstr "" +msgstr "Doties tālāk" #: editor/editor_file_dialog.cpp msgid "Go Up" -msgstr "" +msgstr "Doties augšup" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" -msgstr "" +msgstr "Pārslēgt slēptos failus" #: editor/editor_file_dialog.cpp msgid "Toggle Favorite" -msgstr "" +msgstr "Pārslēgt favorītu" #: editor/editor_file_dialog.cpp msgid "Toggle Mode" -msgstr "" +msgstr "Pārslēgt režīmu" #: editor/editor_file_dialog.cpp msgid "Focus Path" -msgstr "" +msgstr "Fokusa ceļš" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" -msgstr "" +msgstr "Pārvietot favorītu augšup" #: editor/editor_file_dialog.cpp msgid "Move Favorite Down" -msgstr "" +msgstr "Pārvietot favorītu lejup" #: editor/editor_file_dialog.cpp msgid "Go to previous folder." @@ -2010,7 +2017,7 @@ msgstr "Doties uz nākamo mapi." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." -msgstr "" +msgstr "Atvērt mātes mapi." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Refresh files." @@ -2018,63 +2025,65 @@ msgstr "Atjaunot failus." #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." -msgstr "" +msgstr "Pievienot/noņemt pašreizējo mapi pie/no favorītiem." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Toggle the visibility of hidden files." -msgstr "" +msgstr "Pārslēgt slēpto failu redzamību." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." -msgstr "" +msgstr "Skatīt vienumus kā režģi ar sīktēliem." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a list." -msgstr "" +msgstr "Skatīt lietas kā sarakstu." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" -msgstr "" +msgstr "Mapes & Faili:" #: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp #: editor/plugins/style_box_editor_plugin.cpp editor/rename_dialog.cpp msgid "Preview:" -msgstr "" +msgstr "Priekškatījums:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File:" -msgstr "" +msgstr "Fails:" #: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "" +msgstr "ScanSources / Skenēšanas Avoti" #: editor/editor_file_system.cpp msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" +"Ir vairāki importētāji dažādiem tipiem, kas norāda uz failu %s, importēšana " +"atcelta" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" -msgstr "" +msgstr "(Re)Importē līdzekļus" #: editor/editor_help.cpp msgid "Top" -msgstr "" +msgstr "Virsotne" #: editor/editor_help.cpp msgid "Class:" -msgstr "" +msgstr "Klase:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp #: editor/script_create_dialog.cpp msgid "Inherits:" -msgstr "" +msgstr "Manto:" #: editor/editor_help.cpp msgid "Inherited by:" -msgstr "" +msgstr "Manto uz:" #: editor/editor_help.cpp msgid "Description" @@ -2082,15 +2091,15 @@ msgstr "Apraksts" #: editor/editor_help.cpp msgid "Online Tutorials" -msgstr "" +msgstr "Online Pamācības" #: editor/editor_help.cpp msgid "Properties" -msgstr "" +msgstr "Iestatījumi" #: editor/editor_help.cpp msgid "override:" -msgstr "" +msgstr "pārrakstīšana:" #: editor/editor_help.cpp msgid "default:" @@ -2098,15 +2107,15 @@ msgstr "pēc noklusējuma:" #: editor/editor_help.cpp msgid "Methods" -msgstr "" +msgstr "Metodes" #: editor/editor_help.cpp msgid "Theme Properties" -msgstr "" +msgstr "Motīva iestatījumi" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "" +msgstr "Uzskaites" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constants" @@ -2114,17 +2123,19 @@ msgstr "Konstantes" #: editor/editor_help.cpp msgid "Property Descriptions" -msgstr "Mainīgo Apraksts" +msgstr "Iestatījumu apraksti" #: editor/editor_help.cpp msgid "(value)" -msgstr "" +msgstr "(vērtība)" #: editor/editor_help.cpp msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Pašreiz šim mainīgajam nav apraksta. Lūdzu, palīdzi mums [color=$color][url=" +"$url]izveidot to[/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2135,31 +2146,33 @@ msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Pašreiz šai metodei nav apraksta. Lūdzu, palīdzi mums [color=$color][url=" +"$url]pievienojot vienu[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp msgid "Search Help" -msgstr "" +msgstr "Meklēt Palīdzību" #: editor/editor_help_search.cpp msgid "Case Sensitive" -msgstr "" +msgstr "Reģistrjūtīgs" #: editor/editor_help_search.cpp msgid "Show Hierarchy" -msgstr "" +msgstr "Rādīt Hierarhiju" #: editor/editor_help_search.cpp msgid "Display All" -msgstr "" +msgstr "Parādīt Visu" #: editor/editor_help_search.cpp msgid "Classes Only" -msgstr "" +msgstr "Tikai Klases" #: editor/editor_help_search.cpp msgid "Methods Only" -msgstr "" +msgstr "Tikai Metodes" #: editor/editor_help_search.cpp msgid "Signals Only" @@ -2167,27 +2180,27 @@ msgstr "Tikai Signāli" #: editor/editor_help_search.cpp msgid "Constants Only" -msgstr "" +msgstr "Tikai Konstantes" #: editor/editor_help_search.cpp msgid "Properties Only" -msgstr "" +msgstr "Tikai Iestatījumus" #: editor/editor_help_search.cpp msgid "Theme Properties Only" -msgstr "" +msgstr "Tikai Motīva Iestatījumus" #: editor/editor_help_search.cpp msgid "Member Type" -msgstr "" +msgstr "Dalībnieka veids" #: editor/editor_help_search.cpp msgid "Class" -msgstr "" +msgstr "Klase" #: editor/editor_help_search.cpp msgid "Method" -msgstr "" +msgstr "Metode" #: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp msgid "Signal" @@ -2195,32 +2208,32 @@ msgstr "Signāls" #: editor/editor_help_search.cpp msgid "Constant" -msgstr "" +msgstr "Konstante" #: editor/editor_help_search.cpp msgid "Property" -msgstr "" +msgstr "Mainīgais" #: editor/editor_help_search.cpp msgid "Theme Property" -msgstr "" +msgstr "Motīva Mainīgais" #: editor/editor_inspector.cpp editor/project_settings_editor.cpp msgid "Property:" -msgstr "" +msgstr "Parametrs:" #: editor/editor_inspector.cpp editor/scene_tree_dock.cpp #: modules/visual_script/visual_script_property_selector.cpp msgid "Set %s" -msgstr "" +msgstr "Likt %s" #: editor/editor_inspector.cpp msgid "Set Multiple:" -msgstr "" +msgstr "Uzlikt vairākus:" #: editor/editor_log.cpp msgid "Output:" -msgstr "" +msgstr "Izeja:" #: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Copy Selection" @@ -2234,57 +2247,57 @@ msgstr "Kopēt Izvēlēto" #: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Clear" -msgstr "" +msgstr "Notītīt" #: editor/editor_log.cpp msgid "Clear Output" -msgstr "" +msgstr "Notīrīt Izeju" #: editor/editor_network_profiler.cpp editor/editor_node.cpp #: editor/editor_profiler.cpp msgid "Stop" -msgstr "" +msgstr "Pārtraukt" #: editor/editor_network_profiler.cpp editor/editor_profiler.cpp #: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp msgid "Start" -msgstr "" +msgstr "Sākt" #: editor/editor_network_profiler.cpp msgid "%s/s" -msgstr "" +msgstr "%s/s" #: editor/editor_network_profiler.cpp msgid "Down" -msgstr "" +msgstr "Lejup" #: editor/editor_network_profiler.cpp msgid "Up" -msgstr "" +msgstr "Augšup" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" -msgstr "" +msgstr "Mezgls" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" -msgstr "" +msgstr "Ienākošs RPC" #: editor/editor_network_profiler.cpp msgid "Incoming RSET" -msgstr "" +msgstr "Ienākošs RSET" #: editor/editor_network_profiler.cpp msgid "Outgoing RPC" -msgstr "" +msgstr "Izejošs RPC" #: editor/editor_network_profiler.cpp msgid "Outgoing RSET" -msgstr "" +msgstr "Izejošs RSET" #: editor/editor_node.cpp editor/project_manager.cpp msgid "New Window" -msgstr "" +msgstr "Jauns logs" #: editor/editor_node.cpp msgid "" @@ -2292,120 +2305,139 @@ msgid "" "Update Continuously is enabled, which can increase power usage. Click to " "disable it." msgstr "" +"Griežas, kad redaktora logs atjauninas.\n" +"Atjaunināt konstanti ir iespējots, kas var palielināt jaudas izmantošanu. " +"Klikšķini, lai atslēgtu." #: editor/editor_node.cpp msgid "Spins when the editor window redraws." -msgstr "" +msgstr "Griežas, kad redaktora logs atjauninas." #: editor/editor_node.cpp msgid "Imported resources can't be saved." -msgstr "" +msgstr "Importētie resursi nevar tikt saglabāti." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp scene/gui/dialogs.cpp msgid "OK" -msgstr "" +msgstr "Labi" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Error saving resource!" -msgstr "" +msgstr "Kļūda saglabājot resursu!" #: editor/editor_node.cpp msgid "" "This resource can't be saved because it does not belong to the edited scene. " "Make it unique first." msgstr "" +"Šo resursu nevar saglabāt, jo tas nepieder rediģētajai ainai. Vispirms " +"uztaisi to unikālu." #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As..." -msgstr "" +msgstr "Saglabāt Resursu Kā..." #: editor/editor_node.cpp msgid "Can't open file for writing:" -msgstr "" +msgstr "Nevar atvērt failu rakstīšanai:" #: editor/editor_node.cpp msgid "Requested file format unknown:" -msgstr "" +msgstr "Pieprasītais faila formāts ir nezināms:" #: editor/editor_node.cpp msgid "Error while saving." -msgstr "" +msgstr "Kļūda saglabājot." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Can't open '%s'. The file could have been moved or deleted." -msgstr "" +msgstr "Nevar atvērt '%s'. Fails ir pārvietots vai dzēsts." #: editor/editor_node.cpp msgid "Error while parsing '%s'." -msgstr "" +msgstr "Kļūda pārsienot '%s'." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "Negaidītas faila beigas '%s'." #: editor/editor_node.cpp msgid "Missing '%s' or its dependencies." -msgstr "" +msgstr "Iztrūkst '%s' vai tā atkarības." #: editor/editor_node.cpp msgid "Error while loading '%s'." -msgstr "" +msgstr "Kļūda ielādējot '%s'." #: editor/editor_node.cpp msgid "Saving Scene" -msgstr "" +msgstr "Saglabā Ainu" #: editor/editor_node.cpp msgid "Analyzing" -msgstr "" +msgstr "Analizē" #: editor/editor_node.cpp msgid "Creating Thumbnail" -msgstr "" +msgstr "Izveido sīktēlu" #: editor/editor_node.cpp msgid "This operation can't be done without a tree root." -msgstr "" +msgstr "Nevar veikt šo darbību bez koka cilmes." #: editor/editor_node.cpp msgid "" "This scene can't be saved because there is a cyclic instancing inclusion.\n" "Please resolve it and then attempt to save again." msgstr "" +"Šo ainu nevar saglabāt, jo ir konstatēta cikliska instancēšanas cilpa.\n" +"Lūdzu, atrisini to un tad mēgini saglabāt ainu vēlreiz." #: editor/editor_node.cpp msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " "be satisfied." msgstr "" +"Nevar saglabāt ainu. Drošivien atkarības (instances vai mantojumi) ir " +"kļūdainas." + +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Nevar saglabāt vienu vai vairākas ainas!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Saglabāt Visas Ainas" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" -msgstr "" +msgstr "Nevar pārrakstīt ainu, kas joprojām ir atvērta!" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "" +msgstr "Nevarēja ielādēt tīklu bibliotēku sapludināšanai!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "" +msgstr "Kļūda saglabājot tīkla bibliotēku!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" -msgstr "" +msgstr "Nevar ielādēt flīžu karti sapludināšanai!" #: editor/editor_node.cpp msgid "Error saving TileSet!" -msgstr "" +msgstr "Kļūda saglabājot flīžu komplektu!" #: editor/editor_node.cpp msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" +"Notika gļūda saglabājot redaktora izkārtojumu.\n" +"Pārliecinies, ka redaktora lietotāja datu mape ir rakstāma." #: editor/editor_node.cpp msgid "" @@ -2413,14 +2445,17 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" +"Noklusējuma redaktora izkārtojums pārrakstīts.\n" +"Lai atjaunotu noklusējuma izkārtojumu uz bāzes iestatījumiem, izmantojiet " +"Dzēst izkārtojumu opciju." #: editor/editor_node.cpp msgid "Layout name not found!" -msgstr "" +msgstr "Izkārtojuma nosaukums nav atrasts!" #: editor/editor_node.cpp msgid "Restored the Default layout to its base settings." -msgstr "" +msgstr "Noklusējuma izkārtojums atjaunots uz bāzes iestatījumiem." #: editor/editor_node.cpp msgid "" @@ -2448,6 +2483,10 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Šī aina ir importēta, tādēļ izmaiņas netiks saglabāas.\n" +"Veidojiet no tās paraugu, lai ļautu saglabāt izmaiņas.\n" +"Lūdzu, lasiet dokumentāciju par ainu importēšanu un labākai darbaplūsmas " +"saprašanai." #: editor/editor_node.cpp msgid "" @@ -2458,23 +2497,23 @@ msgstr "" #: editor/editor_node.cpp msgid "There is no defined scene to run." -msgstr "" +msgstr "Nav definēta aina, kuru palaist." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "Saglabā ainu pirms palaišanas..." #: editor/editor_node.cpp msgid "Could not start subprocess!" -msgstr "" +msgstr "Nevar palaist sub-procesu!" #: editor/editor_node.cpp editor/filesystem_dock.cpp msgid "Open Scene" -msgstr "" +msgstr "Atvērt ainu" #: editor/editor_node.cpp msgid "Open Base Scene" -msgstr "" +msgstr "Atvērt bāzes ainu" #: editor/editor_node.cpp msgid "Quick Open..." @@ -2482,25 +2521,31 @@ msgstr "Ātri Atvērt..." #: editor/editor_node.cpp msgid "Quick Open Scene..." -msgstr "" +msgstr "Ātri atvērt ainu..." #: editor/editor_node.cpp msgid "Quick Open Script..." -msgstr "" +msgstr "ātri atvērt skriptu..." #: editor/editor_node.cpp msgid "Save & Close" -msgstr "" +msgstr "Saglabāt & aizvērt" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "Saglabāt izmaiņas '%s' pirms aizvēršanas ?" + +#: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s vairs neeksistē! Lūdzu norādi jaunu saglabāšanas lokāciju." #: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." msgstr "" +"Pašreizējai ainav nav saknes mezgla, bet %d pārveidoti ārējie resursi tika " +"saglbāti tāpat." #: editor/editor_node.cpp msgid "" @@ -2510,43 +2555,43 @@ msgstr "" #: editor/editor_node.cpp msgid "Save Scene As..." -msgstr "" +msgstr "Saglabāt ainu kā..." #: editor/editor_node.cpp modules/gltf/editor_scene_exporter_gltf_plugin.cpp msgid "This operation can't be done without a scene." -msgstr "" +msgstr "Šo operāciju nevar veikt bez ainas." #: editor/editor_node.cpp msgid "Export Mesh Library" -msgstr "" +msgstr "Ekportēt tīkla bibliotēku" #: editor/editor_node.cpp msgid "This operation can't be done without a root node." -msgstr "" +msgstr "Šī darbība nevar tikt veikta bez cilmes mezgla." #: editor/editor_node.cpp msgid "Export Tile Set" -msgstr "" +msgstr "Eksportēt flīžu kopumu" #: editor/editor_node.cpp msgid "This operation can't be done without a selected node." -msgstr "" +msgstr "Šo darbību nevar veikt bez izvēlēta mezgla." #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" -msgstr "" +msgstr "Pašreizējā aina nav saglabāta. Vienalga atvērt ?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Nevar atgriezt, kad peles pogas ir nospiestas." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Nav ko atgriezt." #: editor/editor_node.cpp msgid "Undo: %s" -msgstr "" +msgstr "Atgriezts: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." @@ -2562,12 +2607,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "" +msgstr "Nevar pārlādēt ainu, kas nav bijusi saglabāta." #: editor/editor_node.cpp -#, fuzzy msgid "Reload Saved Scene" -msgstr "Atvērt Aizvērto Ainu" +msgstr "Pārlādēt saglabāto ainu" #: editor/editor_node.cpp msgid "" @@ -2577,49 +2621,52 @@ msgstr "" #: editor/editor_node.cpp msgid "Quick Run Scene..." -msgstr "" +msgstr "Ātri palaist ainu..." #: editor/editor_node.cpp msgid "Quit" -msgstr "" +msgstr "Iziet" #: editor/editor_node.cpp msgid "Yes" -msgstr "" +msgstr "Jā" #: editor/editor_node.cpp msgid "Exit the editor?" -msgstr "" +msgstr "Iziet no redaktora?" #: editor/editor_node.cpp msgid "Open Project Manager?" -msgstr "" +msgstr "Atvērt projektu menedžeri ?" #: editor/editor_node.cpp msgid "Save & Quit" -msgstr "" +msgstr "Saglabāt & iziet" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" -msgstr "" +msgstr "Saglabāt izmaiņas sekojošai ainai(-ām) pirms iziešanas ?" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" +"Saglabāt izmaiņas sekojošai ainai(-ām) pirms projektu menedžera atvēršanas ?" #: editor/editor_node.cpp msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"Šī iespēja in novecojusi. Situācijas, kad atsvaidzināšana ir jāveic " +"piespiedu kārtā, ir uzskatāma par kļūdu, lūdzu ziņojiet." #: editor/editor_node.cpp msgid "Pick a Main Scene" -msgstr "" +msgstr "Izvēlēties galveno ainu" #: editor/editor_node.cpp msgid "Close Scene" -msgstr "" +msgstr "Aizvērt ainu" #: editor/editor_node.cpp msgid "Reopen Closed Scene" @@ -2631,11 +2678,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "" +msgstr "Nevarēja atrast skripta lauku spraudnim: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." -msgstr "" +msgstr "Nevarēja ielādēt spraudņa skriptu no: '%s'." #: editor/editor_node.cpp msgid "" @@ -2652,6 +2699,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" +"Nevarēja ielādēt spraudņa skriptu no mapes: '%s' Skripts nav rīka režīmā." #: editor/editor_node.cpp msgid "" @@ -2667,11 +2715,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" -msgstr "" +msgstr "Ainai '%s' ir bojātas atkarības:" #: editor/editor_node.cpp msgid "Clear Recent Scenes" -msgstr "" +msgstr "Notīrīt nesenās ainas" #: editor/editor_node.cpp msgid "" @@ -2696,25 +2744,25 @@ msgstr "" #: editor/editor_node.cpp msgid "Save Layout" -msgstr "" +msgstr "Saglabāt izkārtojumu" #: editor/editor_node.cpp msgid "Delete Layout" -msgstr "" +msgstr "Dzēst izkārtojumu" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "" +msgstr "Noklusējuma" #: editor/editor_node.cpp editor/editor_resource_picker.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp msgid "Show in FileSystem" -msgstr "" +msgstr "Parādīt failu sistēmā" #: editor/editor_node.cpp msgid "Play This Scene" -msgstr "" +msgstr "Spēlēt šo ainu" #: editor/editor_node.cpp msgid "Close Tab" @@ -2726,11 +2774,11 @@ msgstr "Atcelt Cilnes Aizvēršanu" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "Aizvērt pārējās cilnes" #: editor/editor_node.cpp msgid "Close Tabs to the Right" -msgstr "" +msgstr "Aizvērt cilnes pa labi" #: editor/editor_node.cpp msgid "Close All Tabs" @@ -2738,23 +2786,23 @@ msgstr "Aizvērt Visas Cilnes" #: editor/editor_node.cpp msgid "Switch Scene Tab" -msgstr "" +msgstr "Pārslēgt ainas cilni" #: editor/editor_node.cpp msgid "%d more files or folders" -msgstr "" +msgstr "%d vēl faili vai mapes" #: editor/editor_node.cpp msgid "%d more folders" -msgstr "" +msgstr "%s vēl mapes" #: editor/editor_node.cpp msgid "%d more files" -msgstr "" +msgstr "%d vēl faili" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Doka pozīcija" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -2766,15 +2814,15 @@ msgstr "" #: editor/editor_node.cpp msgid "Add a new scene." -msgstr "" +msgstr "Pievienot jaunu ainu." #: editor/editor_node.cpp msgid "Scene" -msgstr "" +msgstr "Aina" #: editor/editor_node.cpp msgid "Go to previously opened scene." -msgstr "" +msgstr "Iet uz iepriekš atvērto ainu." #: editor/editor_node.cpp msgid "Copy Text" @@ -2782,15 +2830,15 @@ msgstr "Kopēt Tekstu" #: editor/editor_node.cpp msgid "Next tab" -msgstr "" +msgstr "Nākamā cilne" #: editor/editor_node.cpp msgid "Previous tab" -msgstr "" +msgstr "Iepriekšējā cilne" #: editor/editor_node.cpp msgid "Filter Files..." -msgstr "" +msgstr "Filtrēt failus..." #: editor/editor_node.cpp msgid "Operations with scene files." @@ -2798,11 +2846,11 @@ msgstr "" #: editor/editor_node.cpp msgid "New Scene" -msgstr "" +msgstr "Jauna aina" #: editor/editor_node.cpp msgid "New Inherited Scene..." -msgstr "" +msgstr "Jauna mantota aina..." #: editor/editor_node.cpp msgid "Open Scene..." @@ -2810,19 +2858,15 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" -msgstr "" +msgstr "Atvērt nesenu" #: editor/editor_node.cpp msgid "Save Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Saglabāt Visas Ainas" +msgstr "Saglabāt ainu" #: editor/editor_node.cpp msgid "Convert To..." -msgstr "" +msgstr "Konvertēt Uz..." #: editor/editor_node.cpp msgid "MeshLibrary..." @@ -2835,12 +2879,12 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Undo" -msgstr "" +msgstr "Atsaukt" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Redo" -msgstr "" +msgstr "Pārtaisīt" #: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." @@ -2849,31 +2893,31 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp msgid "Project" -msgstr "" +msgstr "Projekts" #: editor/editor_node.cpp msgid "Project Settings..." -msgstr "" +msgstr "Projekta iestatjumi..." #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" -msgstr "" +msgstr "Versiju Kontrole" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" -msgstr "" +msgstr "Uzstādīt Versiju Kontroli" #: editor/editor_node.cpp msgid "Shut Down Version Control" -msgstr "" +msgstr "Izbeigt Versiju Kontroli" #: editor/editor_node.cpp msgid "Export..." -msgstr "" +msgstr "Eksportēt..." #: editor/editor_node.cpp msgid "Install Android Build Template..." -msgstr "" +msgstr "Instalēt Android būves šablonu..." #: editor/editor_node.cpp msgid "Open Project Data Folder" @@ -2881,28 +2925,28 @@ msgstr "Atvērt Projekta Datu Mapi" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" -msgstr "" +msgstr "Rīki" #: editor/editor_node.cpp msgid "Orphan Resource Explorer..." -msgstr "" +msgstr "Bāreņu resursu pārlūks..." #: editor/editor_node.cpp msgid "Reload Current Project" -msgstr "" +msgstr "Pārlādēt pašreizējo projektu" #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "" +msgstr "Iziet uz projektu sarakstu" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/project_export.cpp msgid "Debug" -msgstr "" +msgstr "Atkļūdot" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" -msgstr "" +msgstr "Palaist ar tālvadības atkļūdošanu" #: editor/editor_node.cpp msgid "" @@ -2913,10 +2957,16 @@ msgid "" "mobile device).\n" "You don't need to enable it to use the GDScript debugger locally." msgstr "" +"Kad šī opcija ir ieslēgta, izmantojot viena klikšķa palaišanu, tā liks " +"spēlei savienoties ar šī datora IP adresi, lai pašreizējais projekts varētu " +"tik atkļūdots attālināti.\n" +"Šī opcija ir paredzēta izmantošanai tālvadības atkļūdošanai (parasti ar " +"mobilu ierīci).\n" +"Jums tā nav jāieslēdz, lai izmantotu GDScript atkļūdotāju lokāli." #: editor/editor_node.cpp msgid "Small Deploy with Network Filesystem" -msgstr "" +msgstr "Mazā palaišana ar tīkla failu sistēmu" #: editor/editor_node.cpp msgid "" @@ -2927,10 +2977,15 @@ msgid "" "On Android, deploying will use the USB cable for faster performance. This " "option speeds up testing for projects with large assets." msgstr "" +"Kad šī opcija ir ieslēgta, izmantojot viena klikšķa palaišanu uz Android, tā " +"eksportēs tikai spēles palaišanas failu bez projekta datiem.\n" +"Projekta failu sistēma tiks nodrošināta attālināti, caur internetu.\n" +"Uz Android, palaišana izmantos USB kabeli, lai nodrošinātu ātrāku " +"izpildījumu. Šī opcija paātrina projektu testēšanu ar milzīgiem resursiem." #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "" +msgstr "Redzamas sadursmes formas" #: editor/editor_node.cpp msgid "" @@ -2940,7 +2995,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Visible Navigation" -msgstr "" +msgstr "Redzama navigācija" #: editor/editor_node.cpp msgid "" @@ -2950,7 +3005,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Synchronize Scene Changes" -msgstr "" +msgstr "Sinhronizēt ainas izmaiņas" #: editor/editor_node.cpp msgid "" @@ -2962,7 +3017,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Synchronize Script Changes" -msgstr "" +msgstr "Sinhronizēt skripta izmaiņas" #: editor/editor_node.cpp msgid "" @@ -2974,108 +3029,107 @@ msgstr "" #: editor/editor_node.cpp editor/script_create_dialog.cpp msgid "Editor" -msgstr "" +msgstr "Redaktors" #: editor/editor_node.cpp msgid "Editor Settings..." -msgstr "" +msgstr "Redaktora iestatījumi..." #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "" +msgstr "Redaktora izkārtojums" #: editor/editor_node.cpp msgid "Take Screenshot" -msgstr "" +msgstr "Uzņemt Ekrānšāviņu" #: editor/editor_node.cpp msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "" +msgstr "Ekrānšāviņi tiek saglabāti redaktora datu / iestatījumu mapē." #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "" +msgstr "Pārslēgt Pilnekrānu" #: editor/editor_node.cpp msgid "Toggle System Console" -msgstr "" +msgstr "Pārslēgt sistēmas konsoli" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" -msgstr "" +msgstr "Atvērt redaktora datu / iestatījumu mapi" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "" +msgstr "Atvērt redaktora datu mapi" #: editor/editor_node.cpp msgid "Open Editor Settings Folder" -msgstr "" +msgstr "Atvērt redaktora iestatījumu mapi" #: editor/editor_node.cpp msgid "Manage Editor Features..." -msgstr "" +msgstr "Pārvaldīt redaktora iespējas..." #: editor/editor_node.cpp msgid "Manage Export Templates..." -msgstr "" +msgstr "Pārvaldīt eksporta šablonus..." #: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp msgid "Help" -msgstr "" +msgstr "Palīdzība" #: editor/editor_node.cpp msgid "Online Documentation" -msgstr "" +msgstr "Tiešsaistes Dokumentācija" #: editor/editor_node.cpp msgid "Questions & Answers" -msgstr "" +msgstr "Jautājumi & Atbildes" #: editor/editor_node.cpp msgid "Report a Bug" -msgstr "" +msgstr "Ziņot par kļūmi" #: editor/editor_node.cpp msgid "Suggest a Feature" -msgstr "" +msgstr "Ieteikt Iespēju" #: editor/editor_node.cpp msgid "Send Docs Feedback" -msgstr "" +msgstr "Sūtīt dokumentu atsauksmi" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" -msgstr "Sabiedrība" +msgstr "Komūns" #: editor/editor_node.cpp -#, fuzzy msgid "About Godot" -msgstr "Par" +msgstr "Par Godot" #: editor/editor_node.cpp msgid "Support Godot Development" -msgstr "" +msgstr "Atbalstīt Godot izstrādi" #: editor/editor_node.cpp msgid "Play the project." -msgstr "" +msgstr "Atskaņot projektu." #: editor/editor_node.cpp msgid "Play" -msgstr "" +msgstr "Atskaņot" #: editor/editor_node.cpp msgid "Pause the scene execution for debugging." -msgstr "" +msgstr "Pauzēt ainas izpildi priekš atkļūdošanas." #: editor/editor_node.cpp msgid "Pause Scene" -msgstr "" +msgstr "Pauzēt ainu" #: editor/editor_node.cpp msgid "Stop the scene." -msgstr "" +msgstr "Apstādināt ainu." #: editor/editor_node.cpp msgid "Play the edited scene." @@ -3083,7 +3137,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Play Scene" -msgstr "" +msgstr "Spēlēt Ainu" #: editor/editor_node.cpp msgid "Play custom scene" @@ -3100,7 +3154,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp msgid "Save & Restart" -msgstr "" +msgstr "Saglabāt & pārstartēt" #: editor/editor_node.cpp msgid "Update Continuously" @@ -3108,7 +3162,7 @@ msgstr "Nepārtraukti Atjaunot" #: editor/editor_node.cpp msgid "Update When Changed" -msgstr "" +msgstr "Atjaunot Kad Mainīts" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -3116,11 +3170,11 @@ msgstr "" #: editor/editor_node.cpp msgid "FileSystem" -msgstr "" +msgstr "Failu sistēma" #: editor/editor_node.cpp msgid "Inspector" -msgstr "" +msgstr "Inspektors" #: editor/editor_node.cpp msgid "Expand Bottom Panel" @@ -3128,11 +3182,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Output" -msgstr "" +msgstr "Izeja" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "" +msgstr "Nesaglabāt" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." @@ -3160,6 +3214,12 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" +"Šis iestatīs jūsu projektu priekš pielāgotām Android būvēm, ieinstalējot " +"avota šablonu uz \"res://android/build\".\n" +"Jūs varat veikt izmaiņas un uzbūvēt paši savu pielāgoto APK pie " +"eksportēšanas (pievienot moduļus, mainīt AndroidManifest.xml, utt.).\n" +"Piezīme - lai veiktu pielāgotās būves jau iebūvēto APK vietā, opcijai " +"\"Izmantot Pielāgotu būvi\" jābūt ieslēgtai pie Android eksporta šablona." #: editor/editor_node.cpp msgid "" @@ -3186,30 +3246,30 @@ msgid "Merge With Existing" msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Anim Izmainīt Transformāciju" +msgstr "Pielietot MeshInstances Transformācijas" #: editor/editor_node.cpp msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" -msgstr "Sekojošie faili netika izvilkti no paketes:" +msgstr "" +"Sekojošie faili ir jaunāki uz diska.\n" +"Kādu darbību veikt ?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Reload" -msgstr "" +msgstr "Pārlādēt" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Resave" -msgstr "" +msgstr "Pārglabāt" #: editor/editor_node.cpp msgid "New Inherited" @@ -3217,52 +3277,51 @@ msgstr "" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "" +msgstr "Ielādēt kļūdas" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" -msgstr "" +msgstr "Izvēlēties" #: editor/editor_node.cpp -#, fuzzy msgid "Select Current" -msgstr "Aktualizēt" +msgstr "Izvēlēties pašreizējo" #: editor/editor_node.cpp msgid "Open 2D Editor" -msgstr "" +msgstr "Atvērt 2D redaktoru" #: editor/editor_node.cpp msgid "Open 3D Editor" -msgstr "" +msgstr "Atvērt 3D redaktoru" #: editor/editor_node.cpp msgid "Open Script Editor" -msgstr "" +msgstr "Atvērt skriptu redaktoru" #: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "" +msgstr "Atvērt līdzekļu bibliotēku" #: editor/editor_node.cpp msgid "Open the next Editor" -msgstr "" +msgstr "Atvērt nākamo redaktoru" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "" +msgstr "Atvērt iepriekšējo redaktoru" #: editor/editor_node.h msgid "Warning!" -msgstr "" +msgstr "Brīdinājums!" #: editor/editor_path.cpp msgid "No sub-resources found." -msgstr "" +msgstr "Sub-resursi nav atrasti." #: editor/editor_path.cpp msgid "Open a list of sub-resources." -msgstr "" +msgstr "Atvērt sarakstu ar sub-resursiem." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -3270,7 +3329,7 @@ msgstr "" #: editor/editor_plugin.cpp msgid "Thumbnail..." -msgstr "" +msgstr "Sīktēls..." #: editor/editor_plugin_settings.cpp msgid "Main Script:" @@ -3278,59 +3337,57 @@ msgstr "Galvenais Skripts:" #: editor/editor_plugin_settings.cpp msgid "Edit Plugin" -msgstr "" +msgstr "Rediģēt spraudni" #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" -msgstr "" +msgstr "Instalētie spraudņi:" #: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp msgid "Update" -msgstr "" +msgstr "Atjaunināt" #: editor/editor_plugin_settings.cpp msgid "Version" -msgstr "" +msgstr "Versija" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Author" -msgstr "Autori" +msgstr "Autors" #: editor/editor_plugin_settings.cpp #: editor/plugins/version_control_editor_plugin.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Status" -msgstr "" +msgstr "Statuss" #: editor/editor_profiler.cpp msgid "Measure:" -msgstr "" +msgstr "Mērogs:" #: editor/editor_profiler.cpp -#, fuzzy msgid "Frame Time (ms)" -msgstr "Laiks (s): " +msgstr "Kadra Laiks (ms)" #: editor/editor_profiler.cpp msgid "Average Time (ms)" -msgstr "" +msgstr "Vidējais laiks (ms)" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "" +msgstr "Kadrs %" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "" +msgstr "Fizikas kadrs %" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "Iekļaujošs" #: editor/editor_profiler.cpp msgid "Self" -msgstr "" +msgstr "Sevi" #: editor/editor_profiler.cpp msgid "" @@ -3344,15 +3401,15 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Frame #:" -msgstr "" +msgstr "Kadrs #:" #: editor/editor_profiler.cpp msgid "Time" -msgstr "" +msgstr "Laiks" #: editor/editor_profiler.cpp msgid "Calls" -msgstr "" +msgstr "Izsaukumi" #: editor/editor_properties.cpp msgid "Edit Text:" @@ -3364,19 +3421,19 @@ msgstr "" #: editor/editor_properties.cpp msgid "Layer" -msgstr "" +msgstr "Kārta" #: editor/editor_properties.cpp msgid "Bit %d, value %d" -msgstr "" +msgstr "Bits %d, vērtība %d" #: editor/editor_properties.cpp msgid "[Empty]" -msgstr "" +msgstr "[Tukšs]" #: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp msgid "Assign..." -msgstr "" +msgstr "Pievienot..." #: editor/editor_properties.cpp msgid "Invalid RID" @@ -3406,24 +3463,24 @@ msgstr "" #: editor/editor_properties_array_dict.cpp msgid "Size: " -msgstr "" +msgstr "Izmērs: " #: editor/editor_properties_array_dict.cpp msgid "Page: " -msgstr "" +msgstr "Lapa: " #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Item" -msgstr "" +msgstr "Noņemt vienumu" #: editor/editor_properties_array_dict.cpp msgid "New Key:" -msgstr "" +msgstr "Jauna atslēga:" #: editor/editor_properties_array_dict.cpp msgid "New Value:" -msgstr "" +msgstr "Jauna vērtība:" #: editor/editor_properties_array_dict.cpp msgid "Add Key/Value Pair" @@ -3455,12 +3512,11 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp #: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" -msgstr "" +msgstr "Ielīmēt" #: editor/editor_resource_picker.cpp editor/property_editor.cpp -#, fuzzy msgid "Convert to %s" -msgstr "Izveidot" +msgstr "Konvertēt uz %s" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New %s" @@ -3468,11 +3524,11 @@ msgstr "" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New Script" -msgstr "" +msgstr "Jauns skripts" #: editor/editor_resource_picker.cpp editor/scene_tree_dock.cpp msgid "Extend Script" -msgstr "" +msgstr "Pagarināt skriptu" #: editor/editor_run_native.cpp msgid "" @@ -3483,23 +3539,23 @@ msgstr "" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." -msgstr "" +msgstr "Raksti savu loģiku _run() metodē." #: editor/editor_run_script.cpp msgid "There is an edited scene already." -msgstr "" +msgstr "Jau ir rediģēta aina." #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "" +msgstr "Nevar pakļaut skriptu:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" -msgstr "" +msgstr "Vai aizmirsi 'tool' atslēgvārdu?" #: editor/editor_run_script.cpp msgid "Couldn't run script:" -msgstr "" +msgstr "Nevar palaist skriptu:" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" @@ -3515,15 +3571,15 @@ msgstr "" #: editor/editor_sub_scene.cpp editor/project_manager.cpp msgid "Browse" -msgstr "" +msgstr "Pārlūkot" #: editor/editor_sub_scene.cpp msgid "Scene Path:" -msgstr "" +msgstr "Ainas ceļš:" #: editor/editor_sub_scene.cpp msgid "Import From Node:" -msgstr "" +msgstr "Importēt no mezgla:" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -3531,19 +3587,19 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Uninstall these templates." -msgstr "" +msgstr "Atinstalēt šos šablonus." #: editor/export_template_manager.cpp msgid "There are no mirrors available." -msgstr "" +msgstr "Spoguļi nav pieejami." #: editor/export_template_manager.cpp msgid "Retrieving the mirror list..." -msgstr "" +msgstr "Saņem spoguļu sarakstu..." #: editor/export_template_manager.cpp msgid "Starting the download..." -msgstr "" +msgstr "Sāk lejuplādi..." #: editor/export_template_manager.cpp msgid "Error requesting URL:" @@ -3551,15 +3607,15 @@ msgstr "Kļūda pieprasot URL:" #: editor/export_template_manager.cpp msgid "Connecting to the mirror..." -msgstr "" +msgstr "Savienojas ar spoguli..." #: editor/export_template_manager.cpp msgid "Can't resolve the requested address." -msgstr "" +msgstr "Nevar atrisināt pieprasīto adresi." #: editor/export_template_manager.cpp msgid "Can't connect to the mirror." -msgstr "" +msgstr "Nevar pievienoties spogulim." #: editor/export_template_manager.cpp msgid "No response from the mirror." @@ -3612,11 +3668,11 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Disconnected" -msgstr "" +msgstr "Atvienots" #: editor/export_template_manager.cpp msgid "Resolving" -msgstr "" +msgstr "Atrisina" #: editor/export_template_manager.cpp msgid "Can't Resolve" @@ -3625,24 +3681,24 @@ msgstr "" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connecting..." -msgstr "" +msgstr "Savienojas..." #: editor/export_template_manager.cpp msgid "Can't Connect" -msgstr "" +msgstr "Nevar Savieoties" #: editor/export_template_manager.cpp msgid "Connected" -msgstr "" +msgstr "Savienots" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Requesting..." -msgstr "" +msgstr "Pieprasa..." #: editor/export_template_manager.cpp msgid "Downloading" -msgstr "" +msgstr "Lejuplādē" #: editor/export_template_manager.cpp msgid "Connection Error" @@ -3674,23 +3730,23 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Importing:" -msgstr "" +msgstr "Importē:" #: editor/export_template_manager.cpp msgid "Remove templates for the version '%s'?" -msgstr "" +msgstr "Noņemt šablonus versijai '%s'?" #: editor/export_template_manager.cpp msgid "Uncompressing Android Build Sources" -msgstr "" +msgstr "Atspiež Android būves avotus" #: editor/export_template_manager.cpp msgid "Export Template Manager" -msgstr "" +msgstr "Eksporta šablonu menedžeris" #: editor/export_template_manager.cpp msgid "Current Version:" -msgstr "" +msgstr "Pašreizējā Versija:" #: editor/export_template_manager.cpp msgid "Export templates are missing. Download them or install from a file." @@ -3701,9 +3757,8 @@ msgid "Export templates are installed and ready to be used." msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Open Folder" -msgstr "Atvērt" +msgstr "Atvērt mapi" #: editor/export_template_manager.cpp msgid "Open the folder containing installed templates for the current version." @@ -3711,7 +3766,7 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Uninstall" -msgstr "" +msgstr "Atinstalēt" #: editor/export_template_manager.cpp msgid "Uninstall templates for the current version." @@ -3719,20 +3774,19 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Download from:" -msgstr "" +msgstr "Lejuplādēt no:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Open in Web Browser" -msgstr "Atvērt Failu Pārlūkā" +msgstr "Atvērt interneta pārlūkā" #: editor/export_template_manager.cpp msgid "Copy Mirror URL" -msgstr "" +msgstr "Kopēt spoguļa linku" #: editor/export_template_manager.cpp msgid "Download and Install" -msgstr "" +msgstr "Lejuplādēt un instalēt" #: editor/export_template_manager.cpp msgid "" @@ -3742,11 +3796,11 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Official export templates aren't available for development builds." -msgstr "" +msgstr "Oficiālie eksporta šabloni nav pieejami eksperimentālajām būvēm." #: editor/export_template_manager.cpp msgid "Install from File" -msgstr "" +msgstr "Instalēt no Faila" #: editor/export_template_manager.cpp msgid "Install templates from a local file." @@ -3755,15 +3809,15 @@ msgstr "" #: editor/export_template_manager.cpp editor/find_in_files.cpp #: editor/progress_dialog.cpp scene/gui/dialogs.cpp msgid "Cancel" -msgstr "" +msgstr "Atcelt" #: editor/export_template_manager.cpp msgid "Cancel the download of the templates." -msgstr "" +msgstr "Atcelt šablonu lejuplādi." #: editor/export_template_manager.cpp msgid "Other Installed Versions:" -msgstr "" +msgstr "Citas instalētās versijas:" #: editor/export_template_manager.cpp msgid "Uninstall Template" @@ -3782,6 +3836,8 @@ msgid "" "The templates will continue to download.\n" "You may experience a short editor freeze when they finish." msgstr "" +"Šablonu lejuplādes turpināsies.\n" +"Jūs varat pieredzēt īslaicīgu redaktora sastingšanu, kad tās tiks pabeigtas." #: editor/filesystem_dock.cpp msgid "Favorites" @@ -3806,7 +3862,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Error moving:" -msgstr "" +msgstr "Kļūda parvietojot:" #: editor/filesystem_dock.cpp msgid "Error duplicating:" @@ -3844,7 +3900,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Renaming file:" -msgstr "" +msgstr "Pārsauc failu:" #: editor/filesystem_dock.cpp msgid "Renaming folder:" @@ -3872,7 +3928,7 @@ msgstr "Atvērt Ainas" #: editor/filesystem_dock.cpp msgid "Instance" -msgstr "" +msgstr "Šablons" #: editor/filesystem_dock.cpp msgid "Add to Favorites" @@ -3900,7 +3956,7 @@ msgstr "Jauna Aina..." #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "New Script..." -msgstr "" +msgstr "Jauns Skripts..." #: editor/filesystem_dock.cpp msgid "New Resource..." @@ -3919,9 +3975,8 @@ msgid "Collapse All" msgstr "" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort files" -msgstr "Meklēt failus" +msgstr "Šķirot failus" #: editor/filesystem_dock.cpp msgid "Sort by Name (Ascending)" @@ -3949,11 +4004,11 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Duplicate..." -msgstr "" +msgstr "Dublicēt..." #: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Rename..." -msgstr "" +msgstr "Pārsaukt..." #: editor/filesystem_dock.cpp msgid "Focus the search box" @@ -3987,14 +4042,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Move" -msgstr "" +msgstr "Kustināt" #: editor/filesystem_dock.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/project_manager.cpp editor/rename_dialog.cpp #: editor/scene_tree_dock.cpp msgid "Rename" -msgstr "" +msgstr "Pārsaukt" #: editor/filesystem_dock.cpp msgid "Overwrite" @@ -4033,11 +4088,11 @@ msgstr "" #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find..." -msgstr "" +msgstr "Meklēt..." #: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp msgid "Replace..." -msgstr "" +msgstr "Aizvietot..." #: editor/find_in_files.cpp msgid "Find: " @@ -4056,19 +4111,16 @@ msgid "Searching..." msgstr "Meklē..." #: editor/find_in_files.cpp -#, fuzzy msgid "%d match in %d file." -msgstr "%d sakritības." +msgstr "%d sakritības %d failā." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d file." -msgstr "%d sakritības." +msgstr "%d sakritības %d failā." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d files." -msgstr "%d sakritības." +msgstr "%d sakritības %d failos." #: editor/groups_editor.cpp msgid "Add to Group" @@ -4096,7 +4148,7 @@ msgstr "Izdzēst Grupu" #: editor/groups_editor.cpp editor/node_dock.cpp msgid "Groups" -msgstr "" +msgstr "Grupas" #: editor/groups_editor.cpp msgid "Nodes Not in Group" @@ -4113,7 +4165,7 @@ msgstr "" #: editor/groups_editor.cpp msgid "Empty groups will be automatically removed." -msgstr "" +msgstr "Tukšās grupas tiks automātiski noņemtas." #: editor/groups_editor.cpp msgid "Group Editor" @@ -4121,7 +4173,7 @@ msgstr "Grupas Redaktors" #: editor/groups_editor.cpp msgid "Manage Groups" -msgstr "" +msgstr "Pārvaldīt grupas" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" @@ -4202,21 +4254,19 @@ msgstr "" #: editor/import/resource_importer_scene.cpp msgid "Saving..." -msgstr "" +msgstr "Saglabā..." #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Select Importer" -msgstr "Izvēlēties Šablona Failu" +msgstr "Izvēlēties importētāju" #: editor/import_defaults_editor.cpp msgid "Importer:" msgstr "" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Reset to Defaults" -msgstr "Ielādēt Noklusējumu" +msgstr "Atiestatīt uz noklusējumiem" #: editor/import_dock.cpp msgid "Keep File (No Import)" @@ -4235,6 +4285,18 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reimportēt" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "" @@ -4243,10 +4305,6 @@ msgid "Preset" msgstr "Sagatave" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -4264,14 +4322,12 @@ msgid "Failed to load resource." msgstr "" #: editor/inspector_dock.cpp -#, fuzzy msgid "Copy Properties" -msgstr "Ieslēgtie Mainīgie:" +msgstr "Kopēt iestatījumus" #: editor/inspector_dock.cpp -#, fuzzy msgid "Paste Properties" -msgstr "Ieslēgtie Mainīgie:" +msgstr "Ielīmēt iestatījumus" #: editor/inspector_dock.cpp msgid "Make Sub-Resources Unique" @@ -4293,7 +4349,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Save As..." -msgstr "" +msgstr "Saglabāt kā..." #: editor/inspector_dock.cpp msgid "Extra resource options." @@ -4325,20 +4381,19 @@ msgstr "" #: editor/inspector_dock.cpp msgid "Open documentation for this object." -msgstr "" +msgstr "Atvērt dokumentāciju šim objektam." #: editor/inspector_dock.cpp editor/scene_tree_dock.cpp msgid "Open Documentation" -msgstr "" +msgstr "Atvērt dokumentāciju" #: editor/inspector_dock.cpp msgid "Filter properties" -msgstr "" +msgstr "Filtrēt iestatījumus" #: editor/inspector_dock.cpp -#, fuzzy msgid "Manage object properties." -msgstr "Animācijas īpašības." +msgstr "Pārvaldīt objekta rekvizītus." #: editor/inspector_dock.cpp msgid "Changes may be lost!" @@ -4350,7 +4405,7 @@ msgstr "" #: editor/node_dock.cpp msgid "Select a single node to edit its signals and groups." -msgstr "" +msgstr "Izvēlies kādu mezglu, lai rediģētu tā signālus un grupas." #: editor/plugin_config_dialog.cpp msgid "Edit a Plugin" @@ -4370,16 +4425,16 @@ msgstr "" #: editor/plugin_config_dialog.cpp msgid "Author:" -msgstr "" +msgstr "Autors:" #: editor/plugin_config_dialog.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Version:" -msgstr "" +msgstr "Versija:" #: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp msgid "Language:" -msgstr "" +msgstr "Valoda:" #: editor/plugin_config_dialog.cpp msgid "Script Name:" @@ -4573,7 +4628,7 @@ msgstr "" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend:" -msgstr "" +msgstr "Sapludināt:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Parameter Changed:" @@ -4622,7 +4677,7 @@ msgstr "Izdzēst Mezglu" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/scene_tree_dock.cpp msgid "Delete Node(s)" -msgstr "" +msgstr "Dzēst mezglu(s)" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" @@ -4787,12 +4842,12 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation" -msgstr "" +msgstr "Animācija" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/version_control_editor_plugin.cpp msgid "New" -msgstr "" +msgstr "Jauns" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Transitions..." @@ -4820,23 +4875,23 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Directions" -msgstr "" +msgstr "Virzieni" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Past" -msgstr "" +msgstr "Pagātne" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Future" -msgstr "" +msgstr "Nākotne" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Depth" -msgstr "" +msgstr "Dziļums" #: editor/plugins/animation_player_editor_plugin.cpp msgid "1 step" -msgstr "" +msgstr "1 solis" #: editor/plugins/animation_player_editor_plugin.cpp msgid "2 steps" @@ -4875,7 +4930,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp msgid "Error!" -msgstr "" +msgstr "Kļūda!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" @@ -4916,7 +4971,7 @@ msgstr "" #: editor/plugins/animation_state_machine_editor.cpp msgid "Sync" -msgstr "" +msgstr "Sinhronizācija" #: editor/plugins/animation_state_machine_editor.cpp msgid "At End" @@ -4993,7 +5048,7 @@ msgstr "" #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Scale:" -msgstr "" +msgstr "Mērogs:" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Fade In (s):" @@ -5005,11 +5060,11 @@ msgstr "" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend" -msgstr "" +msgstr "Pludināt" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Mix" -msgstr "" +msgstr "Miksēt" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Auto Restart:" @@ -5025,12 +5080,12 @@ msgstr "" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Start!" -msgstr "" +msgstr "Sākt!" #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Amount:" -msgstr "" +msgstr "Daudzums:" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend 0:" @@ -5046,7 +5101,7 @@ msgstr "" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Current:" -msgstr "" +msgstr "Pašreizējs:" #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -5120,11 +5175,11 @@ msgstr "" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Filters..." -msgstr "" +msgstr "Filtri..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" -msgstr "" +msgstr "Saturs:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "View Files" @@ -5132,7 +5187,7 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download" -msgstr "" +msgstr "Lejuplādēt" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connection error, please try again." @@ -5192,7 +5247,7 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" -msgstr "" +msgstr "Neizdevās:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." @@ -5200,11 +5255,11 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" -msgstr "" +msgstr "Sagaidāms:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Got:" -msgstr "" +msgstr "Saņemts:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed SHA-256 hash check" @@ -5224,7 +5279,7 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Resolving..." -msgstr "" +msgstr "Atrisina.." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Error making request" @@ -5232,7 +5287,7 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Idle" -msgstr "" +msgstr "Dīkstāve" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Install..." @@ -5240,7 +5295,7 @@ msgstr "Instalēt..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" -msgstr "" +msgstr "Mēģināt vēlreiz" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download Error" @@ -5276,23 +5331,23 @@ msgstr "Licence (Z-A)" #: editor/plugins/asset_library_editor_plugin.cpp msgid "First" -msgstr "" +msgstr "Pirmais" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Previous" -msgstr "" +msgstr "Iepriekšējais" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Next" -msgstr "" +msgstr "Nākamais" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Last" -msgstr "" +msgstr "Pēdējais" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" -msgstr "" +msgstr "Visi" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search templates, projects, and demos" @@ -5312,15 +5367,15 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Sort:" -msgstr "" +msgstr "Kārtot:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Category:" -msgstr "" +msgstr "Kategorija:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Site:" -msgstr "" +msgstr "Lapa:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Support" @@ -5328,11 +5383,11 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Official" -msgstr "" +msgstr "Oficiāls" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Testing" -msgstr "" +msgstr "Testē" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Loading..." @@ -5382,14 +5437,13 @@ msgid "Bake Lightmaps" msgstr "" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "Select lightmap bake file:" -msgstr "Izvēlēties Šablona Failu" +msgstr "Izvēlēties gaismas kartes cepšanas failu:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Preview" -msgstr "" +msgstr "Priekšskats" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" @@ -5498,9 +5552,8 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Grupa Izvēlēta" +msgstr "Grupēts" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5580,7 +5633,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Full Rect" -msgstr "" +msgstr "Pilns logs" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Keep Ratio" @@ -5677,19 +5730,16 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Drag: Rotate selected node around pivot." -msgstr "Noņemt izvēlēto mezglu vai pāreju." +msgstr "Bīdīt: Rotē izvēlēto mezglu apkārt asij." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Move selected node." -msgstr "Izdzēst izvēlēto Taisnstūri." +msgstr "Alt+Bīdīt: Pārvietot izvēlēto mezglu." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "V: Set selected node's pivot position." -msgstr "Noņemt izvēlēto mezglu vai pāreju." +msgstr "V: Uzlikt izvēlētā mezgla centra pozīciju." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5842,7 +5892,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "View" -msgstr "" +msgstr "Skatīt" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Always Show Grid" @@ -5929,14 +5979,12 @@ msgid "Clear Pose" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Add Node Here" -msgstr "Pievienot Mezgla Punktu" +msgstr "Pievienot mezglu šeit" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Instance Scene Here" -msgstr "Ievadiet Atslēgu Šeit" +msgstr "Izveidot ainas instanci šeit" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" @@ -5963,34 +6011,28 @@ msgid "Zoom to 12.5%" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 25%" -msgstr "Attālināt" +msgstr "Tuvināt uz 25%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 50%" -msgstr "Attālināt" +msgstr "Tuvināt uz 50%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 100%" -msgstr "Attālināt" +msgstr "Tuvināt uz 100%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 200%" -msgstr "Attālināt" +msgstr "Tuvināt uz 200%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 400%" -msgstr "Attālināt" +msgstr "Tuvināt uz 400%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 800%" -msgstr "Attālināt" +msgstr "Tuvināt uz 800%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 1600%" @@ -6065,7 +6107,7 @@ msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Particles" -msgstr "" +msgstr "Daļiņas" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -6122,7 +6164,7 @@ msgstr "" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "" +msgstr "Plakans 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -6237,9 +6279,8 @@ msgid "Couldn't create a single convex collision shape." msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Simplified Convex Shape" -msgstr "Izveidot Vienu Izliektu Formu" +msgstr "Izveidot vienkāršotu izliektu formu" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Single Convex Shape" @@ -6333,9 +6374,8 @@ msgid "" msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Simplified Convex Collision Sibling" -msgstr "Izveidot Vienu Izliektu Sadursmes Uzmavu" +msgstr "Izveidot vienkāršotu izliektu sadursmes radinieku" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6487,15 +6527,15 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "X-Axis" -msgstr "" +msgstr "X ass" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Y-Axis" -msgstr "" +msgstr "Y ass" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Z-Axis" -msgstr "" +msgstr "Z ass" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh Up Axis:" @@ -6515,7 +6555,7 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate" -msgstr "" +msgstr "Apdzīvot" #: editor/plugins/navigation_polygon_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp @@ -6540,9 +6580,8 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles2D" -msgstr "Izveidot" +msgstr "Konvertēt uz CPUParticles2D" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -6587,7 +6626,7 @@ msgstr "" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" -msgstr "" +msgstr "Tilpums" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Source: " @@ -6686,7 +6725,7 @@ msgstr "" #: editor/plugins/theme_editor_preview.cpp #: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp msgid "Options" -msgstr "" +msgstr "Opcijas" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -6780,23 +6819,20 @@ msgid "Invalid Polygon (need 3 different vertices)" msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Add Custom Polygon" -msgstr "Izveidot" +msgstr "Pievienot pielāgotu daudzstūri" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Custom Polygon" -msgstr "Izveidot" +msgstr "Noņemt pielāgotu daudzstūri" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Transform UV Map" msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Transform Polygon" -msgstr "Izveidot" +msgstr "Transformēt daudzstūri" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint Bone Weights" @@ -6819,9 +6855,8 @@ msgid "Points" msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Polygons" -msgstr "Izveidot" +msgstr "Daudzstūri" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Bones" @@ -6890,9 +6925,8 @@ msgid "Copy Polygon to UV" msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Copy UV to Polygon" -msgstr "Izveidot" +msgstr "Kopēt UV uz daudzstūra" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Clear UV" @@ -6912,7 +6946,7 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" -msgstr "" +msgstr "Režģis" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" @@ -6977,7 +7011,7 @@ msgstr "" #: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Type:" -msgstr "" +msgstr "Tips:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp @@ -6997,14 +7031,12 @@ msgid "Flip Portals" msgstr "" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Room Generate Points" -msgstr "Pārvietot Bezjē Punktus" +msgstr "Telpas punktu ģenerācija" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Generate Points" -msgstr "Izveidot punktus." +msgstr "Ģenerēt Punktus" #: editor/plugins/room_manager_editor_plugin.cpp msgid "Flip Portal" @@ -7015,9 +7047,8 @@ msgid "Occluder Set Transform" msgstr "" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Izdzēst" +msgstr "Centrēt mezglu" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7033,7 +7064,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Close and save changes?" -msgstr "" +msgstr "Aizvērt un saglabāt izmaiņas?" #: editor/plugins/script_editor_plugin.cpp msgid "Error writing TextFile:" @@ -7044,9 +7075,8 @@ msgid "Could not load file at:" msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error saving file!" -msgstr "Kļūmes lādējot!" +msgstr "Kļūda saglabājot failu!" #: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme." @@ -7057,9 +7087,8 @@ msgid "Error Saving" msgstr "Kļūda Saglabājot" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error importing theme." -msgstr "Kļūda lādējot fontu." +msgstr "Kļūda importējot motīvu." #: editor/plugins/script_editor_plugin.cpp msgid "Error Importing" @@ -7067,12 +7096,11 @@ msgstr "Kļūda Importējot" #: editor/plugins/script_editor_plugin.cpp msgid "New Text File..." -msgstr "" +msgstr "Jauns teksta fails..." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open File" -msgstr "Atvērt" +msgstr "Atvērt failu" #: editor/plugins/script_editor_plugin.cpp msgid "Save File As..." @@ -7109,7 +7137,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As..." -msgstr "" +msgstr "Saglabāt motīvu kā..." #: editor/plugins/script_editor_plugin.cpp msgid "%s Class Reference" @@ -7118,7 +7146,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find Next" -msgstr "" +msgstr "Atrast Nākamo" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -7139,31 +7167,31 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" -msgstr "" +msgstr "Šķirot" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Move Up" -msgstr "" +msgstr "Bīdīt augšup" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Move Down" -msgstr "" +msgstr "Bīdīt lejup" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +msgid "Next Script" +msgstr "Nākamais skripts" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +msgid "Previous Script" +msgstr "Iepriekšējais skripts" #: editor/plugins/script_editor_plugin.cpp msgid "File" -msgstr "" +msgstr "Fails" #: editor/plugins/script_editor_plugin.cpp msgid "Open..." @@ -7171,11 +7199,11 @@ msgstr "Atvērt..." #: editor/plugins/script_editor_plugin.cpp msgid "Reopen Closed Script" -msgstr "" +msgstr "Atvērt aizvērto skriptu" #: editor/plugins/script_editor_plugin.cpp msgid "Save All" -msgstr "" +msgstr "Saglabāt visu" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" @@ -7208,11 +7236,11 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme" -msgstr "" +msgstr "Saglabāt motīvu" #: editor/plugins/script_editor_plugin.cpp msgid "Close All" -msgstr "" +msgstr "Aizvērt Visu" #: editor/plugins/script_editor_plugin.cpp msgid "Close Docs" @@ -7220,7 +7248,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" -msgstr "" +msgstr "Palaist" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -7228,7 +7256,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Search" -msgstr "" +msgstr "Meklēt" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" @@ -7240,16 +7268,16 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Break" -msgstr "" +msgstr "Pārtraukt" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp #: editor/script_editor_debugger.cpp msgid "Continue" -msgstr "" +msgstr "turpināt" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" -msgstr "" +msgstr "Atstāt atkļūdotāju atvērtu" #: editor/plugins/script_editor_plugin.cpp msgid "Debug with External Editor" @@ -7258,11 +7286,11 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" -msgstr "" +msgstr "Tiešsaistes Dokumenti" #: editor/plugins/script_editor_plugin.cpp msgid "Open Godot online documentation." -msgstr "" +msgstr "Atvērt Godot tiešsaistes dokumentāciju." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." @@ -7278,7 +7306,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Discard" -msgstr "" +msgstr "Atmest" #: editor/plugins/script_editor_plugin.cpp msgid "" @@ -7288,7 +7316,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "" +msgstr "Atkļūdotājs" #: editor/plugins/script_editor_plugin.cpp msgid "Search Results" @@ -7303,9 +7331,8 @@ msgid "Connections to method:" msgstr "" #: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp -#, fuzzy msgid "Source" -msgstr "Resurs" +msgstr "Avots" #: editor/plugins/script_text_editor.cpp msgid "Target" @@ -7319,16 +7346,15 @@ msgstr "" #: editor/plugins/script_text_editor.cpp msgid "[Ignore]" -msgstr "" +msgstr "[Ignorēt]" #: editor/plugins/script_text_editor.cpp msgid "Line" msgstr "Rinda" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Function" -msgstr "Izveidot Funkciju" +msgstr "Iet uz funkciju" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." @@ -7373,9 +7399,8 @@ msgid "Bookmarks" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Breakpoints" -msgstr "Izveidot" +msgstr "Pārrāvumpunkts" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp @@ -7385,7 +7410,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" -msgstr "" +msgstr "Izgriezt" #: editor/plugins/script_text_editor.cpp editor/plugins/theme_editor_plugin.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -7425,9 +7450,8 @@ msgid "Complete Symbol" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Evaluate Selection" -msgstr "Mēroga Izvēle" +msgstr "Novērtēt izvēli" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" @@ -7458,14 +7482,12 @@ msgid "Toggle Bookmark" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Next Bookmark" -msgstr "Doties uz nākamo soli" +msgstr "Doties uz nākamo grāmatzīmi" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Bookmark" -msgstr "Doties uz iepriekšējo soli" +msgstr "Doties uz iepriekšējo grāmatzīmi" #: editor/plugins/script_text_editor.cpp msgid "Remove All Bookmarks" @@ -7489,14 +7511,12 @@ msgid "Remove All Breakpoints" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Next Breakpoint" -msgstr "Doties uz nākamo soli" +msgstr "Doties uz nākamo pārrāvumpunktu" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Breakpoint" -msgstr "Doties uz iepriekšējo soli" +msgstr "Doties uz iepriekšējo pārrāvumpunktu" #: editor/plugins/shader_editor_plugin.cpp msgid "" @@ -7506,18 +7526,18 @@ msgstr "" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" -msgstr "" +msgstr "Ēnotājs" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7525,9 +7545,8 @@ msgid "Skeleton2D" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Ielādēt Noklusējumu" +msgstr "Atiestatīt uz atpūtas pozu" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Overwrite Rest Pose" @@ -7555,7 +7574,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" -msgstr "" +msgstr "Perspektīva" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top Orthogonal" @@ -7578,7 +7597,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7586,6 +7605,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7647,13 +7670,12 @@ msgid "Translate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scale" -msgstr "Mēroga Režīms" +msgstr "Mērogs" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scaling: " -msgstr "" +msgstr "Mērogs: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Translating: " @@ -7692,14 +7714,12 @@ msgid "Material Changes:" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Shader Changes:" -msgstr "Nomainīt" +msgstr "Ēnotāja izmaiņas:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Surface Changes:" -msgstr "Nomainīt" +msgstr "Virsmas izmaiņas:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Draw Calls:" @@ -7802,9 +7822,8 @@ msgid "Audio Listener" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Enable Doppler" -msgstr "Nomainīt" +msgstr "Iespējot doppler" #: editor/plugins/spatial_editor_plugin.cpp msgid "Cinematic Preview" @@ -7866,9 +7885,8 @@ msgid "" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Convert Rooms" -msgstr "Izveidot" +msgstr "Konvertēt telpas" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" @@ -7928,6 +7946,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -8001,9 +8039,8 @@ msgid "View Portal Culling" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Izveidot" +msgstr "Skatīt sķēršļu izkaušanu" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8064,7 +8101,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Pre" -msgstr "" +msgstr "iepriekš" #: editor/plugins/spatial_editor_plugin.cpp msgid "Post" @@ -8075,42 +8112,36 @@ msgid "Unnamed Gizmo" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create Mesh2D" -msgstr "Izveidot Jaunu %s" +msgstr "Izveidot Mesh2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Mesh2D Preview" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create Polygon2D" -msgstr "Izveidot" +msgstr "Izveidot Polygon2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Polygon2D Preview" msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create CollisionPolygon2D" -msgstr "Izveidot" +msgstr "Izveidot CollisionPolygon2D" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "CollisionPolygon2D Preview" -msgstr "Izveidot" +msgstr "CollisionPolygon2D priekšskatījums" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create LightOccluder2D" -msgstr "Izveidot" +msgstr "Izveidot LightOccluder2D" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "LightOccluder2D Preview" -msgstr "Izveidot" +msgstr "LightOccluder2D priekšskatījums" #: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite is empty!" @@ -8133,18 +8164,16 @@ msgid "Invalid geometry, can't create polygon." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to Polygon2D" -msgstr "Izveidot" +msgstr "Konvertēt uz Polygon2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create collision polygon." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create CollisionPolygon2D Sibling" -msgstr "Izveidot" +msgstr "Izveidot CollisionPolygon2D radinieku" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create light occluder." @@ -8179,9 +8208,8 @@ msgid "Settings:" msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "No Frames Selected" -msgstr "Savienot" +msgstr "Nav izvēlēti kadri" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" @@ -8224,14 +8252,12 @@ msgid "Move Frame" msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Animations:" -msgstr "Funkcijas:" +msgstr "Animācijas:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "New Animation" -msgstr "Optimizēt animāciju" +msgstr "Jauna animācija" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -8239,16 +8265,15 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" -msgstr "" +msgstr "Cilpa" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animation Frames:" msgstr "Animācijas Kadri:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Add a Texture from File" -msgstr "Noņemt Izvēlēto" +msgstr "Pievienot tekstūru no faila" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" @@ -8327,9 +8352,8 @@ msgid "Step:" msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp -#, fuzzy msgid "Separation:" -msgstr "Sēpija funkcija." +msgstr "Atdalījums:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "TextureRegion" @@ -8360,9 +8384,8 @@ msgid "No colors found." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "{num} constant(s)" -msgstr "Konstantes" +msgstr "{num} konstante(s)" #: editor/plugins/theme_editor_plugin.cpp msgid "No constants found." @@ -8401,27 +8424,24 @@ msgid "Nothing was selected for the import." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Importing Theme Items" -msgstr "Kļūda lādējot fontu." +msgstr "Tēmas elementu importēšana" #: editor/plugins/theme_editor_plugin.cpp msgid "Importing items {n}/{n}" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Updating the editor" -msgstr "Atjaunina Ainu" +msgstr "Atjaunina redaktoru" #: editor/plugins/theme_editor_plugin.cpp msgid "Finalizing" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Filter:" -msgstr "Nomainīt Filtru" +msgstr "Filtrs:" #: editor/plugins/theme_editor_plugin.cpp msgid "With Data" @@ -8506,9 +8526,8 @@ msgid "Expand types." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all Theme items." -msgstr "Izvēlēties Šablona Failu" +msgstr "Atlasiet visus motīvu vienumus." #: editor/plugins/theme_editor_plugin.cpp msgid "Select With Data" @@ -8519,18 +8538,16 @@ msgid "Select all Theme items with item data." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Deselect All" -msgstr "Atvienot Visu" +msgstr "Atcelt visu atlasi" #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all Theme items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Import Selected" -msgstr "Grupa Izvēlēta" +msgstr "Importēt izvēlēto" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -8546,28 +8563,24 @@ msgid "" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All Color Items" -msgstr "Noņemt no Favorītiem" +msgstr "Noņemt visas krāsas vienības" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Rename Item" -msgstr "Pārsaukt Audio Kopni" +msgstr "Noņemt vienību" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Constant Items" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All Font Items" -msgstr "Noņemt no Favorītiem" +msgstr "Noņemt visus fontu vienumus" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All Icon Items" -msgstr "Saglabāt Visas Ainas" +msgstr "Noņemt visus ikonu vienumus" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All StyleBox Items" @@ -8580,24 +8593,20 @@ msgid "" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Color Item" -msgstr "Pievienot Favorītiem" +msgstr "Pievienot krāsas vienumu" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Constant Item" -msgstr "Konstantes" +msgstr "Pievienot konstantes vienumu" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Font Item" -msgstr "Pievienot Punktu" +msgstr "Pievienot fonta vienumu" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Icon Item" -msgstr "Pievienot Punktu" +msgstr "Pievienot ikonas vienumu" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Stylebox Item" @@ -8636,9 +8645,8 @@ msgid "Manage Theme Items" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Items" -msgstr "Rediģēt Tekstu:" +msgstr "Rediģēt vienumus" #: editor/plugins/theme_editor_plugin.cpp msgid "Types:" @@ -8657,18 +8665,16 @@ msgid "Add StyleBox Item" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Items:" -msgstr "Noņemt Izvēlēto" +msgstr "Noņemt vienumus:" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Custom Items" -msgstr "Izveidot" +msgstr "Noņemt pielāgotos vienumus" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Items" @@ -8679,29 +8685,24 @@ msgid "Add Theme Item" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Old Name:" -msgstr "Nosaukums" +msgstr "Vecais vārds:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Import Items" -msgstr "Ielādēt Noklusējumu" +msgstr "Importēt vienumus" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Default Theme" -msgstr "Nomainīt Noklusējuma Tipu" +msgstr "Noklusējuma motīvs" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Editor Theme" -msgstr "Rediģēt Tekstu:" +msgstr "Redaktora motīvs" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select Another Theme Resource:" -msgstr "Meklēt Aizstājēja Resursu:" +msgstr "Izvēlēties citu motīva resursu:" #: editor/plugins/theme_editor_plugin.cpp msgid "Another Theme" @@ -8713,7 +8714,7 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Cancel Item Rename" -msgstr "" +msgstr "Atcelt pārsaukšanu" #: editor/plugins/theme_editor_plugin.cpp msgid "Override Item" @@ -8730,9 +8731,8 @@ msgid "" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Type" -msgstr "Pievienot Trijstūri" +msgstr "Pievienot tipu" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Item Type" @@ -8743,9 +8743,8 @@ msgid "Node Types:" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Show Default" -msgstr "Ielādēt Noklusējumu" +msgstr "Rādīt noklusējumu" #: editor/plugins/theme_editor_plugin.cpp msgid "Show default type items alongside items that have been overridden." @@ -8760,9 +8759,8 @@ msgid "Override all default type items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme:" -msgstr "Atvērt" +msgstr "Motīvs:" #: editor/plugins/theme_editor_plugin.cpp msgid "Manage Items..." @@ -8773,18 +8771,16 @@ msgid "Add, remove, organize and import Theme items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Preview" -msgstr "Pievienot Trijstūri" +msgstr "Pievienot priekšskatījumu" #: editor/plugins/theme_editor_plugin.cpp msgid "Default Preview" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select UI Scene:" -msgstr "Iestatīt Kā Galveno Ainu" +msgstr "Izvēlēties UI ainu:" #: editor/plugins/theme_editor_preview.cpp msgid "" @@ -8797,18 +8793,16 @@ msgid "Toggle Button" msgstr "" #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Disabled Button" -msgstr "Atspējots" +msgstr "Atspējota poga" #: editor/plugins/theme_editor_preview.cpp msgid "Item" msgstr "" #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Disabled Item" -msgstr "Atspējots" +msgstr "Atspējots vienums" #: editor/plugins/theme_editor_preview.cpp msgid "Check Item" @@ -8844,16 +8838,15 @@ msgstr "" #: editor/plugins/theme_editor_preview.cpp msgid "Has" -msgstr "" +msgstr "Satur" #: editor/plugins/theme_editor_preview.cpp msgid "Many" -msgstr "" +msgstr "Daudz" #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Disabled LineEdit" -msgstr "Atspējots" +msgstr "Atspējota LineEdit" #: editor/plugins/theme_editor_preview.cpp msgid "Tab 1" @@ -8877,7 +8870,7 @@ msgstr "" #: editor/plugins/theme_editor_preview.cpp msgid "Has,Many,Options" -msgstr "" +msgstr "Ir,Daudz,Opcijas" #: editor/plugins/theme_editor_preview.cpp msgid "Invalid path, the PackedScene resource was probably moved or removed." @@ -8905,9 +8898,8 @@ msgstr "Salabot Nederīgās Flīzes" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Cut Selection" -msgstr "Dzēst izvēlētos" +msgstr "Griezt izvēlēto" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" @@ -9007,7 +8999,7 @@ msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from Scene" -msgstr "" +msgstr "Sapludināt no ainas" #: editor/plugins/tile_set_editor_plugin.cpp msgid "New Single Tile" @@ -9038,24 +9030,20 @@ msgid "Select the previous shape, subtile, or Tile." msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Region" -msgstr "Interpolācijas režīms" +msgstr "Reģions" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Collision" -msgstr "Interpolācijas režīms" +msgstr "Sadursme" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occlusion" -msgstr "Izveidot" +msgstr "Šķērslis" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation" -msgstr "Izveidot" +msgstr "Navigācija" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Bitmask" @@ -9067,31 +9055,27 @@ msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Icon" -msgstr "" +msgstr "Ikona" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Z Index" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Region Mode" -msgstr "Interpolācijas režīms" +msgstr "Reģiona režīms" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Collision Mode" -msgstr "Interpolācijas režīms" +msgstr "Sadursmes režīms" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occlusion Mode" -msgstr "Izveidot" +msgstr "Oklūzijas režīms" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Mode" -msgstr "Izveidot" +msgstr "Navigācijas režīms" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Bitmask Mode" @@ -9126,23 +9110,20 @@ msgid "Create a new rectangle." msgstr "Izveidot jaunu taisnstūri." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "New Rectangle" -msgstr "Izveidot jaunu taisnstūri." +msgstr "Jauns taisnstūris" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create a new polygon." msgstr "Izveidot jaunu daudzstūri." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "New Polygon" -msgstr "Izveidot" +msgstr "Jauns daudzstūris" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete Selected Shape" -msgstr "Izdzēst Izvēlēto(ās) Atslēgu(as)" +msgstr "Izdzēst izvēlēto formu" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." @@ -9176,12 +9157,11 @@ msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" -msgstr "" +msgstr "sablodināt no ainas?" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Texture" -msgstr "Noņemt Izvēlēto" +msgstr "Noņemt tekstūru" #: editor/plugins/tile_set_editor_plugin.cpp msgid "%s file(s) were not added because was already on the list." @@ -9239,9 +9219,8 @@ msgid "Set Tile Region" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Tile" -msgstr "Izveidot" +msgstr "Izveidot flīzi" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Icon" @@ -9252,24 +9231,20 @@ msgid "Edit Tile Bitmask" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Collision Polygon" -msgstr "Izveidot" +msgstr "Rediģēt sadursmes daudzstūri" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Occlusion Polygon" -msgstr "Izveidot" +msgstr "Rediģēt oklūzijas daudzstūri" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Navigation Polygon" -msgstr "Izveidot" +msgstr "Rediģēt navigācijas daudzstūri" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Paste Tile Bitmask" -msgstr "Ielīmēt celiņus" +msgstr "Ielīmēt flīzes bitmasku" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Clear Tile Bitmask" @@ -9280,14 +9255,12 @@ msgid "Make Polygon Concave" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Polygon Convex" -msgstr "Izveidot" +msgstr "Izveidot dadzstūra izliekumu" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Tile" -msgstr "Noņemt" +msgstr "Noņemt flīzi" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Collision Polygon" @@ -9310,24 +9283,20 @@ msgid "Edit Tile Z Index" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Convex" -msgstr "Izveidot" +msgstr "Izveidot izliekumu" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Concave" -msgstr "Izveidot" +msgstr "Izveidot ieliekumu" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Collision Polygon" -msgstr "Izveidot" +msgstr "Izveidot sadursmes daudzstūri" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Occlusion Polygon" -msgstr "Izveidot" +msgstr "Izveidot oklūzijas daudzstūri" #: editor/plugins/tile_set_editor_plugin.cpp msgid "This property can't be changed." @@ -9370,47 +9339,40 @@ msgid "Staging area" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Detect new changes" -msgstr "Izveidot Jaunu %s" +msgstr "Atrast jaunas izmaiņas" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Changes" -msgstr "Nomainīt" +msgstr "Maiņas" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Renamed" -msgstr "Pārsaukt Audio Kopni" +msgstr "Pārsaukts" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Deleted" -msgstr "Izdzēst" +msgstr "Dzēsts" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Typechange" -msgstr "Nomainīt" +msgstr "Tipa maiņa" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage Selected" -msgstr "Mēroga Izvēle" +msgstr "Posma izvēle" #: editor/plugins/version_control_editor_plugin.cpp msgid "Stage All" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Changes" -msgstr "Nomainīt" +msgstr "Pielietot izmaiņas" #: editor/plugins/version_control_editor_plugin.cpp msgid "View file diffs before committing them to the latest version" @@ -9457,9 +9419,8 @@ msgid "Add output port" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port type" -msgstr "Nomainīt %s Tipu" +msgstr "Mainīt ienākoša porta tipu" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change output port type" @@ -9474,14 +9435,12 @@ msgid "Change output port name" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove input port" -msgstr "Noņemt Izvēlēto" +msgstr "Noņemt ienākošo portu" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove output port" -msgstr "Noņemt Izvēlēto" +msgstr "Noņemt izejas portu" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set expression" @@ -9504,14 +9463,12 @@ msgid "Add Node to Visual Shader" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Node(s) Moved" -msgstr "Mezgls Noņemts" +msgstr "Mezgls(-i) pārvietots(-i)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Duplicate Nodes" -msgstr "Dublicēt atslēgvietnes" +msgstr "Dubliēt mezglus" #: editor/plugins/visual_shader_editor_plugin.cpp #: modules/visual_script/visual_script_editor.cpp @@ -9519,9 +9476,8 @@ msgid "Paste Nodes" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Nodes" -msgstr "Izdzēst" +msgstr "Dzēst mezglus" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" @@ -9548,9 +9504,8 @@ msgid "Show resulted shader code." msgstr "Attēlot rezultējošo ēnotāja kodu." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Create Shader Node" -msgstr "Izveidot Jaunu %s" +msgstr "Izveidot ēnotāja mezglu" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color function." @@ -10239,9 +10194,8 @@ msgid "VisualShader" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property:" -msgstr "Ieslēgtie Mainīgie:" +msgstr "Rediģēt vizuālo mainīgo:" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" @@ -10408,7 +10362,7 @@ msgstr "" #: editor/project_export.cpp msgid "Manage Export Templates" -msgstr "" +msgstr "Pārvaldīt Eksporta Šablonus" #: editor/project_export.cpp msgid "Export With Debug" @@ -10419,9 +10373,8 @@ msgid "The path specified doesn't exist." msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Error opening package file (it's not in ZIP format)." -msgstr "Kļūme atverot arhīvu failu, nav ZIP formātā." +msgstr "Kļūme atverot paketes failu (tā nav ZIP formātā)." #: editor/project_manager.cpp msgid "" @@ -10442,16 +10395,15 @@ msgstr "" #: editor/project_manager.cpp msgid "New Game Project" -msgstr "" +msgstr "Jauns spēles projekts" #: editor/project_manager.cpp msgid "Imported Project" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Invalid project name." -msgstr "Nederīgs grupas nosaukums." +msgstr "Nederīgs projekta nosaukums." #: editor/project_manager.cpp msgid "Couldn't create folder." @@ -10497,7 +10449,7 @@ msgstr "Pakete instalēta sekmīgi!" #: editor/project_manager.cpp msgid "Rename Project" -msgstr "" +msgstr "Pārsaukt Projektu" #: editor/project_manager.cpp msgid "Import Existing Project" @@ -10521,7 +10473,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Install & Edit" -msgstr "" +msgstr "Instalēt & Rediģēt" #: editor/project_manager.cpp msgid "Project Name:" @@ -10529,11 +10481,11 @@ msgstr "" #: editor/project_manager.cpp msgid "Project Path:" -msgstr "" +msgstr "Projekta ceļš:" #: editor/project_manager.cpp msgid "Project Installation Path:" -msgstr "" +msgstr "Projekta instalācijas ceļš:" #: editor/project_manager.cpp msgid "Renderer:" @@ -10573,7 +10525,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Unnamed Project" -msgstr "" +msgstr "Nenosaukts Projekts" #: editor/project_manager.cpp msgid "Missing Project" @@ -10645,7 +10597,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Remove this project from the list?" -msgstr "" +msgstr "Noņemt šo projektu no saraksta?" #: editor/project_manager.cpp msgid "" @@ -10671,60 +10623,52 @@ msgid "Project Manager" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Local Projects" -msgstr "Projekta Dibinātāji" +msgstr "Lokālie projekti" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "Ielādēt..." +msgstr "Ielādē, lūdzu uzgaidi..." #: editor/project_manager.cpp msgid "Last Modified" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Edit Project" -msgstr "Projekta Dibinātāji" +msgstr "Rediģēt Projektu" #: editor/project_manager.cpp -#, fuzzy msgid "Run Project" -msgstr "Projekta Dibinātāji" +msgstr "Palaist Projektu" #: editor/project_manager.cpp msgid "Scan" -msgstr "" +msgstr "Skenēt" #: editor/project_manager.cpp -#, fuzzy msgid "Scan Projects" -msgstr "Projekta Dibinātāji" +msgstr "Skenēt Projektu" #: editor/project_manager.cpp msgid "Select a Folder to Scan" -msgstr "" +msgstr "Norādīt mapi kuru skenēt" #: editor/project_manager.cpp msgid "New Project" -msgstr "" +msgstr "Jauns projekts" #: editor/project_manager.cpp -#, fuzzy msgid "Import Project" -msgstr "Projekta Dibinātāji" +msgstr "Importēt Projektu" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Project" -msgstr "Noņemt Punktu" +msgstr "Noņemt Projektu" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Missing" -msgstr "Noņemt" +msgstr "Noņemt trūkstošo" #: editor/project_manager.cpp msgid "About" @@ -10732,34 +10676,35 @@ msgstr "Par" #: editor/project_manager.cpp msgid "Asset Library Projects" -msgstr "" +msgstr "Līdzekļu bibliotēkas projekti" #: editor/project_manager.cpp msgid "Restart Now" -msgstr "" +msgstr "Restartēt tagad" #: editor/project_manager.cpp msgid "Remove All" -msgstr "" +msgstr "Noņemt visu" #: editor/project_manager.cpp msgid "Also delete project contents (no undo!)" -msgstr "" +msgstr "Dzēst projekta saturu (nevar atsaukt)" #: editor/project_manager.cpp msgid "Can't run project" -msgstr "" +msgstr "Nevar palaist projektu" #: editor/project_manager.cpp msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" msgstr "" +"Jums pašreiz nav neviena projekta.\n" +"Vai vēlaties skatīt oficiālos paraugu projektus Līdzekļu bibliotēkā ?" #: editor/project_manager.cpp -#, fuzzy msgid "Filter projects" -msgstr "Projekta Dibinātāji" +msgstr "Filtrēt projektus" #: editor/project_manager.cpp msgid "" @@ -10769,12 +10714,12 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" -msgstr "" +msgid "Key " +msgstr "Taustiņš " #: editor/project_settings_editor.cpp msgid "Joy Button" @@ -10961,9 +10906,8 @@ msgid "Override for Feature" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Add %d Translations" -msgstr "Pievienot Pāreju" +msgstr "Pievienot %d tulkojumus" #: editor/project_settings_editor.cpp msgid "Remove Translation" @@ -10999,7 +10943,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Project Settings (project.godot)" -msgstr "" +msgstr "Projekta iestatījumi (project.godot)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" @@ -11015,16 +10959,15 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Input Map" -msgstr "" +msgstr "Ievade" #: editor/project_settings_editor.cpp msgid "Action:" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Action" -msgstr "Visa Izvēle" +msgstr "Darbība" #: editor/project_settings_editor.cpp msgid "Deadzone" @@ -11040,7 +10983,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Localization" -msgstr "" +msgstr "Lokalizācija" #: editor/project_settings_editor.cpp msgid "Translations" @@ -11092,16 +11035,15 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Plugins" -msgstr "" +msgstr "Spraudņi" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Import Defaults" -msgstr "Ielādēt Noklusējumu" +msgstr "Importēt noklusējumus" #: editor/property_editor.cpp msgid "Preset..." -msgstr "" +msgstr "Priekš-iestatījums..." #: editor/property_editor.cpp msgid "Zero" @@ -11160,9 +11102,8 @@ msgid "Batch Rename" msgstr "" #: editor/rename_dialog.cpp -#, fuzzy msgid "Replace:" -msgstr "Aizvietot: " +msgstr "Aizvietot:" #: editor/rename_dialog.cpp msgid "Prefix:" @@ -11273,9 +11214,8 @@ msgid "To Uppercase" msgstr "" #: editor/rename_dialog.cpp -#, fuzzy msgid "Reset" -msgstr "Atiestatīt tālummaiņu" +msgstr "Atiestatīt" #: editor/rename_dialog.cpp msgid "Regular Expression Error:" @@ -11327,7 +11267,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Error loading scene from %s" -msgstr "" +msgstr "Kļūda ielādējot ainu no %s" #: editor/scene_tree_dock.cpp msgid "" @@ -11352,14 +11292,12 @@ msgid "Can't paste root node into the same scene." msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" -msgstr "Dublicēt atslēgvietnes" +msgstr "Ielīmēt mezglu(s)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Detach Script" -msgstr "Galvenais Skripts:" +msgstr "Atvienot skriptu" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on the tree root." @@ -11394,9 +11332,8 @@ msgid "Make node as Root" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Izdzēst %d mezglus?" +msgstr "Dzēst %d mezglus un to bērnus?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -11404,11 +11341,11 @@ msgstr "Izdzēst %d mezglus?" #: editor/scene_tree_dock.cpp msgid "Delete the root node \"%s\"?" -msgstr "" +msgstr "Dzēst saknes mezglu \"%s\"?" #: editor/scene_tree_dock.cpp msgid "Delete node \"%s\" and its children?" -msgstr "" +msgstr "Dzēst mezglu \"%s\" un tā bērnus?" #: editor/scene_tree_dock.cpp msgid "Delete node \"%s\"?" @@ -11442,7 +11379,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." -msgstr "" +msgstr "Saglabāt jaunu ainu kā..." #: editor/scene_tree_dock.cpp msgid "" @@ -11470,20 +11407,19 @@ msgstr "Izveidot Cilmes Mezglu:" #: editor/scene_tree_dock.cpp msgid "2D Scene" -msgstr "" +msgstr "2D Aina" #: editor/scene_tree_dock.cpp msgid "3D Scene" -msgstr "" +msgstr "3D Aina" #: editor/scene_tree_dock.cpp msgid "User Interface" -msgstr "" +msgstr "Lietotāja interfeiss" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Other Node" -msgstr "Izdzēst" +msgstr "Cits mezgls" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" @@ -11499,12 +11435,11 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Attach Script" -msgstr "" +msgstr "Pievienot skriptu" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" -msgstr "Dublicēt atslēgvietnes" +msgstr "Izgriezt mezglu(s)" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -11512,7 +11447,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Change type of node(s)" -msgstr "" +msgstr "Mezgla(-u) tipa maiņa" #: editor/scene_tree_dock.cpp msgid "" @@ -11553,7 +11488,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Add Child Node" -msgstr "" +msgstr "Pievienot bērna mezglu" #: editor/scene_tree_dock.cpp msgid "Expand/Collapse All" @@ -11561,12 +11496,11 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Change Type" -msgstr "" +msgstr "Mainīt tipu" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Reparent to New Node" -msgstr "Izveidot Jaunu %s" +msgstr "Pakļaut zem jauna mezgla" #: editor/scene_tree_dock.cpp msgid "Make Scene Root" @@ -11574,15 +11508,15 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" -msgstr "" +msgstr "Sapludināt no ainas" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Save Branch as Scene" -msgstr "" +msgstr "Saglabāt zaru kā ainu" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Copy Node Path" -msgstr "" +msgstr "Kopēt mezgla ceļu" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" @@ -11600,7 +11534,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script to the selected node." -msgstr "" +msgstr "Pievienot jaunu vai eksistējošu skriptu izvēlētajam mezglam." #: editor/scene_tree_dock.cpp msgid "Detach the script from the selected node." @@ -11662,6 +11596,8 @@ msgid "" "Node is in %s group(s).\n" "Click to show groups dock." msgstr "" +"Mezgls ir %s grupās.\n" +"Klikšķini, lai parādītu grupu doku." #: editor/scene_tree_editor.cpp msgid "Open Script:" @@ -11681,7 +11617,7 @@ msgstr "" #: editor/scene_tree_editor.cpp msgid "Toggle Visibility" -msgstr "" +msgstr "Pārslēgt redzamību" #: editor/scene_tree_editor.cpp msgid "" @@ -11722,9 +11658,8 @@ msgid "Path is not local." msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid base path." -msgstr "Nederīgs nosaukums." +msgstr "Nederīgs bāzes ceļš." #: editor/script_create_dialog.cpp msgid "A directory with the same name exists." @@ -11735,9 +11670,8 @@ msgid "File does not exist." msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid extension." -msgstr "Nederīgs fonta izmērs." +msgstr "Nederīgs paplašinājums." #: editor/script_create_dialog.cpp msgid "Wrong extension chosen." @@ -11780,9 +11714,8 @@ msgid "Invalid path." msgstr "Nederīgs ceļš." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid class name." -msgstr "Nederīgs nosaukums." +msgstr "Nederīgs klases nosaukums." #: editor/script_create_dialog.cpp msgid "Invalid inherited parent name or path." @@ -11790,7 +11723,7 @@ msgstr "" #: editor/script_create_dialog.cpp msgid "Script path/name is valid." -msgstr "" +msgstr "Skripta ceļš/nosaukums ir derīgs." #: editor/script_create_dialog.cpp msgid "Allowed: a-z, A-Z, 0-9, _ and ." @@ -11805,9 +11738,8 @@ msgid "Will create a new script file." msgstr "Izveidos jaunu skripta failu." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will load an existing script file." -msgstr "Ielādēt eksistējošu Kopnes Izkārtojumu." +msgstr "Ielādēs eksistējošu skriptu." #: editor/script_create_dialog.cpp msgid "Script file already exists." @@ -11827,20 +11759,19 @@ msgstr "" #: editor/script_create_dialog.cpp msgid "Class Name:" -msgstr "" +msgstr "Klases nosaukums:" #: editor/script_create_dialog.cpp msgid "Template:" -msgstr "" +msgstr "Šablons:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Savieno Signālu:" +msgstr "Iebūvētais skripts:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" -msgstr "" +msgstr "Pievienot mezgla skriptu" #: editor/script_editor_debugger.cpp msgid "Remote " @@ -11855,9 +11786,8 @@ msgid "Warning:" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Error:" -msgstr "Kļūme lādējot:" +msgstr "Kļūda:" #: editor/script_editor_debugger.cpp msgid "C++ Error" @@ -11868,9 +11798,8 @@ msgid "C++ Error:" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Source" -msgstr "Resurs" +msgstr "C++ avots" #: editor/script_editor_debugger.cpp msgid "Source:" @@ -11886,7 +11815,7 @@ msgstr "" #: editor/script_editor_debugger.cpp msgid "Errors" -msgstr "" +msgstr "Kļūdas" #: editor/script_editor_debugger.cpp msgid "Child process connected." @@ -11905,9 +11834,8 @@ msgid "Video RAM" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Skip Breakpoints" -msgstr "Izveidot" +msgstr "Izlaist pārrāvumpunktus" #: editor/script_editor_debugger.cpp msgid "Inspect Previous Instance" @@ -11975,7 +11903,7 @@ msgstr "" #: editor/script_editor_debugger.cpp msgid "Misc" -msgstr "" +msgstr "Citi" #: editor/script_editor_debugger.cpp msgid "Clicked Control:" @@ -12155,11 +12083,11 @@ msgstr "" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Library" -msgstr "" +msgstr "Bibliotēka" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Libraries: " -msgstr "" +msgstr "Bibliotēkas: " #: modules/gdnative/register_types.cpp msgid "GDNative" @@ -12238,23 +12166,20 @@ msgid "GridMap Delete Selection" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Fill Selection" -msgstr "Visa Izvēle" +msgstr "Režģkartes pildīšanas izvēle" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Paste Selection" -msgstr "Visa Izvēle" +msgstr "Režģkartes ielīmēšanas izvēle" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paint" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Selection" -msgstr "Visa Izvēle" +msgstr "Režģkartes izvēle" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" @@ -12317,18 +12242,16 @@ msgid "Cursor Clear Rotation" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Paste Selects" -msgstr "Visa Izvēle" +msgstr "Ielīmēt izvēlnes" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clear Selection" msgstr "" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Fill Selection" -msgstr "Visa Izvēle" +msgstr "Aizpildīt izvēlni" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -12379,9 +12302,8 @@ msgid "Class name can't be a reserved keyword" msgstr "" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Visa Izvēle" +msgstr "Būvēt risinājumu" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -12445,7 +12367,7 @@ msgstr "" #: modules/recast/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "Darīts!" #: modules/visual_script/visual_script.cpp msgid "" @@ -12506,21 +12428,16 @@ msgid "Add Output Port" msgstr "Pievienot Izejas Pieslēgvietu" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Port Type" -msgstr "Nomainīt %s Tipu" +msgstr "Mainīt porta tipu" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Port Name" -msgstr "Izmainīt masīva vērtību" +msgstr "Mainīt porta nosaukumu" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Override an existing built-in function." -msgstr "" -"Nederīgs nosaukums. Nedrīkst sadurties ar eksistējošu iebūvēto tipa " -"nosaukumu." +msgstr "Pārrakstīt eksistējošu iebūvēto funkciju." #: modules/visual_script/visual_script_editor.cpp msgid "Create a new function." @@ -12536,7 +12453,7 @@ msgstr "Izveidot jaunu mainīgo." #: modules/visual_script/visual_script_editor.cpp msgid "Signals:" -msgstr "" +msgstr "Signāli:" #: modules/visual_script/visual_script_editor.cpp msgid "Create a new signal." @@ -12567,9 +12484,8 @@ msgid "Add Function" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" -msgstr "Noņemt Izvēlēto" +msgstr "Dzēst ienākošo portu" #: modules/visual_script/visual_script_editor.cpp msgid "Add Variable" @@ -12580,14 +12496,12 @@ msgid "Add Signal" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" -msgstr "Noņemt Izvēlēto" +msgstr "Noņemt ienākošo portu" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" -msgstr "Noņemt Izvēlēto" +msgstr "Noņemt izejas portu" #: modules/visual_script/visual_script_editor.cpp msgid "Change Expression" @@ -12630,9 +12544,8 @@ msgid "Add Preload Node" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Node(s)" -msgstr "Pievienot Mezglus..." +msgstr "Pievienot Mezglu(s)" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -12669,9 +12582,8 @@ msgid "Connect Nodes" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "Savienot" +msgstr "Atvienot mezglus" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -12718,9 +12630,8 @@ msgid "Try to only have one sequence input in selection." msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "Izveidot Jaunu %s" +msgstr "Izveidot funkciju" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -12897,14 +12808,12 @@ msgid "Exporting APK..." msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Uninstalling..." -msgstr "Instalēt..." +msgstr "Atinstalē..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Installing to device, please wait..." -msgstr "Ielādēt..." +msgstr "Instalē ierīcē, lūdzu uzgaidi..." #: platform/android/export/export_plugin.cpp msgid "Could not install to device: %s" @@ -13103,9 +13012,8 @@ msgid "" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: %s" -msgstr "Animācija netika atrasta: '%s'" +msgstr "Paka nav atrasta: %s" #: platform/android/export/export_plugin.cpp msgid "Creating APK..." @@ -13126,9 +13034,8 @@ msgid "" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Adding files..." -msgstr "Pievienot Mezglus..." +msgstr "Failu pievienošana..." #: platform/android/export/export_plugin.cpp msgid "Could not export project files" @@ -13203,9 +13110,8 @@ msgid "Error starting HTTP server:" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid bundle identifier:" -msgstr "Nederīgs Identifikators:" +msgstr "Nederīgs bunduļa identifikators:" #: platform/osx/export/export.cpp msgid "Notarization: code signing required." @@ -13224,34 +13130,28 @@ msgid "Notarization: Apple ID password not specified." msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid package short name." -msgstr "Nederīgs nosaukums." +msgstr "Nederīgs paketes īsais nosaukums." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid package unique name." -msgstr "Nederīgs nosaukums." +msgstr "Nederīgs paketes unikālais nosaukums." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid package publisher display name." -msgstr "Nederīgs nosaukums." +msgstr "Nederīgs paketes izdevēja displeja vārds." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid product GUID." -msgstr "Nederīgs nosaukums." +msgstr "Nederīgs produkta GUID." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid publisher GUID." -msgstr "Nederīgs fonta izmērs." +msgstr "Nederīgs izdevēja GUID." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid background color." -msgstr "Nederīgs nosaukums." +msgstr "Nederīga fona krāsa." #: platform/uwp/export/export.cpp msgid "Invalid Store Logo image dimensions (should be 50x50)." @@ -13806,12 +13706,11 @@ msgstr "" #: scene/animation/animation_tree.cpp msgid "In node '%s', invalid animation: '%s'." -msgstr "" +msgstr "Mezglā '%s', nederīga animācija: '%s'." #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Invalid animation: '%s'." -msgstr "Nederīgs fonta izmērs." +msgstr "Nederīga animācija: '%s'." #: scene/animation/animation_tree.cpp msgid "Nothing connected to input '%s' of node '%s'." @@ -13835,7 +13734,7 @@ msgstr "" #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." -msgstr "" +msgstr "Šis mezgls ir novecojis. Tā vietā izmanto AnimationTree." #: scene/gui/color_picker.cpp msgid "" @@ -13846,7 +13745,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." -msgstr "" +msgstr "Izvēlēties krāsu no redaktora loga." #: scene/gui/color_picker.cpp msgid "HSV" @@ -13854,7 +13753,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "Raw" -msgstr "" +msgstr "Jēls" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -13883,15 +13782,15 @@ msgstr "Brīdinājums!" #: scene/gui/dialogs.cpp msgid "Please Confirm..." -msgstr "Lūdzu Apstipriniet..." +msgstr "Lūdzu apstipriniet..." #: scene/gui/file_dialog.cpp msgid "Must use a valid extension." -msgstr "" +msgstr "Jābūt derīgai galotnei." #: scene/gui/graph_edit.cpp msgid "Enable grid minimap." -msgstr "" +msgstr "Iespējot režģa minikarti." #: scene/gui/nine_patch_rect.cpp msgid "" @@ -13907,6 +13806,9 @@ msgid "" "functions. Making them visible for editing is fine, but they will hide upon " "running." msgstr "" +"Uznirstošie logi ir paslēpti pēc noklusējuma, lai tos parādītu, izmanto ." +"popup() vai jebkuru no to funkcijām. Padarīt tos redzamus rediģēšanai ir " +"labi, bet tie tiks paslēpti pēc palaišanas." #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." @@ -13928,6 +13830,16 @@ msgid "" "Default Environment as specified in Project Settings (Rendering -> " "Environment -> Default Environment) could not be loaded." msgstr "" +"Noklusējuma vide, kas norādīta projekta iestatījumos, nevar tikt ielādēta. " +"(Projekta iestatījumi -> Renderēšana -> vide -> noklusējuma vide)." + +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" #: scene/main/viewport.cpp msgid "" @@ -13938,7 +13850,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp @@ -13952,19 +13866,16 @@ msgid "" msgstr "" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid source for preview." -msgstr "Nederīgs fonta izmērs." +msgstr "Nederīgs avots priekšskatījumam." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid source for shader." -msgstr "Nederīgs fonta izmērs." +msgstr "Nederīgs fēnotāja avots." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "Nederīgs fonta izmērs." +msgstr "Nederīgs funkcijas salīdzinājums tās tipam." #: servers/visual/shader_language.cpp msgid "Varying may not be assigned in the '%s' function." @@ -13996,7 +13907,7 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "Konstantes nevar pārveidot." #~ msgid "Package Contents:" #~ msgstr "Paketes Saturs:" @@ -14047,10 +13958,6 @@ msgstr "" #~ msgstr "Nederīgs fonta izmērs." #, fuzzy -#~ msgid "Previous Folder" -#~ msgstr "Izvēlēties šo Mapi" - -#, fuzzy #~ msgid "Next Folder" #~ msgstr "Izvēlēties šo Mapi" diff --git a/editor/translations/mi.po b/editor/translations/mi.po index 456d89671e..6afda28ec5 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -6,6 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "Language: mi\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" @@ -2312,6 +2313,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2428,6 +2437,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2747,10 +2760,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4150,15 +4159,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7039,11 +7056,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7389,11 +7406,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7453,7 +7470,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7461,6 +7478,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7798,6 +7819,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10543,11 +10584,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13655,6 +13696,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13664,7 +13713,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/mk.po b/editor/translations/mk.po index 26d14a75ba..93b4e2afe1 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -4,18 +4,20 @@ # This file is distributed under the same license as the Godot source code. # # Kristijan Fremen Velkovski <me@krisfremen.com>, 2021. +# Denis <densisman@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2021-01-22 10:21+0000\n" -"Last-Translator: Kristijan Fremen Velkovski <me@krisfremen.com>\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" +"PO-Revision-Date: 2021-11-18 13:37+0000\n" +"Last-Translator: Denis <densisman@gmail.com>\n" "Language-Team: Macedonian <https://hosted.weblate.org/projects/godot-engine/" "godot/mk/>\n" "Language: mk\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -38,7 +40,7 @@ msgstr "Невалидено внесување %i (не додадено) во #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "self неможе да се користи зашто инстанцата е нула(не дадена)" +msgstr "селф не може да се користи бидејќи инстанцата е нула (не минува)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -219,7 +221,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Add Track" -msgstr "" +msgstr "Додади Лента" #: editor/animation_track_editor.cpp msgid "Animation Looping" @@ -1795,7 +1797,7 @@ msgstr "" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp msgid "Import" -msgstr "" +msgstr "Импортирај" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" @@ -2203,7 +2205,7 @@ msgstr "" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" -msgstr "" +msgstr "Јазол" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" @@ -2320,6 +2322,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2436,6 +2446,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2755,10 +2769,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4159,15 +4169,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7054,11 +7072,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7404,11 +7422,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7468,7 +7486,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7476,6 +7494,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7813,6 +7835,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10558,11 +10600,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13670,6 +13712,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13679,7 +13729,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/ml.po b/editor/translations/ml.po index b9f86d4cf2..7fcb0ea508 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -8,6 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2019-11-09 22:04+0000\n" "Last-Translator: Anvar Nazar <anvarnasar@ymail.com>\n" @@ -2327,6 +2328,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2443,6 +2452,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2762,10 +2775,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4166,15 +4175,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7063,11 +7080,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7413,11 +7430,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7477,7 +7494,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7485,6 +7502,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7822,6 +7843,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10568,11 +10609,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13682,6 +13723,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13691,7 +13740,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/mr.po b/editor/translations/mr.po index e305a8b937..8b63ae3338 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -7,6 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2020-12-23 22:57+0000\n" "Last-Translator: Prachi Joshi <josprachi@yahoo.com>\n" "Language-Team: Marathi <https://hosted.weblate.org/projects/godot-engine/" @@ -2320,6 +2321,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2436,6 +2445,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2755,10 +2768,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4159,15 +4168,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7052,11 +7069,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7402,11 +7419,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7466,7 +7483,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7474,6 +7491,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7812,6 +7833,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10560,11 +10601,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13674,6 +13715,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13683,7 +13732,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/ms.po b/editor/translations/ms.po index ca77c01937..a6c0097736 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -10,12 +10,14 @@ # keviinx <keviinx@yahoo.com>, 2020. # Keviindran Ramachandran <keviinx@yahoo.com>, 2020, 2021. # Jacque Fresco <aidter@use.startmail.com>, 2021. +# Lemoney <railkill@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-08-22 22:46+0000\n" -"Last-Translator: Keviindran Ramachandran <keviinx@yahoo.com>\n" +"PO-Revision-Date: 2021-10-10 10:18+0000\n" +"Last-Translator: Lemoney <railkill@gmail.com>\n" "Language-Team: Malay <https://hosted.weblate.org/projects/godot-engine/godot/" "ms/>\n" "Language: ms\n" @@ -23,7 +25,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -376,9 +378,8 @@ msgstr "nod '%s'" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "animation" -msgstr "Set Peralihan ke:" +msgstr "animasi" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." @@ -386,9 +387,8 @@ msgstr "AnimationPlayer tidak animasikan dirinya sendiri, hanya pemain lain." #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "property '%s'" -msgstr "Sifat" +msgstr "sifat '%s'" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -618,9 +618,8 @@ msgid "Use Bezier Curves" msgstr "Guna Lengkung Bezier" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Create RESET Track(s)" -msgstr "Tampal Trek" +msgstr "Cipta Trek RESET" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -948,7 +947,6 @@ msgid "Edit..." msgstr "Edit..." #: editor/connections_dialog.cpp -#, fuzzy msgid "Go to Method" msgstr "Pergi ke Kaedah" @@ -1070,18 +1068,16 @@ msgid "Owners Of:" msgstr "Pemilik:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"Alih keluar fail terpilih dari projek? (Tidak boleh buat asal)\n" -"Anda boleh mencari fail yang dikeluarkan dalam tong sampah untuk " -"memulihkannya." +"Keluarkan fail terpilih dari projek? (Tidak boleh buat asal.)\n" +"Bergantung kepada konfigurasi sistem fail anda, fail yang dikeluarkan akan " +"dipindah ke tong sampah atau dipadamkan secara kekal." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1091,9 +1087,9 @@ msgid "" msgstr "" "Fail yang akan dikeluarkan diperlukan oleh sumber lain agar dapat " "berfungsi.\n" -"Masih mahu keluarkan fail tersebut? (tidak boleh buat asal)\n" -"Anda boleh mencari fail yang dikeluarkan dalam tong sampah untuk " -"memulihkannya." +"Masih mahu keluarkan fail tersebut? (Tidak boleh buat asal.)\n" +"Bergantung kepada konfigurasi sistem fail anda, fail yang dikeluarkan akan " +"dipindah ke tong sampah atau dipadamkan secara kekal." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1263,14 +1259,12 @@ msgid "Licenses" msgstr "Lesen" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Error opening asset file for \"%s\" (not in ZIP format)." -msgstr "Ralat semasa membuka fail pakej, bukan dalam format ZIP." +msgstr "Ralat membuka fail aset untuk \"%s\" (bukan dalam format ZIP)." #: editor/editor_asset_installer.cpp -#, fuzzy msgid "%s (already exists)" -msgstr "%s (Sudah Wujud)" +msgstr "%s (sudah wujud)" #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" @@ -1285,19 +1279,16 @@ msgid "Uncompressing Assets" msgstr "Nyahmampatkan Aset" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "The following files failed extraction from asset \"%s\":" -msgstr "Fail berikut gagal diekstrak dari pakej:" +msgstr "Fail berikut gagal diekstrak dari aset \"%s\":" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "(and %s more files)" -msgstr "Dan sebanyak %s fail." +msgstr "(dan %s fail lagi)" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset \"%s\" installed successfully!" -msgstr "Pakej berjaya dipasang!" +msgstr "Aset \"%s\" berjaya dipasang!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -1309,9 +1300,8 @@ msgid "Install" msgstr "Pasang" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset Installer" -msgstr "Pemasang Pakej" +msgstr "Pemasang Aset" #: editor/editor_audio_buses.cpp msgid "Speakers" @@ -1374,9 +1364,8 @@ msgid "Bypass" msgstr "Pintas" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Bus Options" -msgstr "Pilihan bas" +msgstr "Pilihan Bas" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -1761,36 +1750,39 @@ msgstr "Memberikan akses terbina dalam kepada Perpustakaan Aset." #: editor/editor_feature_profile.cpp msgid "Allows editing the node hierarchy in the Scene dock." -msgstr "" +msgstr "Membenarkan suntingan hierarki nod di dalam dok Adegan." #: editor/editor_feature_profile.cpp msgid "" "Allows to work with signals and groups of the node selected in the Scene " "dock." msgstr "" +"Membenarkan fungsi isyarat dan kumpulan nod yang telah dipilih di dalam dok " +"Adegan." #: editor/editor_feature_profile.cpp msgid "Allows to browse the local file system via a dedicated dock." -msgstr "" +msgstr "Membenarkan semakan sistem fail lokal melalui dok yang khas." #: editor/editor_feature_profile.cpp msgid "" "Allows to configure import settings for individual assets. Requires the " "FileSystem dock to function." msgstr "" +"Membenarkan konfigurasi tetapan import untuk setiap aset. Memerlukan dok " +"FileSystem untuk berfungsi." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(current)" -msgstr "(Semasa)" +msgstr "(semasa)" #: editor/editor_feature_profile.cpp msgid "(none)" -msgstr "" +msgstr "(tiada)" #: editor/editor_feature_profile.cpp msgid "Remove currently selected profile, '%s'? Cannot be undone." -msgstr "" +msgstr "Keluarkan profil, '%s' yang sedang dipilih? Tidak boleh dibuat asal." #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -1821,19 +1813,16 @@ msgid "Enable Contextual Editor" msgstr "Aktifkan Editor Kontekstual" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Properties:" -msgstr "Tutup Semua Sifat-sifat" +msgstr "Sifat-sifat Kelas:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Main Features:" -msgstr "Ciri Diaktifkan:" +msgstr "Ciri-ciri Utama:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Nodes and Classes:" -msgstr "Kelas Diaktifkan:" +msgstr "Nod-nod dan Kelas-kelas:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." @@ -1861,14 +1850,12 @@ msgid "Current Profile:" msgstr "Profil Semasa:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Create Profile" -msgstr "Padam Profil" +msgstr "Cipta Profil" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Remove Profile" -msgstr "Buang Trek Anim" +msgstr "Keluarkan Profil" #: editor/editor_feature_profile.cpp msgid "Available Profiles:" @@ -1888,18 +1875,18 @@ msgid "Export" msgstr "Eksport" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Configure Selected Profile:" -msgstr "Profil Semasa:" +msgstr "Kemas Kini Profil Terpilih:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Extra Options:" -msgstr "Pilihan Kelas:" +msgstr "Pilihan Tambahan:" #: editor/editor_feature_profile.cpp msgid "Create or import a profile to edit available classes and properties." msgstr "" +"Cipta atau import sebuah profil untuk menyunting kelas-kelas dan sifat-sifat " +"yang ada." #: editor/editor_feature_profile.cpp msgid "New profile name:" @@ -1926,9 +1913,8 @@ msgid "Select Current Folder" msgstr "Pilih Folder Semasa" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "File exists, overwrite?" -msgstr "Fail Wujud, Tulis Ganti?" +msgstr "Fail wujud, tulis ganti?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select This Folder" @@ -2246,7 +2232,7 @@ msgstr "Sifat:" #: editor/editor_inspector.cpp editor/scene_tree_dock.cpp #: modules/visual_script/visual_script_property_selector.cpp msgid "Set %s" -msgstr "" +msgstr "Tetapkan %s" #: editor/editor_inspector.cpp msgid "Set Multiple:" @@ -2326,6 +2312,9 @@ msgid "" "Update Continuously is enabled, which can increase power usage. Click to " "disable it." msgstr "" +"Berputar apabila tingkap editor dilukis semula.\n" +"Kemas Kini Secara Berterusan adalah aktif, ia boleh meningkatkan penggunaan " +"kuasa. Klik untuk nyahaktifkannya." #: editor/editor_node.cpp msgid "Spins when the editor window redraws." @@ -2423,6 +2412,15 @@ msgstr "" "Tidak dapat menyimpan adegan. Kemungkinan kebergantungan (instance atau " "warisan) tidak dapat dipenuhi." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Tidak dapat memulakan subproses!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Simpan Semua Adegan-adegan" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Tidak boleh tulis ganti adegan yang masih terbuka!" @@ -2559,6 +2557,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Simpan perubahan pada '%s' sebelum menutup?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2908,10 +2910,6 @@ msgid "Save Scene" msgstr "Simpan Adegan" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Simpan Semua Adegan-adegan" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Tukar Kepada..." @@ -2979,9 +2977,8 @@ msgid "Orphan Resource Explorer..." msgstr "Penjelajah Sumber Yatim..." #: editor/editor_node.cpp -#, fuzzy msgid "Reload Current Project" -msgstr "Profil Semasa:" +msgstr "Muat Semula Projek Semasa" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -3422,9 +3419,8 @@ msgid "Update" msgstr "Kemas kini" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Version" -msgstr "Versi:" +msgstr "Versi" #: editor/editor_plugin_settings.cpp #, fuzzy @@ -3711,9 +3707,8 @@ msgid "Can't resolve the requested address." msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't connect to the mirror." -msgstr "Tidak dapat menyambung." +msgstr "Tidak dapat menyambung ke tapak web." #: editor/export_template_manager.cpp #, fuzzy @@ -4418,6 +4413,18 @@ msgid "Clear Default for '%s'" msgstr "Kosongkan Lalai untuk '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Import semula" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Import Sebagai:" @@ -4426,10 +4433,6 @@ msgid "Preset" msgstr "Pratetap" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Import semula" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Simpan Adegan, Import semula, dan Mula Semula" @@ -7348,12 +7351,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Skrip Baru" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Tab sebelumnya" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7699,11 +7704,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7765,7 +7770,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7773,6 +7778,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8119,6 +8128,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10940,11 +10969,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14089,6 +14118,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14098,7 +14135,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 0b9333655f..0a8064f763 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -18,12 +18,15 @@ # Patrick Sletvold <patricksletvold@hotmail.com>, 2021. # Kristoffer <kskau93@gmail.com>, 2021. # Lili Zoey <sayaks1@gmail.com>, 2021. +# slasken06 <ask.skivdal@gmail.com>, 2021. +# Daniel Skogly <daniel@klungo.no>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-08-12 21:32+0000\n" -"Last-Translator: Petter Reinholdtsen <pere-weblate@hungry.com>\n" +"PO-Revision-Date: 2021-11-03 13:15+0000\n" +"Last-Translator: Daniel Skogly <daniel@klungo.no>\n" "Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/godot-" "engine/godot/nb_NO/>\n" "Language: nb\n" @@ -31,7 +34,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2504,6 +2507,15 @@ msgstr "" "Kunne ikke lagre scene. Sannsynligvis kunne ikke avhengigheter (instanser " "eller arvinger) oppfylles." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Kunne ikke starta subprosess!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Lagre Alle Scener" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Kan ikke overskrive en scene som fortsatt er åpen!" @@ -2640,6 +2652,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Lagre endringer til '%s' før lukking?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2993,10 +3009,6 @@ msgid "Save Scene" msgstr "Lagre Scene" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Lagre Alle Scener" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Konverter Til..." @@ -4552,6 +4564,18 @@ msgid "Clear Default for '%s'" msgstr "Fjern Standard for '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reimporter" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importer Som:" @@ -4561,10 +4585,6 @@ msgid "Preset" msgstr "Preset..." #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Reimporter" - -#: editor/import_dock.cpp #, fuzzy msgid "Save Scenes, Re-Import, and Restart" msgstr "Lagre scener, om-importer og start om" @@ -7694,11 +7714,13 @@ msgid "Move Down" msgstr "Flytt Ned" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Neste skript" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Forrige skript" #: editor/plugins/script_editor_plugin.cpp @@ -8060,15 +8082,15 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Create Rest Pose from Bones" msgstr "Fjern Ben" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" -msgstr "" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Skeleton2D" msgstr "Singleton" @@ -8134,7 +8156,7 @@ msgstr "Venstre knapp" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "Perspektiv" #: editor/plugins/spatial_editor_plugin.cpp @@ -8143,6 +8165,11 @@ msgid "Right Orthogonal" msgstr "Høyre knapp" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Right Perspective" +msgstr "Perspektiv" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8501,6 +8528,27 @@ msgid "Right View" msgstr "Høyrevisning" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Frontvisning" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Bytt Perspektiv/Ortogonal Fremvisning" @@ -11486,11 +11534,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14779,6 +14827,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14788,7 +14844,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/nl.po b/editor/translations/nl.po index d588afb791..669ed2e73d 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -49,12 +49,15 @@ # Vancha March <tjipkevdh@gmail.com>, 2021. # Hugo van de Kuilen <hugo.vandekuilen1234567890@gmail.com>, 2021. # tobeqz <vanveenjorik+tobeqz@gmail.com>, 2021. +# Edgar <Edgar@anotherfoxguy.com>, 2021. +# Daan van Luijk <daanvl@outlook.be>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-08-06 19:42+0000\n" -"Last-Translator: tobeqz <vanveenjorik+tobeqz@gmail.com>\n" +"PO-Revision-Date: 2021-11-07 22:23+0000\n" +"Last-Translator: Daan van Luijk <daanvl@outlook.be>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" "Language: nl\n" @@ -62,7 +65,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -412,15 +415,13 @@ msgstr "Anim Invoegen" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "node '%s'" -msgstr "Kan '%s' niet openen." +msgstr "node '%s'" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "animation" -msgstr "Animatie" +msgstr "animatie" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." @@ -428,9 +429,8 @@ msgstr "Animatie-Speler kan zichzelf niet animeren, alleen andere spelers." #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "property '%s'" -msgstr "Eigenschap '%s' bestaat niet." +msgstr "Eigenschap '%s'" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -990,9 +990,8 @@ msgid "Edit..." msgstr "Bewerken..." #: editor/connections_dialog.cpp -#, fuzzy msgid "Go to Method" -msgstr "Naar methode springen" +msgstr "Ga naar methode" #: editor/create_dialog.cpp msgid "Change %s Type" @@ -1608,9 +1607,8 @@ msgid "Name" msgstr "Naam" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Global Variable" -msgstr "Hernoem Variabele" +msgstr "Globale Variabele" #: editor/editor_data.cpp msgid "Paste Params" @@ -1789,6 +1787,8 @@ msgstr "Laat u 3D scenes weergeven en bewerken." #: editor/editor_feature_profile.cpp msgid "Allows to edit scripts using the integrated script editor." msgstr "" +"Staat toe het script aan te passen door middel van de geïntegreerde script " +"editor" #: editor/editor_feature_profile.cpp msgid "Provides built-in access to the Asset Library." @@ -1815,13 +1815,12 @@ msgid "" msgstr "" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(current)" -msgstr "(Huidig)" +msgstr "(huidig)" #: editor/editor_feature_profile.cpp msgid "(none)" -msgstr "" +msgstr "(geen)" #: editor/editor_feature_profile.cpp msgid "Remove currently selected profile, '%s'? Cannot be undone." @@ -2171,7 +2170,7 @@ msgstr "Thema-eigenschappen" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "Enumeratie" +msgstr "Enumeraties" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constants" @@ -2458,6 +2457,15 @@ msgstr "" "Kon de scène niet opslaan. Waarschijnlijk konden afhankelijkheden " "(instanties of erfelijkheden) niet voldaan worden." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Kon het subproces niet opstarten!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Alle scènes opslaan" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Kan geen scènes overschrijven die nog open zijn!" @@ -2595,6 +2603,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Sla wijzigen aan '%s' op voor het afsluiten?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2942,10 +2954,6 @@ msgid "Save Scene" msgstr "Scène opslaan" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Alle scènes opslaan" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Omzetten naar..." @@ -4459,6 +4467,18 @@ msgid "Clear Default for '%s'" msgstr "Wis Standaard voor '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Opnieuw importeren" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importeer als:" @@ -4467,10 +4487,6 @@ msgid "Preset" msgstr "Voorinstellingen" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Opnieuw importeren" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Sla scènes op, importeer opnieuw en start dan opnieuw op" @@ -7467,11 +7483,13 @@ msgid "Move Down" msgstr "Plaats Omlaag" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Volgend script" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Vorig script" #: editor/plugins/script_editor_plugin.cpp @@ -7822,14 +7840,14 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Dit skelet heeft geen botten, maak een aantal Bone2D-knopen als kind." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "CreëerRest Pose vanuit botten" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Botten in rusthouding zetten" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "CreëerRest Pose vanuit botten" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D" @@ -7894,7 +7912,7 @@ msgstr "Orthogonaal" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "Perspectief" #: editor/plugins/spatial_editor_plugin.cpp @@ -7904,6 +7922,11 @@ msgstr "Orthogonaal" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "Perspectief" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "Orthogonaal" @@ -8266,6 +8289,27 @@ msgid "Right View" msgstr "Rechter Zijaanzicht" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Vooraanzicht" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Schakel Perspectief/Orthogonaal Zicht" @@ -11272,14 +11316,14 @@ msgstr "" "`/` karakter bevatten." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Toets " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Toets " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Controllerknop" @@ -14633,6 +14677,14 @@ msgstr "" "De standaard Environment zoals aangegeven in Projectinstellingen " "(Rendering→Environment→Default Environment) kon niet worden geladen." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14646,7 +14698,10 @@ msgstr "" "van en wijs zijn interne textuur toe aan een knoop om te tonen." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +#, fuzzy +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" "De grootte van een Viewport moet groter zijn dan 0 om iets weer te geven." diff --git a/editor/translations/or.po b/editor/translations/or.po index c1036fa702..202b73cddc 100644 --- a/editor/translations/or.po +++ b/editor/translations/or.po @@ -6,6 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2019-08-11 10:23+0000\n" "Last-Translator: Pro Neon <proneon267@gmail.com>\n" "Language-Team: Odia <https://hosted.weblate.org/projects/godot-engine/godot/" @@ -2318,6 +2319,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2434,6 +2443,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2753,10 +2766,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4156,15 +4165,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7045,11 +7062,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7395,11 +7412,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7459,7 +7476,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7467,6 +7484,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7804,6 +7825,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10549,11 +10590,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13661,6 +13702,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13670,7 +13719,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 7a5a0eb037..2ca074c533 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -16,14 +16,14 @@ # Karol Walasek <coreconviction@gmail.com>, 2016. # Maksymilian Świąć <maksymilian.swiac@gmail.com>, 2017-2018. # Mietek Szcześniak <ravaging@go2.pl>, 2016. -# NeverK <neverkoxu@gmail.com>, 2018, 2019, 2020. +# NeverK <neverkoxu@gmail.com>, 2018, 2019, 2020, 2021. # Rafal Brozio <rafal.brozio@gmail.com>, 2016, 2019, 2020, 2021. # Rafał Ziemniak <synaptykq@gmail.com>, 2017. # RM <synaptykq@gmail.com>, 2018, 2020. # Sebastian Krzyszkowiak <dos@dosowisko.net>, 2017. # Sebastian Pasich <sebastian.pasich@gmail.com>, 2017, 2019, 2020. # siatek papieros <sbigneu@gmail.com>, 2016. -# Zatherz <zatherz@linux.pl>, 2017, 2020. +# Zatherz <zatherz@linux.pl>, 2017, 2020, 2021. # Tomek <kobewi4e@gmail.com>, 2018, 2019, 2020, 2021. # Wojcieh Er Zet <wojcieh.rzepecki@gmail.com>, 2018. # Dariusz Siek <dariuszynski@gmail.com>, 2018, 2019, 2020, 2021. @@ -38,7 +38,7 @@ # Myver <igormakarowicz@gmail.com>, 2019. # Maciej Chamera <chameramaciej@gmail.com>, 2019. # Cezary Stasiak <cezary.p.stasiak@gmail.com>, 2019. -# Jan Ligudziński <jan.ligudzinski@gmail.com>, 2020. +# Jan Ligudziński <jan.ligudzinski@gmail.com>, 2020, 2021. # Adam Jagoda <kontakt@lukasz.xyz>, 2020. # Filip Glura <mcmr.slendy@gmail.com>, 2020. # Roman Skiba <romanskiba0@gmail.com>, 2020. @@ -49,11 +49,15 @@ # vrid <patryksoon@live.com>, 2021. # Suchy Talerz <kacperkubis06@gmail.com>, 2021. # Bartosz Stasiak <bs97086@amu.edu.pl>, 2021. +# Marek Malaria <to.tylko.dla.kont@gmail.com>, 2021. +# Mateusz Żak <matisgramy@gmail.com>, 2021. +# voltinus <voltinusmail@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-15 00:46+0000\n" +"PO-Revision-Date: 2021-10-31 22:17+0000\n" "Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" @@ -2436,6 +2440,14 @@ msgstr "" "Nie udało się zapisać sceny. Najprawdopodobniej pewne zależności " "(instancjonowanie lub dziedziczenie) nie są spełnione." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Nie można zapisać jednej lub więcej scen!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Zapisz wszystkie sceny" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Nie można nadpisać sceny, która wciąż jest otwarta!" @@ -2573,6 +2585,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Zapisać zmiany w \"%s\" przed zamknięciem?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s już nie istnieje! Określ nową lokalizację zapisu." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2618,29 +2634,27 @@ msgstr "Aktualna scena nie została zapisana. Otworzyć mimo to?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Nie można cofnąć akcji kiedy przyciski myszy są wciśnięte." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Nie ma nic do cofnięcia." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Cofnij" +msgstr "Cofnij: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Nie można ponowić kiedy przyciski myszy są wciśnięte." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Nie ma nic do ponowienia." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Ponów" +msgstr "Ponów: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2923,10 +2937,6 @@ msgid "Save Scene" msgstr "Zapisz scenę" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Zapisz wszystkie sceny" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Konwertuj na..." @@ -3324,9 +3334,8 @@ msgid "Merge With Existing" msgstr "Połącz z Istniejącym" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Zmiana transformacji" +msgstr "Zastosuj transformacje MeshInstance" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3442,7 +3451,7 @@ msgstr "Status" #: editor/editor_profiler.cpp msgid "Measure:" -msgstr "Zmierzono:" +msgstr "Pomiar:" #: editor/editor_profiler.cpp msgid "Frame Time (ms)" @@ -3587,7 +3596,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Szybkie załadowanie" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -4407,6 +4416,22 @@ msgid "Clear Default for '%s'" msgstr "Usuń domyślne dla \"%s\"" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Importuj ponownie" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Masz niezapisane zmiany, które nie zostały jeszcze zastosowane. Kliknij " +"Importuj ponownie, aby zastosować zmiany dokonane w ustawieniach importu.\n" +"Wybranie innego zasobu w systemie plików bez kliknięcia wpierw Importuj " +"ponownie odrzuci zmiany dokonane w imporcie." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importuj jako:" @@ -4415,10 +4440,6 @@ msgid "Preset" msgstr "Profil" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Importuj ponownie" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Zapisz sceny, reimportuj i uruchom ponownie" @@ -5012,7 +5033,7 @@ msgstr "Poprzedni" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Future" -msgstr "Następny" +msgstr "Przyszłe" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Depth" @@ -5040,7 +5061,7 @@ msgstr "Wymuś białe cieniowanie" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Include Gizmos (3D)" -msgstr "Dołącz Gizmo (3D)" +msgstr "Dołącz uchwyty (3D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pin AnimationPlayer" @@ -5063,7 +5084,7 @@ msgstr "Błąd!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" -msgstr "Czasy przejścia:" +msgstr "Czasy Blendowania:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Next (Auto Queue):" @@ -5071,7 +5092,7 @@ msgstr "Następny (automatyczna kolejka):" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Cross-Animation Blend Times" -msgstr "Czasy przejścia pomiędzy animacjami" +msgstr "Czasy Blendowania Pomiędzy Animacjami" #: editor/plugins/animation_state_machine_editor.cpp msgid "Move Node" @@ -5186,11 +5207,11 @@ msgstr "Skala:" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Fade In (s):" -msgstr "Pojawianie się (s):" +msgstr "Fade In (s):" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Fade Out (s):" -msgstr "Zanikanie (s):" +msgstr "Fade Out (s):" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend" @@ -5273,7 +5294,7 @@ msgstr "Jednorazowy Węzeł" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Mix Node" -msgstr "Wezeł Mieszania" +msgstr "Węzeł Mieszania" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend2 Node" @@ -5297,7 +5318,7 @@ msgstr "Węzeł Przewijania w Czasie" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Transition Node" -msgstr "Węzeł Przejścia" +msgstr "Węzeł Przeobrażenia" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Import Animations..." @@ -5694,15 +5715,13 @@ msgstr "Przesuń CanvasItem \"%s\" na (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Zablokuj wybrane" +msgstr "Zablokowany" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Grupa" +msgstr "Zgrupowany" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5795,7 +5814,7 @@ msgstr "Zachowaj proporcje" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" -msgstr "Tylko zakotwiczenia" +msgstr "Tylko zakotwiczenie" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors and Margins" @@ -5882,7 +5901,7 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp msgid "Zoom Reset" -msgstr "Zresetuj powiększenie" +msgstr "Wyzeruj zbliżenie" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6158,11 +6177,11 @@ msgstr "Instancjonuj scenę tutaj" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "Podwój wielkość siatki" +msgstr "Zwiększ krok siatki 2 razy" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "Zmniejsz wielkość siatki dwukrotnie" +msgstr "Zmniejsz krok siatki 2 razy" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan View" @@ -6218,7 +6237,7 @@ msgstr "Dodawanie %s..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Cannot instantiate multiple nodes without root." -msgstr "Nie można utworzyć wielu węzłów bez węzła głównego." +msgstr "Nie można utworzyć instancji wielu węzłów bez węzła głównego." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6336,7 +6355,7 @@ msgstr "Płaskie 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "Płaskie 1" +msgstr "Flat 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -6648,14 +6667,12 @@ msgid "Remove Selected Item" msgstr "Usuń zaznaczony element" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Import ze sceny" +msgstr "Import ze sceny (ignoruj transformacje)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Import ze sceny" +msgstr "Import ze sceny (zastosuj transformacje)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7245,14 +7262,12 @@ msgid "Flip Portal" msgstr "Odbij portal" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "Wyczyść przekształcenie" +msgstr "Ustaw transformację przesłaniacza" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Utwórz węzeł" +msgstr "Wycentruj węzeł" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7388,11 +7403,11 @@ msgid "Move Down" msgstr "Przesuń w dół" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "Następny skrypt" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "Poprzedni skrypt" #: editor/plugins/script_editor_plugin.cpp @@ -7745,26 +7760,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Ten szkielet nie ma kości. Stwórz jakieś węzły potomne Bone2D." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Utwórz pozę spoczynkową z kości" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Ustaw kościom pozę spoczynkową" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Utwórz pozę spoczynkową z kości" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Szkielet 2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Ustaw kości do pozy spoczynkowej" +msgstr "Resetuj do pozy spoczynkowej" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Nadpisz" +msgstr "Nadpisz pozę spoczynkową" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7791,69 +7804,62 @@ msgid "Perspective" msgstr "Perspektywa" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Ortogonalna" +msgstr "Góra ortogonalnie" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Perspektywa" +msgstr "Góra perspektywicznie" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Ortogonalna" +msgstr "Spód ortogonalnie" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Perspektywa" +msgstr "Spód perspektywicznie" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Ortogonalna" +msgstr "Lewo ortogonalnie" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Perspektywa" +msgid "Left Perspective" +msgstr "Perspektywa z Lewej" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Ortogonalna" +msgstr "Prawo ortogonalnie" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Prawo perspektywicznie" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Ortogonalna" +msgstr "Przód ortogonalnie" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Perspektywa" +msgstr "Przód perspektywicznie" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Ortogonalna" +msgstr "Tył ortogonalnie" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Perspektywa" +msgstr "Tył perspektywicznie" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [auto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [portale aktywne]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8024,7 +8030,7 @@ msgstr "Wyświetlaj środowisko" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Gizmos" -msgstr "Pokaż ikony węzłów" +msgstr "Pokaż uchwyty" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" @@ -8177,6 +8183,26 @@ msgid "Right View" msgstr "Widok z prawej" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "Orbituj widok w dół" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "Orbituj widok w lewo" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "Orbituj widok w prawo" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "Widok Orbitalny z Góry" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "Orbituj widok o 180" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Przełącz widok perspektywiczny/ortogonalny" @@ -8235,7 +8261,7 @@ msgstr "4 widoki" #: editor/plugins/spatial_editor_plugin.cpp msgid "Gizmos" -msgstr "Ikony węzłów" +msgstr "Uchwyty" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" @@ -8250,9 +8276,8 @@ msgid "View Portal Culling" msgstr "Culling portali widoku" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Culling portali widoku" +msgstr "Pokaż Occlusion Culling" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8320,9 +8345,8 @@ msgid "Post" msgstr "Po" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "Projekt bez nazwy" +msgstr "Nienazwany uchwyt" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -11097,14 +11121,14 @@ msgstr "" "przynajmniej jeden znak \"/\"." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Klawisz " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "Fizyczny klawisz" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Klawisz " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Przycisk joysticka" @@ -12446,14 +12470,12 @@ msgid "Set Portal Point Position" msgstr "Ustaw pozycję punktu portalu" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Zmień promień kształtu cylindra" +msgstr "Ustaw promień sfery przesłaniacza" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "Ustaw punkt kontrolny wchodzący z krzywej" +msgstr "Ustaw pozycję sfery przesłaniacza" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12738,9 +12760,8 @@ msgid "Class name can't be a reserved keyword" msgstr "Nazwa klasy nie może być słowem zastrzeżonym" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Wypełnij zaznaczone" +msgstr "Zbuduj rozwiązanie" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -14085,11 +14106,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "Żaden kształt nie jest ustawiony." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Obsługiwane są tylko jednolite skale." #: scene/3d/particles.cpp msgid "" @@ -14440,6 +14461,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Opcje Kafelkowanie i Dopasowane kafelkowanie dla właściwości Rozciąganie Osi " +"są skuteczne tylko w przypadku korzystania z backendu renderowania GLES3.\n" +"Backend GLES2 jest obecnie używany, więc te tryby będą zamiast tego działać " +"jak Rozciągnięcie." #: scene/gui/popup.cpp msgid "" @@ -14477,6 +14502,18 @@ msgstr "" "Domyślne środowisko określone w Ustawieniach Projektu (Renderowanie -> " "Environment -> Default Environment) nie mogło zostać załadowane." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"Bardzo niskie czasy czekania (< 0,05 sekund) mogą zachowywać się znacząco " +"różnie w zależności od częstotliwości klatek renderowania lub fizyki\n" +"Rozważ użycie pętli procesowej w skrypcie zamiast polegać na Timerze dla " +"bardzo niskich czasów czekania." + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14490,12 +14527,16 @@ msgstr "" "przyporządkuj jego teksturę dla któregoś węzła." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." -msgstr "Rozmiar węzła Viewport musi być większy niż 0, by coś wyrenderować." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." +msgstr "" +"Wielkość Viewportu musi być większa lub równa 2 piksele w obu wymiarach, by " +"cokolwiek renderować." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "OccluderShapeSphere ustaw sfery" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -16182,10 +16223,6 @@ msgstr "Stałe nie mogą być modyfikowane." #~ msgid "Couldn't save atlas image:" #~ msgstr "Nie można zapisać obrazu atlasu:" -#, fuzzy -#~ msgid "Couldn't save converted texture:" -#~ msgstr "Nie można zapisać zkonwertowanej tekstury:" - #~ msgid "Invalid translation source!" #~ msgstr "Nieprawidłowe źródło tłumaczenia!" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 8f2aa04183..7d84259d58 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -10,6 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-06-11 14:49+0000\n" "Last-Translator: Nathan Franke <natfra@pm.me>\n" @@ -2404,6 +2405,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2520,6 +2529,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2845,10 +2858,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4306,15 +4315,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7293,12 +7310,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Discharge ye' Variable" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Slit th' Node" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7661,11 +7680,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7726,7 +7745,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7734,6 +7753,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8079,6 +8102,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10962,11 +11005,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14198,6 +14241,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14207,7 +14258,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp @@ -14338,10 +14391,6 @@ msgstr "" #~ msgstr "Yer Calligraphy be wrongly sized." #, fuzzy -#~ msgid "Previous Folder" -#~ msgstr "Slit th' Node" - -#, fuzzy #~ msgid "Custom Node" #~ msgstr "Slit th' Node" diff --git a/editor/translations/pt.po b/editor/translations/pt.po index 94bcea301b..58f22f48ae 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -22,8 +22,9 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-15 00:46+0000\n" +"PO-Revision-Date: 2021-11-07 09:45+0000\n" "Last-Translator: João Lopes <linux-man@hotmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot/pt/>\n" @@ -422,7 +423,7 @@ msgstr "Reorganizar Pistas" #: editor/animation_track_editor.cpp msgid "Transform tracks only apply to Spatial-based nodes." -msgstr "Pistas de Transformação só se aplicam a nós de base Espacial." +msgstr "Pistas de transformação só se aplicam a nós de base Espacial." #: editor/animation_track_editor.cpp msgid "" @@ -1079,7 +1080,7 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"Remover ficheiros selecionados do Projeto? (Não pode ser revertido.)\n" +"Remover ficheiros selecionados do Projeto? (Não pode ser desfeito.)\n" "Dependendo da configuração, pode encontrar os ficheiros removidos na " "Reciclagem do sistema ou apagados permanentemente." @@ -1093,7 +1094,7 @@ msgid "" msgstr "" "Os ficheiros a serem removidos são necessários para que outros recursos " "funcionem.\n" -"Remover mesmo assim? (Não pode ser revertido.)\n" +"Removê-los mesmo assim? (Não pode ser desfeito.)\n" "Dependendo da configuração, pode encontrar os ficheiros removidos na " "Reciclagem do sistema ou apagados permanentemente." @@ -1111,7 +1112,7 @@ msgstr "Falha no carregamento devido a dependências em falta:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "Abrir De Qualquer Maneira" +msgstr "Abrir Em Qualquer Caso" #: editor/dependency_editor.cpp msgid "Which action should be taken?" @@ -1127,7 +1128,7 @@ msgstr "Erros ao carregar!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "Apagar permanentemente %d itens? (Sem desfazer!)" +msgstr "Apagar permanentemente %d itens? (Definitivo!)" #: editor/dependency_editor.cpp msgid "Show Dependencies" @@ -1789,7 +1790,7 @@ msgstr "(nada)" #: editor/editor_feature_profile.cpp msgid "Remove currently selected profile, '%s'? Cannot be undone." -msgstr "Remover perfil selecionado, '%s'? Não pode ser revertido." +msgstr "Remover perfil selecionado, '%s'? Não pode ser desfeito." #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -2110,7 +2111,7 @@ msgstr "Propriedades" #: editor/editor_help.cpp msgid "override:" -msgstr "Sobrepõe:" +msgstr "sobrepor:" #: editor/editor_help.cpp msgid "default:" @@ -2316,6 +2317,9 @@ msgid "" "Update Continuously is enabled, which can increase power usage. Click to " "disable it." msgstr "" +"Roda quando a janela do editor redesenha.\n" +"Atualização Contínua está ativa, o que pode aumentar o consumo de energia. " +"Clique para a desativar." #: editor/editor_node.cpp msgid "Spins when the editor window redraws." @@ -2412,6 +2416,14 @@ msgstr "" "Incapaz de guardar cena. Provavelmente, as dependências (instâncias ou " "heranças) não puderam ser satisfeitas." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Incapaz de guardar uma ou mais cenas!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Guardar todas as Cenas" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Não se consegue sobrescrever cena ainda aberta!" @@ -2446,7 +2458,7 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" -"Layout predefinido do editor anulado.\n" +"Layout predefinido do editor sobreposto.\n" "Para restaurar o layout predefinido nas configurações base, use a opção " "Apagar Layout e remova o layout Predefinido." @@ -2549,12 +2561,16 @@ msgid "Save changes to '%s' before closing?" msgstr "Guardar alterações a '%s' antes de fechar?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "% não existe mais! Especifique uma nova localização para guardar." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." msgstr "" "A cena atual não tem nó raiz, mas %d recurso(s) externo(s) modificados foram " -"guardados." +"mesmo assim guardados." #: editor/editor_node.cpp msgid "" @@ -2594,29 +2610,27 @@ msgstr "A cena atual não foi guardada. Abrir na mesma?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Incapaz de desfazer enquanto os botões do rato estão premidos." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Nada para desfazer." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Desfazer" +msgstr "Desfazer: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Incapaz de refazer enquanto os botões do rato estão premidos." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Nada para refazer." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Refazer" +msgstr "Refazer: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2632,7 +2646,7 @@ msgid "" "Reload the saved scene anyway? This action cannot be undone." msgstr "" "A cena atual tem alterações não guardadas.\n" -"Recarregar a cena guardada? Esta ação não pode ser revertida." +"Recarregar na mesma a cena guardada? Esta ação não pode ser desfeita." #: editor/editor_node.cpp msgid "Quick Run Scene..." @@ -2900,10 +2914,6 @@ msgid "Save Scene" msgstr "Guardar Cena" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Guardar todas as Cenas" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Converter Para..." @@ -3048,7 +3058,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Synchronize Scene Changes" -msgstr "Sincronizar Alterações de Cena" +msgstr "Sincronizar Alterações da Cena" #: editor/editor_node.cpp msgid "" @@ -3303,9 +3313,8 @@ msgid "Merge With Existing" msgstr "Combinar com o Existente" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Anim Mudar Transformação" +msgstr "Aplicar Transformações do MeshInstance" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3456,6 +3465,12 @@ msgid "" "functions called by that function.\n" "Use this to find individual functions to optimize." msgstr "" +"Inclusiva: Inclui tempo de outras funções chamadas por esta função.\n" +"Use-o para detetar congestionamentos.\n" +"\n" +"Próprio: Conta apenas o tempo gasto na própria função, não em outras funções " +"chamadas pela função.\n" +"Use-o para encontrar funções individuais a otimizar." #: editor/editor_profiler.cpp msgid "Frame #:" @@ -3560,7 +3575,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Carregamento Rápido" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -4203,7 +4218,7 @@ msgstr "Substituir: " #: editor/find_in_files.cpp msgid "Replace all (no undo)" -msgstr "Substituir tudo (não há desfazer)" +msgstr "Substituir tudo (definitivo)" #: editor/find_in_files.cpp msgid "Searching..." @@ -4384,6 +4399,22 @@ msgid "Clear Default for '%s'" msgstr "Limpar Predefinição para '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reimportar" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Há alterações pendentes que ainda não foram aplicadas. Clique Reimportar " +"para aplicar alterações feitas nas opções de importação.\n" +"Se selecionar outro recurso na doca FileSystem sem Reimportar primeiro, " +"serão rejeitadas alterações feitas na doca Import." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importar Como:" @@ -4392,10 +4423,6 @@ msgid "Preset" msgstr "Predefinições" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Reimportar" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Guardar Cenas, Reimportar e Reiniciar" @@ -5667,22 +5694,20 @@ msgstr "Mover CanvasItem \"%s\" para (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Bloquear Seleção" +msgstr "Bloqueado" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Grupos" +msgstr "Agrupado" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" "Children of containers have their anchors and margins values overridden by " "their parent." msgstr "" -"As âncoras e margens de filhos de um contentores são sobrescritas pelo seu " +"As âncoras e margens de filhos de um contentores são sobrepostas pelo seu " "progenitor." #: editor/plugins/canvas_item_editor_plugin.cpp @@ -5793,6 +5818,9 @@ msgid "" "No project instance running. Run the project from the editor to use this " "feature." msgstr "" +"Sobreposição da Câmara do Projeto.\n" +"Nenhuma instância do projeto em execução. Execute o projeto pelo editor para " +"usar este recurso." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6389,7 +6417,7 @@ msgstr "Editor da lista de itens" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" -msgstr "Criar Polígono oclusor" +msgstr "Criar Polígono Oclusor" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh is empty!" @@ -6532,6 +6560,9 @@ msgid "" "This is similar to single collision shape, but can result in a simpler " "geometry in some cases, at the cost of accuracy." msgstr "" +"Cria uma forma convexa de colisão simplificada.\n" +"É similar à forma de colisão única, mas pode ter uma geometria mais simples " +"em alguns casos, ao custo da precisão." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Multiple Convex Collision Siblings" @@ -6612,14 +6643,12 @@ msgid "Remove Selected Item" msgstr "Remover item selecionado" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Importar da Cena" +msgstr "Importar da Cena (Ignorar Transformações)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Importar da Cena" +msgstr "Importar da Cena (Aplicar Transformações)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7198,7 +7227,7 @@ msgstr "Inverter Portais" #: editor/plugins/room_manager_editor_plugin.cpp msgid "Room Generate Points" -msgstr "Quarto Gerar Pontos" +msgstr "Room Gerar Pontos" #: editor/plugins/room_manager_editor_plugin.cpp msgid "Generate Points" @@ -7209,14 +7238,12 @@ msgid "Flip Portal" msgstr "Inverter Portal" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "Limpar Transformação" +msgstr "Oclusor Definir Transformação" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Criar Nó" +msgstr "Centrar Nó" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7352,12 +7379,12 @@ msgid "Move Down" msgstr "Mover para baixo" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "Próximo Script" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "Script anterior" +msgid "Previous Script" +msgstr "Script Anterior" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7706,26 +7733,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Este esqueleto não tem ossos, crie alguns nós filhos Bone2D." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Criar Pose de Descanso a partir de Ossos" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Definir Pose de Descanso para Ossos" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Criar Pose de Descanso a partir de Ossos" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Esqueleto2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" msgstr "Pôr Ossos em Pose de Descanso" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Sobrescrever" +msgstr "Sobrescrever Pose de Descanso" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7752,73 +7777,66 @@ msgid "Perspective" msgstr "Perspetiva" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Topo" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Perspetiva" +msgstr "Perspetiva Topo" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Fundo" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Perspetiva" +msgstr "Perspetiva Fundo" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Esquerda" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Perspetiva" +msgid "Left Perspective" +msgstr "Perspetiva Esquerda" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Direita" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Perspetiva Direita" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Frente" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Perspetiva" +msgstr "Perspetiva Frente" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Traseira" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Perspetiva" +msgstr "Perspetiva Traseira" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [auto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [portais ativos]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." -msgstr "Transformação abortada." +msgstr "Transformação Abortada." #: editor/plugins/spatial_editor_plugin.cpp msgid "X-Axis Transform." @@ -7921,7 +7939,7 @@ msgstr "Vista de topo." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View." -msgstr "Vista de fundo." +msgstr "Vista de Fundo." #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View." @@ -8072,7 +8090,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Convert Rooms" -msgstr "Converter Quartos" +msgstr "Converter Rooms" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" @@ -8095,7 +8113,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Nodes to Floor" -msgstr "Ajustar Nós ao Fundo" +msgstr "Ajustar Nós ao Chão" #: editor/plugins/spatial_editor_plugin.cpp msgid "Couldn't find a solid floor to snap the selection to." @@ -8111,7 +8129,7 @@ msgstr "Usar Ajuste" #: editor/plugins/spatial_editor_plugin.cpp msgid "Converts rooms for portal culling." -msgstr "" +msgstr "Converte rooms para culling de portal." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" @@ -8138,6 +8156,26 @@ msgid "Right View" msgstr "Vista Direita" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "Vista Órbita Baixo" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "Vista Órbita Esquerda" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "Vista Órbita Direita" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "Vista de Órbita Cima" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "Vista Órbita 180" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Alternar Vista Perspetiva/Ortogonal" @@ -8168,7 +8206,7 @@ msgstr "Ajustar Objetos ao Chão" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." -msgstr "Diálogo de transformação..." +msgstr "Diálogo de Transformação..." #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" @@ -8211,9 +8249,8 @@ msgid "View Portal Culling" msgstr "Ver Culling do Portal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Ver Culling do Portal" +msgstr "Ver Culling da Oclusão" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8270,7 +8307,7 @@ msgstr "Escala (prop.):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Type" -msgstr "Tipo de transformação" +msgstr "Tipo de Transformação" #: editor/plugins/spatial_editor_plugin.cpp msgid "Pre" @@ -8281,9 +8318,8 @@ msgid "Post" msgstr "Pós" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "Projeto sem nome" +msgstr "Gizmo sem nome" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -8731,12 +8767,18 @@ msgid "" "closing this window.\n" "Close anyway?" msgstr "" +"O separador de Importação de Itens tem alguns itens selecionados. A seleção " +"será perdida ao fechar esta janela.\n" +"Fechar na mesma?" #: editor/plugins/theme_editor_plugin.cpp msgid "" "Select a theme type from the list to edit its items.\n" "You can add a custom type or import a type with its items from another theme." msgstr "" +"Selecione um tipo de tema da lista para editar os seus itens.\n" +"Pode adicionar um tipo personalizado ou importar um tipo com os seus itens " +"de outro tema." #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Color Items" @@ -8767,6 +8809,8 @@ msgid "" "This theme type is empty.\n" "Add more items to it manually or by importing from another theme." msgstr "" +"Este tipo de tema está vazio.\n" +"Adicione-lhe mais itens manualmente ou importando-os de outro tema." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Color Item" @@ -8927,6 +8971,7 @@ msgstr "Mostrar Predefinição" #: editor/plugins/theme_editor_plugin.cpp msgid "Show default type items alongside items that have been overridden." msgstr "" +"Mostrar itens do tipo predefinido ao lado de itens que foram sobrepostos." #: editor/plugins/theme_editor_plugin.cpp msgid "Override All" @@ -8934,7 +8979,7 @@ msgstr "Sobrepor Tudo" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." -msgstr "" +msgstr "Sobrepõe todos os itens de tipo predefinido." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -8965,6 +9010,8 @@ msgid "" "Toggle the control picker, allowing to visually select control types for " "edit." msgstr "" +"Alternar o selecionador de controlo, permitindo escolher o tipo de controlo " +"para editar." #: editor/plugins/theme_editor_preview.cpp msgid "Toggle Button" @@ -8984,7 +9031,7 @@ msgstr "Item Desativado" #: editor/plugins/theme_editor_preview.cpp msgid "Check Item" -msgstr "Verificar item" +msgstr "Marcar item" #: editor/plugins/theme_editor_preview.cpp msgid "Checked Item" @@ -9053,10 +9100,11 @@ msgstr "Tem,Muitas,Opções" #: editor/plugins/theme_editor_preview.cpp msgid "Invalid path, the PackedScene resource was probably moved or removed." msgstr "" +"Caminho inválido, o recurso PackedScene foi provavelmente movido ou removido." #: editor/plugins/theme_editor_preview.cpp msgid "Invalid PackedScene resource, must have a Control node at its root." -msgstr "" +msgstr "Recurso PackedScene inválido, tem de ter um nó Control na sua raíz." #: editor/plugins/theme_editor_preview.cpp msgid "Invalid file, not a PackedScene resource." @@ -9064,7 +9112,7 @@ msgstr "Ficheiro inválido, não é um recurso PackedScene." #: editor/plugins/theme_editor_preview.cpp msgid "Reload the scene to reflect its most actual state." -msgstr "" +msgstr "Recarregar a cena para refletir o seu estado atual." #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" @@ -10157,7 +10205,7 @@ msgstr "Consulta uniforme de textura 2D com triplanar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." -msgstr "Função Transformação." +msgstr "Função transformação." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -10207,11 +10255,11 @@ msgstr "Multiplica vetor por transformação." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform constant." -msgstr "Constante Transformação." +msgstr "Constante transformação." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform uniform." -msgstr "Uniforme Transformação." +msgstr "Uniforme transformação." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector function." @@ -11009,7 +11057,7 @@ msgstr "Remover tudo" #: editor/project_manager.cpp msgid "Also delete project contents (no undo!)" -msgstr "" +msgstr "Também apaga conteúdos do projeto (definitivo!)" #: editor/project_manager.cpp msgid "Can't run project" @@ -11039,14 +11087,14 @@ msgstr "" "pelo menos um caráter `/`." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Tecla " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "Chave Física" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Tecla " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Botão do joystick" @@ -11568,7 +11616,7 @@ msgstr "Reassociar Localização (Selecionar novo Progenitor):" #: editor/reparent_dialog.cpp msgid "Keep Global Transform" -msgstr "Manter transformação global" +msgstr "Manter Transformação Global" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent" @@ -11691,12 +11739,15 @@ msgstr "Apagar nó \"%s\"?" msgid "" "Saving the branch as a scene requires having a scene open in the editor." msgstr "" +"Para guardar o ramo como cena é necessário ter uma cena aberta no editor." #: editor/scene_tree_dock.cpp msgid "" "Saving the branch as a scene requires selecting only one node, but you have " "selected %d nodes." msgstr "" +"Para guardar o ramo como cena é necessário selecionar apenas um nó, mas " +"estão selecionados %d nós." #: editor/scene_tree_dock.cpp msgid "" @@ -11705,6 +11756,10 @@ msgid "" "FileSystem dock context menu\n" "or create an inherited scene using Scene > New Inherited Scene... instead." msgstr "" +"Incapaz de guardar o ramo do nó raiz como uma cena instanciada.\n" +"Para criar uma cópia editável da cena atual, duplique-a usando o menu de " +"contexto da doca FileSystem\n" +"ou crie uma cena herdada usando Cena > Nova Cena Herdada..." #: editor/scene_tree_dock.cpp msgid "" @@ -11712,6 +11767,9 @@ msgid "" "To create a variation of a scene, you can make an inherited scene based on " "the instanced scene using Scene > New Inherited Scene... instead." msgstr "" +"Incapaz de guardar o ramo de uma cena já instanciada.\n" +"Para criar a variação de uma cena, pode fazer uma cena herdada baseada na " +"cena instanciada usando Cena > Nova Cena Herdada..." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -11908,7 +11966,7 @@ msgstr "Local" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" -msgstr "Limpar herança? (Sem retrocesso!)" +msgstr "Limpar herança? (Definitivo!)" #: editor/scene_tree_editor.cpp msgid "Toggle Visible" @@ -12119,6 +12177,8 @@ msgid "" "Warning: Having the script name be the same as a built-in type is usually " "not desired." msgstr "" +"Aviso: Não é habitualmente desejável que o nome do script seja o mesmo do " +"que o de um tipo incorporado." #: editor/script_create_dialog.cpp msgid "Class Name:" @@ -12370,21 +12430,19 @@ msgstr "Mudar comprimento da forma raio" #: editor/spatial_editor_gizmos.cpp msgid "Set Room Point Position" -msgstr "Definir Posição do Ponto do Quarto" +msgstr "Definir Posição do Ponto do Room" #: editor/spatial_editor_gizmos.cpp msgid "Set Portal Point Position" msgstr "Definir Posição do Ponto do Portal" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Mudar Raio da Forma Cilindro" +msgstr "Definir Raio da Esfera do Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "Definir curva na posição" +msgstr "Definir Posição da Esfera do Oclusor" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12669,9 +12727,8 @@ msgid "Class name can't be a reserved keyword" msgstr "Nome de classe não pode ser uma palavra-chave reservada" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Preencher Seleção" +msgstr "Construir Solução" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -13230,6 +13287,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Tanto a Keystore de Depuração, Utilizador de Depuração E Senha de Depuração " +"têm de ser configuradas OU nenhuma delas." #: platform/android/export/export_plugin.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -13242,11 +13301,13 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Tanto a Keystore de Lançamento, Utilizador de Lançamento E Senha de " +"Lançamento têm de ser configuradas OU nenhuma delas." #: platform/android/export/export_plugin.cpp msgid "Release keystore incorrectly configured in the export preset." msgstr "" -"Lançamento de keystore configurado incorretamente na predefinição exportada." +"Keystore de lançamento configurado incorretamente na predefinição exportada." #: platform/android/export/export_plugin.cpp msgid "A valid Android SDK path is required in Editor Settings." @@ -13320,6 +13381,10 @@ msgid "" "directory.\n" "The resulting %s is unsigned." msgstr "" +"'apksigner' não foi encontrado.\n" +"Verifique se o comando está disponível na diretoria Android SDK build-" +"tools.\n" +"O % resultante não está assinado." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -13390,6 +13455,8 @@ msgstr "" msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name" msgstr "" +"Incapaz de sobrescrever ficheiros res://android/build/res/*.xml com o nome " +"do projeto" #: platform/android/export/export_plugin.cpp msgid "Could not export project files to gradle project\n" @@ -13447,6 +13514,10 @@ msgid "" "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" +"Bibliotecas em falta no modelo de exportação para as arquiteturas " +"selecionadas: %s.\n" +"Construa um modelo com todas as bibliotecas necessárias, ou desmarque as " +"arquiteturas em falta na predefinição de exportação." #: platform/android/export/export_plugin.cpp msgid "Adding files..." @@ -13531,19 +13602,19 @@ msgstr "Identificador de pacote inválido:" #: platform/osx/export/export.cpp msgid "Notarization: code signing required." -msgstr "" +msgstr "Notarização: assinatura de código necessária." #: platform/osx/export/export.cpp msgid "Notarization: hardened runtime required." -msgstr "" +msgstr "Notarização: hardened runtime necessário." #: platform/osx/export/export.cpp msgid "Notarization: Apple ID name not specified." -msgstr "" +msgstr "Notarização: nome Apple ID não especificado." #: platform/osx/export/export.cpp msgid "Notarization: Apple ID password not specified." -msgstr "" +msgstr "Notarização: senha Apple ID não especificada." #: platform/uwp/export/export.cpp msgid "Invalid package short name." @@ -13790,7 +13861,7 @@ msgid "" "Change the size in children collision shapes instead." msgstr "" "Mudanças no tamanho do RigidBody2D (em modos carácter ou rígido) serão " -"reescritas pelo motor de física na execução.\n" +"sobrepostas pelo motor de física na execução.\n" "Mude antes o tamanho das formas de colisão filhas." #: scene/2d/remote_transform_2d.cpp @@ -13975,6 +14046,9 @@ msgid "" "longer has any effect.\n" "To remove this warning, disable the GIProbe's Compress property." msgstr "" +"A propriedade GIProbe Compress foi descontinuada devido a bugs conhecidos e " +"não tem qualquer efeito.\n" +"Para remover este aviso desative a propriedade Compress de GIProbe." #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." @@ -13996,11 +14070,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "Nenhuma forma está definida." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Apenas são suportadas escalas uniformes." #: scene/3d/particles.cpp msgid "" @@ -14045,7 +14119,7 @@ msgid "" "Change the size in children collision shapes instead." msgstr "" "Mudanças no tamanho do RigidBody (em modos carácter ou rígido) serão " -"reescritas pelo motor de física na execução.\n" +"sobrepostas pelo motor de física na execução.\n" "Mude antes o tamanho das formas de colisão filhas." #: scene/3d/physics_joint.cpp @@ -14070,15 +14144,15 @@ msgstr "Nó A e Nó B têm de ser PhysicsBodies diferentes" #: scene/3d/portal.cpp msgid "The RoomManager should not be a child or grandchild of a Portal." -msgstr "" +msgstr "O RoomManager não deve ser filho ou neto de um Portal." #: scene/3d/portal.cpp msgid "A Room should not be a child or grandchild of a Portal." -msgstr "" +msgstr "Um Room não deve ser filho ou neto de um Portal." #: scene/3d/portal.cpp msgid "A RoomGroup should not be a child or grandchild of a Portal." -msgstr "" +msgstr "Um RoomGroup não deve ser filho ou neto de um Portal." #: scene/3d/remote_transform.cpp msgid "" @@ -14090,79 +14164,95 @@ msgstr "" #: scene/3d/room.cpp msgid "A Room cannot have another Room as a child or grandchild." -msgstr "Um Quarto não pode ter outro Quarto como filho ou neto." +msgstr "Um Room não pode ter outro Room como filho ou neto." #: scene/3d/room.cpp msgid "The RoomManager should not be placed inside a Room." -msgstr "" +msgstr "O RoomManager não deve ser colocado dentro de um Room." #: scene/3d/room.cpp msgid "A RoomGroup should not be placed inside a Room." -msgstr "" +msgstr "Um RoomGroup não deve ser colocado dentro de um Room." #: scene/3d/room.cpp msgid "" "Room convex hull contains a large number of planes.\n" "Consider simplifying the room bound in order to increase performance." msgstr "" +"O casco convexo do quarto contem um grande número de planos.\n" +"Pense em simplificar os limites do quarto para melhorar o desempenho." #: scene/3d/room_group.cpp msgid "The RoomManager should not be placed inside a RoomGroup." -msgstr "" +msgstr "O RoomManager não deve ser colocado dentro de um RoomGroup." #: scene/3d/room_manager.cpp msgid "The RoomList has not been assigned." -msgstr "" +msgstr "A RoomList não foi atribuída." #: scene/3d/room_manager.cpp msgid "The RoomList node should be a Spatial (or derived from Spatial)." -msgstr "" +msgstr "O nó RoomList deve ser um Spatial (ou derivado de Spatial)." #: scene/3d/room_manager.cpp msgid "" "Portal Depth Limit is set to Zero.\n" "Only the Room that the Camera is in will render." msgstr "" +"Limite de Profundidade do Portal está definido como Zero.\n" +"Só vai ser renderizado o quarto onde a Câmara está." #: scene/3d/room_manager.cpp msgid "There should only be one RoomManager in the SceneTree." -msgstr "" +msgstr "Só deve existir um RoomManager na SceneTree." #: scene/3d/room_manager.cpp msgid "" "RoomList path is invalid.\n" "Please check the RoomList branch has been assigned in the RoomManager." msgstr "" +"Caminho do RoomList é inválido.\n" +"Verifique se o ramo RoomList foi atribuído no RoomManager." #: scene/3d/room_manager.cpp msgid "RoomList contains no Rooms, aborting." -msgstr "" +msgstr "A RoomList não contem Rooms, a abortar." #: scene/3d/room_manager.cpp msgid "Misnamed nodes detected, check output log for details. Aborting." msgstr "" +"Nomes de nós errados detetados, verifique o log de saída para detalhes. A " +"abortar." #: scene/3d/room_manager.cpp msgid "Portal link room not found, check output log for details." msgstr "" +"Room portal link não encontrado, verifique o log de saída para detalhes." #: scene/3d/room_manager.cpp msgid "" "Portal autolink failed, check output log for details.\n" "Check the portal is facing outwards from the source room." msgstr "" +"Autolink do Portal falhou, verifique o log de saída para detalhes.\n" +"Verifique se o portal está voltado para fora do room de origem." #: scene/3d/room_manager.cpp msgid "" "Room overlap detected, cameras may work incorrectly in overlapping area.\n" "Check output log for details." msgstr "" +"Sobreposição de room detetada, câmaras podem trabalhar mal na área de " +"sobreposição.\n" +"Verifique o log de saída para detalhes." #: scene/3d/room_manager.cpp msgid "" "Error calculating room bounds.\n" "Ensure all rooms contain geometry or manual bounds." msgstr "" +"Erro ao calcular limites do room.\n" +"Garanta que todos os rooms contêm geometria ou limites manuais." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -14174,7 +14264,7 @@ msgid "" "running.\n" "Change the size in children collision shapes instead." msgstr "" -"Mudanças no tamanho do SoftBody serão reescritas pelo motor de física na " +"Mudanças no tamanho do SoftBody serão sobrepostas pelo motor de física na " "execução.\n" "Em vez disso, mude o tamanho das formas de colisão filhas." @@ -14227,7 +14317,7 @@ msgstr "Animação não encontrada: '%s'" #: scene/animation/animation_player.cpp msgid "Anim Apply Reset" -msgstr "" +msgstr "Anim Aplicar Reinicialização" #: scene/animation/animation_tree.cpp msgid "In node '%s', invalid animation: '%s'." @@ -14335,6 +14425,9 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"As opções Tile e Tile Fit para as propriedades Axis Stretch só são efetivas " +"na renderização GLES3.\n" +"Como GLES2 está a ser usado atualmente, estes modos funcionarão como Stretch." #: scene/gui/popup.cpp msgid "" @@ -14372,6 +14465,19 @@ msgstr "" "Ambiente predefinido especificado em Configurações do Projeto (Rendering -> " "Environment -> Default Environment) não pode ser carregado." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"Tempos de espera do Timer muito baixos (< 0.05 segundos) podem originar " +"comportamentos muito diferentes dependendo do renderizador ou da taxa de " +"frames física.\n" +"Considere usar um ciclo de processo de script em vez de depender de um Timer " +"para tempos de espera muito baixos." + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14385,12 +14491,16 @@ msgstr "" "RenderTarget e atribua a sua textura interna a outro nó para visualizar." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." -msgstr "O tamanho do viewport tem de ser maior do que 0 para renderizar." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." +msgstr "" +"O tamanho do Viewport tem de ser maior ou igual a 2 pixeis em ambas as " +"dimensões para renderizar." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "OccluderShapeSphere Definir Esferas" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -14421,16 +14531,20 @@ msgid "" "Varyings which assigned in 'vertex' function may not be reassigned in " "'fragment' or 'light'." msgstr "" +"Variantes atribuídas na função 'vertex' não podem ser reatribuídas em " +"'fragment' ou 'light'." #: servers/visual/shader_language.cpp msgid "" "Varyings which assigned in 'fragment' function may not be reassigned in " "'vertex' or 'light'." msgstr "" +"Variantes atribuídas na função 'fragment' não podem ser reatribuídas em " +"'vertex' ou 'light'." #: servers/visual/shader_language.cpp msgid "Fragment-stage varying could not been accessed in custom function!" -msgstr "" +msgstr "Variante fragment-stage não pode ser acedida em função personalizada!" #: servers/visual/shader_language.cpp msgid "Assignment to function." diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 87c8792cbf..cf6ec219e1 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -122,12 +122,20 @@ # Alkoarism <Alkoarism@gmail.com>, 2021. # リーLee <kaualee304@gmail.com>, 2021. # William Weber Berrutti <wwberrutti@protonmail.ch>, 2021. +# Zenvasca <zenvasca@gmail.com>, 2021. +# Wladimir Roberto Barbosa <wladrbarbosa@gmail.com>, 2021. +# Mário Victor Ribeiro Silva <mariovictorrs@gmail.com>, 2021. +# jak3z <jose_renato06@outlook.com>, 2021. +# Henrique Darko <henridark00@gmail.com>, 2021. +# Cearaj <pmoraisleal@gmail.com>, 2021. +# Alefy San <alefyferreiradeoliveira@outlook.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2021-09-11 20:05+0000\n" -"Last-Translator: William Weber Berrutti <wwberrutti@protonmail.ch>\n" +"PO-Revision-Date: 2021-11-15 21:14+0000\n" +"Last-Translator: Alefy San <alefyferreiradeoliveira@outlook.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -135,7 +143,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -484,7 +492,7 @@ msgstr "Inserir Anim" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp msgid "node '%s'" -msgstr "nodo '%s'" +msgstr "nó '%s'" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp @@ -547,7 +555,7 @@ msgstr "Não é possível adicionar uma nova trilha sem uma raiz" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "Trilha inválida para Bézier (sem subpropriedades adequadas)" +msgstr "Trilha inválida para Bézier (sem sub-propriedades adequadas)" #: editor/animation_track_editor.cpp msgid "Add Bezier Track" @@ -572,7 +580,7 @@ msgstr "Adicionar Trilha Chave" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." msgstr "" -"Caminho da trilha é inválido,então não pode adicionar uma chave de método." +"Caminho da trilha é inválido, então não pode adicionar uma chave de método." #: editor/animation_track_editor.cpp msgid "Add Method Track Key" @@ -603,7 +611,8 @@ msgstr "Alterar Escala das Chaves na Anim" msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "" -"Essa opção não funciona para edição por Bezier,pois é apenas uma faixa única." +"Essa opção não funciona para edição por Bézier, pois é apenas uma trilha " +"única." #: editor/animation_track_editor.cpp msgid "" @@ -2417,6 +2426,9 @@ msgid "" "Update Continuously is enabled, which can increase power usage. Click to " "disable it." msgstr "" +"Gira quando a janela do editor é redesenhada.\n" +"Atualização contínua está habilitada, o que pode aumentar o uso de energia. " +"Clique para desativá-lo." #: editor/editor_node.cpp msgid "Spins when the editor window redraws." @@ -2514,6 +2526,14 @@ msgstr "" "Não se pôde salvar a cena. É provável que dependências (instâncias ou " "herança) não foram satisfeitas." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Não foi possível salvar um ou mais cenas!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Salvar Todas as Cenas" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Não é possível sobrescrever a cena que ainda está aberta!" @@ -2649,6 +2669,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Salvar alterações em '%s' antes de fechar?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s não existe! Por favor especifique um novo local para salvar." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2694,29 +2718,27 @@ msgstr "Cena atual não salva. Abrir mesmo assim?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Não pode desfazer enquanto os botões do mouse estiverem pressionados." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Nada para desfazer." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Desfazer" +msgstr "Desfazer: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Não pode refazer enquanto os botões do mouse estiverem pressionados." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Nada para refazer." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Refazer" +msgstr "Refazer: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -3004,10 +3026,6 @@ msgid "Save Scene" msgstr "Salvar Cena" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Salvar Todas as Cenas" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Converter Para..." @@ -3359,9 +3377,8 @@ msgid "Install from file" msgstr "Instalar do arquivo" #: editor/editor_node.cpp -#, fuzzy msgid "Select android sources file" -msgstr "Selecione o arquivo de fontes do Android" +msgstr "Selecione os arquivos fontes do Android" #: editor/editor_node.cpp msgid "" @@ -3448,7 +3465,6 @@ msgid "Select" msgstr "Selecionar" #: editor/editor_node.cpp -#, fuzzy msgid "Select Current" msgstr "Selecione Atual" @@ -3563,6 +3579,12 @@ msgid "" "functions called by that function.\n" "Use this to find individual functions to optimize." msgstr "" +"Inclusivo: inclui o tempo de outras funções chamadas por esta função.\n" +"Use isso para detectar restrições.\n" +"\n" +"Próprio: conta apenas o tempo gasto na função em si, não em outras funções " +"chamadas por essa função.\n" +"Use isso para encontrar funções individuais para otimizar." #: editor/editor_profiler.cpp msgid "Frame #:" @@ -3668,7 +3690,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Carregamento Rápido" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -3770,14 +3792,12 @@ msgid "Uninstall these templates." msgstr "Desinstalar esses modelos." #: editor/export_template_manager.cpp -#, fuzzy msgid "There are no mirrors available." -msgstr "Não existe o arquivo '%s'." +msgstr "Não há espelhos disponíveis." #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving the mirror list..." -msgstr "Reconectando, por favor aguarde." +msgstr "Reconectando a lista de espelhos..." #: editor/export_template_manager.cpp msgid "Starting the download..." @@ -3788,23 +3808,20 @@ msgid "Error requesting URL:" msgstr "Erro ao solicitar URL:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to the mirror..." -msgstr "Conectando..." +msgstr "Conectando ao espelho..." #: editor/export_template_manager.cpp msgid "Can't resolve the requested address." msgstr "Não é possível resolver o endereço solicitado." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't connect to the mirror." -msgstr "Não foi possível conectar ao host:" +msgstr "Não foi possível conectar ao espelho." #: editor/export_template_manager.cpp -#, fuzzy msgid "No response from the mirror." -msgstr "Sem resposta do host:" +msgstr "Sem resposta do espelho." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3840,7 +3857,6 @@ msgid "Error getting the list of mirrors." msgstr "Erro ao obter a lista de espelhos." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error parsing JSON with the list of mirrors. Please report this issue!" msgstr "" "Erro ao analisar o JSON da lista de espelhos. Por favor, reporte este " @@ -3929,9 +3945,8 @@ msgid "Importing:" msgstr "Importando:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove templates for the version '%s'?" -msgstr "Remover versão '%s' do modelo?" +msgstr "Remover modelo para a versão '%s'?" #: editor/export_template_manager.cpp msgid "Uncompressing Android Build Sources" @@ -3957,9 +3972,8 @@ msgstr "" "As exportações de modelos estão instaladas e prontas para serem usadas." #: editor/export_template_manager.cpp -#, fuzzy msgid "Open Folder" -msgstr "Abrir um arquivo" +msgstr "Abrir Pasta" #: editor/export_template_manager.cpp msgid "Open the folder containing installed templates for the current version." @@ -3970,24 +3984,20 @@ msgid "Uninstall" msgstr "Desinstalar" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall templates for the current version." -msgstr "Valor inicial para o contador" +msgstr "Desinstalar modelos da versão atual." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download from:" -msgstr "Erro ao baixar" +msgstr "Baixar de:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Open in Web Browser" -msgstr "Rodar no Navegador" +msgstr "Abrir no Navegador" #: editor/export_template_manager.cpp -#, fuzzy msgid "Copy Mirror URL" -msgstr "Copiar Erro" +msgstr "Copiar URL do Espelho" #: editor/export_template_manager.cpp msgid "Download and Install" @@ -4008,14 +4018,12 @@ msgstr "" "desenvolvimento." #: editor/export_template_manager.cpp -#, fuzzy msgid "Install from File" msgstr "Instalar a Partir do Arquivo" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install templates from a local file." -msgstr "Importar Modelos de um Arquivo ZIP" +msgstr "Importar modelos de um arquivo local." #: editor/export_template_manager.cpp editor/find_in_files.cpp #: editor/progress_dialog.cpp scene/gui/dialogs.cpp @@ -4023,19 +4031,16 @@ msgid "Cancel" msgstr "Cancelar" #: editor/export_template_manager.cpp -#, fuzzy msgid "Cancel the download of the templates." -msgstr "Não se pôde abrir zip dos modelos de exportação." +msgstr "Cancelar o download dos modelos." #: editor/export_template_manager.cpp -#, fuzzy msgid "Other Installed Versions:" -msgstr "Versões Instaladas:" +msgstr "Outras Versões Instaladas:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall Template" -msgstr "Desinstalar" +msgstr "Desinstalar Template" #: editor/export_template_manager.cpp msgid "Select Template File" @@ -4199,35 +4204,32 @@ msgid "Collapse All" msgstr "Recolher Tudo" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort files" -msgstr "Pesquisar arquivos" +msgstr "Ordenar arquivos" #: editor/filesystem_dock.cpp msgid "Sort by Name (Ascending)" -msgstr "" +msgstr "Ordenar por Nome (Ascendente)" #: editor/filesystem_dock.cpp msgid "Sort by Name (Descending)" -msgstr "" +msgstr "Ordenar por Nome (Descendente)" #: editor/filesystem_dock.cpp msgid "Sort by Type (Ascending)" -msgstr "" +msgstr "Ordenar por Tipo (Ascendente)" #: editor/filesystem_dock.cpp msgid "Sort by Type (Descending)" -msgstr "" +msgstr "Ordenar por Tipo (Descendente)" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort by Last Modified" -msgstr "Ultima Modificação" +msgstr "Ordenar por Último Modificado" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort by First Modified" -msgstr "Ultima Modificação" +msgstr "Ordenar por Primeiro Modificado" #: editor/filesystem_dock.cpp msgid "Duplicate..." @@ -4489,7 +4491,7 @@ msgstr "Salvando..." #: editor/import_defaults_editor.cpp msgid "Select Importer" -msgstr "Selecione o arquivo para importar" +msgstr "Selecione Importador" #: editor/import_defaults_editor.cpp msgid "Importer:" @@ -4516,6 +4518,23 @@ msgid "Clear Default for '%s'" msgstr "Limpar Padrão para '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reimportar" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Você tem mudanças pendentes que não foram aplicadas ainda. Clique em " +"Reimportar para aplicar as mudanças feitas nas opções de importação.\n" +"Selecionado outro recurso no painel do Sistema de Arquivos sem ter clicado " +"em Reimportar primeiro ira descartar as mudanças feitas no painel de " +"Importar." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importar como:" @@ -4524,10 +4543,6 @@ msgid "Preset" msgstr "Predefinição" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Reimportar" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Salvar cenas, reimportar e reiniciar" @@ -4548,14 +4563,12 @@ msgid "Failed to load resource." msgstr "Falha ao carregar recurso." #: editor/inspector_dock.cpp -#, fuzzy msgid "Copy Properties" -msgstr "Propriedades" +msgstr "Copiar Propriedades" #: editor/inspector_dock.cpp -#, fuzzy msgid "Paste Properties" -msgstr "Propriedades" +msgstr "Colar Propriedades" #: editor/inspector_dock.cpp msgid "Make Sub-Resources Unique" @@ -4580,21 +4593,18 @@ msgid "Save As..." msgstr "Salvar Como..." #: editor/inspector_dock.cpp -#, fuzzy msgid "Extra resource options." -msgstr "Não está no caminho de recursos." +msgstr "Opções de recursos extras." #: editor/inspector_dock.cpp -#, fuzzy msgid "Edit Resource from Clipboard" -msgstr "Editar Área de Transferência de Recursos" +msgstr "Editar Recursos da Área de Transferência" #: editor/inspector_dock.cpp msgid "Copy Resource" msgstr "Copiar Recurso" #: editor/inspector_dock.cpp -#, fuzzy msgid "Make Resource Built-In" msgstr "Tornar Embutido" @@ -4611,9 +4621,8 @@ msgid "History of recently edited objects." msgstr "Histórico dos objetos editados recentemente." #: editor/inspector_dock.cpp -#, fuzzy msgid "Open documentation for this object." -msgstr "Abrir Documentação" +msgstr "Abrir documentação para esse objeto." #: editor/inspector_dock.cpp editor/scene_tree_dock.cpp msgid "Open Documentation" @@ -4624,9 +4633,8 @@ msgid "Filter properties" msgstr "Filtrar propriedades" #: editor/inspector_dock.cpp -#, fuzzy msgid "Manage object properties." -msgstr "Propriedades do objeto." +msgstr "Gerenciar propriedades do objeto." #: editor/inspector_dock.cpp msgid "Changes may be lost!" @@ -4871,9 +4879,8 @@ msgid "Blend:" msgstr "Misturar:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Parameter Changed:" -msgstr "Parâmetro Modificado" +msgstr "Parâmetro Modificado:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -5611,7 +5618,7 @@ msgstr "Pesquisar modelos, projetos e demonstrações" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search assets (excluding templates, projects, and demos)" -msgstr "" +msgstr "Pesquisar recursos (excluindo modelos, projetos e demonstrações)" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5666,13 +5673,13 @@ msgstr "" "Salve sua cena e tente novamente." #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "" "No meshes to bake. Make sure they contain an UV2 channel and that the 'Use " "In Baked Light' and 'Generate Lightmap' flags are on." msgstr "" -"Não há malhas para preparar. Certifique-se de que elas possuem um canal UV2 " -"e que a propriedade \"Preparar Luz\" está habilitada." +"Não há malhas para pré-calcular. Certifique-se de que elas possuem um canal " +"UV2 e que as propriedades \"Use In Baked Light\" e \"Generate Lightmap\" " +"está habilitada." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed creating lightmap images, make sure path is writable." @@ -5720,7 +5727,7 @@ msgstr "Configurar o Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Offset:" -msgstr "Deslocamento da grade:" +msgstr "Deslocamento da Grade:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Step:" @@ -5736,7 +5743,7 @@ msgstr "passos" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" -msgstr "Deslocamento de rotação:" +msgstr "Deslocamento de Rotação:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Step:" @@ -5816,15 +5823,13 @@ msgstr "Mover CanvaItem \"%s\" para (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" msgstr "Fixar Seleção" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Grupo" +msgstr "Agrupado" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5928,13 +5933,13 @@ msgstr "Alterar Âncoras" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Project Camera Override\n" "Overrides the running project's camera with the editor viewport camera." msgstr "" -"Sobrepor Câmera de Jogo\n" -"Sobrepõe a câmera de jogo com a janela de exibição da câmera." +"Sobrepor câmera do projeto.\n" +"Sobrepõe a câmera do projeto em execução com a câmera da janela de exibição " +"do editor." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5943,6 +5948,9 @@ msgid "" "No project instance running. Run the project from the editor to use this " "feature." msgstr "" +"Sobrepor câmera do projeto.\n" +"Sem instâncias do projeto em execução. Execute o projeto pelo editor para " +"usar essa funcionalidade." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5974,7 +5982,7 @@ msgstr "Limpar Guias" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Custom Bone(s) from Node(s)" -msgstr "Criar esqueleto(s) customizado(s) do(s) nó(s)" +msgstr "Criar Esqueleto(s) Customizado(s) a partir do(s) Nó(s)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Bones" @@ -6010,31 +6018,27 @@ msgstr "Modo de Seleção" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Drag: Rotate selected node around pivot." -msgstr "Remover nó ou trilha selecionada." +msgstr "Arrastar: Gire nó em tono do pivô." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Move selected node." -msgstr "Alt+Arrastar: Mover" +msgstr "Alt+Arrastar: Mover nó selecionado." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "V: Set selected node's pivot position." -msgstr "Remover nó ou trilha selecionada." +msgstr "V: Define a posição do pivô do nó selecionado." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Alt+RMB: Show list of all nodes at position clicked, including locked." msgstr "" -"Mostrar uma lista de todos os objetos na posição clicada\n" -"(mesmo como Alt + botão direito do mouse no Modo de seleção)." +"Alt+Botão Direito do Mouse: Mostrar a lista de todos os nós na posição " +"clicada, incluindo os bloqueados." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "RMB: Add node at position clicked." -msgstr "" +msgstr "BDM: Adiciona node à posição clicada." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6272,14 +6276,12 @@ msgid "Clear Pose" msgstr "Limpar Pose" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Add Node Here" -msgstr "Adicionar Nó" +msgstr "Adicionar Nó Aqui" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Instance Scene Here" -msgstr "Instanciar Cena(s)" +msgstr "Instanciar Cena Aqui" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" @@ -6295,49 +6297,43 @@ msgstr "Deslocar Visão" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 3.125%" -msgstr "" +msgstr "Zoom para 3.125%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 6.25%" -msgstr "" +msgstr "Zoom para 6.25%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 12.5%" -msgstr "" +msgstr "Zoom para 12.5%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 25%" -msgstr "Reduzir" +msgstr "Zoom de 25%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 50%" -msgstr "Reduzir" +msgstr "Zoom de 50%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 100%" -msgstr "Reduzir" +msgstr "Zoom de 100%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 200%" -msgstr "Reduzir" +msgstr "Zoom de 200%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 400%" -msgstr "Reduzir" +msgstr "Zoom de 400%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 800%" -msgstr "Reduzir" +msgstr "Zoom de 800%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 1600%" -msgstr "" +msgstr "Zoom para 1600%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -6582,9 +6578,8 @@ msgid "Couldn't create a single convex collision shape." msgstr "Não foi possível criar uma forma de colisão convexa simples." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Simplified Convex Shape" -msgstr "Criar Forma(s) Convexa(s) Simples" +msgstr "Criar Forma(s) Convexa(s) Simplificadas" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Single Convex Shape" @@ -6619,9 +6614,8 @@ msgid "No mesh to debug." msgstr "Nenhuma malha para depurar." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Mesh has no UV in layer %d." -msgstr "Modelo não tem uma UV nesta camada" +msgstr "Modelo não tem UV na camada %d." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "MeshInstance lacks a Mesh!" @@ -6686,9 +6680,8 @@ msgstr "" "Esta é a opção mais rápida (mas menos precisa) para detecção de colisão." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Simplified Convex Collision Sibling" -msgstr "Criar um irmão de Colisão Convexa" +msgstr "Criar Colisão Convexa Simplificada Irmã" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6696,20 +6689,23 @@ msgid "" "This is similar to single collision shape, but can result in a simpler " "geometry in some cases, at the cost of accuracy." msgstr "" +"Cria uma forma de colisão convexa simplificada.\n" +"É semelhante à forma de colisão única, mas pode resultar em uma geometria " +"mais simples em alguns casos, com menos precisão." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Multiple Convex Collision Siblings" msgstr "Criar Múltipla Colisão Convexa Irmã(s)" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "" "Creates a polygon-based collision shape.\n" "This is a performance middle-ground between a single convex collision and a " "polygon-based collision." msgstr "" -"Cria um polígono base de colisão forma.\n" -"Este é um meio-termo entre as duas opções acima." +"Cria uma forma de colisão baseada em polígonos.\n" +"Este é um meio-termo em desempenho entre uma única colisão convexa e uma " +"colisão baseada em polígono." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." @@ -6776,14 +6772,12 @@ msgid "Remove Selected Item" msgstr "Remover Item Selecionado" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Importar da Cena" +msgstr "Importar da Cena (Ignora Transforms)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Importar da Cena" +msgstr "Importar da Cena (Aplica Transforms)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7131,7 +7125,7 @@ msgid "" "viewport." msgstr "" "Polygon2D tem vértices internos, portanto não pode mais ser editado na " -"viewport." +"janela de exibição." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create Polygon & UV" @@ -7362,24 +7356,20 @@ msgid "ResourcePreloader" msgstr "ResourcePreloader" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Flip Portals" msgstr "Inverter Horizontalmente" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Room Generate Points" -msgstr "Gerar Contagem de Pontos:" +msgstr "Gerar Contagem de Pontos" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Generate Points" -msgstr "Gerar Contagem de Pontos:" +msgstr "Gerar Pontos" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Flip Portal" -msgstr "Inverter Horizontalmente" +msgstr "Virar Portal" #: editor/plugins/room_manager_editor_plugin.cpp #, fuzzy @@ -7387,9 +7377,8 @@ msgid "Occluder Set Transform" msgstr "Limpar Transformação" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Criar Nó" +msgstr "Centralizar Nó" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7525,11 +7514,11 @@ msgid "Move Down" msgstr "Mover para Baixo" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "Próximo Script" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "Script anterior" #: editor/plugins/script_editor_plugin.cpp @@ -7880,26 +7869,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Este esqueleto não tem ossos, crie alguns nós filhos Bone2D." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Criar postura de descanso para os Ossos" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Definir a postura de repouso para os Ossos" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Criar postura de descanso para os Ossos" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Esqueleto2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Definir os ossos para descansar Pose" +msgstr "Redefinir para Pose de Descanso" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Sobrescrever Cena Existente" +msgstr "Sobrescrever Pose de Descanso" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7926,69 +7913,62 @@ msgid "Perspective" msgstr "Perspectiva" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Topo" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Topo" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Baixo" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Baixo" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Esquerda" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Perspectiva" +msgid "Left Perspective" +msgstr "Perspectiva Esquerda" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Direita" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Perspectiva Direita" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Dianteira" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Dianteira" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Ortogonal" +msgstr "Ortogonal Traseira" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Perspectiva" +msgstr "Perspectiva Traseira" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [automático]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [portais ativados]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8017,19 +7997,17 @@ msgid "None" msgstr "Nenhum" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rotate" -msgstr "Status:" +msgstr "Rotacionar" #. TRANSLATORS: This refers to the movement that changes the position of an object. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translate" -msgstr "Translação:" +msgstr "Translação" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale" -msgstr "Scale" +msgstr "Escala" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scaling: " @@ -8052,9 +8030,8 @@ msgid "Animation Key Inserted." msgstr "Chave de Animação Inserida." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Pitch:" -msgstr "Tom" +msgstr "Tom:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Yaw:" @@ -8065,38 +8042,32 @@ msgid "Size:" msgstr "Tamanho:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Objects Drawn:" -msgstr "Objetos Desenhados" +msgstr "Objetos Desenhados:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Material Changes:" -msgstr "Alterações de Material" +msgstr "Alterações de Material:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Shader Changes:" -msgstr "Alterações de Shader" +msgstr "Alterações de Shader:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Surface Changes:" -msgstr "Alterações de Superfície" +msgstr "Alterações de Superfície:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Draw Calls:" -msgstr "Chamadas de Desenho" +msgstr "Chamadas de Desenho:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Vertices:" -msgstr "Vértices" +msgstr "Vértices:" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" -msgstr "" +msgstr "FPS: %d (%s ms)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -8132,7 +8103,7 @@ msgstr "Alinhar Rotação com a Vista" #: 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." +msgstr "Sem pai para instanciar um filho." #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "This operation requires a single selected node." @@ -8231,13 +8202,12 @@ msgid "Freelook Slow Modifier" msgstr "Modificador de velocidade lenta da Visão Livre" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Camera Preview" -msgstr "Alterar Tamanho da Câmera" +msgstr "Alternar pré-visualização da câmera" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Rotation Locked" -msgstr "Ver Rotação Bloqueada" +msgstr "Rotação de Vista Bloqueada" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -8255,9 +8225,8 @@ msgstr "" "Ele não deve ser usado como indicação confiável de desempenho do jogo." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Convert Rooms" -msgstr "Converter Para %s" +msgstr "Converter Salas" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" @@ -8274,14 +8243,13 @@ msgstr "" "Clique para alternar entre estados de visibilidade.\n" "\n" "Olhos abertos: Gizmo está visível.\n" -"Olhos fechados: Gizmo não está visível.\n" +"Olhos fechados: Gizmo está escondido.\n" "Olhos semi-abertos: Gizmo está visível através de superficies opacas (\"raio-" "x\")." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Nodes to Floor" -msgstr "Encaixar Nó(s) no Chão" +msgstr "Atrair Nó(s) ao Chão" #: editor/plugins/spatial_editor_plugin.cpp msgid "Couldn't find a solid floor to snap the selection to." @@ -8297,7 +8265,7 @@ msgstr "Use Encaixar" #: editor/plugins/spatial_editor_plugin.cpp msgid "Converts rooms for portal culling." -msgstr "" +msgstr "Converter salas para portal culling." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" @@ -8324,6 +8292,27 @@ msgid "Right View" msgstr "Visão Direita" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "Vista Órbita Baixo" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "Vista Órbita Esquerda" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "Vista Órbita Direita" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Visão Frontal" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "Vista Órbita 180" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Alternar Visão Perspectiva/Ortogonal" @@ -8722,65 +8711,56 @@ msgid "TextureRegion" msgstr "Região da Textura" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Colors" -msgstr "Cor" +msgstr "Cores" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Fonts" -msgstr "Fonte" +msgstr "Fontes" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Icons" -msgstr "Ícone" +msgstr "Ícones" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Styleboxes" -msgstr "StyleBox" +msgstr "Styleboxes" #: editor/plugins/theme_editor_plugin.cpp msgid "{num} color(s)" -msgstr "" +msgstr "{num} cor(es)" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No colors found." -msgstr "Nenhum sub-recurso encontrado." +msgstr "Nenhuma cor encontrada." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "{num} constant(s)" -msgstr "Constantes" +msgstr "{num} constante(s)" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No constants found." -msgstr "Cor constante." +msgstr "Nenhuma constante encontrada." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} font(s)" -msgstr "" +msgstr "{num} fonte(s)" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No fonts found." -msgstr "Não encontrado!" +msgstr "Fontes não encontradas." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} icon(s)" -msgstr "" +msgstr "{num} ícone(s)" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No icons found." -msgstr "Não encontrado!" +msgstr "Ícones não encontrados." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} stylebox(es)" -msgstr "" +msgstr "{num} stylebox(es)" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8789,154 +8769,139 @@ msgstr "Nenhum sub-recurso encontrado." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} currently selected" -msgstr "" +msgstr "{num} selecionado(s)" #: editor/plugins/theme_editor_plugin.cpp msgid "Nothing was selected for the import." -msgstr "" +msgstr "Nada foi selecionado para a importação." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Importing Theme Items" -msgstr "Importar Tema" +msgstr "Importando Tema" #: editor/plugins/theme_editor_plugin.cpp msgid "Importing items {n}/{n}" -msgstr "" +msgstr "Importando itens {n}/{n}" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Updating the editor" -msgstr "Sair do editor?" +msgstr "Atualizando o editor" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Finalizing" -msgstr "Analisando" +msgstr "Finalizando" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Filter:" -msgstr "Filtro: " +msgstr "Filtro:" #: editor/plugins/theme_editor_plugin.cpp msgid "With Data" -msgstr "" +msgstr "Com Dados" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select by data type:" -msgstr "Selecione um Nó" +msgstr "Selecione por tipo de dados:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible color items." -msgstr "Selecione um item de configuração primeiro!" +msgstr "Selecione todos os itens de cor visíveis." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible color items and their data." -msgstr "" +msgstr "Selecione todos os itens de cor visíveis e seus dados." #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all visible color items." -msgstr "" +msgstr "Desmarque todos os itens de cor visíveis." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible constant items." -msgstr "Selecione um item de configuração primeiro!" +msgstr "Selecione todos os itens constantes visíveis." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible constant items and their data." -msgstr "" +msgstr "Selecione todos os itens constantes visíveis e seus dados." #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all visible constant items." -msgstr "" +msgstr "Desmarque todos os itens constantes visíveis." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible font items." -msgstr "Selecione um item de configuração primeiro!" +msgstr "Selecione todos os itens de fonte visíveis." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible font items and their data." -msgstr "" +msgstr "Selecione todos os itens de fonte visíveis e seus dados." #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all visible font items." -msgstr "" +msgstr "Desmarque todos os itens de fonte visíveis." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items." -msgstr "Selecione um item de configuração primeiro!" +msgstr "Selecione todos os itens de ícones visíveis." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items and their data." -msgstr "Selecione um item de configuração primeiro!" +msgstr "Selecione todos os itens de ícones visíveis e seus dados." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Deselect all visible icon items." -msgstr "Selecione um item de configuração primeiro!" +msgstr "Desmarque todos os itens de ícones visíveis." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible stylebox items." -msgstr "" +msgstr "Selecionar todos os itens visíveis da caixa de estilo." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible stylebox items and their data." -msgstr "" +msgstr "Selecionar todos os itens visíveis da caixa de estilo e seus dados." #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all visible stylebox items." -msgstr "" +msgstr "Deselecionar todos os itens visíveis da caixa de estilo." #: editor/plugins/theme_editor_plugin.cpp msgid "" "Caution: Adding icon data may considerably increase the size of your Theme " "resource." msgstr "" +"Atenção: Adicionar dados de ícone pode aumentar consideravelmente o tamanho " +"do recurso do Tema." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Collapse types." -msgstr "Recolher Tudo" +msgstr "Recolher tudo." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Expand types." -msgstr "Expandir Tudo" +msgstr "Expandir tudo." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all Theme items." -msgstr "Selecionar o Arquivo de Modelo" +msgstr "Selecionar todos os itens do Tema." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select With Data" -msgstr "Selecionar Pontos" +msgstr "Selecionar Com Dados" #: editor/plugins/theme_editor_plugin.cpp msgid "Select all Theme items with item data." -msgstr "" +msgstr "Selecionar todos os itens do Tema com dados." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Deselect All" -msgstr "Selecionar tudo" +msgstr "Desmarcar Tudo" #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all Theme items." -msgstr "" +msgstr "Desselecionar todos os itens do Tema." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Import Selected" -msgstr "Importar Cena" +msgstr "Importar Selecionado" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -8944,277 +8909,249 @@ msgid "" "closing this window.\n" "Close anyway?" msgstr "" +"A guia de Importação de itens possui alguns itens selecionados. A seleção " +"será perdida ao fechar esta janela.\n" +"Fechar mesmo assim?" #: editor/plugins/theme_editor_plugin.cpp msgid "" "Select a theme type from the list to edit its items.\n" "You can add a custom type or import a type with its items from another theme." msgstr "" +"Selecione um modelo de tema da lista para editar seus itens.\n" +"Você pode adicionar um modelo personalizado ou importar um modelo com itens " +"de outro tema." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All Color Items" -msgstr "Remover Todos os Itens" +msgstr "Remover Todos os Itens de Cor" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Rename Item" -msgstr "Remover Item" +msgstr "Renomear Item" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All Constant Items" -msgstr "Remover Todos os Itens" +msgstr "Remover Todos os Itens de Constante" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All Font Items" -msgstr "Remover Todos os Itens" +msgstr "Remover Todos os Itens de Fonte" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All Icon Items" -msgstr "Remover Todos os Itens" +msgstr "Remover Todos os Itens de Ícone" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy msgid "Remove All StyleBox Items" -msgstr "Remover Todos os Itens" +msgstr "Remover Todos os Itens de StyleBox" #: editor/plugins/theme_editor_plugin.cpp msgid "" "This theme type is empty.\n" "Add more items to it manually or by importing from another theme." msgstr "" +"Este modelo de tema está vazio.\n" +"Adicione mais itens manualmente ou importe de outro tema." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Color Item" -msgstr "Adicionar Itens de Classe" +msgstr "Adicionar Itens de Cor" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Constant Item" -msgstr "Adicionar Itens de Classe" +msgstr "Adicionar Item de Constante" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Font Item" -msgstr "Adicionar Item" +msgstr "Adicionar Item de Fonte" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Icon Item" -msgstr "Adicionar Item" +msgstr "Adicionar Item de Ícone" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy msgid "Add Stylebox Item" -msgstr "Adicionar Todos os Itens" +msgstr "Adicionar Item de Stylebox" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Rename Color Item" -msgstr "Remover Itens de Classe" +msgstr "Renomear Item de Cor" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Rename Constant Item" -msgstr "Remover Itens de Classe" +msgstr "Renomear Item de Constante" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Rename Font Item" -msgstr "Renomear Nó" +msgstr "Renomear Item de Fonte" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Rename Icon Item" -msgstr "Renomear Nó" +msgstr "Renomear Item de Ícone" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy msgid "Rename Stylebox Item" -msgstr "Remover Item Selecionado" +msgstr "Renomear Item de Stylebox" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Invalid file, not a Theme resource." -msgstr "Arquivo inválido, não é um layout de canais de áudio." +msgstr "Arquivo inválido, não é um recurso de Tema." #: editor/plugins/theme_editor_plugin.cpp msgid "Invalid file, same as the edited Theme resource." -msgstr "" +msgstr "Arquivo inválido, é o mesmo recurso de Tema sendo editado." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Manage Theme Items" -msgstr "Gerenciar Templates" +msgstr "Gerenciar Itens do Tema" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Items" -msgstr "Item Editável" +msgstr "Editar Itens" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Types:" -msgstr "Tipo:" +msgstr "Modelos:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Type:" -msgstr "Tipo:" +msgstr "Adicionar Modelo:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Item:" -msgstr "Adicionar Item" +msgstr "Adicionar Item:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy msgid "Add StyleBox Item" -msgstr "Adicionar Todos os Itens" +msgstr "Adicionar Item de Stylebox" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Items:" -msgstr "Remover Item" +msgstr "Remover Itens:" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" msgstr "Remover Itens de Classe" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Custom Items" -msgstr "Remover Itens de Classe" +msgstr "Remover Itens Personalizados" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Items" msgstr "Remover Todos os Itens" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Theme Item" -msgstr "Itens do Tema de GUI" +msgstr "Adicionar Item de Tema" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Old Name:" -msgstr "Nome do Nó:" +msgstr "Nome Antigo:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Import Items" -msgstr "Importar Tema" +msgstr "Importar Itens" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Default Theme" -msgstr "Padrão" +msgstr "Tema Padrão" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Editor Theme" -msgstr "Editar Tema" +msgstr "Tema do Editor" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select Another Theme Resource:" -msgstr "Excluir Recurso" +msgstr "Selecionar Outro Recurso de Tema:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Another Theme" -msgstr "Importar Tema" +msgstr "Outro Tema" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Confirm Item Rename" -msgstr "Renomear Trilha na Anim" +msgstr "Confirmar Renomeação do Item" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Cancel Item Rename" -msgstr "Renomear em lote" +msgstr "Cancelar Renomeação do Item" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Override Item" -msgstr "Sobrescreve" +msgstr "Sobrescrever Item" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Unpin this StyleBox as a main style." -msgstr "" +msgstr "Desafixar essa StyleBox do estilo principal." #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "" "Pin this StyleBox as a main style. Editing its properties will update the " "same properties in all other StyleBoxes of this type." msgstr "" +"Fixar essa StyleBox como estilo principal. Editar suas propriedades vai " +"atualizar as mesmas propriedades em todas as outras StyleBoxes desse modelo." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Type" -msgstr "Tipo" +msgstr "Adicionar Modelo" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Item Type" -msgstr "Adicionar Item" +msgstr "Adicionar Tipo de Item" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Node Types:" -msgstr "Tipo de nó" +msgstr "Tipos de Nó:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Show Default" -msgstr "Carregar Padrão" +msgstr "Mostrar Padrão" #: editor/plugins/theme_editor_plugin.cpp msgid "Show default type items alongside items that have been overridden." msgstr "" +"Mostrar itens do modelo padrão ao lado de itens que foram substituídos." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Override All" -msgstr "Sobrescreve" +msgstr "Substituir Todos" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." -msgstr "" +msgstr "Substituir todos os itens do modelo padrão." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme:" -msgstr "Tema" +msgstr "Tema:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Manage Items..." -msgstr "Gerenciar Modelos de Exportação..." +msgstr "Gerenciar Itens..." #: editor/plugins/theme_editor_plugin.cpp msgid "Add, remove, organize and import Theme items." -msgstr "" +msgstr "Adicionar, remover, organizar e importar itens de Tema." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Preview" -msgstr "Visualização" +msgstr "Adicionar Prévia" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Default Preview" -msgstr "Atualizar visualização" +msgstr "Prévia Padrão" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select UI Scene:" -msgstr "Selecione uma Malha de origem:" +msgstr "Selecione a Cena de UI:" #: editor/plugins/theme_editor_preview.cpp msgid "" @@ -9310,19 +9247,19 @@ msgstr "Tem,Muitas,Opções" #: editor/plugins/theme_editor_preview.cpp msgid "Invalid path, the PackedScene resource was probably moved or removed." msgstr "" +"Caminho inválido, o recurso PackedScene foi provavelmente movido ou deletado." #: editor/plugins/theme_editor_preview.cpp msgid "Invalid PackedScene resource, must have a Control node at its root." -msgstr "" +msgstr "Recurso PackedScene inválido, se deve ter um nó Control na sua raíz." #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Invalid file, not a PackedScene resource." -msgstr "Arquivo inválido, não é um layout de canais de áudio." +msgstr "Arquivo inválido, não é um recurso PackedScene." #: editor/plugins/theme_editor_preview.cpp msgid "Reload the scene to reflect its most actual state." -msgstr "" +msgstr "Recarregue a cena para refletir seu estado mais atual." #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" @@ -10718,9 +10655,8 @@ msgid "VisualShader" msgstr "VisualShader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property:" -msgstr "Editar Propriedade Visual" +msgstr "Editar Propriedade Visual:" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" @@ -10848,9 +10784,8 @@ msgid "Script" msgstr "Roteiro" #: editor/project_export.cpp -#, fuzzy msgid "GDScript Export Mode:" -msgstr "Modo de Exportação de Scripts:" +msgstr "Modo de Exportação do GDScript:" #: editor/project_export.cpp msgid "Text" @@ -10858,7 +10793,7 @@ msgstr "Texto" #: editor/project_export.cpp msgid "Compiled Bytecode (Faster Loading)" -msgstr "" +msgstr "Bytecode Compilado (Carregamento Mais Rápido)" #: editor/project_export.cpp msgid "Encrypted (Provide Key Below)" @@ -11173,12 +11108,11 @@ msgstr "Tem certeza de que quer executar %d projetos ao mesmo tempo?" #: editor/project_manager.cpp #, fuzzy msgid "Remove %d projects from the list?" -msgstr "Selecione um dispositivo da lista" +msgstr "Remover projetos %d da lista?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove this project from the list?" -msgstr "Selecione um dispositivo da lista" +msgstr "Remover esse projeto da lista?" #: editor/project_manager.cpp msgid "" @@ -11212,9 +11146,8 @@ msgid "Project Manager" msgstr "Gerenciador de Projetos" #: editor/project_manager.cpp -#, fuzzy msgid "Local Projects" -msgstr "Projetos" +msgstr "Projetos Locais" #: editor/project_manager.cpp msgid "Loading, please wait..." @@ -11225,9 +11158,8 @@ msgid "Last Modified" msgstr "Ultima Modificação" #: editor/project_manager.cpp -#, fuzzy msgid "Edit Project" -msgstr "Exportar Projeto" +msgstr "Editar Projeto" #: editor/project_manager.cpp #, fuzzy @@ -11239,9 +11171,8 @@ msgid "Scan" msgstr "Escanear" #: editor/project_manager.cpp -#, fuzzy msgid "Scan Projects" -msgstr "Projetos" +msgstr "Escanear Projetos" #: editor/project_manager.cpp msgid "Select a Folder to Scan" @@ -11252,14 +11183,12 @@ msgid "New Project" msgstr "Novo Projeto" #: editor/project_manager.cpp -#, fuzzy msgid "Import Project" -msgstr "Projeto Importado" +msgstr "Importar Projeto" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Project" -msgstr "Renomear Projeto" +msgstr "Remover Projeto" #: editor/project_manager.cpp msgid "Remove Missing" @@ -11270,9 +11199,8 @@ msgid "About" msgstr "Sobre" #: editor/project_manager.cpp -#, fuzzy msgid "Asset Library Projects" -msgstr "Biblioteca de Assets" +msgstr "Projetos da Biblioteca de Recursos" #: editor/project_manager.cpp msgid "Restart Now" @@ -11284,7 +11212,7 @@ msgstr "Remover Tudo" #: editor/project_manager.cpp msgid "Also delete project contents (no undo!)" -msgstr "" +msgstr "Também deletar os conteúdos do projeto (não se pode desfazer!)" #: editor/project_manager.cpp msgid "Can't run project" @@ -11299,9 +11227,8 @@ msgstr "" "Gostaria de explorar projetos de exemplo oficiais na Asset Library?" #: editor/project_manager.cpp -#, fuzzy msgid "Filter projects" -msgstr "Filtrar propriedades" +msgstr "Filtrar Projetos" #: editor/project_manager.cpp #, fuzzy @@ -11316,12 +11243,12 @@ msgstr "" "conter pelo menos um caractere `/`." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Tecla " +msgid "Physical Key" +msgstr "Tecla Física" #: editor/project_settings_editor.cpp -msgid "Physical Key" -msgstr "" +msgid "Key " +msgstr "Tecla " #: editor/project_settings_editor.cpp msgid "Joy Button" @@ -11368,8 +11295,9 @@ msgid "Device" msgstr "Dispositivo" #: editor/project_settings_editor.cpp +#, fuzzy msgid " (Physical)" -msgstr "" +msgstr " Físico" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." @@ -11512,9 +11440,8 @@ msgid "Override for Feature" msgstr "Sobrescrever para Funcionalidade" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Add %d Translations" -msgstr "Adicionar Tradução" +msgstr "Adicionar %d Traduções" #: editor/project_settings_editor.cpp msgid "Remove Translation" @@ -11972,12 +11899,15 @@ msgstr "Excluir o nó \"%s\"?" msgid "" "Saving the branch as a scene requires having a scene open in the editor." msgstr "" +"Para salvar o ramo como cena é necessário ter uma cena aberta no editor." #: editor/scene_tree_dock.cpp msgid "" "Saving the branch as a scene requires selecting only one node, but you have " "selected %d nodes." msgstr "" +"Para salvar o ramo como cena é necessário selecionar apenas um nó, mas você " +"selecionou %d nós." #: editor/scene_tree_dock.cpp msgid "" @@ -12399,6 +12329,8 @@ msgid "" "Warning: Having the script name be the same as a built-in type is usually " "not desired." msgstr "" +"Aviso: É geralmente indesejável que o nome do script seja o mesmo que o de " +"um tipo embutido." #: editor/script_create_dialog.cpp msgid "Class Name:" @@ -12470,7 +12402,7 @@ msgstr "Copiar Erro" #: editor/script_editor_debugger.cpp msgid "Open C++ Source on GitHub" -msgstr "" +msgstr "Abrir Código C++ no GitHub" #: editor/script_editor_debugger.cpp msgid "Video RAM" @@ -12784,9 +12716,8 @@ msgid "Export Mesh GLTF2" msgstr "Exportar Biblioteca de Malhas" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp -#, fuzzy msgid "Export GLTF..." -msgstr "Exportar..." +msgstr "Exportar GLTF..." #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -12954,9 +12885,8 @@ msgid "Class name can't be a reserved keyword" msgstr "Nome da classe não pode ser uma palavra reservada" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Seleção de preenchimento" +msgstr "Construir Solução" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -13209,9 +13139,8 @@ msgid "Add Preload Node" msgstr "Adicionar Nó de Pré-carregamento" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Node(s)" -msgstr "Adicionar Nó" +msgstr "Adicionar Nó(s)" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -13478,17 +13407,15 @@ msgstr "Selecione um dispositivo da lista" #: platform/android/export/export_plugin.cpp msgid "Running on %s" -msgstr "" +msgstr "Executando em %s" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exporting APK..." -msgstr "Exportando tudo" +msgstr "Exportando APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Uninstalling..." -msgstr "Desinstalar" +msgstr "Desinstalando..." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -13498,17 +13425,15 @@ msgstr "Carregando, por favor aguarde." #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Could not install to device: %s" -msgstr "Não foi possível instanciar cena!" +msgstr "Não foi possível instalar para o dispositivo: %s" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Running on device..." -msgstr "Rodando Script Personalizado..." +msgstr "Executando no dispositivo..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not execute on device." -msgstr "Não foi possível criar a pasta." +msgstr "Não foi possível executar no dispositivo." #: platform/android/export/export_plugin.cpp msgid "Unable to find the 'apksigner' tool." @@ -13627,32 +13552,28 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." -msgstr "" +msgstr "Assinando depuração %s..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signing release %s..." -msgstr "" -"Escaneando arquivos,\n" -"Por favor aguarde..." +msgstr "Assinando lançamento %s..." #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Could not find keystore, unable to export." -msgstr "Não foi possível abrir o modelo para exportar:" +msgstr "Não foi possível encontrar a keystore, incapaz de exportar." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" -msgstr "" +msgstr "'apksigner' retornou com o erro #%d" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Verifying %s..." -msgstr "Adicionando %s..." +msgstr "Verificando %s..." #: platform/android/export/export_plugin.cpp msgid "'apksigner' verification of %s failed." -msgstr "" +msgstr "A verificação de 'apksigner' de %s falhou." #: platform/android/export/export_plugin.cpp msgid "Exporting for Android" @@ -13672,7 +13593,7 @@ msgstr "Nome de arquivo inválido! Android APK requer a extensão *.apk." #: platform/android/export/export_plugin.cpp msgid "Unsupported export format!\n" -msgstr "" +msgstr "Formato de Exportação Não Suportado\n" #: platform/android/export/export_plugin.cpp msgid "" @@ -13699,6 +13620,8 @@ msgstr "" msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name" msgstr "" +"Incapaz de sobrescrever os arquivos res://android/build/res/*.xml com o nome " +"do projeto" #: platform/android/export/export_plugin.cpp msgid "Could not export project files to gradle project\n" @@ -13706,9 +13629,8 @@ msgstr "" "Não foi possível exportar os arquivos do projeto ao projeto do gradle\n" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not write expansion package file!" -msgstr "Não foi possível escrever o arquivo:" +msgstr "Não foi possível escrever o arquivo do pacote de expansão!" #: platform/android/export/export_plugin.cpp msgid "Building Android Project (gradle)" @@ -13736,21 +13658,20 @@ msgstr "" "diretório do projeto gradle por saídas." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: %s" -msgstr "Animação não encontrada: '%s'" +msgstr "Pacote não encontrado: '%s'" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Creating APK..." -msgstr "Criando contornos..." +msgstr "Criando APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Could not find template APK to export:\n" "%s" -msgstr "Não foi possível abrir o modelo para exportar:" +msgstr "" +"Não foi possível encontrar o modelo de APK para exportar:\n" +"%s" #: platform/android/export/export_plugin.cpp msgid "" @@ -13761,18 +13682,16 @@ msgid "" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Adding files..." -msgstr "Adicionando %s..." +msgstr "Adicionando arquivos..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files" -msgstr "Não foi possível escrever o arquivo:" +msgstr "Não foi possível exportar os arquivos do projeto" #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." -msgstr "" +msgstr "Alinhando APK..." #: platform/android/export/export_plugin.cpp msgid "Could not unzip temporary unaligned APK." @@ -13824,9 +13743,8 @@ msgid "Could not write file:" msgstr "Não foi possível escrever o arquivo:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file:" -msgstr "Não foi possível escrever o arquivo:" +msgstr "Não foi possível ler o arquivo:" #: platform/javascript/export/export.cpp #, fuzzy @@ -13841,7 +13759,7 @@ msgstr "Não foi possível criar a pasta." #: platform/javascript/export/export.cpp #, fuzzy msgid "Error starting HTTP server:" -msgstr "Erro ao salvar cena." +msgstr "Erro iniciando servidor HTTP:" #: platform/osx/export/export.cpp #, fuzzy @@ -14392,11 +14310,11 @@ msgstr "" #: scene/3d/portal.cpp msgid "A Room should not be a child or grandchild of a Portal." -msgstr "" +msgstr "Um Room não deve ser filho ou neto de um Portal." #: scene/3d/portal.cpp msgid "A RoomGroup should not be a child or grandchild of a Portal." -msgstr "" +msgstr "Um RoomGroup não deve ser filho ou neto de um Portal." #: scene/3d/remote_transform.cpp msgid "" @@ -14408,15 +14326,15 @@ msgstr "" #: scene/3d/room.cpp msgid "A Room cannot have another Room as a child or grandchild." -msgstr "" +msgstr "Um Room não pode ter outro Room como filho ou neto." #: scene/3d/room.cpp msgid "The RoomManager should not be placed inside a Room." -msgstr "" +msgstr "O RoomManager não deve ser colocado dentro de um Room." #: scene/3d/room.cpp msgid "A RoomGroup should not be placed inside a Room." -msgstr "" +msgstr "Um RoomGroup não deve ser colocado dentro de um Room." #: scene/3d/room.cpp msgid "" @@ -14426,7 +14344,7 @@ msgstr "" #: scene/3d/room_group.cpp msgid "The RoomManager should not be placed inside a RoomGroup." -msgstr "" +msgstr "O RoomManager não deve ser colocado dentro de um RoomGroup." #: scene/3d/room_manager.cpp msgid "The RoomList has not been assigned." @@ -14434,7 +14352,7 @@ msgstr "" #: scene/3d/room_manager.cpp msgid "The RoomList node should be a Spatial (or derived from Spatial)." -msgstr "" +msgstr "O nó RoomList deve ser Spatial(ou derivado de Spatial)." #: scene/3d/room_manager.cpp msgid "" @@ -14444,7 +14362,7 @@ msgstr "" #: scene/3d/room_manager.cpp msgid "There should only be one RoomManager in the SceneTree." -msgstr "" +msgstr "Só Deve existir um RoomManager na SceneTree." #: scene/3d/room_manager.cpp msgid "" @@ -14454,7 +14372,7 @@ msgstr "" #: scene/3d/room_manager.cpp msgid "RoomList contains no Rooms, aborting." -msgstr "" +msgstr "A RoomList não contem Rooms, abortando." #: scene/3d/room_manager.cpp msgid "Misnamed nodes detected, check output log for details. Aborting." @@ -14692,6 +14610,14 @@ msgstr "" "O Ambiente Padrão especificado nas Configurações de Projeto (Rendering -> " "Environment -> Default Environment) não pôde ser carregado." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14705,9 +14631,12 @@ msgstr "" "render e atribua sua textura interna a algum nó para exibir." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" -"O tamanho da Viewport deve ser maior do que 0 para renderizar qualquer coisa." +"O tamanho do Viewport deve ser maior ou igual a 2 pixels em ambas as " +"dimensões para renderizar algo." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" @@ -14752,7 +14681,7 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Fragment-stage varying could not been accessed in custom function!" -msgstr "" +msgstr "Variante Fragment-stage não pôde ser acessada na função personalizada!" #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -16394,9 +16323,6 @@ msgstr "Constantes não podem serem modificadas." #~ msgid "Couldn't save atlas image:" #~ msgstr "Não se pôde salva imagem de atlas:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "Não se pôde salvar textura convertida:" - #~ msgid "Invalid translation source!" #~ msgstr "Origem de tradução inválida!" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index ecf041058c..9a45a6ca63 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -15,12 +15,14 @@ # f0roots <f0rootss@gmail.com>, 2020. # Gigel2 <mihalacher02@gmail.com>, 2020. # R3ktGamerRO <bluegamermc1@gmail.com>, 2021. +# FlooferLand <yunaflarf@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-03-20 04:18+0000\n" -"Last-Translator: R3ktGamerRO <bluegamermc1@gmail.com>\n" +"PO-Revision-Date: 2021-11-11 16:02+0000\n" +"Last-Translator: FlooferLand <yunaflarf@gmail.com>\n" "Language-Team: Romanian <https://hosted.weblate.org/projects/godot-engine/" "godot/ro/>\n" "Language: ro\n" @@ -29,7 +31,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.5.2-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -378,15 +380,13 @@ msgstr "Anim Inserați" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "node '%s'" -msgstr "Mod Snap (%s)" +msgstr "nodul '%s'" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "animation" -msgstr "Animație" +msgstr "animație" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." @@ -394,9 +394,8 @@ msgstr "AnimationPlayer nu se poate anima singur, doar alți jucători." #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "property '%s'" -msgstr "Proprietate" +msgstr "proprietatea '%s'" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -485,7 +484,7 @@ msgstr "Anim Mutați Cheie" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Clipboard is empty!" -msgstr "" +msgstr "Clipboardul este gol!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -607,9 +606,8 @@ msgid "Go to Previous Step" msgstr "Mergeți la Pasul Anterior" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Apply Reset" -msgstr "Resetați Zoom-area" +msgstr "Resetați" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -628,9 +626,8 @@ msgid "Use Bezier Curves" msgstr "Folosește curbe Bezier" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Create RESET Track(s)" -msgstr "Lipiţi Piste" +msgstr "Creați o pista RESET" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -972,11 +969,11 @@ msgstr "Creați %s Nou" #: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Niciun rezultat pentru \"%s\"." #: editor/create_dialog.cpp editor/property_selector.cpp msgid "No description available for %s." -msgstr "" +msgstr "Nu exista o descriere pentru %s." #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp @@ -1076,14 +1073,14 @@ msgid "Owners Of:" msgstr "Stăpâni La:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" "Ștergeți fișierele selectate din proiect? (Acțiune ireversibilă)\n" -"Poți gasi fișierele șterse in coșul de gunoi dacă vrei să le restabilești." +"Bazat pe configurarea sistemului de fișiere, fișierele vor fi mutate în " +"coșul de gunoi al sistemului, ori vor fi șterse definitiv." #: editor/dependency_editor.cpp #, fuzzy @@ -1169,7 +1166,7 @@ msgstr "Mulțumesc din partea comunităţii Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Apasă click sa copiezi." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1267,41 +1264,38 @@ msgid "Licenses" msgstr "Licențe" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Error opening asset file for \"%s\" (not in ZIP format)." -msgstr "Eroare la deschiderea fişierului pachet, nu este în format ZIP." +msgstr "" +"Eroare la deschiderea fişierului pachet \"%s\" (nu este în formatul ZIP)." #: editor/editor_asset_installer.cpp -#, fuzzy msgid "%s (already exists)" -msgstr "%s (Există deja)" +msgstr "%s (deja există)" #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" -msgstr "" +msgstr "Conținutul pachetului \"%s\" - %d fișiere conflictă cu proiectul tău:" #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - No files conflict with your project:" msgstr "" +"Conținutul pachetului \"%s\" - Niciun fișier nu conflictă cu proiectul tău:" #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" msgstr "Decomprimare Asset-uri" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "The following files failed extraction from asset \"%s\":" -msgstr "Următoarele file au eșuat extragerea din pachet:" +msgstr "Următoarele fișiere au eșuat extragerea din pachetul \"%s\":" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "(and %s more files)" -msgstr "și %d alte fișiere." +msgstr "(și %s alte fișiere)" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset \"%s\" installed successfully!" -msgstr "Pachet instalat cu succes!" +msgstr "Pachetul \"%s\" sa instalat cu succes!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -1550,13 +1544,12 @@ msgid "Can't add autoload:" msgstr "Nu pot adaugă încărcare automata:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "%s is an invalid path. File does not exist." -msgstr "Fișierul nu există." +msgstr "%s este o cale invalidă. Fișierul nu există." #: editor/editor_autoload_settings.cpp msgid "%s is an invalid path. Not in resource path (res://)." -msgstr "" +msgstr "%s este o cale invalida. Nu este în calea resurselor (res://)." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" @@ -1581,7 +1574,7 @@ msgstr "Nume" #: editor/editor_autoload_settings.cpp msgid "Global Variable" -msgstr "" +msgstr "Variabil Global" #: editor/editor_data.cpp msgid "Paste Params" @@ -1760,7 +1753,7 @@ msgstr "Importă Bară" #: editor/editor_feature_profile.cpp msgid "Allows to view and edit 3D scenes." -msgstr "" +msgstr "Permite vizualizarea și editarea scenelor 3D." #: editor/editor_feature_profile.cpp msgid "Allows to edit scripts using the integrated script editor." @@ -1782,7 +1775,7 @@ msgstr "" #: editor/editor_feature_profile.cpp msgid "Allows to browse the local file system via a dedicated dock." -msgstr "" +msgstr "Permite navigarea sistemului local de fișiere printr-un dock dedicat." #: editor/editor_feature_profile.cpp msgid "" @@ -1791,17 +1784,16 @@ msgid "" msgstr "" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(current)" -msgstr "(Curent)" +msgstr "(actual)" #: editor/editor_feature_profile.cpp msgid "(none)" -msgstr "" +msgstr "(nici unul)" #: editor/editor_feature_profile.cpp msgid "Remove currently selected profile, '%s'? Cannot be undone." -msgstr "" +msgstr "Șterge profilul actual selectat, '%s'? Nu poate fi anulat." #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -1833,9 +1825,8 @@ msgid "Enable Contextual Editor" msgstr "Activează Editorul Contextual" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Properties:" -msgstr "Reduceți toate proprietățile" +msgstr "Proprietățile clasei:" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1843,9 +1834,8 @@ msgid "Main Features:" msgstr "Caracteristici active:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Nodes and Classes:" -msgstr "Clase Activate:" +msgstr "Noduri și Clase:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." @@ -1873,14 +1863,12 @@ msgid "Current Profile:" msgstr "Profil Curent:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Create Profile" -msgstr "Ștergere Profil" +msgstr "Creează un Profil" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Remove Profile" -msgstr "Elimină Șablon" +msgstr "Șterge Profil" #: editor/editor_feature_profile.cpp msgid "Available Profiles:" @@ -1900,14 +1888,12 @@ msgid "Export" msgstr "Exportare" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Configure Selected Profile:" -msgstr "Profil Curent:" +msgstr "Configură Profilul Selectat:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Extra Options:" -msgstr "Opțiuni Clasă:" +msgstr "Opțiunii Extra:" #: editor/editor_feature_profile.cpp msgid "Create or import a profile to edit available classes and properties." @@ -1938,9 +1924,8 @@ msgid "Select Current Folder" msgstr "Selectaţi directorul curent" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "File exists, overwrite?" -msgstr "Fișierul există, suprascrieţi?" +msgstr "Fișierul există, înlocuiți?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select This Folder" @@ -2258,8 +2243,9 @@ msgstr "Proprietate:" #: editor/editor_inspector.cpp editor/scene_tree_dock.cpp #: modules/visual_script/visual_script_property_selector.cpp +#, fuzzy msgid "Set %s" -msgstr "" +msgstr "Setați %s" #: editor/editor_inspector.cpp msgid "Set Multiple:" @@ -2434,6 +2420,14 @@ msgstr "" "Nu am putut salva scena. Probabil dependenţe (instanţe sau moşteniri) nu au " "putut fi satisfăcute." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Nu s-au putut salva una sau mai multe scene!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Salvați toate scenele" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Nu pot salva peste scena care este înca deschisă!" @@ -2533,7 +2527,7 @@ msgstr "Nu există nici o scenă definită pentru a execuție." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "Salvați scena înainte de a rula..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2568,6 +2562,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Salvează schimbările la ’%s’ înainte de ieșire?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s nu mai există! Vă rugăm să specificați o nouă locație de salvare." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2918,10 +2916,6 @@ msgid "Save Scene" msgstr "Salvează Scena" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Salvați toate scenele" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Convertește În..." @@ -4405,6 +4399,18 @@ msgid "Clear Default for '%s'" msgstr "Curăță setarea Implicită pentru '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reimportă" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importă Ca:" @@ -4413,10 +4419,6 @@ msgid "Preset" msgstr "Presetare" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Reimportă" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -7489,12 +7491,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Extinde Script" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Fila anterioară" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7859,15 +7863,15 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Create Rest Pose from Bones" msgstr "Creează Puncte de Emisie Din Mesh" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" -msgstr "" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Skeleton2D" msgstr "Singleton (Unicat)" @@ -7930,14 +7934,19 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" -msgstr "" +#, fuzzy +msgid "Left Perspective" +msgstr "Mod Rotație" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8291,6 +8300,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -11225,11 +11254,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14452,6 +14481,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14461,7 +14498,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/ru.po b/editor/translations/ru.po index c402e80ff1..0d7bd238ed 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -70,7 +70,7 @@ # Ivan Kuzmenko <kuzmenko.ivan2002@yandex.com>, 2020. # Super Pracion <superpracion2@gmail.com>, 2020. # PizzArt <7o7goo7o7@gmail.com>, 2020. -# TheGracekale <mrsmailbot.lg@gmail.com>, 2020. +# TheGracekale <mrsmailbot.lg@gmail.com>, 2020, 2021. # Климентий Титов <titoffklim@cclc.tech>, 2020. # Richard Urban <redasuio1@gmail.com>, 2020. # Nikita <Kulacnikita@ya.ru>, 2020. @@ -98,12 +98,15 @@ # enderlorde <madel.laboratories@gmail.com>, 2021. # Олег Довгер <oleg.a.dovger@gmail.com>, 2021. # Anna Malinovskaia <tacitcoast@gmail.com>, 2021. +# mrvladus <mrvladus@yandex.ru>, 2021. +# DΞLTΛ <craftercrafter43@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-08-14 19:04+0000\n" -"Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n" +"PO-Revision-Date: 2021-11-07 09:45+0000\n" +"Last-Translator: DΞLTΛ <craftercrafter43@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -112,7 +115,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2495,6 +2498,14 @@ msgstr "" "Не возможно сохранить сцену. Вероятно, зависимости (экземпляры или " "унаследованные) не могли быть удовлетворены." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Не удалось сохранить одну или несколько сцен!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Сохранить все сцены" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Невозможно перезаписать сцену, которая все еще открыта!" @@ -2632,6 +2643,11 @@ msgid "Save changes to '%s' before closing?" msgstr "Сохранить изменения в «%s» перед закрытием?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" +"%s больше не существует! Пожалуйста укажите новое место для сохранения." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2677,29 +2693,27 @@ msgstr "Текущая сцена не сохранена. Открыть в л #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Невозможно отменить пока кнопки мыши нажаты." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Нечего отменить." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Отменить" +msgstr "Отменить: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Невозможно повторить пока кнопки мыши нажаты." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Нечего повторить." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Повторить" +msgstr "Повторить: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2773,7 +2787,7 @@ msgstr "Открыть закрытую сцену" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" -"Не удаётся включить плагин: «%s». Ошибка синтаксического разбора " +"Не удаётся включить плагин: «%s». Ошибка синтаксического разбора файла " "конфигурации." #: editor/editor_node.cpp @@ -2983,10 +2997,6 @@ msgid "Save Scene" msgstr "Сохранить сцену" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Сохранить все сцены" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Конвертировать в..." @@ -3387,9 +3397,8 @@ msgid "Merge With Existing" msgstr "Объединить с существующей" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Изменить положение" +msgstr "Применить преобразования MeshInstance" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3650,7 +3659,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Быстро загрузить" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -4469,6 +4478,23 @@ msgid "Clear Default for '%s'" msgstr "Очистить по умолчанию для «%s»" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Переимпортировать" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"У вас есть изменения, которые ещё не были применены. Нажмите " +"«Переимпортировать», чтобы применить изменения, внесённые в параметры " +"импорта.\n" +"Если выбрать другой ресурс в панели «Файловая система», не нажав сначала " +"«Переимпортировать», то сделанные в панели «Импорт» изменения будут потеряны." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Импортировать как:" @@ -4477,10 +4503,6 @@ msgid "Preset" msgstr "Пресет" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Переимпортировать" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Сохранить сцены, переимпортировать и перезапустить" @@ -5754,15 +5776,13 @@ msgstr "Передвинуть CanvasItem «%s» в (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Заблокировать выбранное" +msgstr "Заблокирован" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Группа" +msgstr "Сгруппирован" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6703,14 +6723,12 @@ msgid "Remove Selected Item" msgstr "Удалить выбранный элемент" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Импортировать из сцены" +msgstr "Импортировать из сцены (игнорируя преобразования)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Импортировать из сцены" +msgstr "Импортировать из сцены (применяя преобразования)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7301,14 +7319,12 @@ msgid "Flip Portal" msgstr "Перевернуть портал" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "Очистить преобразование" +msgstr "Преобразование набора окклюдеров" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Создать узел" +msgstr "Центрировать узел" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7444,11 +7460,11 @@ msgid "Move Down" msgstr "Переместить вниз" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "Следующий скрипт" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "Предыдущий скрипт" #: editor/plugins/script_editor_plugin.cpp @@ -7802,26 +7818,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "У этого скелета нет костей, создайте дочерние Bone2D узлы." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Создать позу покоя из костей" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Задать позу покоя костям" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Создать позу покоя из костей" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "2D скелет" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Установить кости в позу покоя" +msgstr "Создать позу покоя" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Перезаписать существующую сцену" +msgstr "Перезаписать позу покоя" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7848,69 +7862,62 @@ msgid "Perspective" msgstr "Перспективный" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Ортогональный" +msgstr "Верхний ортогональный" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Перспективный" +msgstr "Верхний перспективный" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Ортогональный" +msgstr "Нижний ортогональный" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Перспективный" +msgstr "Нижний перспективный" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Ортогональный" +msgstr "Левый ортогональный" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Перспективный" +msgid "Left Perspective" +msgstr "Левый перспективный" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Ортогональный" +msgstr "Правый ортогональный" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Правый перспективный" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Ортогональный" +msgstr "Передний ортогональный" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Перспективный" +msgstr "Передний перспективный" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Ортогональный" +msgstr "Задний ортогональный" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Перспективный" +msgstr "Задний перспективный" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [авто]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [порталы активны]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8101,7 +8108,7 @@ msgstr "Прослушиватель звука" #: editor/plugins/spatial_editor_plugin.cpp msgid "Enable Doppler" -msgstr "Включить эффект Doppler" +msgstr "Включить эффект Доплера" #: editor/plugins/spatial_editor_plugin.cpp msgid "Cinematic Preview" @@ -8235,6 +8242,26 @@ msgid "Right View" msgstr "Вид справа" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "Вид с орбиты вниз" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "Вид с орбиты влево" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "Вид с орбиты вправо" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "Вид с орбиты вверх" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "Вид с орбиты 180" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Переключение перспективного/ортогонального вида" @@ -8308,9 +8335,8 @@ msgid "View Portal Culling" msgstr "Отображать portal culling" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Отображать portal culling" +msgstr "Просмотр Occlusion Culling" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8378,9 +8404,8 @@ msgid "Post" msgstr "После" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "Безымянный проект" +msgstr "Безымянный гизмо" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -11153,14 +11178,14 @@ msgstr "" "хотя бы один символ `/`." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Клавиша " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "Физическая клавиша" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Клавиша " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Кнопка геймпада" @@ -11644,19 +11669,19 @@ msgstr "Оставить оригинал" #: editor/rename_dialog.cpp msgid "PascalCase to snake_case" -msgstr "ВерблюжийРегистр в змеиный_регистр" +msgstr "PascalCase в snake_case" #: editor/rename_dialog.cpp msgid "snake_case to PascalCase" -msgstr "змеиный_регистр в ВерблюжийРегистр" +msgstr "snake_case в PascalCase" #: editor/rename_dialog.cpp msgid "Case" -msgstr "Случай" +msgstr "Регистр" #: editor/rename_dialog.cpp msgid "To Lowercase" -msgstr "К нижнему регистру" +msgstr "В нижний регистр" #: editor/rename_dialog.cpp msgid "To Uppercase" @@ -12060,7 +12085,7 @@ msgstr "(Источник)" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" -msgstr "Конфигурации узла, предупреждение:" +msgstr "Предупреждение о конфигурации узла:" #: editor/scene_tree_editor.cpp msgid "" @@ -12512,14 +12537,12 @@ msgid "Set Portal Point Position" msgstr "Задать положение точки портала" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Изменить радиус цилиндра" +msgstr "Задать радиус сферы окклюдера" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "Установить позицию входа кривой" +msgstr "Задать положение сферы окклюдера" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12804,9 +12827,8 @@ msgid "Class name can't be a reserved keyword" msgstr "Имя класса не может быть зарезервированным ключевым словом" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Заполнить выбранное" +msgstr "Собрать решение" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -14140,11 +14162,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "Форма не задана." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Поддерживается только масштабирование uniform." #: scene/3d/particles.cpp msgid "" @@ -14497,6 +14519,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Опции Tile и Tile Fit для свойств Axis Stretch работают только при " +"использовании бэкенда рендеринга GLES3.\n" +"В настоящее время используется бэкенд GLES2, поэтому эти режимы будут " +"работать как Stretch." #: scene/gui/popup.cpp msgid "" @@ -14535,6 +14561,19 @@ msgstr "" "Окружение по умолчанию, указанное в Настройках проекта (Rendering -> " "Environment -> Default Environment) не может быть загружено." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"Очень низкое время ожидания таймера (< 0,05 секунды) может привести к " +"значительно разному поведению, в зависимости от частоты кадров рендеринга " +"или физики.\n" +"Рассмотрите возможность использования цикла обработки в скрипте вместо " +"таймера с очень низким временем ожидания." + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14549,12 +14588,16 @@ msgstr "" "либо узлу для отображения." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." -msgstr "Размер окна просмотра должен быть больше 0 для рендеринга." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." +msgstr "" +"Размер области просмотра должен быть больше или равен 2 пикселям в обоих " +"измерениях, чтобы отобразить что-либо." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "OccluderShapeSphere Задать сферы" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -16244,9 +16287,6 @@ msgstr "Константы не могут быть изменены." #~ msgid "Couldn't save atlas image:" #~ msgstr "Невозможно сохранить изображение атласа:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "Невозможно сохранить конвертированную текстуру:" - #~ msgid "Invalid translation source!" #~ msgstr "Неверный источник перевода!" diff --git a/editor/translations/si.po b/editor/translations/si.po index 7ff9aee6fb..a6c6eb5ab3 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -7,6 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-02-05 09:20+0000\n" "Last-Translator: thushariii <thusharipahalage@gmail.com>\n" @@ -2349,6 +2350,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2465,6 +2474,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2785,10 +2798,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4193,15 +4202,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7112,11 +7129,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7463,11 +7480,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7527,7 +7544,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7535,6 +7552,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7872,6 +7893,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10652,11 +10693,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13787,6 +13828,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13796,7 +13845,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 2395e28105..70488a8dae 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -15,6 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-07-07 15:34+0000\n" "Last-Translator: Eliška Fichnová <eliska@fichna.sk>\n" @@ -2413,6 +2414,15 @@ msgstr "" "Nedá sa uložiť scéna. Pravdepodobne (inštancie alebo dedičstvo) nemôžu byť " "spokojné." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Subprocess sa nedá spustiť!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Uložiť Všetky Scény" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Scéna sa nedá predpísať keď je stále otvorená!" @@ -2549,6 +2559,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Chcete uložiť zmeny do '%s' pred zatvorením?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2894,10 +2908,6 @@ msgid "Save Scene" msgstr "Uložiť Scénu" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Uložiť Všetky Scény" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Konvertovať Do..." @@ -4398,6 +4408,18 @@ msgid "Clear Default for '%s'" msgstr "Vyčistiť Štandardné pre '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reimportovať" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importovať Ako:" @@ -4406,10 +4428,6 @@ msgid "Preset" msgstr "Preset" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Reimportovať" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Uložiť Scény, Re-Importovať, a Reštartovať" @@ -7398,12 +7416,13 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp #, fuzzy -msgid "Next script" +msgid "Next Script" msgstr "Popis:" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Minulá karta" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7764,11 +7783,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7831,14 +7850,19 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" -msgstr "" +#, fuzzy +msgid "Left Perspective" +msgstr "Vľavo Dole" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8192,6 +8216,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -11117,11 +11161,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14361,6 +14405,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14370,7 +14422,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/sl.po b/editor/translations/sl.po index d505ee913c..5fe2168656 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -16,6 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-02-01 20:54+0000\n" "Last-Translator: Jakob Tadej Vrtačnik <minecraftalka2@gmail.com>\n" @@ -2513,6 +2514,16 @@ msgstr "" "Ni mogoče shraniti scene. Najverjetneje odvisnosti (primeri ali dedovanja) " "ne morejo biti izpolnjene." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Nemorem začeti podprocesa!" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Save All Scenes" +msgstr "Shrani vse Prizore" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2645,6 +2656,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Shranim spremembe v '%s' pred zapiranjem?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2999,11 +3014,6 @@ msgid "Save Scene" msgstr "Shrani Prizor" #: editor/editor_node.cpp -#, fuzzy -msgid "Save All Scenes" -msgstr "Shrani vse Prizore" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Pretvori V..." @@ -4541,6 +4551,18 @@ msgid "Clear Default for '%s'" msgstr "Počisti privzeto za '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Ponovno Uvozi" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Uvozi Kot:" @@ -4550,10 +4572,6 @@ msgid "Preset" msgstr "Prednastavitev..." #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Ponovno Uvozi" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -7661,12 +7679,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Zaženi Skripto" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Prejšnji zavihek" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -8035,15 +8055,15 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Create Rest Pose from Bones" msgstr "Zaženi Prizor po Meri" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" -msgstr "" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Skeleton2D" msgstr "Posameznik" @@ -8105,14 +8125,19 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" -msgstr "" +#, fuzzy +msgid "Left Perspective" +msgstr "Način Vrtenja" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8464,6 +8489,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -11432,11 +11477,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14735,6 +14780,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14744,7 +14797,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/sq.po b/editor/translations/sq.po index 2cc63728a3..a68667d741 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -7,6 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2019-03-24 17:38+0000\n" "Last-Translator: Enrik Qose <enrikqose@gmail.com>\n" "Language-Team: Albanian <https://hosted.weblate.org/projects/godot-engine/" @@ -2448,6 +2449,15 @@ msgstr "" "Nuk mund ta ruante skenën. Me shumë mundësi varësitë (instancat ose " "trashgimit) nuk mund të plotësohej." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Nuk mund të fillojë subprocess-in!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Ruaj të Gjitha Skenat" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Nuk mund të mbishkruash skenën që është akoma e hapur!" @@ -2585,6 +2595,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Ruaji ndryshimet në '%s' para se ta mbyllësh?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2940,10 +2954,6 @@ msgid "Save Scene" msgstr "Ruaj Skenën" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Ruaj të Gjitha Skenat" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Konverto në..." @@ -4464,6 +4474,18 @@ msgid "Clear Default for '%s'" msgstr "Pastro të Parazgjedhurat për '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Ri-importo" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importo Si:" @@ -4473,10 +4495,6 @@ msgid "Preset" msgstr "Ngarko Gabimet" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Ri-importo" - -#: editor/import_dock.cpp #, fuzzy msgid "Save Scenes, Re-Import, and Restart" msgstr "Ruaj skenat, ri-importo dhe rifillo" @@ -7422,12 +7440,14 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" -msgstr "" +#, fuzzy +msgid "Next Script" +msgstr "Shkrim i Ri" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Tabi i mëparshëm" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7782,11 +7802,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7848,7 +7868,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7856,6 +7876,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8202,6 +8226,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -11062,11 +11106,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14266,6 +14310,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14275,7 +14327,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index bb56bcbe29..73448d79ed 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -6,11 +6,13 @@ # Александар Урошевић <nicecubedude@gmail.com>, 2017. # Младен Габић <cupakabra@protonmail.com>, 2020. # Anonymous <noreply@weblate.org>, 2020. +# Алексић Владица <vlajkousk@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2020-05-22 21:01+0000\n" -"Last-Translator: Младен Габић <cupakabra@protonmail.com>\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" +"PO-Revision-Date: 2021-11-07 22:23+0000\n" +"Last-Translator: Алексић Владица <vlajkousk@gmail.com>\n" "Language-Team: Serbian (cyrillic) <https://hosted.weblate.org/projects/godot-" "engine/godot/sr_Cyrl/>\n" "Language: sr_Cyrl\n" @@ -18,7 +20,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.1-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -100,7 +102,6 @@ msgid "Balanced" msgstr "Балансирано" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Mirror" msgstr "Огледало" @@ -109,14 +110,12 @@ msgid "Time:" msgstr "Време:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Value:" msgstr "Вредност:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Insert Key Here" -msgstr "Убаци кључ" +msgstr "Овде Убаците Кључ" #: editor/animation_bezier_editor.cpp #, fuzzy @@ -1023,7 +1022,7 @@ msgstr "Сигурно желиш да уклониш све везе са \"%s\ #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "Сигнали" +msgstr "Знаци" #: editor/connections_dialog.cpp #, fuzzy @@ -2271,9 +2270,8 @@ msgid "Inherited by:" msgstr "Наслеђено од:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "Опис:" +msgstr "Опис" #: editor/editor_help.cpp #, fuzzy @@ -2296,25 +2294,26 @@ msgstr "Уобичајено" #: editor/editor_help.cpp msgid "Methods" -msgstr "Методе" +msgstr "Поступци" #: editor/editor_help.cpp #, fuzzy msgid "Theme Properties" -msgstr "Особине" +msgstr "Особине Теме" #: editor/editor_help.cpp +#, fuzzy msgid "Enumerations" -msgstr "Енумерације" +msgstr "Пописивање" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constants" -msgstr "Константе" +msgstr "Непроменљиве" #: editor/editor_help.cpp #, fuzzy msgid "Property Descriptions" -msgstr "Опис особине:" +msgstr "Описи Особина" #: editor/editor_help.cpp #, fuzzy @@ -2332,7 +2331,7 @@ msgstr "" #: editor/editor_help.cpp #, fuzzy msgid "Method Descriptions" -msgstr "Опис методе:" +msgstr "Описи Метода" #: editor/editor_help.cpp msgid "" @@ -2626,6 +2625,16 @@ msgid "" "be satisfied." msgstr "Не могу сачувати сцену. Вероватно зависности нису задовољене." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Не могу покренути подпроцес!" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Save All Scenes" +msgstr "Сачувај све сцене" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp #, fuzzy msgid "Can't overwrite scene that is still open!" @@ -2762,6 +2771,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Сачувај промене '%s' пре изласка?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -3117,11 +3130,6 @@ msgid "Save Scene" msgstr "Сачувај сцену" #: editor/editor_node.cpp -#, fuzzy -msgid "Save All Scenes" -msgstr "Сачувај све сцене" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Конвертуј у..." @@ -4748,6 +4756,18 @@ msgid "Clear Default for '%s'" msgstr "Обриши уобичајено за „%s“" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Поново увези" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Увези као:" @@ -4757,10 +4777,6 @@ msgid "Preset" msgstr "Поставке" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Поново увези" - -#: editor/import_dock.cpp #, fuzzy msgid "Save Scenes, Re-Import, and Restart" msgstr "Упамти Сцену, Опет Увези, и Рестартуј" @@ -8054,11 +8070,13 @@ msgid "Move Down" msgstr "Помери доле" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Следећа скриптица" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Претходна скриптица" #: editor/plugins/script_editor_plugin.cpp @@ -8447,13 +8465,13 @@ msgstr "Овај костур нема кости, креирај му децу #: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy -msgid "Create Rest Pose from Bones" -msgstr "Направи тачке емисије од мреже" +msgid "Set Rest Pose to Bones" +msgstr "Постави Одмор Позу на Коске" #: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy -msgid "Set Rest Pose to Bones" -msgstr "Постави Одмор Позу на Коске" +msgid "Create Rest Pose from Bones" +msgstr "Направи тачке емисије од мреже" #: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy @@ -8525,7 +8543,7 @@ msgstr "Ортогонална пројекција" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "Перспективна пројекција" #: editor/plugins/spatial_editor_plugin.cpp @@ -8535,6 +8553,11 @@ msgstr "Ортогонална пројекција" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "Перспективна пројекција" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "Ортогонална пројекција" @@ -8904,6 +8927,27 @@ msgid "Right View" msgstr "Поглед с десна" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Поглед испред" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Switch Perspective/Orthogonal View" msgstr "Пребаци у перспективни/ортогонални поглед" @@ -12300,15 +12344,15 @@ msgstr "" "карактер." #: editor/project_settings_editor.cpp +msgid "Physical Key" +msgstr "" + +#: editor/project_settings_editor.cpp #, fuzzy msgid "Key " msgstr "Кључ" #: editor/project_settings_editor.cpp -msgid "Physical Key" -msgstr "" - -#: editor/project_settings_editor.cpp #, fuzzy msgid "Joy Button" msgstr "Џојс дугмиж" @@ -16151,6 +16195,14 @@ msgstr "" "Уобичајено Окружење наведено у Подешавањима Пројекта (Исцртавање -> Окружење " "-> Уобичајено Окружење) није успешно учитано." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp #, fuzzy msgid "" @@ -16166,7 +16218,9 @@ msgstr "" #: scene/main/viewport.cpp #, fuzzy -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "Величина Viewport-а мора бити већа од 0 да би се нешто исцртало." #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index eee30eb977..d8a6c896f1 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -9,6 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2019-07-29 19:21+0000\n" "Last-Translator: LT <lakizvezdas@gmail.com>\n" @@ -2361,6 +2362,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2477,6 +2486,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2798,10 +2811,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4212,15 +4221,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7157,12 +7174,13 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "Otiđi Na Prethodni Korak" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7514,11 +7532,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7579,7 +7597,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7587,6 +7605,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7926,6 +7948,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10753,11 +10795,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13902,6 +13944,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13911,7 +13961,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 3b0b8a97dd..7abece55a6 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -3,7 +3,7 @@ # Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). # This file is distributed under the same license as the Godot source code. # bergmarklund <davemcgroin@gmail.com>, 2017, 2018. -# Christoffer Sundbom <christoffer_karlsson@live.se>, 2017. +# Christoffer Sundbom <christoffer_karlsson@live.se>, 2017, 2021. # Jakob Sinclair <sinclair.jakob@mailbox.org>, 2018. # . <grenoscar@gmail.com>, 2018, 2020. # Kristoffer Grundström <kristoffer.grundstrom1983@gmail.com>, 2018. @@ -23,12 +23,14 @@ # Marcus Toftedahl <marcus.toftedahl@his.se>, 2020. # Alex25820 <Alexander_sjogren@hotmail.se>, 2021. # Leon <joel.lundborg@gmail.com>, 2021. +# Kent Jofur <kent.jofur@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-08-10 21:40+0000\n" -"Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>\n" +"PO-Revision-Date: 2021-11-03 13:15+0000\n" +"Last-Translator: Kent Jofur <kent.jofur@gmail.com>\n" "Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/" "godot/sv/>\n" "Language: sv\n" @@ -36,7 +38,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -384,15 +386,13 @@ msgstr "Anim Infoga" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "node '%s'" -msgstr "Kan inte öppna '%s'." +msgstr "nod '%s'" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "animation" -msgstr "Animation" +msgstr "animering" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." @@ -401,9 +401,8 @@ msgstr "" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "property '%s'" -msgstr "Egenskaper" +msgstr "egenskapen '%s'" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -873,9 +872,8 @@ msgstr "" "vilotid." #: editor/connections_dialog.cpp -#, fuzzy msgid "Oneshot" -msgstr "Oneshot" +msgstr "Ett skott" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." @@ -1303,9 +1301,8 @@ msgid "(and %s more files)" msgstr "(och %s fler filer)" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset \"%s\" installed successfully!" -msgstr "Paketet installerades!" +msgstr "Paketet \"%s\" har installerats!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -1829,9 +1826,8 @@ msgid "Enable Contextual Editor" msgstr "Aktivera kontextuell redigerare" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Properties:" -msgstr "Expandera alla" +msgstr "Klassegenskaper:" #: editor/editor_feature_profile.cpp #, fuzzy @@ -2145,9 +2141,8 @@ msgid "Methods" msgstr "Metoder" #: editor/editor_help.cpp -#, fuzzy msgid "Theme Properties" -msgstr "Egenskaper" +msgstr "Tema Egenskaper" #: editor/editor_help.cpp msgid "Enumerations" @@ -2176,7 +2171,7 @@ msgstr "" #: editor/editor_help.cpp msgid "Method Descriptions" -msgstr "Metodbeskrivningar" +msgstr "Metodbeskrivning" #: editor/editor_help.cpp msgid "" @@ -2454,6 +2449,16 @@ msgstr "" "Kunde inte spara scenen. Förmodligen kunde inte beroenden (instanser) " "uppfyllas." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Kunde inte starta underprocess!" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Save All Scenes" +msgstr "Spara alla Scener" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Kan inte skriva över en scen som fortfarande är öppen!" @@ -2595,10 +2600,16 @@ msgid "Save changes to '%s' before closing?" msgstr "Spara ändringar i '%s' innan stängning?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s finns inte längre! Vänligen ange en ny lagringsplats." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." msgstr "" +"Den aktuella scenen har ingen rotnod, men %d modifierade externa resurser " +"sparades ändå." #: editor/editor_node.cpp #, fuzzy @@ -2637,29 +2648,27 @@ msgstr "Nuvarande scen inte sparad. Öppna ändå?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Det går inte att ångra medan musknapparna är nedtryckta." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Inget att ångra." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Ångra" +msgstr "Ångra: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Det går inte att göra om medan musknapparna är nedtryckta." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Inget att göra om." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Återställ" +msgstr "Gör om: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2953,11 +2962,6 @@ msgid "Save Scene" msgstr "Spara Scen" #: editor/editor_node.cpp -#, fuzzy -msgid "Save All Scenes" -msgstr "Spara alla Scener" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Konvertera Till..." @@ -3269,9 +3273,8 @@ msgid "Inspector" msgstr "Inspektör" #: editor/editor_node.cpp -#, fuzzy msgid "Expand Bottom Panel" -msgstr "Expandera alla" +msgstr "Expandera Nedre Panel" #: editor/editor_node.cpp msgid "Output" @@ -3443,9 +3446,8 @@ msgid "Update" msgstr "Uppdatera" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Version" -msgstr "Version:" +msgstr "Version" #: editor/editor_plugin_settings.cpp #, fuzzy @@ -3712,9 +3714,8 @@ msgid "Error requesting URL:" msgstr "Fel vid laddning:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to the mirror..." -msgstr "Anslut Till Node:" +msgstr "Ansluter till spegeln..." #: editor/export_template_manager.cpp msgid "Can't resolve the requested address." @@ -3740,9 +3741,8 @@ msgid "Request ended up in a redirect loop." msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Request failed:" -msgstr "Förfrågning Misslyckades." +msgstr "Förfrågning misslyckades:" #: editor/export_template_manager.cpp msgid "Download complete; extracting templates..." @@ -3893,9 +3893,8 @@ msgid "Uninstall templates for the current version." msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download from:" -msgstr "Ladda ner" +msgstr "Ladda ner från:" #: editor/export_template_manager.cpp #, fuzzy @@ -4396,19 +4395,19 @@ msgstr "Genererar Lightmaps" #: editor/import/resource_importer_scene.cpp msgid "Generating for Mesh: " -msgstr "" +msgstr "Generera för mesh: " #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." -msgstr "" +msgstr "Kör anpassat skript..." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" -msgstr "" +msgstr "Det gick inte att läsa in skript efter import:" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" -msgstr "" +msgstr "Ogiltigt/felaktigt skript för efterimport (kontrollera konsolen):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" @@ -4423,22 +4422,20 @@ msgid "Saving..." msgstr "Sparar..." #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Select Importer" -msgstr "Välj Node" +msgstr "Välj Importör" #: editor/import_defaults_editor.cpp msgid "Importer:" msgstr "Importör:" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Reset to Defaults" -msgstr "Ladda Standard" +msgstr "Återställ till standardvärden" #: editor/import_dock.cpp msgid "Keep File (No Import)" -msgstr "" +msgstr "Behåll fil (ingen import)" #: editor/import_dock.cpp msgid "%d Files" @@ -4453,6 +4450,22 @@ msgid "Clear Default for '%s'" msgstr "Rensa Standarden för '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Importera om" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Du har väntande ändringar som inte har tillämpats ännu. Klicka på " +"Återimportera för att tillämpa ändringar som gjorts i importalternativen.\n" +"Om du väljer en annan resurs i FilSystem-dockan utan att först klicka på " +"Återimportera kommer ändringar som gjorts i importdockan att ignoreras." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Importera Som:" @@ -4462,21 +4475,19 @@ msgid "Preset" msgstr "Återställ Zoom" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Importera om" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" -msgstr "" +msgstr "Spara scener, återimportera och starta om" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." -msgstr "" +msgstr "Att ändra typen av en importerad fil kräver omstart av editorn." #: editor/import_dock.cpp msgid "" "WARNING: Assets exist that use this resource, they may stop loading properly." msgstr "" +"VARNING: Det finns tillgångar som använder den här resursen, de kan sluta " +"laddas in korrekt." #: editor/inspector_dock.cpp msgid "Failed to load resource." @@ -4502,7 +4513,7 @@ msgstr "Skapa en ny resurs i minnet och ändra den." #: editor/inspector_dock.cpp msgid "Load an existing resource from disk and edit it." -msgstr "" +msgstr "Ladda en befintlig resurs från disken och redigera den." #: editor/inspector_dock.cpp msgid "Save the currently edited resource." @@ -4818,9 +4829,8 @@ msgid "Blend:" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Parameter Changed:" -msgstr "Uppdatera Ändringar" +msgstr "Parameter ändrad:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -5452,9 +5462,8 @@ msgid "Request failed, timeout" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Timeout." -msgstr "Tid:" +msgstr "Tidsgräns." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" @@ -7490,11 +7499,13 @@ msgid "Move Down" msgstr "Flytta Ner" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Nästa Skript" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Föregående Skript" #: editor/plugins/script_editor_plugin.cpp @@ -7858,15 +7869,15 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Create Rest Pose from Bones" msgstr "Skapa från Scen" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" -msgstr "" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Skeleton2D" msgstr "Singleton" @@ -7931,7 +7942,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "Perspektiv" #: editor/plugins/spatial_editor_plugin.cpp @@ -7939,6 +7950,11 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Right Perspective" +msgstr "Perspektiv" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8004,9 +8020,8 @@ msgid "Translate" msgstr "Översättningar" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scale" -msgstr "Skala:" +msgstr "Skala" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scaling: " @@ -8038,28 +8053,24 @@ msgid "Yaw:" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size:" -msgstr "Storlek: " +msgstr "Storlek:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn:" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Material Changes:" -msgstr "Uppdatera Ändringar" +msgstr "Materialförändringar:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Shader Changes:" -msgstr "Ändra" +msgstr "Shader Ändringar:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Surface Changes:" -msgstr "Ändra" +msgstr "Ytförändringar:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Draw Calls:" @@ -8295,6 +8306,27 @@ msgid "Right View" msgstr "Vy från höger" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Vy framifrån" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -8793,9 +8825,8 @@ msgid "Importing items {n}/{n}" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Updating the editor" -msgstr "Stäng redigeraren?" +msgstr "Uppdaterar editorn" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8812,9 +8843,8 @@ msgid "With Data" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select by data type:" -msgstr "Välj en Node" +msgstr "Välj efter datatyp:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9056,9 +9086,8 @@ msgid "Add StyleBox Item" msgstr "Stil" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Items:" -msgstr "Ta Bort Mall" +msgstr "Ta bort objekt:" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" @@ -9098,9 +9127,8 @@ msgid "Editor Theme" msgstr "Redigera Tema" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select Another Theme Resource:" -msgstr "Ta bort Resurs" +msgstr "Välj en annan temaresurs:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9156,18 +9184,16 @@ msgid "Show default type items alongside items that have been overridden." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Override All" -msgstr "skriv över:" +msgstr "Åsidosätt Alla" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme:" -msgstr "Tema" +msgstr "Tema:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9189,9 +9215,8 @@ msgid "Default Preview" msgstr "Förhandsgranska" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select UI Scene:" -msgstr "Återställ Scen" +msgstr "Välj UI-scen:" #: editor/plugins/theme_editor_preview.cpp msgid "" @@ -9341,9 +9366,8 @@ msgid "Erase TileMap" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Find Tile" -msgstr "Hitta Nästa" +msgstr "Hitta Bricka" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" @@ -9514,9 +9538,8 @@ msgid "Navigation Mode" msgstr "Animations-Node" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Bitmask Mode" -msgstr "Raw-Läge" +msgstr "Bitmaskläge" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -9524,9 +9547,8 @@ msgid "Priority Mode" msgstr "Exportera Projekt" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Icon Mode" -msgstr "Växla Läge" +msgstr "Icon Läge" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Z Index Mode" @@ -9812,9 +9834,8 @@ msgid "Detect new changes" msgstr "Skapa Ny" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Changes" -msgstr "Ändra" +msgstr "Ändringar" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -10678,9 +10699,8 @@ msgid "VisualShader" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property:" -msgstr "Redigera Filter" +msgstr "Redigera Visuell Egenskap:" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" @@ -11102,14 +11122,12 @@ msgid "Are you sure to run %d projects at once?" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Remove %d projects from the list?" -msgstr "Välj enhet från listan" +msgstr "Ta bort %d projekt från listan?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove this project from the list?" -msgstr "Välj enhet från listan" +msgstr "Vill du ta bort det här projektet från listan?" #: editor/project_manager.cpp msgid "" @@ -11234,14 +11252,14 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Nyckel " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Nyckel " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "" @@ -13539,9 +13557,8 @@ msgstr "" "Snälla Vänta..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find keystore, unable to export." -msgstr "Kunde inte öppna mall för export:" +msgstr "Det gick inte att hitta nyckellager, det gick inte att exportera." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -13601,9 +13618,8 @@ msgid "Could not export project files to gradle project\n" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not write expansion package file!" -msgstr "Kunde inte skriva till filen:" +msgstr "Kunde inte skriva expansionspaketfil!" #: platform/android/export/export_plugin.cpp msgid "Building Android Project (gradle)" @@ -13656,9 +13672,8 @@ msgid "Adding files..." msgstr "Lägger till %s..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files" -msgstr "Kunde inte skriva till filen:" +msgstr "Kunde inte exportera projektfiler" #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -13723,14 +13738,12 @@ msgid "Could not read HTML shell:" msgstr "Kunde inte skriva till filen:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory:" -msgstr "Kunde inte skapa mapp." +msgstr "Kunde inte skapa HTTP-serverkatalog:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server:" -msgstr "Fel vid sparande av scenen." +msgstr "Fel vid start av HTTP-server:" #: platform/osx/export/export.cpp #, fuzzy @@ -14486,6 +14499,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14495,7 +14516,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp @@ -14519,9 +14542,8 @@ msgid "Invalid source for shader." msgstr "Ogiltig teckenstorlek." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "Ogiltig teckenstorlek." +msgstr "Ogiltig jämförelsefunktion för den typen." #: servers/visual/shader_language.cpp msgid "Varying may not be assigned in the '%s' function." @@ -14552,8 +14574,9 @@ msgid "Assignment to uniform." msgstr "" #: servers/visual/shader_language.cpp +#, fuzzy msgid "Constants cannot be modified." -msgstr "" +msgstr "Konstanter kan inte ändras." #~ msgid "Bottom" #~ msgstr "Botten" diff --git a/editor/translations/ta.po b/editor/translations/ta.po index f0a34987a2..137e2a28f9 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -9,6 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2020-09-01 10:38+0000\n" "Last-Translator: Sridhar <sreeafmarketing@gmail.com>\n" @@ -2352,6 +2353,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2468,6 +2477,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2788,10 +2801,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4199,15 +4208,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7114,11 +7131,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7465,11 +7482,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7529,7 +7546,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7537,6 +7554,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7874,6 +7895,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10656,11 +10697,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13793,6 +13834,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13802,7 +13851,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/te.po b/editor/translations/te.po index a77af85920..fbe2d0dac3 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -6,6 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2020-09-15 07:17+0000\n" "Last-Translator: suresh p <suresh9247@gmail.com>\n" "Language-Team: Telugu <https://hosted.weblate.org/projects/godot-engine/" @@ -2321,6 +2322,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2437,6 +2446,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2756,10 +2769,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4160,15 +4169,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7049,11 +7066,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7399,11 +7416,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7463,7 +7480,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7471,6 +7488,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7808,6 +7829,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10554,11 +10595,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13666,6 +13707,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13675,7 +13724,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/th.po b/editor/translations/th.po index 3042188001..6fe9af7f1d 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -14,6 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-06-07 23:43+0000\n" "Last-Translator: Atirut Wattanamongkol <artjang301@gmail.com>\n" @@ -2405,6 +2406,15 @@ msgid "" "be satisfied." msgstr "บันทึกฉากไม่ได้ อาจจะมีการอ้างอิงไม่สมบูรณ์ (อินสแตนซ์หรือการสืบทอด)" +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "บันทึก Texture ที่แปลงแล้วไม่ได้:" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "บันทึกฉากทั้งหมด" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "ไม่สามารถเขียนทับฉากที่กำลังเปิดอยู่ได้!" @@ -2535,6 +2545,10 @@ msgid "Save changes to '%s' before closing?" msgstr "บันทึก '%s' ก่อนปิดโปรแกรมหรือไม่?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2873,10 +2887,6 @@ msgid "Save Scene" msgstr "บันทึกฉาก" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "บันทึกฉากทั้งหมด" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "แปลงเป็น..." @@ -4360,6 +4370,18 @@ msgid "Clear Default for '%s'" msgstr "ลบค่าเริ่มต้นของ '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "นำเข้าใหม่" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "นำเข้าเป็น:" @@ -4368,10 +4390,6 @@ msgid "Preset" msgstr "พรีเซ็ต (ค่าตั้งล่วงหน้า)" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "นำเข้าใหม่" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "บันทึกฉาก, นำเข้าและเริ่มต้นใหม่" @@ -7326,11 +7344,13 @@ msgid "Move Down" msgstr "เลื่อนลง" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "สคริปต์ถัดไป" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "สคริปต์ก่อนหน้า" #: editor/plugins/script_editor_plugin.cpp @@ -7680,14 +7700,14 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "โครงหลักนี้ยังไม่มีโครงใดๆ สร้างโหนดลูกของ Bone2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "สร้างท่าโพสจากโครง" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "ตั้งท่าโพสจากโครง" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "สร้างท่าโพสจากโครง" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D" @@ -7752,7 +7772,7 @@ msgstr "ขนาน" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "เพอร์สเปกทีฟ" #: editor/plugins/spatial_editor_plugin.cpp @@ -7762,6 +7782,11 @@ msgstr "ขนาน" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "เพอร์สเปกทีฟ" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "ขนาน" @@ -8123,6 +8148,27 @@ msgid "Right View" msgstr "มุมขวา" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "มุมหน้า" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "สลับมุมมองเพอร์สเปกทีฟ/ออโธโกนอล" @@ -11064,14 +11110,14 @@ msgstr "" "แบบสอบถามต้องมีอักขระ `/` อย่างน้อยหนึ่งตัวเพื่อกรองตามชื่อโครงการและที่อยู่แบบเต็ม" #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "ปุ่ม " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "ปุ่ม " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "ปุ่มจอย" @@ -14324,6 +14370,14 @@ msgstr "" "ไม่สามารถโหลด Environment ปริยายที่กำหนดในตัวเลือกโปรเจกต์ได้ (Rendering -> " "Environment -> Default Environment)" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14336,7 +14390,10 @@ msgstr "" "texture ของโหนดอื่น" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +#, fuzzy +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "ขนาดวิวพอร์ตจะต้องมากกว่า 0 เพื่อที่จะเรนเดอร์ได้" #: scene/resources/occluder_shape.cpp @@ -15959,9 +16016,6 @@ msgstr "ค่าคงที่ไม่สามารถแก้ไขได #~ msgid "Couldn't save atlas image:" #~ msgstr "บันทึก Atlas ไม่ได้:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "บันทึก Texture ที่แปลงแล้วไม่ได้:" - #~ msgid "Invalid translation source!" #~ msgstr "ต้นฉบับการแปลไม่ถูกต้อง!" diff --git a/editor/translations/tl.po b/editor/translations/tl.po new file mode 100644 index 0000000000..691f0eeeac --- /dev/null +++ b/editor/translations/tl.po @@ -0,0 +1,13819 @@ +# Tagalog translation of the Godot Engine editor. +# Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. +# Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). +# This file is distributed under the same license as the Godot source code. +# +# Napstaguy04 <brokenscreen3@gmail.com>, 2021. +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" +"PO-Revision-Date: 2021-11-19 08:44+0000\n" +"Last-Translator: Napstaguy04 <brokenscreen3@gmail.com>\n" +"Language-Team: Tagalog <https://hosted.weblate.org/projects/godot-engine/" +"godot/tl/>\n" +"Language: tl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 " +"|| n % 10 == 6 || n % 10 == 9);\n" +"X-Generator: Weblate 4.9.1-dev\n" + +#: 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 "" +"Di-wastong uri ng argumento para sa convert(), gamitin ang TYPE_* constants." + +#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp +msgid "Expected a string of length 1 (a character)." +msgstr "Inaasahang string na may habang 1 (isang karakter)." + +#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp +#: modules/mono/glue/gd_glue.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Not enough bytes for decoding bytes, or invalid format." +msgstr "Kulang na bytes para sa decoding bytes, o di-wastong format." + +#: core/math/expression.cpp +msgid "Invalid input %i (not passed) in expression" +msgstr "Di-wastong input %i (di naipasa) sa expression" + +#: core/math/expression.cpp +msgid "self can't be used because instance is null (not passed)" +msgstr "" +"Hindi magagamit ang self dahil ang instance ay naka-null (hindi ipinasa)" + +#: core/math/expression.cpp +msgid "Invalid operands to operator %s, %s and %s." +msgstr "Di-wastong mga operands sa mga operator %s, %s at %s." + +#: core/math/expression.cpp +msgid "Invalid index of type %s for base type %s" +msgstr "Di-wastong index ng uring %s para sa batayang uri %s" + +#: core/math/expression.cpp +msgid "Invalid named index '%s' for base type %s" +msgstr "Di-wastong pinangalang index '%s' para sa batayang uri na %s" + +#: core/math/expression.cpp +msgid "Invalid arguments to construct '%s'" +msgstr "Di-wastong mga argument para i-construct ang '%s'" + +#: core/math/expression.cpp +msgid "On call to '%s':" +msgstr "Sa pagtawag sa '%s':" + +#: core/ustring.cpp +msgid "B" +msgstr "B" + +#: core/ustring.cpp +msgid "KiB" +msgstr "KiB" + +#: core/ustring.cpp +msgid "MiB" +msgstr "MiB" + +#: core/ustring.cpp +msgid "GiB" +msgstr "GiB" + +#: core/ustring.cpp +msgid "TiB" +msgstr "TiB" + +#: core/ustring.cpp +msgid "PiB" +msgstr "PiB" + +#: core/ustring.cpp +msgid "EiB" +msgstr "EiB" + +#: editor/animation_bezier_editor.cpp +msgid "Free" +msgstr "Walang Bayad" + +#: editor/animation_bezier_editor.cpp +msgid "Balanced" +msgstr "Nakabalanse" + +#: editor/animation_bezier_editor.cpp +msgid "Mirror" +msgstr "Salamin" + +#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp +msgid "Time:" +msgstr "Oras:" + +#: editor/animation_bezier_editor.cpp +msgid "Value:" +msgstr "Halaga:" + +#: editor/animation_bezier_editor.cpp +msgid "Insert Key Here" +msgstr "Maglagay ng Key dito" + +#: editor/animation_bezier_editor.cpp +msgid "Duplicate Selected Key(s)" +msgstr "Doblehin ang (mga) Napiling Key" + +#: editor/animation_bezier_editor.cpp +msgid "Delete Selected Key(s)" +msgstr "Burahin ang (mga) Napiling Key" + +#: editor/animation_bezier_editor.cpp +msgid "Add Bezier Point" +msgstr "Magdagdag ng Bezier Point" + +#: editor/animation_bezier_editor.cpp +msgid "Move Bezier Points" +msgstr "Maglipat ng (mga) Bezier Point" + +#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "Pagdodoble ng mga Animation Key" + +#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +msgid "Anim Delete Keys" +msgstr "Pagbura ng mga Animation Key" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Keyframe Time" +msgstr "Pagbago ng Keyframe Time ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Transition" +msgstr "Pagbago ng Transisyon ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Transform" +msgstr "Pagbago ng Transform ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Keyframe Value" +msgstr "Pagbago ng Nilalaman ng Keyframe ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Call" +msgstr "Pagbago ng Pagtawag sa Animation" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "Pagbago ng Oras ng Maraming Keyframe ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "Pagbago ng Maraming Transisyon ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "Pagbago ng Maraming Transform ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "Pagbago ng Maraming Pagtawag ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Length" +msgstr "Pagbago ang Haba ng Animation" + +#: editor/animation_track_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "Pagbago ng Animation Loop" + +#: editor/animation_track_editor.cpp +msgid "Property Track" +msgstr "Pangkatangiang Track" + +#: editor/animation_track_editor.cpp +msgid "3D Transform Track" +msgstr "Track na Pang-3D Transform" + +#: editor/animation_track_editor.cpp +msgid "Call Method Track" +msgstr "Track na Pantawag ng Method" + +#: editor/animation_track_editor.cpp +msgid "Bezier Curve Track" +msgstr "Track na Pang-Bezier Curve" + +#: editor/animation_track_editor.cpp +msgid "Audio Playback Track" +msgstr "Track na Tagapatunog ng Audio" + +#: editor/animation_track_editor.cpp +msgid "Animation Playback Track" +msgstr "Track na Tagasimula ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Animation length (frames)" +msgstr "Haba ng Animation (frames)" + +#: editor/animation_track_editor.cpp +msgid "Animation length (seconds)" +msgstr "Haba ng Animation (Kada segundo)" + +#: editor/animation_track_editor.cpp +msgid "Add Track" +msgstr "Magdagdag ng Track" + +#: editor/animation_track_editor.cpp +msgid "Animation Looping" +msgstr "Paguulit ng Animation" + +#: editor/animation_track_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Functions:" +msgstr "Mga Punsyon:" + +#: editor/animation_track_editor.cpp +msgid "Audio Clips:" +msgstr "Kabahagi ng Audio:" + +#: editor/animation_track_editor.cpp +msgid "Anim Clips:" +msgstr "Mga Kabahagi ng Anim:" + +#: editor/animation_track_editor.cpp +msgid "Change Track Path" +msgstr "Ibahin ang Daan ng Track" + +#: editor/animation_track_editor.cpp +msgid "Toggle this track on/off." +msgstr "Ipalit sa on/off ang track na ito." + +#: editor/animation_track_editor.cpp +msgid "Update Mode (How this property is set)" +msgstr "Paraang Nag-aapdate (Kung papano inayos ang katangian na ito)" + +#: editor/animation_track_editor.cpp +msgid "Interpolation Mode" +msgstr "Paraang Interpolasyon" + +#: editor/animation_track_editor.cpp +msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" +msgstr "" +"Paraang Paikot na Paghigpit (I-interpolate ang dulo kasama ng pagsimula ng " +"loop)" + +#: editor/animation_track_editor.cpp +msgid "Remove this track." +msgstr "Tanggalin ang track na ito." + +#: editor/animation_track_editor.cpp +msgid "Time (s): " +msgstr "Oras (s): " + +#: editor/animation_track_editor.cpp +msgid "Toggle Track Enabled" +msgstr "Pinapagana ang Pagpalit ng Track" + +#: editor/animation_track_editor.cpp +msgid "Continuous" +msgstr "Tuloy-tuloy" + +#: editor/animation_track_editor.cpp +msgid "Discrete" +msgstr "Magkaiba" + +#: editor/animation_track_editor.cpp +msgid "Trigger" +msgstr "Trigger" + +#: editor/animation_track_editor.cpp +msgid "Capture" +msgstr "Pagkuha" + +#: editor/animation_track_editor.cpp +msgid "Nearest" +msgstr "Pinakamalapit" + +#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp +#: editor/property_editor.cpp +msgid "Linear" +msgstr "Pahanay" + +#: editor/animation_track_editor.cpp +msgid "Cubic" +msgstr "Pakubo" + +#: editor/animation_track_editor.cpp +msgid "Clamp Loop Interp" +msgstr "Hanggahan ang Loop Interp" + +#: editor/animation_track_editor.cpp +msgid "Wrap Loop Interp" +msgstr "Ibalot ang Loop Interp" + +#: editor/animation_track_editor.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "Maglagay ng Key" + +#: editor/animation_track_editor.cpp +msgid "Duplicate Key(s)" +msgstr "Doblehin ang (mga) Key" + +#: editor/animation_track_editor.cpp +msgid "Delete Key(s)" +msgstr "Tanggalin Ang (mga) Key" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Update Mode" +msgstr "Ibahin ang Paraan ng Pag-update ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Interpolation Mode" +msgstr "Ibahin ang Paraan ng Pag-interpolate ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Loop Mode" +msgstr "Ibahin Ang Paraan ng Pag-loop" + +#: editor/animation_track_editor.cpp +msgid "Remove Anim Track" +msgstr "Alisin ang Anim Track" + +#. TRANSLATORS: %s will be replaced by a phrase describing the target of track. +#: editor/animation_track_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "Gumawa ng BAGONG track para sa %s at ilagay ang key?" + +#: editor/animation_track_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "Gumawa ng %d BAGONG mga track at maglagay ng mga key?" + +#: editor/animation_track_editor.cpp editor/create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_create_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Create" +msgstr "Lumikha" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert" +msgstr "Maglagay ng Anim" + +#. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. +#: editor/animation_track_editor.cpp +msgid "node '%s'" +msgstr "node '%s'" + +#. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. +#: editor/animation_track_editor.cpp +msgid "animation" +msgstr "animation" + +#: editor/animation_track_editor.cpp +msgid "AnimationPlayer can't animate itself, only other players." +msgstr "" +"Hindi kayang i-animate ng AnimationPlayer ang sarili, sa ibang manlalaro " +"lang." + +#. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. +#: editor/animation_track_editor.cpp +msgid "property '%s'" +msgstr "katangiang '%s'" + +#: editor/animation_track_editor.cpp +msgid "Anim Create & Insert" +msgstr "Lumikha at Maglagay ng Anim" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "Maglagay ng Anim Track & Key" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert Key" +msgstr "Maglagay ng Anim Key" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Step" +msgstr "Ibahin ang Baytang ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Rearrange Tracks" +msgstr "Ayusin ang mga Track" + +#: editor/animation_track_editor.cpp +msgid "Transform tracks only apply to Spatial-based nodes." +msgstr "" +"Ang mga transform track ay maari lang ikapit sa mga nakabaseng Spatial node." + +#: editor/animation_track_editor.cpp +msgid "" +"Audio tracks can only point to nodes of type:\n" +"-AudioStreamPlayer\n" +"-AudioStreamPlayer2D\n" +"-AudioStreamPlayer3D" +msgstr "" +"Maari lang tumuro sa mga node na ganitong uri:\n" +"-AudioStreamPlayer\n" +"-AudioStreamPlayer2D\n" +"-AudioStreamPlayer3D" + +#: editor/animation_track_editor.cpp +msgid "Animation tracks can only point to AnimationPlayer nodes." +msgstr "Maari lang tumuro ang mga Animation tracks sa AnimationPlayer nodes." + +#: editor/animation_track_editor.cpp +msgid "Not possible to add a new track without a root" +msgstr "Hindi maaring magdagdag ng bagong track na walang ugat" + +#: editor/animation_track_editor.cpp +msgid "Invalid track for Bezier (no suitable sub-properties)" +msgstr "Hindi kaayong track para sa Bezier (walang kaayong subproperties)" + +#: editor/animation_track_editor.cpp +msgid "Add Bezier Track" +msgstr "Magdagdag ng Bezier Track" + +#: editor/animation_track_editor.cpp +msgid "Track path is invalid, so can't add a key." +msgstr "Ang pagdaraanan ng track ay imbalido, kaya hindi makakadagdag ng key." + +#: editor/animation_track_editor.cpp +msgid "Track is not of type Spatial, can't insert key" +msgstr "Hindi Spatial ang Track, hindi makakalagay ng key" + +#: editor/animation_track_editor.cpp +msgid "Add Transform Track Key" +msgstr "Magdagdag ng Transform Track Key" + +#: editor/animation_track_editor.cpp +msgid "Add Track Key" +msgstr "Magdagdag ng Track Key" + +#: editor/animation_track_editor.cpp +msgid "Track path is invalid, so can't add a method key." +msgstr "Di-wasto ang daan ng Track, kaya di maidaragdag ang method key." + +#: editor/animation_track_editor.cpp +msgid "Add Method Track Key" +msgstr "Magdagdag ng Method Track Key" + +#: editor/animation_track_editor.cpp +msgid "Method not found in object: " +msgstr "Hindi mahanap ang Method sa object: " + +#: editor/animation_track_editor.cpp +msgid "Anim Move Keys" +msgstr "" + +#: editor/animation_track_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Walang laman ang clipboard!" + +#: editor/animation_track_editor.cpp +msgid "Paste Tracks" +msgstr "Idikit ang mga Track" + +#: editor/animation_track_editor.cpp +msgid "Anim Scale Keys" +msgstr "Mga Key ng Anim Scale" + +#: editor/animation_track_editor.cpp +msgid "" +"This option does not work for Bezier editing, as it's only a single track." +msgstr "" +"Hindi gumagana ang opsyong ito para sa pag-edit ng Bezier, dahil iisa lang " +"ito." + +#: editor/animation_track_editor.cpp +msgid "" +"This animation belongs to an imported scene, so changes to imported tracks " +"will not be saved.\n" +"\n" +"To enable the ability to add custom tracks, navigate to the scene's import " +"settings and set\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" +"\", then re-import.\n" +"Alternatively, use an import preset that imports animations to separate " +"files." +msgstr "" +"Ang animation na ito ay nabibilang sa na-import na eksena, kaya ang anumang " +"pagbabago sa imported tracks ay hindi mase-save.\n" +"\n" +"Upang magbigay ng kakayahang magdagdag ng mga custom track, mag-navigate sa " +"import settings ng eksena at itakda ang\n" +"\"Animation> Stroage\" sa \"File\", i-activate ang \"Animation> Keep Custom " +"Tracks\", pagkatapos ay muling i-import.\n" +"Bilang kahalili, gumamit ng import preset na nag-i-import ng mga animation " +"upang paghiwalayin ang mga file." + +#: editor/animation_track_editor.cpp +msgid "Warning: Editing imported animation" +msgstr "Babala: Ineedit ang na import na animation" + +#: editor/animation_track_editor.cpp +msgid "Select an AnimationPlayer node to create and edit animations." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Only show tracks from nodes selected in tree." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Group tracks by node or display them as plain list." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Snap:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation step value." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "Mga Segundo" + +#: editor/animation_track_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "FPS" +msgstr "FPS" + +#: editor/animation_track_editor.cpp editor/editor_plugin_settings.cpp +#: editor/editor_resource_picker.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/tile_set_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit" +msgstr "Ayusin" + +#: editor/animation_track_editor.cpp +msgid "Animation properties." +msgstr "Mga katangian ng animation." + +#: editor/animation_track_editor.cpp +msgid "Copy Tracks" +msgstr "Kopyahin ang mga Tracks" + +#: editor/animation_track_editor.cpp +msgid "Scale Selection" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Scale From Cursor" +msgstr "" + +#: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Duplicate Selection" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Duplicate Transposed" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Delete Selection" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Go to Next Step" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Go to Previous Step" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Apply Reset" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Optimize Animation" +msgstr "Pabilisin ang takbo ng Animation" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up Animation" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Pick the node that will be animated:" +msgstr "Piliin ang node na i-aanimate:" + +#: editor/animation_track_editor.cpp +msgid "Use Bezier Curves" +msgstr "Gumamit ng Bezier Curves" + +#: editor/animation_track_editor.cpp +msgid "Create RESET Track(s)" +msgstr "Gumawa ng (mga) RESET Track" + +#: editor/animation_track_editor.cpp +msgid "Anim. Optimizer" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Max. Linear Error:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Max. Angular Error:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Max Optimizable Angle:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Optimize" +msgstr "Pabilisin ang takbo" + +#: editor/animation_track_editor.cpp +msgid "Remove invalid keys" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Remove unresolved and empty tracks" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clean-up all animations" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Scale Ratio:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Select Tracks to Copy" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_log.cpp +#: editor/editor_resource_picker.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Copy" +msgstr "Kopyahin" + +#: editor/animation_track_editor.cpp +msgid "Select All/None" +msgstr "Piliin Lahat/Wala" + +#: editor/animation_track_editor_plugins.cpp +msgid "Add Audio Track Clip" +msgstr "Magdagdag ng Audio Track Clip" + +#: editor/animation_track_editor_plugins.cpp +msgid "Change Audio Track Clip Start Offset" +msgstr "" + +#: editor/animation_track_editor_plugins.cpp +msgid "Change Audio Track Clip End Offset" +msgstr "Ibahin ang Urong ng hulihan ng Audio Track" + +#: editor/array_property_edit.cpp +msgid "Resize Array" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value Type" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value" +msgstr "" + +#: editor/code_editor.cpp +msgid "Go to Line" +msgstr "Pumunta sa Line" + +#: editor/code_editor.cpp +msgid "Line Number:" +msgstr "Bilang ng Linya:" + +#: editor/code_editor.cpp +msgid "%d replaced." +msgstr "Naalis ang %d." + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "%d match." +msgstr "%d na kapares." + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "%d matches." +msgstr "%d na mga kapares." + +#: editor/code_editor.cpp editor/find_in_files.cpp +msgid "Match Case" +msgstr "" + +#: editor/code_editor.cpp editor/find_in_files.cpp +msgid "Whole Words" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace" +msgstr "Palitan" + +#: editor/code_editor.cpp +msgid "Replace All" +msgstr "Palitan Lahat" + +#: editor/code_editor.cpp +msgid "Selection Only" +msgstr "Napili lang" + +#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp +#: editor/plugins/text_editor.cpp +msgid "Standard" +msgstr "Karaniwan" + +#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp +msgid "Toggle Scripts Panel" +msgstr "" + +#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Zoom In" +msgstr "Palakihin Ang Tanaw" + +#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Zoom Out" +msgstr "Paliitin Ang Tanaw" + +#: editor/code_editor.cpp +msgid "Reset Zoom" +msgstr "Ibalik sa Dati Ang Tanaw" + +#: editor/code_editor.cpp +msgid "Warnings" +msgstr "Mga Babala" + +#: editor/code_editor.cpp +msgid "Line and column numbers." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Method in target node must be specified." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Method name must be a valid identifier." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "" +"Target method not found. Specify a valid method or attach a script to the " +"target node." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect to Node:" +msgstr "Ikabit sa Node:" + +#: editor/connections_dialog.cpp +msgid "Connect to Script:" +msgstr "Ikabit sa Script:" + +#: editor/connections_dialog.cpp +msgid "From Signal:" +msgstr "Galing sa Hudyat:" + +#: editor/connections_dialog.cpp +msgid "Scene does not contain any script." +msgstr "Walang script ang eksena." + +#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp +#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Add" +msgstr "Maglagay" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp +msgid "Remove" +msgstr "Alisin" + +#: editor/connections_dialog.cpp +msgid "Add Extra Call Argument:" +msgstr "Magdagdag ng Dagdag na Argumento sa Tawag:" + +#: editor/connections_dialog.cpp +msgid "Extra Call Arguments:" +msgstr "Mga Dagdag na Argumento ng Tawag:" + +#: editor/connections_dialog.cpp +msgid "Receiver Method:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Advanced" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Deferred" +msgstr "Ipinagbaliban" + +#: editor/connections_dialog.cpp +msgid "" +"Defers the signal, storing it in a queue and only firing it at idle time." +msgstr "" +"Ipinagpaliban ang hudyat. Iniistore ito sa isang queue at pinapalitaw lamang " +"kapag walang ginagawa." + +#: editor/connections_dialog.cpp +msgid "Oneshot" +msgstr "Isang Beses" + +#: editor/connections_dialog.cpp +msgid "Disconnects the signal after its first emission." +msgstr "Tinatanggal ang hudyat pagkatapos ng unang pag-trigger." + +#: editor/connections_dialog.cpp +msgid "Cannot connect signal" +msgstr "Hindi maikabit ang hudyat" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/export_template_manager.cpp editor/groups_editor.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/version_control_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Close" +msgstr "Isara" + +#: editor/connections_dialog.cpp +msgid "Connect" +msgstr "Ikabit" + +#: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Hudyat:" + +#: editor/connections_dialog.cpp +msgid "Connect '%s' to '%s'" +msgstr "Ikabit ang '%s' sa '%s'" + +#: editor/connections_dialog.cpp +msgid "Disconnect '%s' from '%s'" +msgstr "Tanggalin ang '%s' sa '%s'" + +#: editor/connections_dialog.cpp +msgid "Disconnect all from signal: '%s'" +msgstr "Tanggalin lahat sa nakakabit na hudyat: '%s'" + +#: editor/connections_dialog.cpp +msgid "Connect..." +msgstr "Ikabit..." + +#: editor/connections_dialog.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Disconnect" +msgstr "Tanggalin" + +#: editor/connections_dialog.cpp +msgid "Connect a Signal to a Method" +msgstr "Ikabit Ang Hudyat sa Isang Method" + +#: editor/connections_dialog.cpp +msgid "Edit Connection:" +msgstr "Ayusin Ang Pagkakabit:" + +#: editor/connections_dialog.cpp +msgid "Are you sure you want to remove all connections from the \"%s\" signal?" +msgstr "" +"Tiyak ka bang gusto mong alisin lahat ng mga pagkakabit mula sa hudyat \"%s" +"\"?" + +#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp +msgid "Signals" +msgstr "Mga Hudyat" + +#: editor/connections_dialog.cpp +msgid "Filter signals" +msgstr "Salain ang mga hudyat" + +#: editor/connections_dialog.cpp +msgid "Are you sure you want to remove all connections from this signal?" +msgstr "Gusto mo bang alisin lahat ng pagkakabit sa hudyat na ito?" + +#: editor/connections_dialog.cpp +msgid "Disconnect All" +msgstr "Tanggalin Lahat" + +#: editor/connections_dialog.cpp +msgid "Edit..." +msgstr "Ayusin..." + +#: editor/connections_dialog.cpp +msgid "Go to Method" +msgstr "Pumunta sa Method" + +#: editor/create_dialog.cpp +msgid "Change %s Type" +msgstr "Ibahin Ang Uri ng %s" + +#: editor/create_dialog.cpp editor/project_settings_editor.cpp +msgid "Change" +msgstr "Baguhin" + +#: editor/create_dialog.cpp +msgid "Create New %s" +msgstr "Gumawa ng Bagong %s" + +#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "No results for \"%s\"." +msgstr "Walang resulta para sa \"%s\"." + +#: editor/create_dialog.cpp editor/property_selector.cpp +msgid "No description available for %s." +msgstr "Walang paglalarawan sa %s." + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp +msgid "Favorites:" +msgstr "Mga Paborito:" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +msgid "Recent:" +msgstr "Kamakailan:" + +#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp +#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Search:" +msgstr "Maghanap:" + +#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp +#: editor/property_selector.cpp editor/quick_open.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Matches:" +msgstr "Mga Tugma:" + +#: editor/create_dialog.cpp editor/editor_feature_profile.cpp +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Description:" +msgstr "Paglalarawan:" + +#: editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "Maghanap ng Kapalit para sa:" + +#: editor/dependency_editor.cpp +msgid "Dependencies For:" +msgstr "Mga Kaasahan Para Sa:" + +#: editor/dependency_editor.cpp +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will only take effect when reloaded." +msgstr "" +"Kasalukuyang binabago ang Eksenang '%s'.\n" +"Magpapakita lang ang mga pagbabago sa pag-reload." + +#: editor/dependency_editor.cpp +msgid "" +"Resource '%s' is in use.\n" +"Changes will only take effect when reloaded." +msgstr "" + +#: editor/dependency_editor.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Dependencies" +msgstr "Mga Kaasahan" + +#: editor/dependency_editor.cpp editor/editor_resource_picker.cpp +msgid "Resource" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp +#: editor/project_manager.cpp editor/project_settings_editor.cpp +msgid "Path" +msgstr "Kinaroroonan" + +#: editor/dependency_editor.cpp +msgid "Dependencies:" +msgstr "Mga Kaasahan:" + +#: editor/dependency_editor.cpp +msgid "Fix Broken" +msgstr "Ayusin Ang Sira" + +#: editor/dependency_editor.cpp +msgid "Dependency Editor" +msgstr "Editor ng Kaasahan" + +#: editor/dependency_editor.cpp +msgid "Search Replacement Resource:" +msgstr "Maghanap ng Pangpalit na Resource:" + +#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp +#: editor/editor_help_search.cpp editor/editor_node.cpp +#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +#: editor/property_selector.cpp editor/quick_open.cpp +#: editor/script_create_dialog.cpp +#: modules/visual_script/visual_script_property_selector.cpp +#: scene/gui/file_dialog.cpp +msgid "Open" +msgstr "Buksan" + +#: editor/dependency_editor.cpp +msgid "Owners Of:" +msgstr "Mga May-ari ng:" + +#: editor/dependency_editor.cpp +msgid "" +"Remove the selected files from the project? (Cannot be undone.)\n" +"Depending on your filesystem configuration, the files will either be moved " +"to the system trash or deleted permanently." +msgstr "" +"Alisin ang mga napiling file sa proyekto? (Bawal nang bawiin.)\n" +"Depende sa ayos ng filesystem mo, ang mga file ay maaring malipat sa " +"basurahan ng system o mananatili nang mawala." + +#: editor/dependency_editor.cpp +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (Cannot be undone.)\n" +"Depending on your filesystem configuration, the files will either be moved " +"to the system trash or deleted permanently." +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Cannot remove:" +msgstr "Hindi matanggal:" + +#: editor/dependency_editor.cpp +msgid "Error loading:" +msgstr "Nabigong ikarga:" + +#: editor/dependency_editor.cpp +msgid "Load failed due to missing dependencies:" +msgstr "Nabigo ang pagkakarga dahil sa mga nawawalang kaasahan:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Open Anyway" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Which action should be taken?" +msgstr "Aling kilos ang dapat tanggapin?" + +#: editor/dependency_editor.cpp +msgid "Fix Dependencies" +msgstr "Ayusin Ang Mga Kaasahan." + +#: editor/dependency_editor.cpp +msgid "Errors loading!" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Show Dependencies" +msgstr "Ipakita Ang Mga Kaasahan" + +#: editor/dependency_editor.cpp +msgid "Orphan Resource Explorer" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp +msgid "Delete" +msgstr "Alisin" + +#: editor/dependency_editor.cpp +msgid "Owns" +msgstr "Ay Minamayari Ang" + +#: editor/dependency_editor.cpp +msgid "Resources Without Explicit Ownership:" +msgstr "Mga Resources na Walang Tiyak na Pagmamayari:" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Key" +msgstr "" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Value" +msgstr "" + +#: editor/editor_about.cpp +msgid "Thanks from the Godot community!" +msgstr "Salamat mula sa komunidad ng Godot!" + +#: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp +msgid "Click to copy." +msgstr "Pindutin para kopyahin." + +#: editor/editor_about.cpp +msgid "Godot Engine contributors" +msgstr "Mga Tagapagambag ng Godot Engine" + +#: editor/editor_about.cpp +msgid "Project Founders" +msgstr "Mga Tagapagtatag ng Proyekto" + +#: editor/editor_about.cpp +msgid "Lead Developer" +msgstr "Pangunahing Developer" + +#. TRANSLATORS: This refers to a job title. +#. The trailing space is used to distinguish with the project list application, +#. you do not have to keep it in your translation. +#: editor/editor_about.cpp +msgid "Project Manager " +msgstr "Tagapangasiwa ng Proyekto " + +#: editor/editor_about.cpp +msgid "Developers" +msgstr "Mga Developers" + +#: editor/editor_about.cpp +msgid "Authors" +msgstr "Mga May-akda" + +#: editor/editor_about.cpp +msgid "Platinum Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Gold Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Silver Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Bronze Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Mini Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Gold Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Silver Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Bronze Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Donors" +msgstr "Mga Nagabuloy" + +#: editor/editor_about.cpp +msgid "License" +msgstr "Lisensya" + +#: editor/editor_about.cpp +msgid "Third-party Licenses" +msgstr "Mga Lisensyang Third-party" + +#: editor/editor_about.cpp +msgid "" +"Godot Engine relies on a number of third-party free and open source " +"libraries, all compatible with the terms of its MIT license. The following " +"is an exhaustive list of all such third-party components with their " +"respective copyright statements and license terms." +msgstr "" + +#: editor/editor_about.cpp +msgid "All Components" +msgstr "Lahat ng Mga Bahagi" + +#: editor/editor_about.cpp +msgid "Components" +msgstr "Mga Bahagi" + +#: editor/editor_about.cpp +msgid "Licenses" +msgstr "Mga Lisensya" + +#: editor/editor_asset_installer.cpp +msgid "Error opening asset file for \"%s\" (not in ZIP format)." +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "%s (already exists)" +msgstr "%s (mayroon na)" + +#: editor/editor_asset_installer.cpp +msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Contents of asset \"%s\" - No files conflict with your project:" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Uncompressing Assets" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "The following files failed extraction from asset \"%s\":" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "(and %s more files)" +msgstr "(at %s pang mga file)" + +#: editor/editor_asset_installer.cpp +msgid "Asset \"%s\" installed successfully!" +msgstr "" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Success!" +msgstr "Tagumpay!" + +#: editor/editor_asset_installer.cpp editor/editor_node.cpp +msgid "Install" +msgstr "I-install" + +#: editor/editor_asset_installer.cpp +msgid "Asset Installer" +msgstr "Taga-install ng mga Asset" + +#: editor/editor_audio_buses.cpp +msgid "Speakers" +msgstr "Mga Speaker" + +#: editor/editor_audio_buses.cpp +msgid "Add Effect" +msgstr "Magdagdag ng Effect" + +#: editor/editor_audio_buses.cpp +msgid "Rename Audio Bus" +msgstr "Palitan ang pangalan ng Audio Bus" + +#: editor/editor_audio_buses.cpp +msgid "Change Audio Bus Volume" +msgstr "Ibahin ang Kaingayan ng Audio Bus" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Solo" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Mute" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Bypass Effects" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Select Audio Bus Send" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Move Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Drag & drop to rearrange." +msgstr "I-drag & i-hulog para ayusin." + +#: editor/editor_audio_buses.cpp +msgid "Solo" +msgstr "Naka-solo" + +#: editor/editor_audio_buses.cpp +msgid "Mute" +msgstr "Nakatahimik" + +#: editor/editor_audio_buses.cpp +msgid "Bypass" +msgstr "Pasikot-sikot" + +#: editor/editor_audio_buses.cpp +msgid "Bus Options" +msgstr "" + +#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp +#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Audio" +msgstr "Tunog (Audio)" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus" +msgstr "Magdagdag ng Audio Bus" + +#: editor/editor_audio_buses.cpp +msgid "Master bus can't be deleted!" +msgstr "Hindi maaring alisin ang master bus!" + +#: editor/editor_audio_buses.cpp +msgid "Delete Audio Bus" +msgstr "Alisin ang Audio Bus" + +#: editor/editor_audio_buses.cpp +msgid "Duplicate Audio Bus" +msgstr "Doblehin ang Audio Bus" + +#: editor/editor_audio_buses.cpp +msgid "Reset Bus Volume" +msgstr "Ibalik sa Dati Ang Kaingayan ng Bus" + +#: editor/editor_audio_buses.cpp +msgid "Move Audio Bus" +msgstr "Ilipat ang Audio Bus" + +#: editor/editor_audio_buses.cpp +msgid "Save Audio Bus Layout As..." +msgstr "I-save Ang Ayos ng Audio Bus Bilang..." + +#: editor/editor_audio_buses.cpp +msgid "Location for New Layout..." +msgstr "Lokasyon para sa Bagong Layout..." + +#: editor/editor_audio_buses.cpp +msgid "Open Audio Bus Layout" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "There is no '%s' file." +msgstr "Walang file na '%s'." + +#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp +msgid "Layout" +msgstr "Kaayusan" + +#: editor/editor_audio_buses.cpp +msgid "Invalid file, not an audio bus layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Error saving file: %s" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add a new Audio Bus to this layout." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/editor_resource_picker.cpp +#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Load" +msgstr "Kumarga" + +#: editor/editor_audio_buses.cpp +msgid "Load an existing Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save As" +msgstr "I-save Bilang" + +#: editor/editor_audio_buses.cpp +msgid "Save this Bus Layout to a file." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/import_dock.cpp +msgid "Load Default" +msgstr "I-load ang Karaniwan" + +#: editor/editor_audio_buses.cpp +msgid "Load the default Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Create a new Bus Layout." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name." +msgstr "Di-wastong pangalan." + +#: editor/editor_autoload_settings.cpp +msgid "Valid characters:" +msgstr "Mga Pinapayagang Karakter:" + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing engine class name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing built-in type name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing global constant name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Keyword cannot be used as an autoload name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Autoload '%s' already exists!" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rename Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Toggle AutoLoad Globals" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Move Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Remove Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp +msgid "Enable" +msgstr "Paganahin" + +#: editor/editor_autoload_settings.cpp +msgid "Rearrange Autoloads" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Can't add autoload:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "%s is an invalid path. File does not exist." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "%s is an invalid path. Not in resource path (res://)." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Add AutoLoad" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +msgid "Path:" +msgstr "Kinaroroonan:" + +#: editor/editor_autoload_settings.cpp +msgid "Node Name:" +msgstr "Pangalan ng Node:" + +#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp +#: editor/editor_plugin_settings.cpp editor/editor_profiler.cpp +#: editor/project_manager.cpp editor/settings_config_dialog.cpp +msgid "Name" +msgstr "Pangalan" + +#: editor/editor_autoload_settings.cpp +msgid "Global Variable" +msgstr "Pangkalahatang (Global) Variable" + +#: editor/editor_data.cpp +msgid "Paste Params" +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating Scene" +msgstr "" + +#: editor/editor_data.cpp +msgid "Storing local changes..." +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating scene..." +msgstr "" + +#: editor/editor_data.cpp editor/editor_resource_picker.cpp +msgid "[empty]" +msgstr "[wala]" + +#: editor/editor_data.cpp +msgid "[unsaved]" +msgstr "[di-nakasave]" + +#: editor/editor_dir_dialog.cpp +msgid "Please select a base directory first." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose a Directory" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp editor/project_manager.cpp +#: scene/gui/file_dialog.cpp +msgid "Create Folder" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp +msgid "Name:" +msgstr "" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Could not create folder." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "Pumili" + +#: editor/editor_export.cpp +msgid "Storing File:" +msgstr "Inimpok ang File:" + +#: editor/editor_export.cpp +msgid "No export template found at the expected path:" +msgstr "" + +#: editor/editor_export.cpp +msgid "Packing" +msgstr "Iniimpake" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " +"Etc' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC2' texture compression for GLES3. Enable " +"'Import Etc 2' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC' texture compression for the driver fallback " +"to GLES2.\n" +"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " +"Enabled'." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'PVRTC' texture compression for GLES2. Enable " +"'Import Pvrtc' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC2' or 'PVRTC' texture compression for GLES3. " +"Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'PVRTC' texture compression for the driver fallback " +"to GLES2.\n" +"Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " +"Enabled'." +msgstr "" + +#: editor/editor_export.cpp platform/android/export/export_plugin.cpp +#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp platform/uwp/export/export.cpp +msgid "Custom debug template not found." +msgstr "" + +#: editor/editor_export.cpp platform/android/export/export_plugin.cpp +#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp platform/uwp/export/export.cpp +msgid "Custom release template not found." +msgstr "" + +#: editor/editor_export.cpp platform/javascript/export/export.cpp +msgid "Template file not found:" +msgstr "" + +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "3D Editor" +msgstr "3D Editor" + +#: editor/editor_feature_profile.cpp +msgid "Script Editor" +msgstr "Editor ng Script" + +#: editor/editor_feature_profile.cpp +msgid "Asset Library" +msgstr "Silid-Assetan" + +#: editor/editor_feature_profile.cpp +msgid "Scene Tree Editing" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Node Dock" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "FileSystem Dock" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Import Dock" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows to view and edit 3D scenes." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows to edit scripts using the integrated script editor." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Provides built-in access to the Asset Library." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows editing the node hierarchy in the Scene dock." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "" +"Allows to work with signals and groups of the node selected in the Scene " +"dock." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows to browse the local file system via a dedicated dock." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "" +"Allows to configure import settings for individual assets. Requires the " +"FileSystem dock to function." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "(current)" +msgstr "(nakatutok)" + +#: editor/editor_feature_profile.cpp +msgid "(none)" +msgstr "(wala)" + +#: editor/editor_feature_profile.cpp +msgid "Remove currently selected profile, '%s'? Cannot be undone." +msgstr "Alisin ang napiling profile na '%s'? Hindi na mababawi." + +#: editor/editor_feature_profile.cpp +msgid "Profile must be a valid filename and must not contain '.'" +msgstr "Ang profile ay dapat may wastong pangalan at walang '.'" + +#: editor/editor_feature_profile.cpp +msgid "Profile with this name already exists." +msgstr "Mayroon nang profile na may ganitong pangalan." + +#: editor/editor_feature_profile.cpp +msgid "(Editor Disabled, Properties Disabled)" +msgstr "" +"(Hindi pinapagana ang Editor, Ang Tala ng Katangian Ay Hindi Rin Pinapagana)" + +#: editor/editor_feature_profile.cpp +msgid "(Properties Disabled)" +msgstr "(Hindi Pinapagana Ang Tala ng Mga Katangian)" + +#: editor/editor_feature_profile.cpp +msgid "(Editor Disabled)" +msgstr "(Hindi Pinapagana Ang Editor)" + +#: editor/editor_feature_profile.cpp +msgid "Class Options:" +msgstr "Mga Kaayusan ng Class:" + +#: editor/editor_feature_profile.cpp +msgid "Enable Contextual Editor" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Class Properties:" +msgstr "Katangian ng Class:" + +#: editor/editor_feature_profile.cpp +msgid "Main Features:" +msgstr "Pangunahing Mga Tampok:" + +#: editor/editor_feature_profile.cpp +msgid "Nodes and Classes:" +msgstr "Mga Node at Class:" + +#: editor/editor_feature_profile.cpp +msgid "File '%s' format is invalid, import aborted." +msgstr "Hindi wasto ang format ng '%s', Ipinagpaliban ang pag-aangkat." + +#: editor/editor_feature_profile.cpp +msgid "" +"Profile '%s' already exists. Remove it first before importing, import " +"aborted." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Error saving profile to path: '%s'." +msgstr "Hindi maisalba ang profile sa kinaroroonang: '%s'." + +#: editor/editor_feature_profile.cpp +msgid "Reset to Default" +msgstr "Ibalik sa Dati" + +#: editor/editor_feature_profile.cpp +msgid "Current Profile:" +msgstr "Nakatutok na Profile:" + +#: editor/editor_feature_profile.cpp +msgid "Create Profile" +msgstr "Gumawa ng Profile" + +#: editor/editor_feature_profile.cpp +msgid "Remove Profile" +msgstr "Alisin ang Profile" + +#: editor/editor_feature_profile.cpp +msgid "Available Profiles:" +msgstr "Magagamit na mga Profile:" + +#: editor/editor_feature_profile.cpp +msgid "Make Current" +msgstr "" + +#: editor/editor_feature_profile.cpp editor/editor_node.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +msgid "Import" +msgstr "Magangkat" + +#: editor/editor_feature_profile.cpp editor/project_export.cpp +msgid "Export" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Configure Selected Profile:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Extra Options:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Create or import a profile to edit available classes and properties." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "New profile name:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Godot Feature Profile" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Import Profile(s)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Export Profile" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Manage Editor Feature Profiles" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select Current Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File exists, overwrite?" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select This Folder" +msgstr "Piliin ang Folder na Ito" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "Copy Path" +msgstr "Kopyahin ang Kinaroroonan" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "Open in File Manager" +msgstr "Buksan sa File Manager" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/filesystem_dock.cpp editor/project_manager.cpp +msgid "Show in File Manager" +msgstr "Ipakita sa File Manager" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "New Folder..." +msgstr "Bagong Folder..." + +#: editor/editor_file_dialog.cpp editor/find_in_files.cpp +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Refresh" +msgstr "I-refresh" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Recognized" +msgstr "Nakilala Lahat" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Files (*)" +msgstr "Lahat ng Files (*)" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File" +msgstr "Buksan ang File" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open File(s)" +msgstr "Buksan Ang (Mga) File" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a Directory" +msgstr "Bumukas ng Directory" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File or Directory" +msgstr "Bumukas ng File o Directory" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/editor_resource_picker.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "Save" +msgstr "I-save" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Save a File" +msgstr "Magsave ng File" + +#: editor/editor_file_dialog.cpp +msgid "Go Back" +msgstr "Bumalik" + +#: editor/editor_file_dialog.cpp +msgid "Go Forward" +msgstr "Umusad" + +#: editor/editor_file_dialog.cpp +msgid "Go Up" +msgstr "Tumaas" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Hidden Files" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Favorite" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Mode" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Focus Path" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Up" +msgstr "Ilipat Pataas Ang Paborito" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Down" +msgstr "Ilipat Pababa ang Paborito" + +#: editor/editor_file_dialog.cpp +msgid "Go to previous folder." +msgstr "Pumunta sa Nakaraang Folder." + +#: editor/editor_file_dialog.cpp +msgid "Go to next folder." +msgstr "Pumunta sa susunod na folder." + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Go to parent folder." +msgstr "Pumunta sa ugat na folder." + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "I-refresh ang mga file." + +#: editor/editor_file_dialog.cpp +msgid "(Un)favorite current folder." +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." +msgstr "I-toggle ang pagkakakita ng mga nakatagong file." + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "View items as a grid of thumbnails." +msgstr "Tingnan ang mga items na nakabalaylay ang mga thumbnail." + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "View items as a list." +msgstr "Tingnan ang mga item bilang talaan." + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Directories & Files:" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp +#: editor/plugins/style_box_editor_plugin.cpp editor/rename_dialog.cpp +msgid "Preview:" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File:" +msgstr "File:" + +#: editor/editor_file_system.cpp +msgid "ScanSources" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "" +"There are multiple importers for different types pointing to file %s, import " +"aborted" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "(Re)Importing Assets" +msgstr "Inaangkat muli ang mga Asset" + +#: editor/editor_help.cpp +msgid "Top" +msgstr "Nasaitaas" + +#: editor/editor_help.cpp +msgid "Class:" +msgstr "Class:" + +#: editor/editor_help.cpp editor/scene_tree_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Inherits:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Inherited by:" +msgstr "Pinagmana ng:" + +#: editor/editor_help.cpp +msgid "Description" +msgstr "Paglalarawan" + +#: editor/editor_help.cpp +msgid "Online Tutorials" +msgstr "Mga Tutorial sa Online" + +#: editor/editor_help.cpp +msgid "Properties" +msgstr "Mga Katangian" + +#: editor/editor_help.cpp +msgid "override:" +msgstr "ipagpalit:" + +#: editor/editor_help.cpp +msgid "default:" +msgstr "karaniwan:" + +#: editor/editor_help.cpp +msgid "Methods" +msgstr "Mga Method" + +#: editor/editor_help.cpp +msgid "Theme Properties" +msgstr "Mga Katangian ng Theme" + +#: editor/editor_help.cpp +msgid "Enumerations" +msgstr "Mga Enumerasyon" + +#: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Constants" +msgstr "Mga Konstant" + +#: editor/editor_help.cpp +msgid "Property Descriptions" +msgstr "Mga Paglalarawan ng Katangian" + +#: editor/editor_help.cpp +msgid "(value)" +msgstr "(halaga)" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this property. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Kasalukuyang walang panglalarawan sa katangiang ito. Maaring tulungan kami " +"sa pamamagitan ng [color=$color][url=$url]pag-kokontribyut[/url][/color]!" + +#: editor/editor_help.cpp +msgid "Method Descriptions" +msgstr "Panglalarawan ng mga Method" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this method. Please help us by [color=" +"$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Kasalukuyang walang paglalarawan sa method na ito. Maaring tulungan kami sa " +"pamamagitan ng [color=$color][url=$url]pag-kontribyut[/url][/color]!" + +#: editor/editor_help_search.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Help" +msgstr "Maghanap sa Sanggunian" + +#: editor/editor_help_search.cpp +msgid "Case Sensitive" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Show Hierarchy" +msgstr "Ipakita ang Halpunuan" + +#: editor/editor_help_search.cpp +msgid "Display All" +msgstr "Ipakita Lahat" + +#: editor/editor_help_search.cpp +msgid "Classes Only" +msgstr "Mga Class Lang" + +#: editor/editor_help_search.cpp +msgid "Methods Only" +msgstr "Mga Method Lang" + +#: editor/editor_help_search.cpp +msgid "Signals Only" +msgstr "Mga Hudyat Lang" + +#: editor/editor_help_search.cpp +msgid "Constants Only" +msgstr "Mga Konstant Lang" + +#: editor/editor_help_search.cpp +msgid "Properties Only" +msgstr "Mga Katangian Lang" + +#: editor/editor_help_search.cpp +msgid "Theme Properties Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Member Type" +msgstr "Uri ng Kasapi" + +#: editor/editor_help_search.cpp +msgid "Class" +msgstr "Class" + +#: editor/editor_help_search.cpp +msgid "Method" +msgstr "Method" + +#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp +msgid "Signal" +msgstr "Hudyat" + +#: editor/editor_help_search.cpp +msgid "Constant" +msgstr "Constant" + +#: editor/editor_help_search.cpp +msgid "Property" +msgstr "Katangian" + +#: editor/editor_help_search.cpp +msgid "Theme Property" +msgstr "" + +#: editor/editor_inspector.cpp editor/project_settings_editor.cpp +msgid "Property:" +msgstr "" + +#: editor/editor_inspector.cpp editor/scene_tree_dock.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Set %s" +msgstr "Itakda ang %s" + +#: editor/editor_inspector.cpp +msgid "Set Multiple:" +msgstr "" + +#: editor/editor_log.cpp +msgid "Output:" +msgstr "Kalabasan:" + +#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Copy Selection" +msgstr "Kopyahin Ang Pinagpipilian" + +#: editor/editor_log.cpp editor/editor_network_profiler.cpp +#: editor/editor_profiler.cpp editor/editor_resource_picker.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/property_editor.cpp editor/scene_tree_dock.cpp +#: editor/script_editor_debugger.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Clear" +msgstr "Linisin" + +#: editor/editor_log.cpp +msgid "Clear Output" +msgstr "Linisin ang Kalabasan" + +#: editor/editor_network_profiler.cpp editor/editor_node.cpp +#: editor/editor_profiler.cpp +msgid "Stop" +msgstr "Huminto" + +#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp +#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp +msgid "Start" +msgstr "Magsimula" + +#: editor/editor_network_profiler.cpp +msgid "%s/s" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Down" +msgstr "Baba" + +#: editor/editor_network_profiler.cpp +msgid "Up" +msgstr "Taas" + +#: editor/editor_network_profiler.cpp editor/editor_node.cpp +msgid "Node" +msgstr "Node" + +#: editor/editor_network_profiler.cpp +msgid "Incoming RPC" +msgstr "Padating na RPC" + +#: editor/editor_network_profiler.cpp +msgid "Incoming RSET" +msgstr "Padating na RSET" + +#: editor/editor_network_profiler.cpp +msgid "Outgoing RPC" +msgstr "Paluwas na RPC" + +#: editor/editor_network_profiler.cpp +msgid "Outgoing RSET" +msgstr "Paluwas na RSET" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "New Window" +msgstr "Bagong Tabing" + +#: editor/editor_node.cpp +msgid "" +"Spins when the editor window redraws.\n" +"Update Continuously is enabled, which can increase power usage. Click to " +"disable it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Spins when the editor window redraws." +msgstr "" + +#: editor/editor_node.cpp +msgid "Imported resources can't be saved." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: modules/gltf/editor_scene_exporter_gltf_plugin.cpp scene/gui/dialogs.cpp +msgid "OK" +msgstr "OK" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Error saving resource!" +msgstr "Hindi ma-save ang resource!" + +#: editor/editor_node.cpp +msgid "" +"This resource can't be saved because it does not belong to the edited scene. " +"Make it unique first." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Save Resource As..." +msgstr "I-save ang Resource Bilang..." + +#: editor/editor_node.cpp +msgid "Can't open file for writing:" +msgstr "Hindi mabuksan ang file para sa pagsusulat:" + +#: editor/editor_node.cpp +msgid "Requested file format unknown:" +msgstr "Hindi ma-tiyak ang porma ng file na hinihiling:" + +#: editor/editor_node.cpp +msgid "Error while saving." +msgstr "Nabigo habang nagsesave." + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Can't open '%s'. The file could have been moved or deleted." +msgstr "Hindi mabuksan ang '%s'. Maaring nalipat o nabura ang file." + +#: editor/editor_node.cpp +msgid "Error while parsing '%s'." +msgstr "Nabigo habang sinisiyasat ang '%s'." + +#: editor/editor_node.cpp +msgid "Unexpected end of file '%s'." +msgstr "Hindi inaasahang hulihan ng file na '%s'." + +#: editor/editor_node.cpp +msgid "Missing '%s' or its dependencies." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while loading '%s'." +msgstr "Nabigo habang kinakarga ang '%s'." + +#: editor/editor_node.cpp +msgid "Saving Scene" +msgstr "Sinasalba ang Eksena" + +#: editor/editor_node.cpp +msgid "Analyzing" +msgstr "Sinusuri" + +#: editor/editor_node.cpp +msgid "Creating Thumbnail" +msgstr "Ginagawa ang Thumbnail" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a tree root." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This scene can't be saved because there is a cyclic instancing inclusion.\n" +"Please resolve it and then attempt to save again." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " +"be satisfied." +msgstr "" + +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + +#: editor/editor_node.cpp editor/scene_tree_dock.cpp +msgid "Can't overwrite scene that is still open!" +msgstr "Hindi ma-overwrite ang mga bukas pa ring eksena!" + +#: editor/editor_node.cpp +msgid "Can't load MeshLibrary for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving MeshLibrary!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load TileSet for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving TileSet!" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"An error occurred while trying to save the editor layout.\n" +"Make sure the editor's user data path is writable." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Default editor layout overridden.\n" +"To restore the Default layout to its base settings, use the Delete Layout " +"option and delete the Default layout." +msgstr "" + +#: editor/editor_node.cpp +msgid "Layout name not found!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Restored the Default layout to its base settings." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was imported, so it's not editable.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was instanced or inherited.\n" +"Changes to it won't be kept when saving the current scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource was imported, so it's not editable. Change its settings in the " +"import panel and then re-import." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This scene was imported, so changes to it won't be kept.\n" +"Instancing it or inheriting will allow making changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This is a remote object, so changes to it won't be kept.\n" +"Please read the documentation relevant to debugging to better understand " +"this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save scene before running..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Could not start subprocess!" +msgstr "" + +#: editor/editor_node.cpp editor/filesystem_dock.cpp +msgid "Open Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Base Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Scene..." +msgstr "Mabilisang Magbukas ng Eksena..." + +#: editor/editor_node.cpp +msgid "Quick Open Script..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Close" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to '%s' before closing?" +msgstr "" + +#: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The current scene has no root node, but %d modified external resource(s) " +"were saved anyway." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"A root node is required to save the scene. You can add a root node using the " +"Scene tree dock." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene As..." +msgstr "" + +#: editor/editor_node.cpp modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "This operation can't be done without a scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Mesh Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a root node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Tile Set" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a selected node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't undo while mouse buttons are pressed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Nothing to undo." +msgstr "" + +#: editor/editor_node.cpp +msgid "Undo: %s" +msgstr "Ibalik: %s" + +#: editor/editor_node.cpp +msgid "Can't redo while mouse buttons are pressed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Nothing to redo." +msgstr "" + +#: editor/editor_node.cpp +msgid "Redo: %s" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't reload a scene that was never saved." +msgstr "" + +#: editor/editor_node.cpp +msgid "Reload Saved Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The current scene has unsaved changes.\n" +"Reload the saved scene anyway? This action cannot be undone." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Run Scene..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Yes" +msgstr "Oo" + +#: editor/editor_node.cpp +msgid "Exit the editor?" +msgstr "Umalis sa editor?" + +#: editor/editor_node.cpp +msgid "Open Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before quitting?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before opening Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This option is deprecated. Situations where refresh must be forced are now " +"considered a bug. Please report." +msgstr "" + +#: editor/editor_node.cpp +msgid "Pick a Main Scene" +msgstr "Pumili ng Pangunahing Eksena" + +#: editor/editor_node.cpp +msgid "Close Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Reopen Closed Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to enable addon plugin at: '%s' parsing of config failed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s'. This might be due to a code " +"error in that script.\n" +"Disabling the addon at '%s' to prevent further errors." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s' Base type is not EditorPlugin." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s' Script is not in tool mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Scene '%s' was automatically imported, so it can't be modified.\n" +"To make changes to it, a new inherited scene can be created." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Error loading scene, it must be inside the project path. Use 'Import' to " +"open the scene, then save it inside the project path." +msgstr "" + +#: editor/editor_node.cpp +msgid "Scene '%s' has broken dependencies:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Clear Recent Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"No main scene has ever been defined, select one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' is not a scene file, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Delete Layout" +msgstr "Alisin Ang Pagkaayos" + +#: editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp +msgid "Default" +msgstr "Karaniwan" + +#: editor/editor_node.cpp editor/editor_resource_picker.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp +msgid "Show in FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play This Scene" +msgstr "Ipalabas Ang Eksenang Ito" + +#: editor/editor_node.cpp +msgid "Close Tab" +msgstr "Isara ang Tab" + +#: editor/editor_node.cpp +msgid "Undo Close Tab" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Close Other Tabs" +msgstr "Isara Ang Ibang Mga Tab" + +#: editor/editor_node.cpp +msgid "Close Tabs to the Right" +msgstr "Isara Ang Mga Tab Sa Kanan" + +#: editor/editor_node.cpp +msgid "Close All Tabs" +msgstr "Isara Lahat ng Tabs" + +#: editor/editor_node.cpp +msgid "Switch Scene Tab" +msgstr "Palitan Ang Tab ng Eksena" + +#: editor/editor_node.cpp +msgid "%d more files or folders" +msgstr "%d pang mga file o mga folder" + +#: editor/editor_node.cpp +msgid "%d more folders" +msgstr "%d pang mga folder" + +#: editor/editor_node.cpp +msgid "%d more files" +msgstr "%d mga file" + +#: editor/editor_node.cpp +msgid "Dock Position" +msgstr "Idaong Ang Posisyon" + +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle distraction-free mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "Add a new scene." +msgstr "Magdagdag ng panibagong eksena." + +#: editor/editor_node.cpp +msgid "Scene" +msgstr "Eksena" + +#: editor/editor_node.cpp +msgid "Go to previously opened scene." +msgstr "Bumalik sa dating binuksang eksena." + +#: editor/editor_node.cpp +msgid "Copy Text" +msgstr "Kopyahin Ang Nakasulat" + +#: editor/editor_node.cpp +msgid "Next tab" +msgstr "Susunod na tab" + +#: editor/editor_node.cpp +msgid "Previous tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Filter Files..." +msgstr "Magsala ng mga File..." + +#: editor/editor_node.cpp +msgid "Operations with scene files." +msgstr "" + +#: editor/editor_node.cpp +msgid "New Scene" +msgstr "Panibagong Eksena" + +#: editor/editor_node.cpp +msgid "New Inherited Scene..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene..." +msgstr "Magbukas ng Eksena..." + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Open Recent" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Convert To..." +msgstr "Palitan Sa..." + +#: editor/editor_node.cpp +msgid "MeshLibrary..." +msgstr "MeshLibrary..." + +#: editor/editor_node.cpp +msgid "TileSet..." +msgstr "TileSet..." + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Undo" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Redo" +msgstr "" + +#: editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +#: editor/script_create_dialog.cpp +msgid "Project" +msgstr "Proyekto" + +#: editor/editor_node.cpp +msgid "Project Settings..." +msgstr "Kaayusan ng Proyekto..." + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Pagmamahala ng Bersyon" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Set Up Version Control" +msgstr "" + +#: editor/editor_node.cpp +msgid "Shut Down Version Control" +msgstr "" + +#: editor/editor_node.cpp +msgid "Export..." +msgstr "Magluwas..." + +#: editor/editor_node.cpp +msgid "Install Android Build Template..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Project Data Folder" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp +msgid "Tools" +msgstr "Mga Kagamitan" + +#: editor/editor_node.cpp +msgid "Orphan Resource Explorer..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Reload Current Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit to Project List" +msgstr "Umuwi sa Talaproyektuhan" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/project_export.cpp +msgid "Debug" +msgstr "Debug" + +#: editor/editor_node.cpp +msgid "Deploy with Remote Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, using one-click deploy will make the executable " +"attempt to connect to this computer's IP so the running project can be " +"debugged.\n" +"This option is intended to be used for remote debugging (typically with a " +"mobile device).\n" +"You don't need to enable it to use the GDScript debugger locally." +msgstr "" + +#: editor/editor_node.cpp +msgid "Small Deploy with Network Filesystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, using one-click deploy for Android will only " +"export an executable without the project data.\n" +"The filesystem will be provided from the project by the editor over the " +"network.\n" +"On Android, deploying will use the USB cable for faster performance. This " +"option speeds up testing for projects with large assets." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, collision shapes and raycast nodes (for 2D and " +"3D) will be visible in the running project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, navigation meshes and polygons will be visible " +"in the running project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Synchronize Scene Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, any changes made to the scene in the editor " +"will be replicated in the running project.\n" +"When used remotely on a device, this is more efficient when the network " +"filesystem option is enabled." +msgstr "" + +#: editor/editor_node.cpp +msgid "Synchronize Script Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, any script that is saved will be reloaded in " +"the running project.\n" +"When used remotely on a device, this is more efficient when the network " +"filesystem option is enabled." +msgstr "" + +#: editor/editor_node.cpp editor/script_create_dialog.cpp +msgid "Editor" +msgstr "Editor" + +#: editor/editor_node.cpp +msgid "Editor Settings..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Take Screenshot" +msgstr "" + +#: editor/editor_node.cpp +msgid "Screenshots are stored in the Editor Data/Settings Folder." +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle Fullscreen" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle System Console" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Editor Data/Settings Folder" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Editor Data Folder" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Editor Settings Folder" +msgstr "" + +#: editor/editor_node.cpp +msgid "Manage Editor Features..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Manage Export Templates..." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp +msgid "Help" +msgstr "Tulong" + +#: editor/editor_node.cpp +msgid "Online Documentation" +msgstr "" + +#: editor/editor_node.cpp +msgid "Questions & Answers" +msgstr "Mga Katanungan at Kasagutan" + +#: editor/editor_node.cpp +msgid "Report a Bug" +msgstr "Umulat ng Bug" + +#: editor/editor_node.cpp +msgid "Suggest a Feature" +msgstr "Magmungkahi ng Tampok" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Magpadala ng Puna Ukol sa Docs" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "Community" +msgstr "Pamayanan" + +#: editor/editor_node.cpp +msgid "About Godot" +msgstr "Tungkol sa Godot" + +#: editor/editor_node.cpp +msgid "Support Godot Development" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the project." +msgstr "Ipalabas ang proyekto." + +#: editor/editor_node.cpp +msgid "Play" +msgstr "Ipalabas" + +#: editor/editor_node.cpp +msgid "Pause the scene execution for debugging." +msgstr "Ihinto muna ang pagpapalabas ng eksena para sa pagdebug." + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Ihinto muna ang Eksena" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Itigil Ang Pagpapalabas ng Eksena." + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Ipalabas ang nabagong eksena." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Ipalabas Ang Eksena" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Ipalabas ang pasadyang eksena" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Changing the video driver requires restarting the editor." +msgstr "" + +#: editor/editor_node.cpp editor/project_settings_editor.cpp +#: editor/settings_config_dialog.cpp +msgid "Save & Restart" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Continuously" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update When Changed" +msgstr "" + +#: editor/editor_node.cpp +msgid "Hide Update Spinner" +msgstr "" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Expand Bottom Panel" +msgstr "" + +#: editor/editor_node.cpp +msgid "Output" +msgstr "" + +#: editor/editor_node.cpp +msgid "Don't Save" +msgstr "" + +#: editor/editor_node.cpp +msgid "Android build template is missing, please install relevant templates." +msgstr "" + +#: editor/editor_node.cpp +msgid "Manage Templates" +msgstr "" + +#: editor/editor_node.cpp +msgid "Install from file" +msgstr "" + +#: editor/editor_node.cpp +msgid "Select android sources file" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This will set up your project for custom Android builds by installing the " +"source template to \"res://android/build\".\n" +"You can then apply modifications and build your own custom APK on export " +"(adding modules, changing the AndroidManifest.xml, etc.).\n" +"Note that in order to make custom builds instead of using pre-built APKs, " +"the \"Use Custom Build\" option should be enabled in the Android export " +"preset." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The Android build template is already installed in this project and it won't " +"be overwritten.\n" +"Remove the \"res://android/build\" directory manually before attempting this " +"operation again." +msgstr "" + +#: editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "Magankat ng mga Template mula sa ZIP File" + +#: editor/editor_node.cpp +msgid "Template Package" +msgstr "Pakete ng Template" + +#: editor/editor_node.cpp modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "Export Library" +msgstr "Iluwas ang Library" + +#: editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "Ipagsama Sa Mga Umiiral" + +#: editor/editor_node.cpp +msgid "Apply MeshInstance Transforms" +msgstr "Applayan ng MeshInstance Transform" + +#: editor/editor_node.cpp +msgid "Open & Run a Script" +msgstr "Magbukas at magpatakbo ng skrip" + +#: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Isalba muli" + +#: editor/editor_node.cpp +msgid "New Inherited" +msgstr "" + +#: editor/editor_node.cpp +msgid "Load Errors" +msgstr "Mga Kabugian Sa Pagloload" + +#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Select" +msgstr "Magpili" + +#: editor/editor_node.cpp +msgid "Select Current" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + +#: editor/editor_node.h +msgid "Warning!" +msgstr "Babala!" + +#: editor/editor_path.cpp +msgid "No sub-resources found." +msgstr "" + +#: editor/editor_path.cpp +msgid "Open a list of sub-resources." +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Creating Mesh Previews" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Thumbnail..." +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Main Script:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Edit Plugin" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Installed Plugins:" +msgstr "" + +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +msgid "Update" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Version" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Author" +msgstr "" + +#: editor/editor_plugin_settings.cpp +#: editor/plugins/version_control_editor_plugin.cpp +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Status" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Measure:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame Time (ms)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Average Time (ms)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Physics Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Inclusive" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Self" +msgstr "Sarili" + +#: editor/editor_profiler.cpp +msgid "" +"Inclusive: Includes time from other functions called by this function.\n" +"Use this to spot bottlenecks.\n" +"\n" +"Self: Only count the time spent in the function itself, not in other " +"functions called by that function.\n" +"Use this to find individual functions to optimize." +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame #:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Time" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Calls" +msgstr "" + +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "Baguhin ang Text:" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp +msgid "On" +msgstr "Nakabukas" + +#: editor/editor_properties.cpp +msgid "Layer" +msgstr "" + +#: editor/editor_properties.cpp +msgid "Bit %d, value %d" +msgstr "" + +#: editor/editor_properties.cpp +msgid "[Empty]" +msgstr "[Puwang]" + +#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp +msgid "Assign..." +msgstr "" + +#: editor/editor_properties.cpp +msgid "Invalid RID" +msgstr "" + +#: editor/editor_properties.cpp +msgid "" +"Can't create a ViewportTexture on resources saved as a file.\n" +"Resource needs to belong to a scene." +msgstr "" + +#: editor/editor_properties.cpp +msgid "" +"Can't create a ViewportTexture on this resource because it's not set as " +"local to scene.\n" +"Please switch on the 'local to scene' property on it (and all resources " +"containing it up to a node)." +msgstr "" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "Pick a Viewport" +msgstr "" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "Selected node is not a Viewport!" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +msgid "Size: " +msgstr "Laki: " + +#: editor/editor_properties_array_dict.cpp +msgid "Page: " +msgstr "Pahina: " + +#: editor/editor_properties_array_dict.cpp +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Item" +msgstr "Alisin ang Gamit" + +#: editor/editor_properties_array_dict.cpp +msgid "New Key:" +msgstr "Bagong Susi:" + +#: editor/editor_properties_array_dict.cpp +msgid "New Value:" +msgstr "Bagong Halaga:" + +#: editor/editor_properties_array_dict.cpp +msgid "Add Key/Value Pair" +msgstr "" + +#: editor/editor_resource_picker.cpp +msgid "" +"The selected resource (%s) does not match any type expected for this " +"property (%s)." +msgstr "" + +#: editor/editor_resource_picker.cpp +msgid "Quick Load" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "Make Unique" +msgstr "" + +#: editor/editor_resource_picker.cpp +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Paste" +msgstr "Idikit" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "Convert to %s" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "New %s" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "New Script" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/scene_tree_dock.cpp +msgid "Extend Script" +msgstr "" + +#: editor/editor_run_native.cpp +msgid "" +"No runnable export preset found for this platform.\n" +"Please add a runnable preset in the Export menu or define an existing preset " +"as runnable." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "There is an edited scene already." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't instance script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't run script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "" + +#: editor/editor_spin_slider.cpp +msgid "Hold %s to round to integers. Hold Shift for more precise changes." +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Select Node(s) to Import" +msgstr "" + +#: editor/editor_sub_scene.cpp editor/project_manager.cpp +msgid "Browse" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Import From Node:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open the folder containing these templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall these templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "There are no mirrors available." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Retrieving the mirror list..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Starting the download..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error requesting URL:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connecting to the mirror..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't resolve the requested address." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't connect to the mirror." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No response from the mirror." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Request ended up in a redirect loop." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Request failed:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download complete; extracting templates..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Cannot remove temporary file:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Templates installation failed.\n" +"The problematic templates archives can be found at '%s'." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error getting the list of mirrors." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error parsing JSON with the list of mirrors. Please report this issue!" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Best available mirror" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"No download links found for this version. Direct download is only available " +"for official releases." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Disconnected" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Resolving" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Resolve" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connecting..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Connect" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connected" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Requesting..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Downloading" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connection Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "SSL Handshake Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't open the export templates file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Invalid version.txt format inside the export templates file: %s." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No version.txt found inside the export templates file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error creating path for extracting templates:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Extracting Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Importing:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove templates for the version '%s'?" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uncompressing Android Build Sources" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export Template Manager" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Current Version:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export templates are missing. Download them or install from a file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export templates are installed and ready to be used." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open Folder" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open the folder containing installed templates for the current version." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall templates for the current version." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download from:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open in Web Browser" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Copy Mirror URL" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download and Install" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Download and install templates for the current version from the best " +"possible mirror." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Official export templates aren't available for development builds." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Install from File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Install templates from a local file." +msgstr "" + +#: editor/export_template_manager.cpp editor/find_in_files.cpp +#: editor/progress_dialog.cpp scene/gui/dialogs.cpp +msgid "Cancel" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Cancel the download of the templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Other Installed Versions:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall Template" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select Template File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Godot Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"The templates will continue to download.\n" +"You may experience a short editor freeze when they finish." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Favorites" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Status: Import of file failed. Please fix file and reimport manually." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"Importing has been disabled for this file, so it can't be opened for editing." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move/rename resources root." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move a folder into itself." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error moving:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error duplicating:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Unable to update dependencies:" +msgstr "" + +#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp +msgid "No name provided." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Provided name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "A file or folder with this name already exists." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"The following files or folders conflict with items in the target location " +"'%s':\n" +"\n" +"%s\n" +"\n" +"Do you wish to overwrite them?" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming file:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming folder:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Duplicating file:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Duplicating folder:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Inherited Scene" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Open Scenes" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Add to Favorites" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Remove from Favorites" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Edit Dependencies..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View Owners..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move To..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Scene..." +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +msgid "New Script..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Resource..." +msgstr "" + +#: editor/filesystem_dock.cpp editor/inspector_dock.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_editor_debugger.cpp +msgid "Expand All" +msgstr "" + +#: editor/filesystem_dock.cpp editor/inspector_dock.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_editor_debugger.cpp +msgid "Collapse All" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort files" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Name (Ascending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Name (Descending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Type (Ascending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Type (Descending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Last Modified" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by First Modified" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Duplicate..." +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Rename..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Focus the search box" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Previous Folder/File" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Next Folder/File" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Toggle Split Mode" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Search files" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"Scanning Files,\n" +"Please Wait..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move" +msgstr "" + +#: editor/filesystem_dock.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/project_manager.cpp editor/rename_dialog.cpp +#: editor/scene_tree_dock.cpp +msgid "Rename" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Overwrite" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Create Scene" +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "" + +#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp +msgid "Find in Files" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Find:" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Folder:" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Filters:" +msgstr "" + +#: editor/find_in_files.cpp +msgid "" +"Include the files with the following extensions. Add or remove them in " +"ProjectSettings." +msgstr "" + +#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find..." +msgstr "" + +#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp +msgid "Replace..." +msgstr "" + +#: editor/find_in_files.cpp +msgid "Find: " +msgstr "" + +#: editor/find_in_files.cpp +msgid "Replace: " +msgstr "" + +#: editor/find_in_files.cpp +msgid "Replace all (no undo)" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Searching..." +msgstr "" + +#: editor/find_in_files.cpp +msgid "%d match in %d file." +msgstr "" + +#: editor/find_in_files.cpp +msgid "%d matches in %d file." +msgstr "" + +#: editor/find_in_files.cpp +msgid "%d matches in %d files." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Add to Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Group name already exists." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Invalid group name." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Rename Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Delete Group" +msgstr "" + +#: editor/groups_editor.cpp editor/node_dock.cpp +msgid "Groups" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Nodes Not in Group" +msgstr "" + +#: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp +msgid "Filter nodes" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Nodes in Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Empty groups will be automatically removed." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Group Editor" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Manage Groups" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Single Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Import Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Importing Scene..." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Generating Lightmaps" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Generating for Mesh: " +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Running Custom Script..." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Couldn't load post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Invalid/broken script for post-import (check console):" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Error running post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Did you return a Node-derived object in the `post_import()` method?" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Saving..." +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + +#: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp +msgid "%d Files" +msgstr "" + +#: editor/import_dock.cpp +msgid "Set as Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Clear Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" +msgstr "" + +#: editor/import_dock.cpp +msgid "Save Scenes, Re-Import, and Restart" +msgstr "" + +#: editor/import_dock.cpp +msgid "Changing the type of an imported file requires editor restart." +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"WARNING: Assets exist that use this resource, they may stop loading properly." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Failed to load resource." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Copy Properties" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Paste Properties" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Make Sub-Resources Unique" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Create a new resource in memory and edit it." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Save the currently edited resource." +msgstr "" + +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +msgid "Save As..." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Extra resource options." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Edit Resource from Clipboard" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Copy Resource" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Make Resource Built-In" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Go to the previous edited object in history." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Go to the next edited object in history." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "History of recently edited objects." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Open documentation for this object." +msgstr "" + +#: editor/inspector_dock.cpp editor/scene_tree_dock.cpp +msgid "Open Documentation" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Filter properties" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Manage object properties." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Changes may be lost!" +msgstr "" + +#: editor/multi_node_edit.cpp +msgid "MultiNode Set" +msgstr "" + +#: editor/node_dock.cpp +msgid "Select a single node to edit its signals and groups." +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Edit a Plugin" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Create a Plugin" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Plugin Name:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Subfolder:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Author:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Version:" +msgstr "" + +#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp +msgid "Language:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Script Name:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Activate now?" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Polygon" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Create points." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "" +"Edit points.\n" +"LMB: Move Point\n" +"RMB: Erase Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Erase points." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Edit Polygon" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Insert Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Edit Polygon (Remove Point)" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Remove Polygon And Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Load..." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Move Node Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Change BlendSpace1D Limits" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Change BlendSpace1D Labels" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "This type of node can't be used. Only root nodes are allowed." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Node Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Animation Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Remove BlendSpace1D Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Move BlendSpace1D Node Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "" +"AnimationTree is inactive.\n" +"Activate to enable playback, check node warnings if activation fails." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Set the blending position within the space" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Select and move points, create points with RMB." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp +msgid "Enable snap and show grid." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Open Editor" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Open Animation Node" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Triangle already exists." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Triangle" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Change BlendSpace2D Limits" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Change BlendSpace2D Labels" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Remove BlendSpace2D Point" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Remove BlendSpace2D Triangle" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "BlendSpace2D does not belong to an AnimationTree node." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "No triangles exist, so no blending can take place." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Toggle Auto Triangles" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Create triangles by connecting points." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Erase points and triangles." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Generate blend triangles automatically (instead of manually)" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend:" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Parameter Changed:" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Edit Filters" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Output node can't be added to the blend tree." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Add Node to BlendTree" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Node Moved" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Unable to connect, port may be in use or connection may be invalid." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Nodes Connected" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Nodes Disconnected" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Set Animation" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Node" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Toggle Filter On/Off" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Change Filter" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "No animation player set, so unable to retrieve track names." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Player path set is invalid, so unable to retrieve track names." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "" +"Animation player has no valid root node path, so unable to retrieve track " +"names." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Node Renamed" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Node..." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "Edit Filtered Tracks:" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Enable Filtering" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Animation?" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Invalid animation name!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation name already exists!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "No animation to copy!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "No animation resource on clipboard!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pasted Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "No animation to edit!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from current pos. (A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from start. (Shift+D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from current pos. (D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Scale animation playback globally for the node." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Tools" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/version_control_editor_plugin.cpp +msgid "New" +msgstr "Bago" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Transitions..." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Open in Inspector" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning Options" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Directions" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "Nakaraan" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "Hinaharap" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "Lalim" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "1 hakbang" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "2 hakbang" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "3 hakbang" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "Mga Pagkakaiba Lang" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "Piliting Magmodulate ng Paputi" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "Magsama ng mga Gizmo (3D)" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pin AnimationPlayer" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Gumawa ng Bagong Animasyon" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "Pangalan ng Animasyon:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +msgid "Error!" +msgstr "Kabiguan!" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "Sunod (Kusang Pagpila):" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Move Node" +msgstr "Ilipat Ang Node" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Transition exists!" +msgstr "Mayroon ng Transisyon!" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Add Transition" +msgstr "Magdagdag ng Transisyon" + +#: editor/plugins/animation_state_machine_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node" +msgstr "Magdagdag ng Node" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "End" +msgstr "Iwakas" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Immediate" +msgstr "Mabilisan" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Sync" +msgstr "Ipagsabay" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "At End" +msgstr "Sa Huli" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Travel" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Start and end nodes are needed for a sub-transition." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "No playback resource set at path: %s." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Node Removed" +msgstr "Naalis ang Node" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Transition Removed" +msgstr "Naalis ang Transisyon" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Set Start Node (Autoplay)" +msgstr "Itakda ang Umpisa ng Node (Kusang Pagpalabas)" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "" +"Select and move nodes.\n" +"RMB to add new nodes.\n" +"Shift+LMB to create connections." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Create new nodes." +msgstr "Gumawa ng bagong mga node." + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Connect nodes." +msgstr "Magkabit ng mga node." + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Remove selected node or transition." +msgstr "Alisin ang napiling node o transisyon." + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Toggle autoplay this animation on start, restart or seek to zero." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Set the end animation. This is useful for sub-transitions." +msgstr "" +"Itakda ang hulihan ng animasyon. Magagamit to para sa mga sub-transisyon." + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Transition: " +msgstr "Transisyon: " + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Play Mode:" +msgstr "Paraan sa Pagpapalabas:" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "AnimationTree" +msgstr "AnimationTree" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "New name:" +msgstr "Bagong pangalan:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Scale:" +msgstr "Sukat:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "(Mga) Palabong Pagpasok:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "(Mga) Palabong Paglabas:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend" +msgstr "Halo" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Mix" +msgstr "Mix" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "Kusa Muling Pagumpisa:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Restart (s):" +msgstr "(Mga) Muling Pagumpisa:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "Alinmang (Mga) Kusa Muling-Pagsisimula:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Start!" +msgstr "Simulan!" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "Bilang:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend 0:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend 1:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Current:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Input" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Delete Input" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "OneShot Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Mix Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Import Animations..." +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Edit Node Filters" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Filters..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Contents:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "View Files" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connection error, please try again." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect to host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response from host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve hostname:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, return code:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Cannot save response to:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Write error." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, too many redirects" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Redirect loop." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, timeout" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Timeout." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Bad download hash, assuming file has been tampered with." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Expected:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Got:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed SHA-256 hash check" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Asset Download Error:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Downloading (%s / %s)..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Downloading..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Resolving..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Error making request" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Idle" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Retry" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download Error" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download for this asset is already in progress!" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Recently Updated" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Least Recently Updated" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Name (A-Z)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Name (Z-A)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "License (A-Z)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "License (Z-A)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "First" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Previous" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Next" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Last" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "All" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Search templates, projects, and demos" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Search assets (excluding templates, projects, and demos)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Import..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Plugins..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Sort:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Category:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Site:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Support" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Official" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Testing" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Loading..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "" + +#: editor/plugins/audio_stream_editor_plugin.cpp +msgid "Audio Preview Play/Pause" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Can't determine a save path for lightmap images.\n" +"Save your scene and try again." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"No meshes to bake. Make sure they contain an UV2 channel and that the 'Use " +"In Baked Light' and 'Generate Lightmap' flags are on." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Failed creating lightmap images, make sure path is writable." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Failed determining lightmap size. Maximum lightmap size too small?" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Some mesh is invalid. Make sure the UV2 channel values are contained within " +"the [0.0,1.0] square region." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Godot editor was built without ray tracing support, lightmaps can't be baked." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Bake Lightmaps" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Select lightmap bake file:" +msgstr "" + +#: editor/plugins/camera_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Preview" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Grid Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Grid Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Vertical Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Vertical Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove Vertical Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Horizontal Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Horizontal Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove Horizontal Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Horizontal and Vertical Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate CanvasItem \"%s\" to %d degrees" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move CanvasItem \"%s\" Anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Node2D \"%s\" to (%s, %s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Resize Control \"%s\" to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale CanvasItem \"%s\" to (%s, %s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move CanvasItem \"%s\" to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Locked" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Grouped" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Children of containers have their anchors and margins values overridden by " +"their parent." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Presets for the anchors and margins values of a Control node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"When active, moving Control nodes changes their anchors instead of their " +"margins." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Top Left" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Top Right" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Bottom Right" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Bottom Left" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Left" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Top" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Right" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Bottom" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Left Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Top Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Right Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Bottom Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "VCenter Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "HCenter Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Full Rect" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Keep Ratio" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchors only" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors and Margins" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Project Camera Override\n" +"Overrides the running project's camera with the editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Project Camera Override\n" +"No project instance running. Run the project from the editor to use this " +"feature." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Group Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Ungroup Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Custom Bone(s) from Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Warning: Children of a container get their position and size determined only " +"by their parent." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Zoom Reset" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Select Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Drag: Rotate selected node around pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move selected node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "V: Set selected node's pivot position." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Alt+RMB: Show list of all nodes at position clicked, including locked." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "RMB: Add node at position clicked." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Show a list of all objects at the position clicked\n" +"(same as Alt+RMB in select mode)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Click to change object's rotation pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Ruler Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggle smart snapping." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Smart Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggle grid snapping." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Grid Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snapping Options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap Relative" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Smart Snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Parent" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Sides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Center" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Other Nodes" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock the selected object in place (can't be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock the selected object (can be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Makes sure the object's children are not selectable." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Restores the object's children's ability to be selected." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Skeleton Options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Custom Bone(s) from Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Custom Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Always Show Grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Helpers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Rulers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Origin" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Viewport" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Group And Lock Icons" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Preview Canvas Scale" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated or scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Animation Key and Pose Options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add Node Here" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Instance Scene Here" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Multiply grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Divide grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 3.125%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 6.25%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 12.5%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 25%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 50%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 100%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 200%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 400%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 800%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 1600%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Adding %s..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Cannot instantiate multiple nodes without root." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Create Node" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Default Type" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Drag & drop + Shift : Add node as sibling\n" +"Drag & drop + Alt : Change node type" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Create Polygon3D" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Edit Poly" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Edit Poly (Remove Point)" +msgstr "" + +#: editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Restart" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Solid Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Border Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Directed Border Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +msgid "CPUParticles" +msgstr "" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Mesh" +msgstr "" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Node" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat 0" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat 1" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp +msgid "Ease In" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp +msgid "Ease Out" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Smoothstep" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Curve Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Add Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Left Linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right Linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Toggle Curve Linear Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Hold Shift to edit tangents individually" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right click to add point" +msgstr "" + +#: editor/plugins/gi_probe_editor_plugin.cpp +msgid "Bake GI Probe" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Gradient Edited" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh is empty!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Couldn't create a Trimesh collision shape." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "This doesn't work on scene root!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Can't create a single convex collision shape for the scene root." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Couldn't create a single convex collision shape." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Simplified Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Single Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Can't create multiple convex collision shapes for the scene root." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Couldn't create any collision shapes." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Multiple Convex Shapes" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Contained Mesh is not of type ArrayMesh." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "UV Unwrap failed, mesh may not be manifold?" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "No mesh to debug." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has no UV in layer %d." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has not surface to create outlines from!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a StaticBody and assigns a polygon-based collision shape to it " +"automatically.\n" +"This is the most accurate (but slowest) option for collision detection." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a polygon-based collision shape.\n" +"This is the most accurate (but slowest) option for collision detection." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Single Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a single convex collision shape.\n" +"This is the fastest (but least accurate) option for collision detection." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Simplified Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a simplified convex collision shape.\n" +"This is similar to single collision shape, but can result in a simpler " +"geometry in some cases, at the cost of accuracy." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Multiple Convex Collision Siblings" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a polygon-based collision shape.\n" +"This is a performance middle-ground between a single convex collision and a " +"polygon-based collision." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh..." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a static outline mesh. The outline mesh will have its normals " +"flipped automatically.\n" +"This can be used instead of the SpatialMaterial Grow property when using " +"that property isn't possible." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "View UV1" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "View UV2" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Unwrap UV2 for Lightmap/AO" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Outline Size:" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "UV Channel Debug" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "" +"Update from existing scene?:\n" +"%s" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Mesh Library" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Add Item" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Remove Selected Item" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Import from Scene (Ignore Transforms)" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Import from Scene (Apply Transforms)" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Update from Scene" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and no MultiMesh set in node)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "X-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Y-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Z-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Rotation:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Scale:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Convert to CPUParticles" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generating Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generate Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Convert to CPUParticles2D" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "The geometry's faces don't contain any area." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "The geometry doesn't contain any faces." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't inherit from Spatial." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't contain geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't contain face geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Points:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points+Normal (Directed)" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Volume" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Source: " +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "A processor material of type 'ParticlesMaterial' is required." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate Visibility AABB" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point to Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Split Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Select Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Left Click: Split Segment (in curve)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Close Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +#: editor/plugins/theme_editor_preview.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp +msgid "Options" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Mirror Handle Angles" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Mirror Handle Lengths" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Path Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Segment (in curve)" +msgstr "" + +#: editor/plugins/physical_bone_plugin.cpp +msgid "Move Joint" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"The skeleton property of the Polygon2D does not point to a Skeleton2D node" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Sync Bones" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"No texture in this polygon.\n" +"Set a texture to be able to edit UV." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"Polygon 2D has internal vertices, so it can no longer be edited in the " +"viewport." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Polygon & UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Internal Vertex" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Remove Internal Vertex" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Invalid Polygon (need 3 different vertices)" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Add Custom Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Remove Custom Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Paint Bone Weights" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Open Polygon 2D UV editor." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Points" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygons" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Bones" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Points" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Command: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Command: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Ctrl: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create a custom polygon. Enables custom polygon rendering." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"Remove a custom polygon. If none remain, custom polygon rendering is " +"disabled." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Paint weights with specified intensity." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Unpaint weights with specified intensity." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Radius:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Copy Polygon to UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Copy UV to Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Settings" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Enable Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Grid" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Configure Grid:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset X:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset Y:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step X:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step Y:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Sync Bones to Polygon" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/scene_tree_editor.cpp +msgid "Instance:" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Type:" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Load Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ResourcePreloader" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Flip Portals" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Room Generate Points" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Generate Points" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Flip Portal" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Occluder Set Transform" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Center Node" +msgstr "" + +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "AnimationTree has no path set to an AnimationPlayer" +msgstr "" + +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "Path to AnimationPlayer is invalid" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close and save changes?" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error writing TextFile:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Could not load file at:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving file!" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error Saving" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing theme." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error Importing" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "New Text File..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open File" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save File As..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Can't obtain the script for running." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script failed reloading, check console for errors." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script is not in tool mode, will not be able to run." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"To run this script, it must inherit EditorScript and be set to tool mode." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "%s Class Reference" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Previous" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Filter scripts" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Toggle alphabetical sorting of the method list." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Filter methods" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Sort" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Move Up" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Move Down" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Next Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Previous Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "File" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reopen Closed Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Soft Reload Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Copy Script Path" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Previous" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +msgid "Run" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Into" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Over" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Break" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_editor_debugger.cpp +msgid "Continue" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Debug with External Editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Godot online documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Discard" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Debugger" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Results" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Scripts" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Connections to method:" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp +msgid "Source" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Target" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "" +"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "[Ignore]" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Function" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Only resources from filesystem can be dropped." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't drop nodes because script '%s' is not used in this scene." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lookup Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Pick Color" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Syntax Highlighter" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +msgid "Bookmarks" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Cut" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/theme_editor_plugin.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Select All" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Delete Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Left" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Right" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Comment" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold/Unfold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Complete Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Evaluate Selection" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Trim Trailing Whitespace" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent to Spaces" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent to Tabs" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Auto Indent" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Find in Files..." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Contextual Help" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Bookmark" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Next Bookmark" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Previous Bookmark" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Bookmarks" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Function..." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Line..." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Toggle Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Next Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Previous Breakpoint" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "" +"This shader has been modified on on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "This skeleton has no bones, create some children Bone2D nodes." +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Skeleton2D" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Reset to Rest Pose" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Overwrite Rest Pose" +msgstr "" + +#: editor/plugins/skeleton_editor_plugin.cpp +msgid "Create physical bones" +msgstr "" + +#: editor/plugins/skeleton_editor_plugin.cpp +msgid "Skeleton" +msgstr "" + +#: editor/plugins/skeleton_editor_plugin.cpp +msgid "Create physical skeleton" +msgstr "" + +#: editor/plugins/skeleton_ik_editor_plugin.cpp +msgid "Play IK" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear Perspective" +msgstr "" + +#. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. +#: editor/plugins/spatial_editor_plugin.cpp +msgid " [auto]" +msgstr "" + +#. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. +#: editor/plugins/spatial_editor_plugin.cpp +msgid " [portals active]" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "X-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Y-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Z-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp scene/resources/visual_shader.cpp +msgid "None" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate" +msgstr "" + +#. TRANSLATORS: This refers to the movement that changes the position of an object. +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scaling: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translating: " +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotating %s degrees." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pitch:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Yaw:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Size:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "FPS: %d (%s ms)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "No parent to instance a child at." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "This operation requires a single selected node." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock View Rotation" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Half Resolution" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Enable Doppler" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Cinematic Preview" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Not available when using the GLES2 renderer." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Slow Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Camera Preview" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"To zoom further, change the camera's clipping planes (View -> Settings...)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Convert Rooms" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Click to toggle between visibility states.\n" +"\n" +"Open eye: Gizmo is visible.\n" +"Closed eye: Gizmo is hidden.\n" +"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Nodes to Floor" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Couldn't find a solid floor to snap the selection to." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Local Space" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Snap" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Converts rooms for portal culling." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Switch Perspective/Orthogonal View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Insert Animation Key" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Freelook" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Object to Floor" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog..." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "1 Viewport" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "4 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Portal Culling" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Occlusion Culling" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Settings..." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unnamed Gizmo" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Mesh2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Polygon2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "CollisionPolygon2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "LightOccluder2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Sprite is empty!" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Can't convert a sprite using animation frames to mesh." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't replace by mesh." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Sprite" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Simplification: " +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Shrink (Pixels): " +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Grow (Pixels): " +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Update Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Settings:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "No Frames Selected" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add %d Frame(s)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Unable to load images" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "(empty)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "New Animation" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add a Texture from File" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frames from a Sprite Sheet" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Select Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Horizontal:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Vertical:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Select/Clear All Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Create Frames from Sprite Sheet" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "SpriteFrames" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Region Rect" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Margin" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Snap Mode:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Pixel Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Grid Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Auto Slice" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Offset:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Step:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Separation:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "TextureRegion" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Colors" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Fonts" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Icons" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Styleboxes" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} color(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No colors found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} constant(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No constants found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} font(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No fonts found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} icon(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No icons found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} stylebox(es)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No styleboxes found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} currently selected" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Nothing was selected for the import." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Importing Theme Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Importing items {n}/{n}" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Updating the editor" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Finalizing" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Filter:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "With Data" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select by data type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible color items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible color items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible color items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible constant items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible constant items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible constant items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible font items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible font items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible font items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible icon items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible icon items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible icon items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible stylebox items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible stylebox items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible stylebox items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Caution: Adding icon data may considerably increase the size of your Theme " +"resource." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Collapse types." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Expand types." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all Theme items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select With Data" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all Theme items with item data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all Theme items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Import Selected" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Import Items tab has some items selected. Selection will be lost upon " +"closing this window.\n" +"Close anyway?" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Select a theme type from the list to edit its items.\n" +"You can add a custom type or import a type with its items from another theme." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Color Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Constant Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Font Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Icon Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All StyleBox Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"This theme type is empty.\n" +"Add more items to it manually or by importing from another theme." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Color Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Constant Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Font Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Icon Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Stylebox Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Color Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Constant Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Font Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Icon Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Stylebox Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Invalid file, not a Theme resource." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Invalid file, same as the edited Theme resource." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Manage Theme Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Edit Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Types:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Item:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add StyleBox Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Items:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Custom Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Theme Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Old Name:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Import Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Default Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Editor Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select Another Theme Resource:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Another Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Confirm Item Rename" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Cancel Item Rename" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Override Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Unpin this StyleBox as a main style." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Pin this StyleBox as a main style. Editing its properties will update the " +"same properties in all other StyleBoxes of this type." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Item Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Node Types:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Show Default" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Show default type items alongside items that have been overridden." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Override All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Override all default type items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Manage Items..." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add, remove, organize and import Theme items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Preview" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Default Preview" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select UI Scene:" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "" +"Toggle the control picker, allowing to visually select control types for " +"edit." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Toggle Button" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Disabled Button" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Disabled Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Check Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Checked Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Radio Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Checked Radio Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Named Separator" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Submenu" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Subitem 1" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Subitem 2" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Has" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Many" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Disabled LineEdit" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Tab 1" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Tab 2" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Tab 3" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Editable Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Subtree" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Has,Many,Options" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Invalid path, the PackedScene resource was probably moved or removed." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Invalid PackedScene resource, must have a Control node at its root." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Invalid file, not a PackedScene resource." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Reload the scene to reflect its most actual state." +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Fix Invalid Tiles" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cut Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Line Draw" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Find Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Disable Autotile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Enable Priority" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Filter tiles" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Give a TileSet resource to this TileMap to use its tiles." +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "" +"Shift+LMB: Line Draw\n" +"Shift+Command+LMB: Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "" +"Shift+LMB: Line Draw\n" +"Shift+Ctrl+LMB: Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate Left" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate Right" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Flip Horizontally" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Flip Vertically" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Clear Transform" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Add Texture(s) to TileSet." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove selected Texture from TileSet." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Single Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Autotile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Atlas" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Next Coordinate" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Select the next shape, subtile, or Tile." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Previous Coordinate" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Select the previous shape, subtile, or Tile." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Region" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Collision" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Occlusion" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Navigation" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Priority" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Icon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Z Index" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Region Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Collision Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Occlusion Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Navigation Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Bitmask Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Priority Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Icon Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Z Index Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Copy bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Paste bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Erase bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create a new rectangle." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Rectangle" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create a new polygon." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete Selected Shape" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Keep polygon inside region Rect." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Enable snap and show grid (configurable via the Inspector)." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Display Tile Names (Hold Alt Key)" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Add or select a texture on the left panel to edit the tiles bound to it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove selected texture? This will remove all tiles which use it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "You haven't selected a texture to remove." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene? This will overwrite all current tiles." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Texture" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "%s file(s) were not added because was already on the list." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Drag handles to edit Rect.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete selected Rect." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select current edited sub-tile.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete polygon." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"LMB: Set bit on.\n" +"RMB: Set bit off.\n" +"Shift+LMB: Set wildcard bit.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to use as icon, this will be also used on invalid autotile " +"bindings.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to change its priority.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to change its z index.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Set Tile Region" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Set Tile Icon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Navigation Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Paste Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Clear Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Polygon Concave" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Polygon Convex" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Navigation Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Priority" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Z Index" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Convex" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Concave" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "This property can't be changed." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "TileSet" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "No VCS addons are available." +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Error" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "No files added to stage" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "VCS Addon is not initialized" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control System" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Initialize" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Staging area" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Detect new changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Modified" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Renamed" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Deleted" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Typechange" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Stage Selected" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Stage All" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit Changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "View file diffs before committing them to the latest version" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "No file diff is active" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Detect changes in file diff" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Output" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sampler" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add input port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add output port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change input port type" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change output port type" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change input port name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change output port name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Remove input port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Remove output port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set expression" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Resize VisualShader node" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set Uniform Name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set Input Default Port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Node to Visual Shader" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Node(s) Moved" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Duplicate Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Visual Shader Input Type Changed" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "UniformRef Name Changed" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vertex" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Fragment" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Light" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Show resulted shader code." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Create Shader Node" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Grayscale function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts HSV vector to RGB equivalent." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts RGB vector to HSV equivalent." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sepia function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Burn operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Darken operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Difference operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Dodge operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "HardLight operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Lighten operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Overlay operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Screen operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "SoftLight operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated vector if the provided scalars are equal, greater or " +"less." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated vector if the provided boolean value is true or false." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated scalar if the provided boolean value is true or false." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for all shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Input parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex and fragment shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for fragment and light shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for fragment shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for light shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex and fragment shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "E constant (2.718282). Represents the base of the natural logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Epsilon constant (0.00001). Smallest possible scalar number." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Phi constant (1.618034). Golden ratio." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi/4 constant (0.785398) or 45 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi/2 constant (1.570796) or 90 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi constant (3.141593) or 180 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Tau constant (6.283185) or 360 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sqrt2 constant (1.414214). Square root of 2." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the absolute value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-tangent of the parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Finds the nearest integer that is greater than or equal to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Constrains a value to lie between two further values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts a quantity in radians to degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-e Exponential." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-2 Exponential." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest integer less than or equal to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Computes the fractional part of the argument." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse of the square root of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Natural logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-2 logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the greater of two values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the lesser of two values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the opposite value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 - scalar" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the value of the first parameter raised to the power of the second." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts a quantity in degrees to radians." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 / scalar" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest integer to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest even integer to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Clamps the value between 0.0 and 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Extracts the sign of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the square root of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( scalar(edge), scalar(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the truncated value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Adds scalar to scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Divides scalar by scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies scalar by scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the remainder of the two scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Subtracts scalar from scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Perform the cubic texture lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Perform the texture lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Calculate the outer product of a pair of vectors.\n" +"\n" +"OuterProduct treats the first parameter 'c' as a column vector (matrix with " +"one column) and the second parameter 'r' as a row vector (matrix with one " +"row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix " +"whose number of rows is the number of components in 'c' and whose number of " +"columns is the number of components in 'r'." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Composes transform from four vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Decomposes transform to four vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the determinant of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the inverse of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the transpose of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies transform by transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies vector by transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Composes vector from three scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Decomposes vector to three scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the cross product of two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the distance between two points." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the dot product of two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the vector that points in the same direction as a reference vector. " +"The function has three vector parameters : N, the vector to orient, I, the " +"incident vector, and Nref, the reference vector. If the dot product of I and " +"Nref is smaller than zero the return value is N. Otherwise -N is returned." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the length of a vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two vectors using scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the normalize product of vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 - vector" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 / vector" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the vector that points in the direction of reflection ( a : incident " +"vector, b : normal vector )." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the vector that points in the direction of refraction." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( vector(edge), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( scalar(edge), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Adds vector to vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Divides vector by vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies vector by vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the remainder of the two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Subtracts vector from vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Custom Godot Shader Language expression, with custom amount of input and " +"output ports. This is a direct injection of code into the vertex/fragment/" +"light function, do not use it to write the function declarations inside." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns falloff based on the dot product of surface normal and view " +"direction of camera (pass associated inputs to it)." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "A reference to an existing uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "VisualShader" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Edit Visual Property:" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Visual Shader Mode Changed" +msgstr "" + +#: editor/project_export.cpp +msgid "Runnable" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete preset '%s'?" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Failed to export the project for platform '%s'.\n" +"Export templates seem to be missing or invalid." +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Failed to export the project for platform '%s'.\n" +"This might be due to a configuration issue in the export preset or your " +"export settings." +msgstr "" + +#: editor/project_export.cpp +msgid "Release" +msgstr "" + +#: editor/project_export.cpp +msgid "Exporting All" +msgstr "" + +#: editor/project_export.cpp +msgid "The given export path doesn't exist:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted:" +msgstr "" + +#: editor/project_export.cpp +msgid "Presets" +msgstr "" + +#: editor/project_export.cpp editor/project_settings_editor.cpp +msgid "Add..." +msgstr "" + +#: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp +msgid "Export Path" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources" +msgstr "" + +#: editor/project_export.cpp +msgid "Export all resources in the project" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected scenes (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected resources (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources to export:" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to export non-resource files/folders\n" +"(comma-separated, e.g: *.json, *.txt, docs/*)" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to exclude files/folders from project\n" +"(comma-separated, e.g: *.json, *.txt, docs/*)" +msgstr "" + +#: editor/project_export.cpp +msgid "Features" +msgstr "Mga Tampok" + +#: editor/project_export.cpp +msgid "Custom (comma-separated):" +msgstr "" + +#: editor/project_export.cpp +msgid "Feature List:" +msgstr "" + +#: editor/project_export.cpp +msgid "Script" +msgstr "" + +#: editor/project_export.cpp +msgid "GDScript Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Text" +msgstr "" + +#: editor/project_export.cpp +msgid "Compiled Bytecode (Faster Loading)" +msgstr "" + +#: editor/project_export.cpp +msgid "Encrypted (Provide Key Below)" +msgstr "" + +#: editor/project_export.cpp +msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" +msgstr "" + +#: editor/project_export.cpp +msgid "GDScript Encryption Key (256-bits as hexadecimal):" +msgstr "" + +#: editor/project_export.cpp +msgid "Export PCK/Zip" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Project" +msgstr "" + +#: editor/project_export.cpp +msgid "Export mode?" +msgstr "" + +#: editor/project_export.cpp +msgid "Export All" +msgstr "" + +#: editor/project_export.cpp editor/project_manager.cpp +msgid "ZIP File" +msgstr "" + +#: editor/project_export.cpp +msgid "Godot Game Pack" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing:" +msgstr "" + +#: editor/project_export.cpp +msgid "Manage Export Templates" +msgstr "" + +#: editor/project_export.cpp +msgid "Export With Debug" +msgstr "" + +#: editor/project_manager.cpp +msgid "The path specified doesn't exist." +msgstr "" + +#: editor/project_manager.cpp +msgid "Error opening package file (it's not in ZIP format)." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose an empty folder." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a \"project.godot\" or \".zip\" file." +msgstr "" + +#: editor/project_manager.cpp +msgid "This directory already contains a Godot project." +msgstr "" + +#: editor/project_manager.cpp +msgid "New Game Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Imported Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Invalid project name." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create folder." +msgstr "" + +#: editor/project_manager.cpp +msgid "There is already a folder in this path with the specified name." +msgstr "" + +#: editor/project_manager.cpp +msgid "It would be a good idea to name your project." +msgstr "" + +#: editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Couldn't load project.godot in project path (error %d). It may be missing or " +"corrupted." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't edit project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Error opening package file, not in ZIP format." +msgstr "" + +#: editor/project_manager.cpp +msgid "The following files failed extraction from package:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Package installed successfully!" +msgstr "" + +#: editor/project_manager.cpp +msgid "Rename Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import Existing Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import & Edit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create & Edit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Install Project:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Install & Edit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Name:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Path:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Installation Path:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Renderer:" +msgstr "" + +#: editor/project_manager.cpp +msgid "OpenGL ES 3.0" +msgstr "" + +#: editor/project_manager.cpp +msgid "Not supported by your GPU drivers." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Higher visual quality\n" +"All features available\n" +"Incompatible with older hardware\n" +"Not recommended for web games" +msgstr "" + +#: editor/project_manager.cpp +msgid "OpenGL ES 2.0" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Lower visual quality\n" +"Some features not available\n" +"Works on most hardware\n" +"Recommended for web games" +msgstr "" + +#: editor/project_manager.cpp +msgid "Renderer can be changed later, but scenes may need to be adjusted." +msgstr "" + +#: editor/project_manager.cpp +msgid "Unnamed Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Missing Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Error: Project is missing on the filesystem." +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't open project at '%s'." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to open more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"The following project settings file does not specify the version of Godot " +"through which it was created.\n" +"\n" +"%s\n" +"\n" +"If you proceed with opening it, it will be converted to Godot's current " +"configuration file format.\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"The following project settings file was generated by an older engine " +"version, and needs to be converted for this version:\n" +"\n" +"%s\n" +"\n" +"Do you want to convert it?\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"The project settings were created by a newer engine version, whose settings " +"are not compatible with this version." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: no main scene defined.\n" +"Please edit the project and set the main scene in the Project Settings under " +"the \"Application\" category." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Can't run project: Assets need to be imported.\n" +"Please edit the project to trigger the initial import." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to run %d projects at once?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove %d projects from the list?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove this project from the list?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Remove all missing projects from the list?\n" +"The project folders' contents won't be modified." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Language changed.\n" +"The interface will update after restarting the editor or project manager." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Are you sure to scan %s folders for existing Godot projects?\n" +"This could take a while." +msgstr "" + +#. TRANSLATORS: This refers to the application where users manage their Godot projects. +#: editor/project_manager.cpp +msgid "Project Manager" +msgstr "" + +#: editor/project_manager.cpp +msgid "Local Projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp +msgid "Last Modified" +msgstr "" + +#: editor/project_manager.cpp +msgid "Edit Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Run Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "Scan Projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "Select a Folder to Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove Missing" +msgstr "" + +#: editor/project_manager.cpp +msgid "About" +msgstr "Tungkol sa Godot" + +#: editor/project_manager.cpp +msgid "Asset Library Projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "Restart Now" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove All" +msgstr "" + +#: editor/project_manager.cpp +msgid "Also delete project contents (no undo!)" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't run project" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You currently don't have any projects.\n" +"Would you like to explore official example projects in the Asset Library?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Filter projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"This field filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Physical Key" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Key " +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "" +"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " +"'\"'" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "An action with the name '%s' already exists." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Rename Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Action deadzone" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "All Devices" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid " (Physical)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Press a Key..." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "X Button 1" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "X Button 2" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Axis Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Global Property" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Select a setting item first!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "No property '%s' exists." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Setting '%s' is internal, and it can't be deleted." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Delete Item" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "" +"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " +"'\"'." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Error saving settings." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Settings saved OK." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Moved Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override for Feature" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add %d Translations" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translation Resource Remap: Add %d Path(s)" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translation Resource Remap: Add %d Remap(s)" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter Mode" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Project Settings (project.godot)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "General" +msgstr "Pangkalahatan" + +#: editor/project_settings_editor.cpp +msgid "Override For..." +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "The editor must be restarted for changes to take effect." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Input Map" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Deadzone" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Localization" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resources:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps by Locale:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locale" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show All Locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show Selected Locales Only" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Filter mode:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "AutoLoad" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Plugins" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + +#: editor/property_editor.cpp +msgid "Preset..." +msgstr "" + +#: editor/property_editor.cpp +msgid "Zero" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "" + +#: editor/property_editor.cpp +msgid "File..." +msgstr "" + +#: editor/property_editor.cpp +msgid "Dir..." +msgstr "" + +#: editor/property_editor.cpp +msgid "Assign" +msgstr "" + +#: editor/property_editor.cpp +msgid "Select Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Property" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Virtual Method" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Method" +msgstr "" + +#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp +msgid "Batch Rename" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Replace:" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Prefix:" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Suffix:" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Use Regular Expressions" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Advanced Options" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Substitute" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Node name" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Node's parent name, if available" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Node type" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Current scene name" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Root node name" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "" +"Sequential integer counter.\n" +"Compare counter options." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Per-level Counter" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "If set, the counter restarts for each group of child nodes." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Initial value for the counter" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Step" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Amount by which counter is incremented for each node" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Padding" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "" +"Minimum number of digits for the counter.\n" +"Missing digits are padded with leading zeros." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Post-Process" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Style" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Keep" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "PascalCase to snake_case" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "snake_case to PascalCase" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Case" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "To Lowercase" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "To Uppercase" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Reset" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Regular Expression Error:" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "At character %s" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent Node" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Current Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "No parent to instance the scenes at." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error loading scene from %s" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot instance the scene '%s' because the current scene exists within one " +"of its nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Scene(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Replace with Branch Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Child Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Detach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on the tree root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Node In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Nodes In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Duplicate Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't reparent nodes in inherited scenes, order of nodes can't change." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Node must belong to the edited scene to become root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instantiated scenes can't become root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make node as Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete %d nodes and any children?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete %d nodes?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete the root node \"%s\"?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete node \"%s\" and its children?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete node \"%s\"?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Saving the branch as a scene requires having a scene open in the editor." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Saving the branch as a scene requires selecting only one node, but you have " +"selected %d nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Can't save the root node branch as an instanced scene.\n" +"To create an editable copy of the current scene, duplicate it using the " +"FileSystem dock context menu\n" +"or create an inherited scene using Scene > New Inherited Scene... instead." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Can't save the branch of an already instanced scene.\n" +"To create a variation of a scene, you can make an inherited scene based on " +"the instanced scene using Scene > New Inherited Scene... instead." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save New Scene As..." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Disabling \"editable_instance\" will cause all properties of the node to be " +"reverted to their default." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " +"cause all properties of the node to be reverted to their default." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make Local" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "New Scene Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Create Root Node:" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "2D Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "3D Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "User Interface" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Other Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remove Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change type of node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Couldn't save new scene. Likely dependencies (instances) couldn't be " +"satisfied." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error saving scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Sub-Resources" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Editable Children" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Load As Placeholder" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot attach a script: there are no languages registered.\n" +"This is probably because this editor was built with all language modules " +"disabled." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add Child Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Expand/Collapse All" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change Type" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make Scene Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Merge From Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp +msgid "Save Branch as Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp +msgid "Copy Node Path" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete (No Confirm)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add/Create a New Node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach a new or existing script to the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Detach the script from the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remote" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"If selected, the Remote scene tree dock will cause the project to stutter " +"every time it updates.\n" +"Switch back to the Local scene tree dock to improve performance." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Local" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Unlock Node" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Button Group" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "(Connecting From)" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has %s connection(s) and %s group(s).\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has %s connection(s).\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in %s group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Open Script:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock it." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"AnimationPlayer is pinned.\n" +"Click to unpin." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Rename Node" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Scene Tree (Nodes):" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node Configuration Warning!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Select a Node" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is empty." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Filename is empty." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is not local." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid base path." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "A directory with the same name exists." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "File does not exist." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid extension." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Wrong extension chosen." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading template '%s'" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error - Could not create script in filesystem." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading script from %s" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Overrides" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "N/A" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Open Script / Choose Location" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Open Script" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "File exists, it will be reused." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid path." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid class name." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid inherited parent name or path." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Script path/name is valid." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Allowed: a-z, A-Z, 0-9, _ and ." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in script (into scene file)." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Will create a new script file." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Will load an existing script file." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Script file already exists." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "" +"Warning: Having the script name be the same as a built-in type is usually " +"not desired." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Class Name:" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Template:" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script:" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Attach Node Script" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote " +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Warning:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Error" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Error:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Source" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Source:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Source:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Trace" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Child process connected." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Copy Error" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Open C++ Source on GitHub" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Video RAM" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Skip Breakpoints" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Profiler" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Network Profiler" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Value" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Pick one or more items from the list to display the graph." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Total:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Resource Path" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Type" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Format" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Usage" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Misc" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Export measures as CSV" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Erase Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Restore Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Change Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Editor Settings" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Shortcuts" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Binding" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change AudioStreamPlayer3D Emission Angle" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Notifier AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Particles AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Probe Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Cylinder Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Cylinder Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Room Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Portal Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Sphere Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Sphere Position" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Cylinder Radius" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Cylinder Height" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Torus Inner Radius" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Torus Outer Radius" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Select the dynamic library for this entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Select dependencies of the library for this entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Remove current entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Double click to create a new entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Platform:" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Platform" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Dynamic Library" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Add an architecture entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "GDNativeLibrary" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Enabled GDNative Singleton" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Disabled GDNative Singleton" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Library" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Libraries: " +msgstr "" + +#: modules/gdnative/register_types.cpp +msgid "GDNative" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Step argument is zero!" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not a script with an instance" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a script" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a resource file" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (missing @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Object can't provide a length." +msgstr "" + +#: modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "Export Mesh GLTF2" +msgstr "" + +#: modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "Export GLTF..." +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Plane" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Plane" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Plane:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Floor:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Delete Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Fill Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Paste Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Paint" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Grid Map" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Snap View" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Disabled" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Above" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Below" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit X Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Y Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Z Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Clear Rotation" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Paste Selects" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clear Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Fill Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Settings" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Filter meshes" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Give a MeshLibrary resource to this GridMap to use its meshes." +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Begin Bake" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Preparing data structures" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Generate buffers" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Direct lighting" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Indirect lighting" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Post processing" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Plotting lightmaps" +msgstr "" + +#: modules/mono/csharp_script.cpp +msgid "Class name can't be a reserved keyword" +msgstr "" + +#: modules/mono/csharp_script.cpp +msgid "Build Solution" +msgstr "" + +#: modules/mono/mono_gd/gd_mono_utils.cpp +msgid "End of inner exception stack trace" +msgstr "" + +#: modules/recast/navigation_mesh_editor_plugin.cpp +msgid "Bake NavMesh" +msgstr "" + +#: modules/recast/navigation_mesh_editor_plugin.cpp +msgid "Clear the navigation mesh." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Setting up Configuration..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Calculating grid size..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Creating heightfield..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Marking walkable triangles..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Constructing compact heightfield..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Eroding walkable area..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Partitioning..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Creating contours..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Creating polymesh..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Converting to native navigation mesh..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Navigation Mesh Generator Setup:" +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Parsing Geometry..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Done!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"A node yielded without working memory, please read the docs on how to yield " +"properly!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Node yielded, but did not return a function state in the first working " +"memory." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Return value must be assigned to first element of node working memory! Fix " +"your node please." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Node returned an invalid sequence output: " +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Found sequence bit but not the node in the stack, report bug!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Stack overflow with stack depth: " +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Signal Arguments" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Default Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Input Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Output Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Port Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Port Name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Override an existing built-in function." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new function." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Variables:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new variable." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Signals:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new signal." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name is not a valid identifier:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name already in use by another func/var/signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete input port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Input Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Output Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Expression" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Duplicate VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Preload Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s)" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s) From Tree" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "" +"Can't drop properties because script '%s' is not used in this scene.\n" +"Drop holding 'Shift' to just copy the signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Getter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Setter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Move Node(s)" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Disconnect Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Node Data" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Node Sequence" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Script already has function '%s'" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Input Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Resize Comment" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't copy the function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't create function with a function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't create function of nodes from nodes of multiple functions." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select at least one node with sequence port." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Try to only have one sequence input in selection." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Make Tool:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Members:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Nodes..." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function..." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "function_name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select or create a function to edit its graph." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete Selected" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Find Node Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Copy Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Cut Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Make Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Refresh Graph" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Member" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Input type not iterable: " +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid: " +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base object is not a Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Path does not lead Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name '%s' in node %s." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid argument of type: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid arguments: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableGet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableSet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Custom node has no _step() method, can't process graph." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "" +"Invalid return value from _step(), must be integer (seq out), or string " +"(error)." +msgstr "" + +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Search VisualScript" +msgstr "" + +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Get %s" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Package name is missing." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Package segments must be of non-zero length." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "The character '%s' is not allowed in Android application package names." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "A digit cannot be the first character in a package segment." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "The character '%s' cannot be the first character in a package segment." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "The package must have at least one '.' separator." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Select device from the list" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Running on %s" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Exporting APK..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Uninstalling..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Installing to device, please wait..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not install to device: %s" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Running on device..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not execute on device." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Unable to find the 'apksigner' tool." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Android build template not installed in the project. Install it from the " +"Project menu." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Either Debug Keystore, Debug User AND Debug Password settings must be " +"configured OR none of them." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Debug keystore not configured in the Editor Settings nor in the preset." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Either Release Keystore, Release User AND Release Password settings must be " +"configured OR none of them." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Release keystore incorrectly configured in the export preset." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "A valid Android SDK path is required in Editor Settings." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid Android SDK path in Editor Settings." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Missing 'platform-tools' directory!" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Unable to find Android SDK platform-tools' adb command." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Please check in the Android SDK directory specified in Editor Settings." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Missing 'build-tools' directory!" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Unable to find Android SDK build-tools' apksigner command." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid public key for APK expansion." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid package name:" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " +"project setting (changed in Godot 3.2.2).\n" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Use Custom Build\" must be enabled to use the plugins." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"'apksigner' could not be found.\n" +"Please check the command is available in the Android SDK build-tools " +"directory.\n" +"The resulting %s is unsigned." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Signing debug %s..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Signing release %s..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not find keystore, unable to export." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "'apksigner' returned with error #%d" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Verifying %s..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "'apksigner' verification of %s failed." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Exporting for Android" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid filename! Android App Bundle requires the *.aab extension." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "APK Expansion not compatible with Android App Bundle." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid filename! Android APK requires the *.apk extension." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Unsupported export format!\n" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Trying to build from a custom built template, but no version info for it " +"exists. Please reinstall from the 'Project' menu." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Android build version mismatch:\n" +" Template installed: %s\n" +" Godot Version: %s\n" +"Please reinstall Android build template from 'Project' menu." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Unable to overwrite res://android/build/res/*.xml files with project name" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not export project files to gradle project\n" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not write expansion package file!" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Building Android Project (gradle)" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Building of Android project failed, check output for the error.\n" +"Alternatively visit docs.godotengine.org for Android build documentation." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Moving output" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Unable to copy and rename export file, check gradle project directory for " +"outputs." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Package not found: %s" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Creating APK..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Could not find template APK to export:\n" +"%s" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Missing libraries in the export template for the selected architectures: " +"%s.\n" +"Please build a template with all required libraries, or uncheck the missing " +"architectures in the export preset." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Adding files..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not export project files" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Aligning APK..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not unzip temporary unaligned APK." +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Identifier is missing." +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "The character '%s' is not allowed in Identifier." +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "App Store Team ID not specified - cannot configure the project." +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Invalid Identifier:" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Required icon is not specified in the preset." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Stop HTTP Server" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run in Browser" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run exported HTML in the system's default browser." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not open template for export:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Invalid export template:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not write file:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read file:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read HTML shell:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not create HTTP server directory:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Error starting HTTP server:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Invalid bundle identifier:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: code signing required." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: hardened runtime required." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Apple ID name not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Apple ID password not specified." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package unique name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid product GUID." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid publisher GUID." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid background color." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid Store Logo image dimensions (should be 50x50)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid splash screen image dimensions (should be 620x300)." +msgstr "" + +#: scene/2d/animated_sprite.cpp +msgid "" +"A SpriteFrames resource must be created or set in the \"Frames\" property in " +"order for AnimatedSprite to display frames." +msgstr "" + +#: scene/2d/canvas_modulate.cpp +msgid "" +"Only one visible CanvasModulate is allowed per scene (or set of instanced " +"scenes). The first created one will work, while the rest will be ignored." +msgstr "" + +#: scene/2d/collision_object_2d.cpp +msgid "" +"This node has no shape, so it can't collide or interact with other objects.\n" +"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to " +"define its shape." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"Polygon-based shapes are not meant be used nor edited directly through the " +"CollisionShape2D node. Please use the CollisionPolygon2D node instead." +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp +msgid "" +"CPUParticles2D animation requires the usage of a CanvasItemMaterial with " +"\"Particles Animation\" enabled." +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node A and Node B must be PhysicsBody2Ds" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node A must be a PhysicsBody2D" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node B must be a PhysicsBody2D" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Joint is not connected to two PhysicsBody2Ds" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node A and Node B must be different PhysicsBody2Ds" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the \"Texture\" " +"property." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." +msgstr "" + +#: scene/2d/navigation_polygon.cpp +msgid "" +"A NavigationPolygon resource must be set or created for this node to work. " +"Please set a property or draw a polygon." +msgstr "" + +#: scene/2d/navigation_polygon.cpp +msgid "" +"NavigationPolygonInstance must be a child or grandchild to a Navigation2D " +"node. It only provides navigation data." +msgstr "" + +#: scene/2d/parallax_layer.cpp +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" + +#: scene/2d/particles_2d.cpp +msgid "" +"GPU-based particles are not supported by the GLES2 video driver.\n" +"Use the CPUParticles2D node instead. You can use the \"Convert to " +"CPUParticles\" option for this purpose." +msgstr "" + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" + +#: scene/2d/particles_2d.cpp +msgid "" +"Particles2D animation requires the usage of a CanvasItemMaterial with " +"\"Particles Animation\" enabled." +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "" +"Size changes to RigidBody2D (in character or rigid modes) will be overridden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/2d/remote_transform_2d.cpp +msgid "Path property must point to a valid Node2D node to work." +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "This Bone2D chain should end at a Skeleton2D node." +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node." +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "" +"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one." +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "" +"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " +"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " +"KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "" +"VisibilityEnabler2D works best when used with the edited scene root directly " +"as parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRController must have an ARVROrigin node as its parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The controller ID must not be 0 or this controller won't be bound to an " +"actual controller." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRAnchor must have an ARVROrigin node as its parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The anchor ID must not be 0 or this anchor won't be bound to an actual " +"anchor." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVROrigin requires an ARVRCamera child node." +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Finding meshes and lights" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Preparing geometry (%d/%d)" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Preparing environment" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Generating capture" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Saving lightmaps" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Done" +msgstr "" + +#: scene/3d/collision_object.cpp +msgid "" +"This node has no shape, so it can't collide or interact with other objects.\n" +"Consider adding a CollisionShape or CollisionPolygon as a child to define " +"its shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "" +"CollisionPolygon only serves to provide a collision shape to a " +"CollisionObject derived node. Please only use it as a child of Area, " +"StaticBody, RigidBody, KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"CollisionShape only serves to provide a collision shape to a CollisionObject " +"derived node. Please only use it as a child of Area, StaticBody, RigidBody, " +"KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"Plane shapes don't work well and will be removed in future versions. Please " +"don't use them." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"ConcavePolygonShape doesn't support RigidBody in another mode than static." +msgstr "" + +#: scene/3d/cpu_particles.cpp +msgid "Nothing is visible because no mesh has been assigned." +msgstr "" + +#: scene/3d/cpu_particles.cpp +msgid "" +"CPUParticles animation requires the usage of a SpatialMaterial whose " +"Billboard Mode is set to \"Particle Billboard\"." +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Plotting Meshes" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Finishing Plot" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "" +"GIProbes are not supported by the GLES2 video driver.\n" +"Use a BakedLightmap instead." +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "" +"The GIProbe Compress property has been deprecated due to known bugs and no " +"longer has any effect.\n" +"To remove this warning, disable the GIProbe's Compress property." +msgstr "" + +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "" +"NavigationMeshInstance must be a child or grandchild to a Navigation node. " +"It only provides navigation data." +msgstr "" + +#: scene/3d/occluder.cpp +msgid "No shape is set." +msgstr "" + +#: scene/3d/occluder.cpp +msgid "Only uniform scales are supported." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"GPU-based particles are not supported by the GLES2 video driver.\n" +"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" +"\" option for this purpose." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Nothing is visible because meshes have not been assigned to draw passes." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Particles animation requires the usage of a SpatialMaterial whose Billboard " +"Mode is set to \"Particle Billboard\"." +msgstr "" + +#: scene/3d/path.cpp +msgid "PathFollow only works when set as a child of a Path node." +msgstr "" + +#: scene/3d/path.cpp +msgid "" +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "" +"Size changes to RigidBody (in character or rigid modes) will be overridden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node A and Node B must be PhysicsBodies" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node A must be a PhysicsBody" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node B must be a PhysicsBody" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Joint is not connected to any PhysicsBodies" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node A and Node B must be different PhysicsBodies" +msgstr "" + +#: scene/3d/portal.cpp +msgid "The RoomManager should not be a child or grandchild of a Portal." +msgstr "" + +#: scene/3d/portal.cpp +msgid "A Room should not be a child or grandchild of a Portal." +msgstr "" + +#: scene/3d/portal.cpp +msgid "A RoomGroup should not be a child or grandchild of a Portal." +msgstr "" + +#: scene/3d/remote_transform.cpp +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." +msgstr "" + +#: scene/3d/room.cpp +msgid "A Room cannot have another Room as a child or grandchild." +msgstr "" + +#: scene/3d/room.cpp +msgid "The RoomManager should not be placed inside a Room." +msgstr "" + +#: scene/3d/room.cpp +msgid "A RoomGroup should not be placed inside a Room." +msgstr "" + +#: scene/3d/room.cpp +msgid "" +"Room convex hull contains a large number of planes.\n" +"Consider simplifying the room bound in order to increase performance." +msgstr "" + +#: scene/3d/room_group.cpp +msgid "The RoomManager should not be placed inside a RoomGroup." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "The RoomList has not been assigned." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "The RoomList node should be a Spatial (or derived from Spatial)." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Portal Depth Limit is set to Zero.\n" +"Only the Room that the Camera is in will render." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "There should only be one RoomManager in the SceneTree." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"RoomList path is invalid.\n" +"Please check the RoomList branch has been assigned in the RoomManager." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "RoomList contains no Rooms, aborting." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Misnamed nodes detected, check output log for details. Aborting." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Portal link room not found, check output log for details." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Portal autolink failed, check output log for details.\n" +"Check the portal is facing outwards from the source room." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Room overlap detected, cameras may work incorrectly in overlapping area.\n" +"Check output log for details." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Error calculating room bounds.\n" +"Ensure all rooms contain geometry or manual bounds." +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "This body will be ignored until you set a mesh." +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "" +"Size changes to SoftBody will be overridden by the physics engine when " +"running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/sprite_3d.cpp +msgid "" +"A SpriteFrames resource must be created or set in the \"Frames\" property in " +"order for AnimatedSprite3D to display frames." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "" +"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " +"it as a child of a VehicleBody." +msgstr "" + +#: scene/3d/world_environment.cpp +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" + +#: scene/3d/world_environment.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" + +#: scene/3d/world_environment.cpp +msgid "" +"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set " +"this environment's Background Mode to Canvas (for 2D scenes)." +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "On BlendTree node '%s', animation not found: '%s'" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Animation not found: '%s'" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Anim Apply Reset" +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "In node '%s', invalid animation: '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Invalid animation: '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Nothing connected to input '%s' of node '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "No root AnimationNode for the graph is set." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Path to an AnimationPlayer node containing animations is not set." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "The AnimationPlayer root node is not a valid node." +msgstr "" + +#: scene/animation/animation_tree_player.cpp +msgid "This node has been deprecated. Use AnimationTree instead." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "" +"Color: #%s\n" +"LMB: Set color\n" +"RMB: Remove preset" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Pick a color from the editor window." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "HSV" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Raw" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Switch between hexadecimal and code values." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset." +msgstr "" + +#: scene/gui/container.cpp +msgid "" +"Container by itself serves no purpose unless a script configures its " +"children placement behavior.\n" +"If you don't intend to add a script, use a plain Control node instead." +msgstr "" + +#: scene/gui/control.cpp +msgid "" +"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " +"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Alert!" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Please Confirm..." +msgstr "" + +#: scene/gui/file_dialog.cpp +msgid "Must use a valid extension." +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Enable grid minimap." +msgstr "" + +#: scene/gui/nine_patch_rect.cpp +msgid "" +"The Tile and Tile Fit options for Axis Stretch properties are only effective " +"when using the GLES3 rendering backend.\n" +"The GLES2 backend is currently in use, so these modes will act like Stretch " +"instead." +msgstr "" + +#: scene/gui/popup.cpp +msgid "" +"Popups will hide by default unless you call popup() or any of the popup*() " +"functions. Making them visible for editing is fine, but they will hide upon " +"running." +msgstr "" + +#: scene/gui/range.cpp +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "" +"ScrollContainer is intended to work with a single child control.\n" +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " +"minimum size manually." +msgstr "" + +#: scene/gui/tree.cpp +msgid "(Other)" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "" +"Default Environment as specified in Project Settings (Rendering -> " +"Environment -> Default Environment) could not be loaded." +msgstr "" + +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + +#: scene/main/viewport.cpp +msgid "" +"This viewport is not set as render target. If you intend for it to display " +"its contents directly to the screen, make it a child of a Control so it can " +"obtain a size. Otherwise, make it a RenderTarget and assign its internal " +"texture to some node for display." +msgstr "" + +#: scene/main/viewport.cpp +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." +msgstr "" + +#: scene/resources/occluder_shape.cpp +msgid "OccluderShapeSphere Set Spheres" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "" +"The sampler port is connected but not used. Consider changing the source to " +"'SamplerPort'." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for shader." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Varying may not be assigned in the '%s' function." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "" +"Varyings which assigned in 'vertex' function may not be reassigned in " +"'fragment' or 'light'." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "" +"Varyings which assigned in 'fragment' function may not be reassigned in " +"'vertex' or 'light'." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Fragment-stage varying could not been accessed in custom function!" +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Assignment to function." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Assignment to uniform." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Constants cannot be modified." +msgstr "Hindi maaring maibago ang mga Constant." diff --git a/editor/translations/tr.po b/editor/translations/tr.po index e5a65500d1..6cab155c7e 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -62,12 +62,16 @@ # Cannur Daşkıran <canndask@gmail.com>, 2021. # kahveciderin <kahveciderin@gmail.com>, 2021. # Lucifer25x <umudyt2006@gmail.com>, 2021. +# Kadir Berk Yağar <ykadirberk2@gmail.com>, 2021. +# Aysu Toprak <moonwater99@hotmail.com>, 2021. +# Yusuf Yavuzyigit <yusufyavuzyigit25@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-09-15 00:46+0000\n" -"Last-Translator: Lucifer25x <umudyt2006@gmail.com>\n" +"PO-Revision-Date: 2021-11-18 13:37+0000\n" +"Last-Translator: Yusuf Yavuzyigit <yusufyavuzyigit25@gmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -75,7 +79,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -84,7 +88,7 @@ msgstr "convert() için geçersiz türde argüman, TYPE_* sabitlerini kullanın. #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "1 uzunluğunda bir metin (bir karakter) bekleniyor." +msgstr "1 uzunluğunda bir metin bekleniyor (bir karakter)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -94,11 +98,11 @@ msgstr "Baytları çözümlemek için yetersiz miktarda bayt ya da geçersiz for #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "İfade de geçersiz giriş %i (geçersiz)" +msgstr "İfadede geçersiz giriş %i (geçersiz)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "\"self\" kullanılamaz çünkü \"null\" değerini almış(geçersiz)" +msgstr "self kullanılamaz çünkü örnek boş (geçilmedi)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -126,7 +130,7 @@ msgstr "B" #: core/ustring.cpp msgid "KiB" -msgstr "KB" +msgstr "KiB" #: core/ustring.cpp msgid "MiB" @@ -423,15 +427,13 @@ msgstr "Animasyon Ekle" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "node '%s'" -msgstr "'%s' açılamıyor." +msgstr "'%s' düğümü" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "animation" -msgstr "Animasyon" +msgstr "animasyon" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." @@ -440,9 +442,8 @@ msgstr "" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "property '%s'" -msgstr "'%s' özelliği mevcut değil." +msgstr "'%s' özelliği" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -652,7 +653,6 @@ msgid "Go to Previous Step" msgstr "Önceki Adıma Git" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Apply Reset" msgstr "Sıfırla" @@ -673,9 +673,8 @@ msgid "Use Bezier Curves" msgstr "Bezier Eğrileri Kullan" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Create RESET Track(s)" -msgstr "İzleri Yapıştır" +msgstr "RESET İz(ler)i oluşturun" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -980,7 +979,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "Sinyaller" +msgstr "sinyaller" #: editor/connections_dialog.cpp msgid "Filter signals" @@ -999,7 +998,6 @@ msgid "Edit..." msgstr "Düzenle..." #: editor/connections_dialog.cpp -#, fuzzy msgid "Go to Method" msgstr "Yönteme Git" @@ -1121,18 +1119,16 @@ msgid "Owners Of:" msgstr "Şunların sahipleri:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"Seçilen dosyalar kaldırılsın mı? (geri alınamaz)\n" -"Kaldırılan dosyaları sistemin geri dönüşüm kutusunda bulabilir ve geri " -"yükleyebilirsiniz." +"Seçilen dosyalar projeden kaldırılsın mı? (Geri alınamaz.)\n" +"Sahip olduğunuz dosya sistemine bağlı olarak bu dosyalar sonsuza dek " +"silinebilir ya da geri dönüşüm kutusuna gönderilebilir." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1140,10 +1136,11 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"Diğer kimi dosyaların çalışması için kaldırdığınız dosyalar gerekli " -"görülmekte.\n" -"Yine de kaldırılsın mı? (geri alınamaz)\n" -"Kaldırılan dosyaların sistemin geri dönüşüm kutusunda bulabilirsiniz." +"Kaldırmaya çalıştığınız dosyalar projenin bazı parçalarının çalışması için " +"gerekli görülmekte.\n" +"Yine de kaldırılsın mı? (Geri alınamaz.)\n" +"Sisteminizin dosya sistemine bağlı olarak silmeye çalıştığınız dosyalar " +"kalıcı olarak silinebilir ya da geri dönüşüm kutusuna gönderilebilir." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1215,7 +1212,7 @@ msgstr "Godot topluluğundan teşekkürler!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "Kopyalamak için tıklayın." +msgstr "Kopyalamak için tıkla." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1314,12 +1311,10 @@ msgid "Licenses" msgstr "Lisanslar" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Error opening asset file for \"%s\" (not in ZIP format)." -msgstr "Paket dosyası açılırken hata (ZIP formatında değil)." +msgstr "\"%s\" açılırken hata ile karşılaşıldı (dosya ZIP formatında değil)." #: editor/editor_asset_installer.cpp -#, fuzzy msgid "%s (already exists)" msgstr "%s (Zaten Var)" @@ -1328,7 +1323,6 @@ msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" msgstr "\"%s\" öğesinin içeriği - %d dosya(lar) projenizle çakışıyor:" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Contents of asset \"%s\" - No files conflict with your project:" msgstr "\"%s\" öğesinin içeriği - Projenizle çakışan dosya yok:" @@ -1337,19 +1331,16 @@ msgid "Uncompressing Assets" msgstr "Varlıklar Çıkartılıyor" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "The following files failed extraction from asset \"%s\":" -msgstr "Aşağıdaki dosyaların, çıkından ayıklanma işlemi başarısız oldu:" +msgstr "Aşağıdaki dosyaların \"%s\" kaynağından ayıklanmasında hata oluştu:" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "(and %s more files)" -msgstr "Ve %s kadar dosya daha." +msgstr "(ve %s dosya daha)" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset \"%s\" installed successfully!" -msgstr "Paket Başarı ile Kuruldu!" +msgstr "\"%s\" Başarı ile kuruldu!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -1361,7 +1352,6 @@ msgid "Install" msgstr "Kur" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Asset Installer" msgstr "Paket Yükleyici" @@ -1426,7 +1416,6 @@ msgid "Bypass" msgstr "Baypas" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Bus Options" msgstr "Bus ayarları" @@ -1594,14 +1583,12 @@ msgid "Can't add autoload:" msgstr "Otomatik yükleme eklenemiyor:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "%s is an invalid path. File does not exist." -msgstr "Dosya yok." +msgstr "%s geçerli bir dizin değil. Dosya yok." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "%s is an invalid path. Not in resource path (res://)." -msgstr "%s geçersiz bir yol. Kaynak yolunda değil (res://)." +msgstr "%s geçersiz bir dizin. Kaynak dizinde değil (res://)." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" @@ -1625,9 +1612,8 @@ msgid "Name" msgstr "İsim" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Global Variable" -msgstr "Değişken" +msgstr "Global Değişken" #: editor/editor_data.cpp msgid "Paste Params" @@ -1810,7 +1796,6 @@ msgstr "" "düzenlemeye izin verir." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Provides built-in access to the Asset Library." msgstr "Varlık Kitaplığına yerleşik erişim sağlar." @@ -1819,7 +1804,6 @@ msgid "Allows editing the node hierarchy in the Scene dock." msgstr "Scene dock'ta düğüm hiyerarşisini düzenlemeye izin verir." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Allows to work with signals and groups of the node selected in the Scene " "dock." @@ -1827,33 +1811,29 @@ msgstr "" "Scene dock'ta seçilen düğümün sinyalleri ve gruplarıyla çalışmaya izin verir." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Allows to browse the local file system via a dedicated dock." msgstr "" "Özel bir dock aracılığıyla yerel dosya sistemine göz atılmasına izin verir." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Allows to configure import settings for individual assets. Requires the " "FileSystem dock to function." msgstr "" -"Bireysel varlıklar için içe aktarma ayarlarını yapılandırmaya izin verir. " +"Tekil paketler için içe aktarma ayarlarını yapılandırmaya izin verir. " "Çalışması için FileSystem fonksiyonunu gerektirir." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(current)" -msgstr "(Şuanki)" +msgstr "(Şu anki)" #: editor/editor_feature_profile.cpp msgid "(none)" -msgstr "" +msgstr "(hiç)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Remove currently selected profile, '%s'? Cannot be undone." -msgstr "Seçili olan '%s' profili kaldırılsın mı? (Geri alınamayan.)" +msgstr "Seçili olan '%s' profili kaldırılsın mı? Geri alınamaz." #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -1884,19 +1864,16 @@ msgid "Enable Contextual Editor" msgstr "İçeriksel Düzenleyiciyi Etkinleştir" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Properties:" -msgstr "Özellikler:" +msgstr "Sınıf Özellikleri:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Main Features:" -msgstr "Özellikler" +msgstr "Ana Özellikler:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Nodes and Classes:" -msgstr "Aktif Sınıflar:" +msgstr "Düğümler ve Sınıflar:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." @@ -1914,7 +1891,6 @@ msgid "Error saving profile to path: '%s'." msgstr "Profil '%s' yoluna kaydedilirken hata oluştu." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Reset to Default" msgstr "Varsayılanlara dön" @@ -1923,14 +1899,12 @@ msgid "Current Profile:" msgstr "Şu Anki Profil:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Create Profile" -msgstr "Profili Sil" +msgstr "Profil Oluştur" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Remove Profile" -msgstr "Döşemeyi Kaldır" +msgstr "Profili Kaldır" #: editor/editor_feature_profile.cpp msgid "Available Profiles:" @@ -1950,14 +1924,12 @@ msgid "Export" msgstr "Dışa Aktar" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Configure Selected Profile:" -msgstr "Şu Anki Profil:" +msgstr "Seçilen Profili Yapılandır:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Extra Options:" -msgstr "Doku Seçenekleri" +msgstr "İlave Seçenekler:" #: editor/editor_feature_profile.cpp msgid "Create or import a profile to edit available classes and properties." @@ -1990,7 +1962,6 @@ msgid "Select Current Folder" msgstr "Geçerli Klasörü Seç" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "File exists, overwrite?" msgstr "Dosya var. Üzerine Yazılsın mı?" @@ -2192,7 +2163,7 @@ msgstr "varsayılan:" #: editor/editor_help.cpp msgid "Methods" -msgstr "Metotlar" +msgstr "Metodlar" #: editor/editor_help.cpp msgid "Theme Properties" @@ -2385,7 +2356,6 @@ msgid "New Window" msgstr "Yeni Pencere" #: editor/editor_node.cpp -#, fuzzy msgid "" "Spins when the editor window redraws.\n" "Update Continuously is enabled, which can increase power usage. Click to " @@ -2489,6 +2459,14 @@ msgstr "" "Sahne kaydedilemedi. Anlaşılan bağımlılıklar (örnekler ve kalıtımlar) " "karşılanamadı." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Bir veya birden fazla sahne kaydedilemedi!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Tüm Sahneleri Kaydet" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Açık olan sahnenin üzerine yazılamıyor!" @@ -2625,7 +2603,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Kapatmadan önce değişklikler buraya '%s' kaydedilsin mi?" #: editor/editor_node.cpp -#, fuzzy +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s artık mevcut değil! Lütfen yeni bir kaydetme konumu belirtin." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2634,11 +2615,12 @@ msgstr "" "yine de kaydedildi." #: editor/editor_node.cpp -#, fuzzy msgid "" "A root node is required to save the scene. You can add a root node using the " "Scene tree dock." -msgstr "Sahneyi kaydedilmesi için kök düğüm gerekiyor." +msgstr "" +"Sahneyi kaydedilmesi için kök düğüm gerekiyor. Sahne ağacını kullanarak bir " +"kök düğüm ekleyebilirsin." #: editor/editor_node.cpp msgid "Save Scene As..." @@ -2670,29 +2652,27 @@ msgstr "Var olan sahne kaydedilmedi. Yine de açılsın mı?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Fare düğmelerine basıldığında geri alınamaz." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Geri alınacak bir şey yok." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Geri al" +msgstr "Geri al: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Fare düğmelerine basıldığında yeniden yapılamaz." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Yeniden yapılacak bir şey yok." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Yeniden yap" +msgstr "İleri al: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2772,7 +2752,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "Eklenti için betik alanı şu konumda bulunamıyor: '%s'." +msgstr "Eklentideki betik alanı bulunamıyor: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2976,10 +2956,6 @@ msgid "Save Scene" msgstr "Sahne Kaydet" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Tüm Sahneleri Kaydet" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Şuna Dönüştür..." @@ -3047,9 +3023,8 @@ msgid "Orphan Resource Explorer..." msgstr "Orphan Kaynak Göstericisi..." #: editor/editor_node.cpp -#, fuzzy msgid "Reload Current Project" -msgstr "Projeyi Yeniden Adlandır" +msgstr "Projeyi Tekrar Yükle" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -3210,9 +3185,8 @@ msgid "Help" msgstr "Yardım" #: editor/editor_node.cpp -#, fuzzy msgid "Online Documentation" -msgstr "Klavuzu Aç" +msgstr "Çevrimiçi Dokümanlar" #: editor/editor_node.cpp msgid "Questions & Answers" @@ -3223,9 +3197,8 @@ msgid "Report a Bug" msgstr "Hata Bildir" #: editor/editor_node.cpp -#, fuzzy msgid "Suggest a Feature" -msgstr "Bir Değer Ata" +msgstr "Yeni bir özellik öner" #: editor/editor_node.cpp msgid "Send Docs Feedback" @@ -3236,9 +3209,8 @@ msgid "Community" msgstr "Topluluk" #: editor/editor_node.cpp -#, fuzzy msgid "About Godot" -msgstr "Hakkında" +msgstr "Godot Hakkında" #: editor/editor_node.cpp msgid "Support Godot Development" @@ -3331,14 +3303,12 @@ msgid "Manage Templates" msgstr "Şablonlarını Yönet" #: editor/editor_node.cpp -#, fuzzy msgid "Install from file" msgstr "Dosyadan Kur" #: editor/editor_node.cpp -#, fuzzy msgid "Select android sources file" -msgstr "Bir Kaynak Örüntü Seçin:" +msgstr "Bir android kaynak dosyası seçin" #: editor/editor_node.cpp msgid "" @@ -3387,9 +3357,8 @@ msgid "Merge With Existing" msgstr "Var Olanla Birleştir" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Animasyon Değişikliği Dönüşümü" +msgstr "MeshInstance dönüşümlerini uygula" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3426,7 +3395,6 @@ msgid "Select" msgstr "Seç" #: editor/editor_node.cpp -#, fuzzy msgid "Select Current" msgstr "Geçerli Klasörü Seç" @@ -3463,9 +3431,8 @@ msgid "No sub-resources found." msgstr "Alt kaynağı bulunamadı." #: editor/editor_path.cpp -#, fuzzy msgid "Open a list of sub-resources." -msgstr "Alt kaynağı bulunamadı." +msgstr "Kaynağın alt dizinini liste halinde aç." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -3492,14 +3459,12 @@ msgid "Update" msgstr "Güncelle" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Version" -msgstr "Sürüm:" +msgstr "Sürüm" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Author" -msgstr "Yazarlar" +msgstr "Yaratıcı" #: editor/editor_plugin_settings.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -3512,14 +3477,12 @@ msgid "Measure:" msgstr "Ölçüm:" #: editor/editor_profiler.cpp -#, fuzzy msgid "Frame Time (ms)" -msgstr "Kare Zamanı (sn)" +msgstr "Kare Zamanı (milisaniye)" #: editor/editor_profiler.cpp -#, fuzzy msgid "Average Time (ms)" -msgstr "Ortalama Zaman (sn)" +msgstr "Ortalama Zaman (milisaniye)" #: editor/editor_profiler.cpp msgid "Frame %" @@ -3546,6 +3509,12 @@ msgid "" "functions called by that function.\n" "Use this to find individual functions to optimize." msgstr "" +"Dahili: Bu işlev tarafından çağrılan diğer işlevlerden gelen zamanı içerir.\n" +"Darboğazları tespit etmek için bunu kullanın.\n" +"\n" +"Self: Sadece fonksiyonun kendisinde geçirilen zamanı sayın, o fonksiyon " +"tarafından çağrılan diğer fonksiyonlarda değil.\n" +"Eniyileştirilecek edilecek tekil işlevleri bulmak için bunu kullanın." #: editor/editor_profiler.cpp msgid "Frame #:" @@ -3651,7 +3620,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Hızlı yükleme" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -3672,9 +3641,8 @@ msgid "Paste" msgstr "Yapıştır" #: editor/editor_resource_picker.cpp editor/property_editor.cpp -#, fuzzy msgid "Convert to %s" -msgstr "Şuna Dönüştür %s" +msgstr "%s 'e dönüştür" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New %s" @@ -3723,11 +3691,10 @@ msgid "Did you forget the '_run' method?" msgstr "'_run()' metodunu unuttunuz mu?" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hold %s to round to integers. Hold Shift for more precise changes." msgstr "" -"Tam sayıya yuvarlamak için Ctrl tuşuna basılı tutun. Hassas değişiklikler " -"için Shift tuşuna basılı tutun." +"Tam sayıya yuvarlamak için %s tuşuna basılı tutun. Hassas değişiklikler için " +"Shift tuşuna basılı tutun." #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -3754,14 +3721,12 @@ msgid "Uninstall these templates." msgstr "Bu şablonları kaldırın." #: editor/export_template_manager.cpp -#, fuzzy msgid "There are no mirrors available." -msgstr "'%s' dosyası bulunamadı." +msgstr "Hiç mevcut ayna bulunamadı." #: editor/export_template_manager.cpp -#, fuzzy msgid "Retrieving the mirror list..." -msgstr "Aynalar alınıyor, lütfen bekleyin..." +msgstr "Alternatif kaynak listesi alınıyor..." #: editor/export_template_manager.cpp msgid "Starting the download..." @@ -3772,24 +3737,20 @@ msgid "Error requesting URL:" msgstr "URL isteği hatası:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to the mirror..." -msgstr "Aynaya bağlanılıyor..." +msgstr "Alternatif kaynağa bağlanılıyor..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't resolve the requested address." -msgstr "Ana makine adı çözümlenemedi:" +msgstr "Talep edilen adres çözümlenemedi." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't connect to the mirror." -msgstr "Ana makineye bağlanılamadı:" +msgstr "Ana makineye bağlanılamadı." #: editor/export_template_manager.cpp -#, fuzzy msgid "No response from the mirror." -msgstr "Ana makineden cevap yok:" +msgstr "Ana makineden cevap yok." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3797,17 +3758,14 @@ msgid "Request failed." msgstr "İstek başarısız." #: editor/export_template_manager.cpp -#, fuzzy msgid "Request ended up in a redirect loop." -msgstr "İstem Başarısız, çok fazla yönlendirme" +msgstr "İstek sonsuz bir döngüye dönüştü." #: editor/export_template_manager.cpp -#, fuzzy msgid "Request failed:" -msgstr "İstek başarısız." +msgstr "Talep başarısız oldu:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download complete; extracting templates..." msgstr "İndirme tamamlandı; şablonlar ayıklanıyor..." @@ -3828,14 +3786,14 @@ msgid "Error getting the list of mirrors." msgstr "Kaynaklar listesini alırken hata." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error parsing JSON with the list of mirrors. Please report this issue!" -msgstr "JSON sunucuları listesini alırken hata. Lütfen bu hatayı bildirin!" +msgstr "" +"Sağlanan kaynak listesiyle JSON dosyasını çözümlemeye çalışırken hata ile " +"karşılaşıldı. Lütfen bu hatayı bildirin!" #: editor/export_template_manager.cpp -#, fuzzy msgid "Best available mirror" -msgstr "Mevcut en iyi ayna" +msgstr "Mevcut en iyi alternatif kaynak" #: editor/export_template_manager.cpp msgid "" @@ -3888,24 +3846,20 @@ msgid "SSL Handshake Error" msgstr "SSL El Sıkışma Hatası" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't open the export templates file." -msgstr "Dışa aktarım kalıplarının zipi açılamadı." +msgstr "Dışa aktarım kalıpları dosyası açılamadı." #: editor/export_template_manager.cpp -#, fuzzy msgid "Invalid version.txt format inside the export templates file: %s." -msgstr "Şablonların içinde geçersiz version.txt formatı: %s." +msgstr "Dışa aktarım şablonlarının içinde geçersiz version.txt formatı: %s." #: editor/export_template_manager.cpp -#, fuzzy msgid "No version.txt found inside the export templates file." -msgstr "Şablonların içinde version.txt bulunamadı." +msgstr "Dışa aktarım şablonlarının içinde version.txt bulunamadı." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for extracting templates:" -msgstr "Şablonlar için yol oluşturulurken hata:" +msgstr "Ayıklama şablonları için dizin oluşturulurken hata ile karşılaşıldı:" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" @@ -3916,9 +3870,8 @@ msgid "Importing:" msgstr "İçe Aktarım:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove templates for the version '%s'?" -msgstr "Şablon sürümünü kaldır '%s'?" +msgstr "'%s' sürümü için şablonlar kaldırılsın mı?" #: editor/export_template_manager.cpp msgid "Uncompressing Android Build Sources" @@ -3933,7 +3886,6 @@ msgid "Current Version:" msgstr "Şu Anki Sürüm:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Export templates are missing. Download them or install from a file." msgstr "" "Dışa aktarma şablonları eksik. Bunları indirin veya bir dosyadan yükleyin." @@ -3943,9 +3895,8 @@ msgid "Export templates are installed and ready to be used." msgstr "Dışa aktarma şablonları yüklenir ve kullanıma hazırdır." #: editor/export_template_manager.cpp -#, fuzzy msgid "Open Folder" -msgstr "Dosya Aç" +msgstr "Klasör Aç" #: editor/export_template_manager.cpp msgid "Open the folder containing installed templates for the current version." @@ -3956,24 +3907,20 @@ msgid "Uninstall" msgstr "Kaldır" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall templates for the current version." -msgstr "Sayaç için başlangıç değeri" +msgstr "Güncel sürüm için şablonları kaldır." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download from:" -msgstr "İndirme Hatası" +msgstr "Şuradan indir:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Open in Web Browser" -msgstr "Tarayıcıda Çalıştır" +msgstr "İnternet Tarayıcıda Çalıştır" #: editor/export_template_manager.cpp -#, fuzzy msgid "Copy Mirror URL" -msgstr "Hatayı Kopyala" +msgstr "Alternatif kaynak URL'sini kopyala" #: editor/export_template_manager.cpp msgid "Download and Install" @@ -3993,14 +3940,12 @@ msgstr "" "değildir." #: editor/export_template_manager.cpp -#, fuzzy msgid "Install from File" msgstr "Dosyadan Kur" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install templates from a local file." -msgstr "Şablonları Zip Dosyasından İçeri Aktar" +msgstr "Şablonları yerel bir dosyadan kur." #: editor/export_template_manager.cpp editor/find_in_files.cpp #: editor/progress_dialog.cpp scene/gui/dialogs.cpp @@ -4008,19 +3953,16 @@ msgid "Cancel" msgstr "Vazgeç" #: editor/export_template_manager.cpp -#, fuzzy msgid "Cancel the download of the templates." -msgstr "Dışa aktarım kalıplarının zipi açılamadı." +msgstr "Şablon indirme işlemini iptal et." #: editor/export_template_manager.cpp -#, fuzzy msgid "Other Installed Versions:" msgstr "Yüklü Sürümler:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall Template" -msgstr "Kaldır" +msgstr "Şablonu Kaldır" #: editor/export_template_manager.cpp msgid "Select Template File" @@ -4204,14 +4146,12 @@ msgid "Sort by Type (Descending)" msgstr "Türe Göre Sırala (Artan)" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort by Last Modified" -msgstr "Son Değişiklik" +msgstr "Son Değişiklik Tarihi'ne göre sırala" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort by First Modified" -msgstr "Son Değişiklik" +msgstr "İlk Değişiklik Tarihi'ne göre sırala" #: editor/filesystem_dock.cpp msgid "Duplicate..." @@ -4502,6 +4442,22 @@ msgid "Clear Default for '%s'" msgstr "'%s' İçin Varsayılanı Temizle" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Yeniden İçe Aktar" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Daha uygulanmamış değişiklere sahipsiniz. İçe aktarma seçeneklerinde yapılan " +"değişiklikleri uygulamak için Yeniden İçe Aktar'a tıklayın.\n" +"Önce Yeniden İçe Aktar'ı tıklatmadan Dosya Sisteminden başka bir kaynak " +"seçmek, İçe Aktarma yuvasında yapılan değişiklikleri yok sayacaktır." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Şu Şekilde İçe Aktar:" @@ -4510,10 +4466,6 @@ msgid "Preset" msgstr "Ön ayar" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Yeniden İçe Aktar" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Sahneleri kaydet, tekrar içe aktar ve baştan başlat" @@ -4535,14 +4487,12 @@ msgid "Failed to load resource." msgstr "Kaynak yükleme başarısız oldu." #: editor/inspector_dock.cpp -#, fuzzy msgid "Copy Properties" -msgstr "Özellikler" +msgstr "Özellikleri Kopyala" #: editor/inspector_dock.cpp -#, fuzzy msgid "Paste Properties" -msgstr "Özellikler" +msgstr "Özellikleri Yapıştır" #: editor/inspector_dock.cpp msgid "Make Sub-Resources Unique" @@ -4567,9 +4517,8 @@ msgid "Save As..." msgstr "Farklı Kaydet..." #: editor/inspector_dock.cpp -#, fuzzy msgid "Extra resource options." -msgstr "Kaynak yolunda değil." +msgstr "İlave kaynak ayarları." #: editor/inspector_dock.cpp msgid "Edit Resource from Clipboard" @@ -4580,9 +4529,8 @@ msgid "Copy Resource" msgstr "Kaynağı Tıpkıla" #: editor/inspector_dock.cpp -#, fuzzy msgid "Make Resource Built-In" -msgstr "Gömülü Yap" +msgstr "Kaynağı gömülü hale getir" #: editor/inspector_dock.cpp msgid "Go to the previous edited object in history." @@ -5643,13 +5591,13 @@ msgstr "" "Sahneyi kaydedip tekrar deneyin." #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "" "No meshes to bake. Make sure they contain an UV2 channel and that the 'Use " "In Baked Light' and 'Generate Lightmap' flags are on." msgstr "" -"Pişirilecek örüntüler yok. Örüntülerin UV2 kanalı içerdiğinden ve 'Bake " -"Light' bayrağınının açık olduğundan emin olun." +"Pişirilecek örüntüler yok. Örüntülerin UV2 kanalı içerdiğinden, 'Pişirilmiş " +"Işık Kullan' ve 'Işık Haritası Oluştur' bayrağınının açık olduğundan emin " +"olun." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed creating lightmap images, make sure path is writable." @@ -5791,15 +5739,13 @@ msgstr "CanvasItem \"%s\" öğesini (%d,%d) konumuna taşı" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Seçimi Kilitle" +msgstr "Kilitli" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Öbek" +msgstr "Gruplanmış" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5903,7 +5849,6 @@ msgstr "Çapaları Değiştir" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Project Camera Override\n" "Overrides the running project's camera with the editor viewport camera." @@ -5918,6 +5863,9 @@ msgid "" "No project instance running. Run the project from the editor to use this " "feature." msgstr "" +"Proje Kamera Geçersiz Kılma\n" +"Çalışan proje örneği yok. Bu özelliği kullanmak için projeyi düzenleyiciden " +"çalıştırın." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5985,18 +5933,16 @@ msgstr "Kip Seç" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Drag: Rotate selected node around pivot." -msgstr "Seçilen düğüm ya da geçişi sil." +msgstr "Sürükle: Seçili düğümü pivot etrafında döndürün." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+Drag: Move selected node." msgstr "Alt+Sürükle: Seçili düğümü taşıyın." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "V: Set selected node's pivot position." -msgstr "Seçilen düğüm ya da geçişi sil." +msgstr "V: Seçili düğümün pivot konumunu ayarlayın." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6244,14 +6190,12 @@ msgid "Clear Pose" msgstr "Duruşu Temizle" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Add Node Here" -msgstr "Düğüm Ekle" +msgstr "Buraya Düğüm Ekle" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Instance Scene Here" -msgstr "Sahne(leri) Örnekle" +msgstr "Buraya Sahne Örnekle" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" @@ -6266,53 +6210,44 @@ msgid "Pan View" msgstr "Yatay Kaydırma Görünümü" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 3.125%" msgstr "%3.125'e yakınlaştır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 6.25%" msgstr "%6,25'e yakınlaştır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 12.5%" msgstr "%12,5'e yakınlaştır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 25%" -msgstr "Uzaklaştır" +msgstr "%25'e yakınlaştır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 50%" -msgstr "Uzaklaştır" +msgstr "%50'ye yakınlaştır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 100%" -msgstr "Uzaklaştır" +msgstr "%100'e yakınlaştır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 200%" -msgstr "Uzaklaştır" +msgstr "%200'e yakınlaştır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 400%" -msgstr "Uzaklaştır" +msgstr "%400'e yakınlaştır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 800%" -msgstr "Uzaklaştır" +msgstr "%800'e yakınlaştır" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 1600%" -msgstr "" +msgstr "%1600'e yakınlaştır" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -6442,7 +6377,7 @@ msgstr "Sade 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "Sade 1" +msgstr "Düz 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -6557,9 +6492,8 @@ msgid "Couldn't create a single convex collision shape." msgstr "Tek dışbükey çarpışma şekli oluşturulamadı." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Simplified Convex Shape" -msgstr "Tekil Dışbükey Şekil Oluştur" +msgstr "Basitleştirilmiş Dışbükey Şekil Oluştur" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Single Convex Shape" @@ -6594,9 +6528,8 @@ msgid "No mesh to debug." msgstr "Hata ayıklaöma için örüntü yok." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Mesh has no UV in layer %d." -msgstr "Model bu katmanda UV'ye sahip değil" +msgstr "Model %d katmanında UV'ye sahip değil." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "MeshInstance lacks a Mesh!" @@ -6661,9 +6594,8 @@ msgstr "" "Bu, çarpışma tespiti için en hızlı (ancak en az doğru) seçenektir." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Simplified Convex Collision Sibling" -msgstr "Dışbükey Çarpışma Komşusu Oluştur" +msgstr "Basitleştirilmiş Dışbükey Çarpışma Kardeşi Oluştur" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6680,14 +6612,14 @@ msgid "Create Multiple Convex Collision Siblings" msgstr "Dışbükey Çarpışma Komşuları Oluştur" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "" "Creates a polygon-based collision shape.\n" "This is a performance middle-ground between a single convex collision and a " "polygon-based collision." msgstr "" -"Poligon bazlı bir çarpışma şekli oluştur.\n" -"Bu performans açısından üstteki iki seçeneğin arasındadır." +"Poligon tabanlı bir çarpışma şekli oluştur.\n" +"Bu, tek bir dışbükey çarpışma ile poligon tabanlı bir çarpışma arasındaki " +"performans orta noktasıdır." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." @@ -6754,14 +6686,12 @@ msgid "Remove Selected Item" msgstr "Seçilen Öğeyi Kaldır" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Sahneden İçe Aktar" +msgstr "Sahneden İçe Aktar (Transformları yoksay)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Sahneden İçe Aktar" +msgstr "Sahneden İçe Aktar (Transformları uygula)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7335,34 +7265,28 @@ msgid "ResourcePreloader" msgstr "KaynakÖnyükleyici" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Flip Portals" -msgstr "Yatay Yansıt" +msgstr "Portalları Çevir" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Room Generate Points" -msgstr "Üretilen Nokta Sayısı:" +msgstr "Oda Noktalar Oluştur" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Generate Points" -msgstr "Üretilen Nokta Sayısı:" +msgstr "Noktalar Oluştur" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Flip Portal" -msgstr "Yatay Yansıt" +msgstr "Portalı Çevir" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "Dönüşümü Temizle" +msgstr "Engelleyici Dönüşümü Ayarla" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Düğüm Oluştur" +msgstr "Node'u Ortala" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7498,11 +7422,11 @@ msgid "Move Down" msgstr "Aşağı Taşı" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "Sonraki betik" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "Önceki betik" #: editor/plugins/script_editor_plugin.cpp @@ -7854,26 +7778,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Bu iskelette hiç kemik yok, alt öge olarak Kemik2D düğümleri oluştur." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Kemiklerle dinlenme duruşu Oluştur" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Dinlenme duruşunu Kemiklere ata" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Kemiklerle dinlenme duruşu Oluştur" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "İskelet2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Kemikleri Dinlenme Duruşuna ata" +msgstr "Dinlenme Duruşuna Sıfırla" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Üzerine Yaz" +msgstr "Dinlenme Duruşunun Üstüne Yaz" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7900,69 +7822,62 @@ msgid "Perspective" msgstr "Derinlik" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Dikey" +msgstr "Üst Dikaçılı" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Derinlik" +msgstr "Üst Perspektif" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Dikey" +msgstr "Alt Dikaçılı" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Derinlik" +msgstr "Alt Perspektif" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Dikey" +msgstr "Sol Dikaçılı" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Derinlik" +msgid "Left Perspective" +msgstr "Sol Perspektif" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Dikey" +msgstr "Sağ Dikaçılı" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Sağ Perspektif" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Dikey" +msgstr "Ön Dikaçılı" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Derinlik" +msgstr "Ön Perspektif" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Dikey" +msgstr "Arka Dikaçılı" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Derinlik" +msgstr "Arka Perspektif" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [Oto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [portallar aktif]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8032,9 +7947,8 @@ msgid "Yaw:" msgstr "Sapma:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size:" -msgstr "Boyut: " +msgstr "Boyut:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn:" @@ -8053,16 +7967,14 @@ msgid "Surface Changes:" msgstr "Yüzey Değişiklikleri:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Draw Calls:" -msgstr "Çizim Çağrıları" +msgstr "Çizim Çağrıları:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Vertices:" msgstr "Köşenoktalar:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "FPS: %d (%s ms)" msgstr "Kare hızı: %d (%s ms)" @@ -8199,9 +8111,8 @@ msgid "Freelook Slow Modifier" msgstr "Serbest Bakış Hız Değiştirici" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Camera Preview" -msgstr "Kamera Boyutunu Değiştir" +msgstr "Kamera Görünürlüğünü Değiştir" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Rotation Locked" @@ -8223,9 +8134,8 @@ msgstr "" "Oyun içi performansın gösteri olarak ele alınamaz." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Convert Rooms" -msgstr "Şuna Dönüştür %s" +msgstr "Odaları Dönüştür" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" @@ -8246,9 +8156,8 @@ msgstr "" "Yarı-açık göz: Gizmo aynı zamanda saydam yüzeylerden görünür (\"x-ray\")." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Nodes to Floor" -msgstr "Düğümleri zemine hizala" +msgstr "Düğümleri Zemine Yapıştır" #: editor/plugins/spatial_editor_plugin.cpp msgid "Couldn't find a solid floor to snap the selection to." @@ -8263,7 +8172,6 @@ msgid "Use Snap" msgstr "Yapışma Kullan" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Converts rooms for portal culling." msgstr "Odaları portal ayıklama için dönüştürür." @@ -8292,6 +8200,26 @@ msgid "Right View" msgstr "Sağdan Görünüm" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "Yörünge Görünümü Alt" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "Yörünge Görünümü Sol" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "Yörünge Görünümü Sağ" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "Yörünge Görünümü Yukarı" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "Yörünge Görünümü 180" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Derinlikli / Sığ Görünüme Değiştir" @@ -8361,14 +8289,12 @@ msgid "View Grid" msgstr "Izgara Görünümü" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Portal Culling" -msgstr "Görüntükapısı Ayarları" +msgstr "Portal Ayırmayı Görüntüle" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Görüntükapısı Ayarları" +msgstr "Emilme Ayırmayı Görüntüle" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8436,9 +8362,8 @@ msgid "Post" msgstr "Sonrası" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "Adsız Proje" +msgstr "Adsız Aygıt" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -8698,12 +8623,10 @@ msgid "Fonts" msgstr "Yazı Tipleri" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Icons" -msgstr "Simge" +msgstr "Simgeler" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Styleboxes" msgstr "StilKutusu" @@ -8712,23 +8635,20 @@ msgid "{num} color(s)" msgstr "{num} renk(lar)" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No colors found." -msgstr "Alt kaynağı bulunamadı." +msgstr "Renk bulunamadı." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "{num} constant(s)" -msgstr "Sabitler" +msgstr "{num} Sabitler" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No constants found." -msgstr "Renk Sabiti." +msgstr "Sabitler bulunamadı." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} font(s)" -msgstr "" +msgstr "{num} yazı tipi(leri)" #: editor/plugins/theme_editor_plugin.cpp msgid "No fonts found." @@ -8736,16 +8656,15 @@ msgstr "Yazı tipi bulunamadı." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} icon(s)" -msgstr "" +msgstr "{num} simge(ler)" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No icons found." -msgstr "Bulunamadı!" +msgstr "Simge bulunamadı." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} stylebox(es)" -msgstr "" +msgstr "{num} stil kutusu(lar)" #: editor/plugins/theme_editor_plugin.cpp msgid "No styleboxes found." @@ -8753,48 +8672,43 @@ msgstr "Stil kutusu bulunamadı." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} currently selected" -msgstr "" +msgstr "{num} şuan seçili" #: editor/plugins/theme_editor_plugin.cpp msgid "Nothing was selected for the import." msgstr "İçe aktarma için hiçbir şey seçilmedi." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Importing Theme Items" -msgstr "Kalıbı İçe Aktar" +msgstr "Tema Ögeleri İçe Aktarılıyor" #: editor/plugins/theme_editor_plugin.cpp msgid "Importing items {n}/{n}" -msgstr "" +msgstr "{n}/{n} öğeleri içe aktarılıyor" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Updating the editor" -msgstr "Düzenleyiciden çık?" +msgstr "Editörün güncellenmesi" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Finalizing" msgstr "Çözümleniyor" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Filter:" msgstr "Süzgeç:" #: editor/plugins/theme_editor_plugin.cpp msgid "With Data" -msgstr "" +msgstr "Veri ile" #: editor/plugins/theme_editor_plugin.cpp msgid "Select by data type:" msgstr "Veri türüne göre seçin:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible color items." -msgstr "Önce bir ayar öğesi seçin!" +msgstr "Tüm görünür renk öğelerini seçin." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible color items and their data." @@ -8805,9 +8719,8 @@ msgid "Deselect all visible color items." msgstr "Tüm görünür renk öğelerinin seçimini kaldırın." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible constant items." -msgstr "Önce bir ayar öğesi seçin!" +msgstr "Tüm görünür sabit öğeleri seçin." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible constant items and their data." @@ -8818,9 +8731,8 @@ msgid "Deselect all visible constant items." msgstr "Tüm görünür sabit öğelerin seçimini kaldırın." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible font items." -msgstr "Önce bir ayar öğesi seçin!" +msgstr "Tüm görünür yazı tipi öğelerini seçin." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible font items and their data." @@ -8831,19 +8743,16 @@ msgid "Deselect all visible font items." msgstr "Tüm görünür yazı tipi öğelerinin seçimini kaldırın." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items." -msgstr "Önce bir ayar öğesi seçin!" +msgstr "Tüm görünür simge öğelerini seçin." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items and their data." -msgstr "Önce bir ayar öğesi seçin!" +msgstr "Tüm görünür simge öğelerini ve verilerini seçin." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Deselect all visible icon items." -msgstr "Önce bir ayar öğesi seçin!" +msgstr "Tüm görünür simge öğelerinin seçimini kaldırın." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible stylebox items." @@ -8878,9 +8787,8 @@ msgid "Select all Theme items." msgstr "Şablon Dosyası Seç." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select With Data" -msgstr "Noktaları Seç" +msgstr "Veri ile Seç" #: editor/plugins/theme_editor_plugin.cpp msgid "Select all Theme items with item data." @@ -8895,9 +8803,8 @@ msgid "Deselect all Theme items." msgstr "Tüm Tema öğelerinin seçimini kaldırın." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Import Selected" -msgstr "Sahneyi İçe Aktar" +msgstr "Seçileni İçe Aktar" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -9079,7 +8986,6 @@ msgid "Override Item" msgstr "Öğeyi Geçersiz Kıl" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Unpin this StyleBox as a main style." msgstr "Bu Stil Kutusunun ana stil olarak sabitlemesini kaldırın." @@ -9184,9 +9090,8 @@ msgid "Checked Radio Item" msgstr "Seçili Radyo Ögesi" #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Named Separator" -msgstr "İsimli Ayraç." +msgstr "İsimli Ayraç" #: editor/plugins/theme_editor_preview.cpp msgid "Submenu" @@ -9238,20 +9143,19 @@ msgstr "Var,Çok,Seçenekler" #: editor/plugins/theme_editor_preview.cpp msgid "Invalid path, the PackedScene resource was probably moved or removed." -msgstr "" +msgstr "Geçersiz yol, PackedScene kaynağı muhtemelen taşındı veya kaldırıldı." #: editor/plugins/theme_editor_preview.cpp msgid "Invalid PackedScene resource, must have a Control node at its root." -msgstr "" +msgstr "Geçersiz PackedScene kaynağı, kökünde bir Kontrol düğümü olmalıdır." #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Invalid file, not a PackedScene resource." -msgstr "Geçersiz dosya, bu bir audio bus yerleşim düzeni değil." +msgstr "Geçersiz dosya, bu bir PackedScene kaynağı değil." #: editor/plugins/theme_editor_preview.cpp msgid "Reload the scene to reflect its most actual state." -msgstr "" +msgstr "Sahneyi en gerçek durumunu yansıtacak şekilde yeniden yükleyin." #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" @@ -10649,9 +10553,8 @@ msgid "VisualShader" msgstr "GörselShader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property:" -msgstr "Görsel Niteliği Düzenle" +msgstr "Görsel Niteliği Düzenle:" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" @@ -10777,9 +10680,8 @@ msgid "Script" msgstr "Betik" #: editor/project_export.cpp -#, fuzzy msgid "GDScript Export Mode:" -msgstr "Betik Dışa Aktarım Biçimi:" +msgstr "GDScript Dışa Aktarım Modu:" #: editor/project_export.cpp msgid "Text" @@ -10787,21 +10689,21 @@ msgstr "Yazı" #: editor/project_export.cpp msgid "Compiled Bytecode (Faster Loading)" -msgstr "" +msgstr "Derlenmiş Bayt Kodu (Daha Hızlı Yükleme)" #: editor/project_export.cpp msgid "Encrypted (Provide Key Below)" msgstr "Şifreli (Açarı Aşağıda Belirtin)" #: editor/project_export.cpp -#, fuzzy msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" -msgstr "Geçersiz Şifreleme Anahtarı (64 karakter uzunluğunda olmalı)" +msgstr "" +"Geçersiz Şifreleme Anahtarı (On altılı sayı sisteminde 64 karakter " +"uzunluğunda olmalı)" #: editor/project_export.cpp -#, fuzzy msgid "GDScript Encryption Key (256-bits as hexadecimal):" -msgstr "Betik Şifreleme Açarı (Hex olarak 256-bit):" +msgstr "GDScript Şifreleme Anahtarı (On altılı sayı sisteminde 256-bit):" #: editor/project_export.cpp msgid "Export PCK/Zip" @@ -10873,7 +10775,6 @@ msgid "Imported Project" msgstr "İçe Aktarılan Proje" #: editor/project_manager.cpp -#, fuzzy msgid "Invalid project name." msgstr "Geçersiz Proje Adı." @@ -11098,14 +10999,12 @@ msgid "Are you sure to run %d projects at once?" msgstr "Birden fazla projeyi çalıştırmak istediğinize emin misiniz?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove %d projects from the list?" -msgstr "Listeden aygıt seç" +msgstr "%d proje listeden kaldırılsın mı?" #: editor/project_manager.cpp -#, fuzzy msgid "Remove this project from the list?" -msgstr "Listeden aygıt seç" +msgstr "Bu proje listeden kaldırılsın mı?" #: editor/project_manager.cpp msgid "" @@ -11139,9 +11038,8 @@ msgid "Project Manager" msgstr "Proje Yöneticisi" #: editor/project_manager.cpp -#, fuzzy msgid "Local Projects" -msgstr "Projeler" +msgstr "Yerel Projeler" #: editor/project_manager.cpp msgid "Loading, please wait..." @@ -11152,23 +11050,20 @@ msgid "Last Modified" msgstr "Son Değişiklik" #: editor/project_manager.cpp -#, fuzzy msgid "Edit Project" -msgstr "Projeyi Dışa Aktar" +msgstr "Projjeyi Düzenle" #: editor/project_manager.cpp -#, fuzzy msgid "Run Project" -msgstr "Projeyi Yeniden Adlandır" +msgstr "Projeyi Çalıştır" #: editor/project_manager.cpp msgid "Scan" msgstr "Tara" #: editor/project_manager.cpp -#, fuzzy msgid "Scan Projects" -msgstr "Projeler" +msgstr "Projeleri Tara" #: editor/project_manager.cpp msgid "Select a Folder to Scan" @@ -11179,14 +11074,12 @@ msgid "New Project" msgstr "Yeni Proje" #: editor/project_manager.cpp -#, fuzzy msgid "Import Project" -msgstr "İçe Aktarılan Proje" +msgstr "Projeyi İçe Aktar" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Project" -msgstr "Projeyi Yeniden Adlandır" +msgstr "Projeyi Kaldır" #: editor/project_manager.cpp msgid "Remove Missing" @@ -11197,9 +11090,8 @@ msgid "About" msgstr "Hakkında" #: editor/project_manager.cpp -#, fuzzy msgid "Asset Library Projects" -msgstr "Varlık Kütüphanesi" +msgstr "Kaynak Kütüphanesi Projeleri" #: editor/project_manager.cpp msgid "Restart Now" @@ -11211,7 +11103,7 @@ msgstr "Tümünü Kaldır" #: editor/project_manager.cpp msgid "Also delete project contents (no undo!)" -msgstr "" +msgstr "Ayrıca proje içeriğini silin (geri alma yok!)" #: editor/project_manager.cpp msgid "Can't run project" @@ -11226,28 +11118,26 @@ msgstr "" "Varlık Kütüphanesi'ndeki resmî örnek projeleri incelemek ister misin?" #: editor/project_manager.cpp -#, fuzzy msgid "Filter projects" -msgstr "Özellikleri süz" +msgstr "Projeleri Ayıkla" #: editor/project_manager.cpp -#, fuzzy msgid "" "This field filters projects by name and last path component.\n" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" -"Arama kutusu, projeleri adına ve son yol bileşenine göre filtreler.\n" -"Projeleri adına ve tam yoluna göre filtrelemek için, sorgunun en az bir `/` " -"karakteri içermesi gereklidir." +"Arama kutusu, projeleri adına ve son dizin bileşenine göre filtreler.\n" +"Projeleri adına ve tam dizinine göre filtrelemek için, sorgunun en az bir `/" +"` karakteri içermesi gereklidir." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Anahtar " +msgid "Physical Key" +msgstr "Fiziksel Anahtar" #: editor/project_settings_editor.cpp -msgid "Physical Key" -msgstr "" +msgid "Key " +msgstr "Anahtar " #: editor/project_settings_editor.cpp msgid "Joy Button" @@ -11294,7 +11184,7 @@ msgstr "Aygıt" #: editor/project_settings_editor.cpp msgid " (Physical)" -msgstr "" +msgstr " (Fiziksel)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." @@ -11436,23 +11326,20 @@ msgid "Override for Feature" msgstr "Özelliğin Üzerine Yaz" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Add %d Translations" -msgstr "Çeviri Ekle" +msgstr "%d Çeviri Ekle" #: editor/project_settings_editor.cpp msgid "Remove Translation" msgstr "Çeviriyi Kaldır" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Translation Resource Remap: Add %d Path(s)" -msgstr "Kaynak Yeniden Eşleme Ekle Eşle" +msgstr "Çeviri Kaynağı Yeniden Eşlemesi: %d Yol(lar) Ekle" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Translation Resource Remap: Add %d Remap(s)" -msgstr "Kaynak Yeniden Eşleme Ekle Eşle" +msgstr "Çeviri Kaynağı Yeniden Eşlemesi: %d Yeniden Haritalama Ekle" #: editor/project_settings_editor.cpp msgid "Change Resource Remap Language" @@ -11898,12 +11785,16 @@ msgstr "\"%s\" düğümü silinsin mi?" msgid "" "Saving the branch as a scene requires having a scene open in the editor." msgstr "" +"Dalın sahne olarak kaydedilmesi, düzenleyicide bir sahnenin açık olmasını " +"gerektirir." #: editor/scene_tree_dock.cpp msgid "" "Saving the branch as a scene requires selecting only one node, but you have " "selected %d nodes." msgstr "" +"Dalın sahne olarak kaydedilmesi yalnızca bir düğümün seçilmesini gerektirir, " +"ancak %d düğüm seçtiniz." #: editor/scene_tree_dock.cpp msgid "" @@ -11912,6 +11803,11 @@ msgid "" "FileSystem dock context menu\n" "or create an inherited scene using Scene > New Inherited Scene... instead." msgstr "" +"Kök düğüm dalı, örneklenmiş bir sahne olarak kaydedilemiyor.\n" +"Geçerli sahnenin düzenlenebilir bir kopyasını oluşturmak için, onu " +"FileSystem dock bağlam menüsünü kullanarak çoğaltın\n" +"veya bunun yerine Sahne > Yeni Devralınan Sahne...'yi kullanarak devralınan " +"bir sahne oluşturun." #: editor/scene_tree_dock.cpp msgid "" @@ -11919,6 +11815,10 @@ msgid "" "To create a variation of a scene, you can make an inherited scene based on " "the instanced scene using Scene > New Inherited Scene... instead." msgstr "" +"Halihazırda örneklenmiş bir sahnenin dalı kaydedilemez.\n" +"Bir sahnenin varyasyonunu oluşturmak için, bunun yerine Sahne > Yeni " +"Devralınan Sahne... seçeneğini kullanarak örneklenen sahneye dayalı olarak " +"devralınan bir sahne oluşturabilirsiniz." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -12103,9 +12003,9 @@ msgid "" "every time it updates.\n" "Switch back to the Local scene tree dock to improve performance." msgstr "" -"Seçilirse, Uzak sahne ağacı yuvası, projenin her güncellendiğinde " -"takılmasına neden olur.\n" -"Performansı artırmak için Yerel sahne ağaç yuvasına geri dönün." +"Seçilirse, Uzak sahne ağacı dok-u projenin her güncelleme anında takılmasına " +"neden olur.\n" +"Performansı artırmak için Yerel sahne ağacı dok-una geri dönün." #: editor/scene_tree_dock.cpp msgid "Local" @@ -12324,6 +12224,7 @@ msgid "" "Warning: Having the script name be the same as a built-in type is usually " "not desired." msgstr "" +"Uyarı: Komut dosyası adının yerleşik türle aynı olması genellikle istenmez." #: editor/script_create_dialog.cpp msgid "Class Name:" @@ -12395,7 +12296,7 @@ msgstr "Hatayı Kopyala" #: editor/script_editor_debugger.cpp msgid "Open C++ Source on GitHub" -msgstr "" +msgstr "GitHub'da C++ Kaynağını Açın" #: editor/script_editor_debugger.cpp msgid "Video RAM" @@ -12574,24 +12475,20 @@ msgid "Change Ray Shape Length" msgstr "Işın Şeklinin Uzunluğunu Değiştir" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Room Point Position" -msgstr "Eğri Noktası Konumu Ayarla" +msgstr "Oda Noktası Konumunu Ayarla" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Portal Point Position" -msgstr "Eğri Noktası Konumu Ayarla" +msgstr "Portal Noktası Konumunu Ayarla" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Silindir Şekli Yarıçapını Değiştir" +msgstr "Engelleyici Silindir Yarıçapını Ayarla" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "Eğriyi Konumda Ayarla" +msgstr "Engelleyici Küre Konumunu Ayarla" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12702,14 +12599,12 @@ msgid "Object can't provide a length." msgstr "Nesne bir uzunluk sağlayamaz." #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp -#, fuzzy msgid "Export Mesh GLTF2" -msgstr "Örüntü Kütüphanesini Dışa Aktar" +msgstr "Örüntüyü GLTF2 Olarak Dışa Aktar" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp -#, fuzzy msgid "Export GLTF..." -msgstr "Dışa Aktar..." +msgstr "GLTF Dışa Aktar..." #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -12752,9 +12647,8 @@ msgid "GridMap Paint" msgstr "IzgaraHaritası Boyama" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Selection" -msgstr "IzgaraHaritası Seçimi Doldur" +msgstr "GridMap Seçimi" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" @@ -12877,9 +12771,8 @@ msgid "Class name can't be a reserved keyword" msgstr "Sınıf ismi ayrılmış anahtar kelime olamaz" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Seçimi Doldur" +msgstr "Solüsyonu İnşa Et" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -13010,14 +12903,12 @@ msgid "Add Output Port" msgstr "Çıkış Portu Ekle" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Port Type" -msgstr "Türü Değiştir" +msgstr "Bağlantı Noktası Türünü Değiştir" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Port Name" -msgstr "Giriş noktası adını değiştir" +msgstr "Bağlantı Noktası Adını Değiştir" #: modules/visual_script/visual_script_editor.cpp msgid "Override an existing built-in function." @@ -13132,9 +13023,8 @@ msgid "Add Preload Node" msgstr "Önyüklenen Düğüm Ekle" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Node(s)" -msgstr "Düğüm Ekle" +msgstr "Düğüm(ler) Ekle" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -13395,37 +13285,31 @@ msgstr "Listeden aygıt seç" #: platform/android/export/export_plugin.cpp msgid "Running on %s" -msgstr "" +msgstr "%s üzerinde çalışıyor" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exporting APK..." -msgstr "Tümünü Dışa Aktarma" +msgstr "APK dışarı aktarılıyor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Uninstalling..." -msgstr "Kaldır" +msgstr "Kaldırılıyor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Installing to device, please wait..." -msgstr "Yükleniyor, lütfen bekleyin..." +msgstr "Cihaza yükleniyor, lütfen bekleyin..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not install to device: %s" -msgstr "Sahne Örneklenemedi!" +msgstr "Cihaza yüklenemedi: %s" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Running on device..." -msgstr "Çalışan Özel Betik..." +msgstr "Cihazda çalışıyor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not execute on device." -msgstr "Klasör oluşturulamadı." +msgstr "Cihazda yürütülemedi." #: platform/android/export/export_plugin.cpp msgid "Unable to find the 'apksigner' tool." @@ -13444,7 +13328,7 @@ msgid "" "configured OR none of them." msgstr "" "Hata Ayıklama Anahtar Deposu, Hata Ayıklama Kullanıcısı VE Hata Ayıklama " -"Şifresi konfigüre edilmelidir VEYA hiçbiri konfigüre edilmemelidir." +"Şifresi konfigüre edilmeli VEYA hiçbiri konfigüre edilmemelidir." #: platform/android/export/export_plugin.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -13536,40 +13420,38 @@ msgid "" "directory.\n" "The resulting %s is unsigned." msgstr "" +"'apksigner' bulunamadı.\n" +"Lütfen komutun Android SDK build-tools dizininde bulunup bulunmadığını " +"kontrol edin.\n" +"Elde edilen %s imzasız." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." -msgstr "" +msgstr "%s hata ayıklaması imzalanıyor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signing release %s..." -msgstr "" -"Dosyalar Taranıyor,\n" -"Lütfen Bekleyiniz..." +msgstr "%s sürümü imzalanıyor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find keystore, unable to export." -msgstr "Dışa aktarma için şablon açılamadı:" +msgstr "Anahtar deposu bulunamadı, dışa aktarılamadı." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" -msgstr "" +msgstr "'apksigner', #%d hatasıyla döndürüldü" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Verifying %s..." -msgstr "Ekliyor %s..." +msgstr "Doğrulanıyor %s..." #: platform/android/export/export_plugin.cpp msgid "'apksigner' verification of %s failed." -msgstr "" +msgstr "%s için 'apksigner' doğrulaması başarısız oldu." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exporting for Android" -msgstr "Tümünü Dışa Aktarma" +msgstr "Android için dışa aktarılıyor" #: platform/android/export/export_plugin.cpp msgid "Invalid filename! Android App Bundle requires the *.aab extension." @@ -13585,7 +13467,7 @@ msgstr "Geçersiz dosya adı! Android APK, * .apk uzantısını gerektirir." #: platform/android/export/export_plugin.cpp msgid "Unsupported export format!\n" -msgstr "" +msgstr "Desteklenmeyen dışa aktarma biçimi!\n" #: platform/android/export/export_plugin.cpp msgid "" @@ -13611,16 +13493,15 @@ msgstr "" msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name" msgstr "" +"Proje adıyla res://android/build/res/*.xml dosyalarının üzerine yazılamıyor" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project\n" -msgstr "Proje yolunda proje.godot alınamadı." +msgstr "Proje dosyaları gradle projesine aktarılamadı\n" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not write expansion package file!" -msgstr "Dosya yazılamadı:" +msgstr "Genişletme paketi dosyası yazılamadı!" #: platform/android/export/export_plugin.cpp msgid "Building Android Project (gradle)" @@ -13649,21 +13530,20 @@ msgstr "" "için gradle proje dizinini kontrol edin." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: %s" -msgstr "Animasyon bulunamadı: '%s'" +msgstr "Paket bulunamadı: %s" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Creating APK..." -msgstr "Konturlar oluşturuluyor..." +msgstr "APK oluşturuluyor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Could not find template APK to export:\n" "%s" -msgstr "Dışa aktarma için şablon açılamadı:" +msgstr "" +"Dışa aktarılacak şablon APK bulunamadı:\n" +"%s" #: platform/android/export/export_plugin.cpp msgid "" @@ -13672,16 +13552,17 @@ msgid "" "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" +"Seçili mimariler için dışa aktarma şablonunda eksik kitaplıklar: %s.\n" +"Lütfen tüm gerekli kitaplıkları içeren bir şablon oluşturun veya dışa " +"aktarma ön ayarındaki eksik mimarilerin işaretini kaldırın." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Adding files..." -msgstr "Ekliyor %s..." +msgstr "Dosyalar ekleniyor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files" -msgstr "Dosya yazılamadı:" +msgstr "Proje dosyaları dışa aktarılamadı" #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -13689,7 +13570,7 @@ msgstr "APK hizalanıyor ..." #: platform/android/export/export_plugin.cpp msgid "Could not unzip temporary unaligned APK." -msgstr "" +msgstr "Geçici olarak hizalanmamış APK'nın sıkıştırması açılamadı." #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Identifier is missing." @@ -13736,45 +13617,40 @@ msgid "Could not write file:" msgstr "Dosya yazılamadı:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file:" -msgstr "Dosya yazılamadı:" +msgstr "Dosya okunamadı:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell:" -msgstr "Özel HTML çekirdeği okunamadı:" +msgstr "HTML kabuğu okunamadı:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory:" -msgstr "Klasör oluşturulamadı." +msgstr "HTTP sunucu klasörü oluşturulamadı:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server:" -msgstr "Sahne kaydedilirken hata." +msgstr "HTTP sunucusu başlatılırken hata:" #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid bundle identifier:" -msgstr "Geçersiz Tanımlayıcı:" +msgstr "Geçersiz paket tanımlayıcısı:" #: platform/osx/export/export.cpp msgid "Notarization: code signing required." -msgstr "" +msgstr "Noter tasdiki: kod imzalama gerekli." #: platform/osx/export/export.cpp msgid "Notarization: hardened runtime required." -msgstr "" +msgstr "Noter onayı: sertleştirilmiş çalışma zamanı gerekli." #: platform/osx/export/export.cpp msgid "Notarization: Apple ID name not specified." -msgstr "" +msgstr "Noter tasdik: Apple Kimliği adı belirtilmedi." #: platform/osx/export/export.cpp msgid "Notarization: Apple ID password not specified." -msgstr "" +msgstr "Noter tasdik: Apple Kimliği parolası belirtilmedi." #: platform/uwp/export/export.cpp msgid "Invalid package short name." @@ -14205,6 +14081,10 @@ msgid "" "longer has any effect.\n" "To remove this warning, disable the GIProbe's Compress property." msgstr "" +"GIProbe Sıkıştırma özelliği, bilinen hatalar nedeniyle kullanımdan " +"kaldırılmıştır ve artık herhangi bir etkisi yoktur.\n" +"Bu uyarıyı kaldırmak için GIProbe'un Sıkıştırma özelliğini devre dışı " +"bırakın." #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." @@ -14226,11 +14106,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "Hiçbir şekil ayarlanmadı." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Yalnızca tek tip ölçekler desteklenir." #: scene/3d/particles.cpp msgid "" @@ -14301,15 +14181,15 @@ msgstr "Düğüm A ve Düğüm B, farklı PhysicsBody olmalıdır" #: scene/3d/portal.cpp msgid "The RoomManager should not be a child or grandchild of a Portal." -msgstr "" +msgstr "RoomManager, bir Portal'ın çocuğu veya torunu olmamalıdır." #: scene/3d/portal.cpp msgid "A Room should not be a child or grandchild of a Portal." -msgstr "" +msgstr "Bir Oda, bir Portal'ın çocuğu veya torunu olmamalıdır." #: scene/3d/portal.cpp msgid "A RoomGroup should not be a child or grandchild of a Portal." -msgstr "" +msgstr "Bir RoomGroup, bir Portal'ın çocuğu veya torunu olmamalıdır." #: scene/3d/remote_transform.cpp msgid "" @@ -14321,79 +14201,96 @@ msgstr "" #: scene/3d/room.cpp msgid "A Room cannot have another Room as a child or grandchild." -msgstr "" +msgstr "Bir Oda'nın çocuk veya torun olarak başka bir Odası olamaz." #: scene/3d/room.cpp msgid "The RoomManager should not be placed inside a Room." -msgstr "" +msgstr "RoomManager bir Odanın içine yerleştirilmemelidir." #: scene/3d/room.cpp msgid "A RoomGroup should not be placed inside a Room." -msgstr "" +msgstr "Bir Oda Grubu, bir Odanın içine yerleştirilmemelidir." #: scene/3d/room.cpp msgid "" "Room convex hull contains a large number of planes.\n" "Consider simplifying the room bound in order to increase performance." msgstr "" +"Oda dışbükey gövde, çok sayıda uçak içerir.\n" +"Performansı artırmak için oda sınırını basitleştirmeyi düşünün." #: scene/3d/room_group.cpp msgid "The RoomManager should not be placed inside a RoomGroup." -msgstr "" +msgstr "RoomManager, bir RoomGroup içine yerleştirilmemelidir." #: scene/3d/room_manager.cpp msgid "The RoomList has not been assigned." -msgstr "" +msgstr "RoomList atanmadı." #: scene/3d/room_manager.cpp msgid "The RoomList node should be a Spatial (or derived from Spatial)." -msgstr "" +msgstr "RoomList düğümü bir Uzamsal (veya Uzamsal'dan türetilmiş) olmalıdır." #: scene/3d/room_manager.cpp msgid "" "Portal Depth Limit is set to Zero.\n" "Only the Room that the Camera is in will render." msgstr "" +"Portal Derinlik Sınırı Sıfır olarak ayarlanmıştır.\n" +"Yalnızca Kameranın bulunduğu Oda görüntülenecektir." #: scene/3d/room_manager.cpp msgid "There should only be one RoomManager in the SceneTree." -msgstr "" +msgstr "SceneTree'de yalnızca bir RoomManager olmalıdır." #: scene/3d/room_manager.cpp msgid "" "RoomList path is invalid.\n" "Please check the RoomList branch has been assigned in the RoomManager." msgstr "" +"RoomList yolu geçersiz.\n" +"Lütfen RoomManager'da RoomList şubesinin atandığını kontrol edin." #: scene/3d/room_manager.cpp msgid "RoomList contains no Rooms, aborting." -msgstr "" +msgstr "RoomList hiç Oda içermiyor, iptal ediliyor." #: scene/3d/room_manager.cpp msgid "Misnamed nodes detected, check output log for details. Aborting." msgstr "" +"Yanlış adlandırılmış düğümler algılandı, ayrıntılar için çıktı günlüğünü " +"kontrol edin. İptal ediliyor." #: scene/3d/room_manager.cpp msgid "Portal link room not found, check output log for details." msgstr "" +"Portal bağlantı odası bulunamadı, ayrıntılar için çıktı günlüğünü kontrol " +"edin." #: scene/3d/room_manager.cpp msgid "" "Portal autolink failed, check output log for details.\n" "Check the portal is facing outwards from the source room." msgstr "" +"Portal otomatik bağlantısı başarısız oldu, ayrıntılar için çıktı günlüğünü " +"kontrol edin.\n" +"Portalın kaynak odadan dışa doğru baktığını kontrol edin." #: scene/3d/room_manager.cpp msgid "" "Room overlap detected, cameras may work incorrectly in overlapping area.\n" "Check output log for details." msgstr "" +"Oda çakışması algılandı, kameralar çakışan alanda hatalı çalışabilir.\n" +"Ayrıntılar için çıktı günlüğünü kontrol edin." #: scene/3d/room_manager.cpp msgid "" "Error calculating room bounds.\n" "Ensure all rooms contain geometry or manual bounds." msgstr "" +"Oda sınırları hesaplanırken hata oluştu.\n" +"Tüm odaların geometri veya manuel sınırlar içerdiğinden emin olun." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -14458,7 +14355,7 @@ msgstr "Animasyon bulunamadı: '%s'" #: scene/animation/animation_player.cpp msgid "Anim Apply Reset" -msgstr "" +msgstr "Animasyon Sıfırlamayı Uygula" #: scene/animation/animation_tree.cpp msgid "In node '%s', invalid animation: '%s'." @@ -14567,6 +14464,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Eksen Uzatma özellikleri için Döşeme ve Döşeme Sığdırma seçenekleri yalnızca " +"GLES3 işleme arka ucunu kullanırken etkilidir.\n" +"GLES2 arka ucu şu anda kullanımda olduğundan, bu modlar bunun yerine Stretch " +"gibi davranacaktır." #: scene/gui/popup.cpp msgid "" @@ -14604,6 +14505,18 @@ msgstr "" "Proje Ayarlarında tanımlanmış Varsayılan Ortam (İşleme -> Görüntükapısı -> " "Varsayılan Ortam) yüklenemedi." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"Çok düşük zamanlayıcı bekleme süreleri (< 0.05 saniye) kare hızına bağlı " +"olarak, olması gerekenden farklı çalışabilir.\n" +"Çok düşük bekleme süreleri için Timer'a güvenmektense, bir betiğin process " +"döngüsünü kullanmayı tercih edin." + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14617,13 +14530,16 @@ msgstr "" "bir RenderTarget yap ve dahili dokusunu herhangi bir düğüme ata." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" -"Herhangi bir şeyi işlemek için görüntükapısı boyutu 0'dan büyük olmalıdır." +"Herhangi bir şeyi işlemek için her iki boyutta da görüntükapısı boyutu 2 " +"pikselden büyük ya da buna eşit olmalıdır." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "OccluderShapeSphere Küre Kümeleri" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -14646,25 +14562,27 @@ msgid "Invalid comparison function for that type." msgstr "Bu tür için geçersiz karşılaştırma işlevi." #: servers/visual/shader_language.cpp -#, fuzzy msgid "Varying may not be assigned in the '%s' function." -msgstr "varyings yalnızca vertex işlevinde atanabilir." +msgstr "'%s' işlevinde farklılıklar atanamayabilir." #: servers/visual/shader_language.cpp msgid "" "Varyings which assigned in 'vertex' function may not be reassigned in " "'fragment' or 'light'." msgstr "" +"'Köşe' işlevinde atanan varyasyonlar, 'parça' veya 'ışık' olarak yeniden " +"atanamaz." #: servers/visual/shader_language.cpp msgid "" "Varyings which assigned in 'fragment' function may not be reassigned in " "'vertex' or 'light'." msgstr "" +"'Parça' işlevinde atanan varyasyonlar, 'köşe' veya 'ışık'ta yeniden atanamaz." #: servers/visual/shader_language.cpp msgid "Fragment-stage varying could not been accessed in custom function!" -msgstr "" +msgstr "Özel işlevde parça aşaması değişikliğine erişilemedi!" #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -16283,9 +16201,6 @@ msgstr "Sabit değerler değiştirilemez." #~ msgid "Couldn't save atlas image:" #~ msgstr "Atlas bedizi kaydedilemedi:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "Dönüştürülmüş doku kaydedilemedi:" - #~ msgid "Invalid translation source!" #~ msgstr "Geçersiz çeviri kaynağı!" diff --git a/editor/translations/tt.po b/editor/translations/tt.po index b169cafdc7..b9631ca8b4 100644 --- a/editor/translations/tt.po +++ b/editor/translations/tt.po @@ -7,6 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2021-06-07 23:43+0000\n" "Last-Translator: Bualma Show <appleaidar6@gmail.com>\n" "Language-Team: Tatar <https://hosted.weblate.org/projects/godot-engine/godot/" @@ -2321,6 +2322,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2437,6 +2446,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2756,10 +2769,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4159,15 +4168,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7048,11 +7065,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7398,11 +7415,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7462,7 +7479,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7470,6 +7487,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7807,6 +7828,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10552,11 +10593,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13664,6 +13705,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13673,7 +13722,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/tzm.po b/editor/translations/tzm.po index b0d9d05525..b75bb26463 100644 --- a/editor/translations/tzm.po +++ b/editor/translations/tzm.po @@ -7,6 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "PO-Revision-Date: 2020-10-18 14:21+0000\n" "Last-Translator: Hakim Oubouali <hakim.oubouali.skr@gmail.com>\n" "Language-Team: Central Atlas Tamazight <https://hosted.weblate.org/projects/" @@ -2319,6 +2320,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2435,6 +2444,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2754,10 +2767,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4157,15 +4166,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7046,11 +7063,11 @@ msgid "Move Down" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -7396,11 +7413,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7460,7 +7477,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7468,6 +7485,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -7805,6 +7826,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10550,11 +10591,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -13662,6 +13703,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -13671,7 +13720,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/uk.po b/editor/translations/uk.po index fd9f2a1b8a..401f0fa006 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -20,8 +20,9 @@ msgid "" msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-08-12 21:32+0000\n" +"PO-Revision-Date: 2021-10-18 15:35+0000\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" @@ -31,7 +32,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2424,6 +2425,14 @@ msgstr "" "Не вдалося зберегти сцену. Вірогідно, залежності (екземпляри або " "успадковані) не задоволені." +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "Не вдалося зберегти одну або декілька сцен!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Зберегти всі сцени" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Неможливо перезаписати сцену, яка є ще відкритою!" @@ -2560,6 +2569,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Зберегти зміни, внесені до '%s' перед закриттям?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "%s вже не існує! Будь ласка, вкажіть нове місце для збереження." + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2605,29 +2618,27 @@ msgstr "Поточна сцена не збережена. Відкрити в #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "Скасування неможливе, доки натиснуто кнопки миші." #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Нічого скасовувати." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Скасувати" +msgstr "Скасувати: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Повторення дій неможливе, доки натиснуто кнопки миші." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Нічого повторювати." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "Повернути" +msgstr "Повторити: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2914,10 +2925,6 @@ msgid "Save Scene" msgstr "Зберегти сцену" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Зберегти всі сцени" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Перетворити на..." @@ -3319,9 +3326,8 @@ msgid "Merge With Existing" msgstr "Об'єднати з існуючим" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Змінити перетворення" +msgstr "Змінити перетворення екземпляра сітки" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3583,7 +3589,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Швидке завантаження" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -4404,6 +4410,23 @@ msgid "Clear Default for '%s'" msgstr "Очистити типове для '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Переімпортувати" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"Внесені вами зміни ще не застосовано. Натисніть кнопку «Імпортувати " +"повторно», щоб застосувати зміни у параметрах імпортування.\n" +"Вибір іншого ресурсу на бічній панелі файлової системи без натискання кнопки " +"«Імпортувати повторно» призведе до відкидання змін, які було внесено на " +"бічній панелі імпортування." + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Імпортувати як:" @@ -4412,10 +4435,6 @@ msgid "Preset" msgstr "Набір" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Переімпортувати" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Зберегти сцени, повторно імпортувати і перезапустити" @@ -5696,15 +5715,13 @@ msgstr "Пересунути CanvasItem «%s» до (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "Заблокувати позначене" +msgstr "Заблоковано" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Групи" +msgstr "Згруповано" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6647,14 +6664,12 @@ msgid "Remove Selected Item" msgstr "Вилучити вибраний елемент" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Імпортувати зі сцени" +msgstr "Імпортувати зі сцени (ігнорувати перетворення)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Імпортувати зі сцени" +msgstr "Імпортувати зі сцени (застосувати перетворення)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7246,14 +7261,12 @@ msgid "Flip Portal" msgstr "Віддзеркалити портал" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "Зняти перетворення" +msgstr "Перетворення набору закупорювача" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Створити вузол" +msgstr "Центрувати вузол" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7391,11 +7404,11 @@ msgid "Move Down" msgstr "Перемістити вниз" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "Наступний скрипт" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "Попередній скрипт" #: editor/plugins/script_editor_plugin.cpp @@ -7749,26 +7762,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "У цього каркаса немає кісток, створіть хоч якісь дочірні вузли Bone2D." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Створити вільну позу з кісток" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Створити вільну позу для кісток" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Створити вільну позу з кісток" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Плоский каркас" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Встановити кістки для вільної пози" +msgstr "Відновити вільну позу" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "Перезаписати" +msgstr "Перезаписати вільну позу" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7795,69 +7806,62 @@ msgid "Perspective" msgstr "Перспектива" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "Ортогонально" +msgstr "Верхній ортогональний" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "Перспектива" +msgstr "Верхній перспективний" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "Ортогонально" +msgstr "Нижній ортогональний" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "Перспектива" +msgstr "Нижній перспективний" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "Ортогонально" +msgstr "Лівий ортогональний" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "Перспектива" +msgid "Left Perspective" +msgstr "Ліва перспектива" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "Ортогонально" +msgstr "Правий ортогональний" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "Правий перспективний" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "Ортогонально" +msgstr "Передній ортогональний" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "Перспектива" +msgstr "Передній перспективний" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "Ортогонально" +msgstr "Задній ортогональний" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "Перспектива" +msgstr "Задній перспективний" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [авто]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [портали активні]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8181,6 +8185,26 @@ msgid "Right View" msgstr "Вигляд справа" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "Орбітальний вид вниз" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "Орбітальний вид ліворуч" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "Орбітальний вид праворуч" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "Орбітальний вид згори" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "Орбітальний вид 180" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "Перемкнути перегляд перспективи/ортогональний перегляд" @@ -8254,9 +8278,8 @@ msgid "View Portal Culling" msgstr "Переглянути відбраковування Portal" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "Переглянути відбраковування Portal" +msgstr "Переглянути відбраковування замикання" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8324,9 +8347,8 @@ msgid "Post" msgstr "Після" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "Проєкт без назви" +msgstr "Гаджет без назви" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -11109,14 +11131,14 @@ msgstr "" "бути принаймні один символ «/»." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Клавіша " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "Фізична клавіша" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Клавіша " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "Кнопка джойстика" @@ -12465,14 +12487,12 @@ msgid "Set Portal Point Position" msgstr "Задати положення точки порталу" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Змінити радіус форми циліндра" +msgstr "Змінити радіус сфери закупорювання" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "Встановити криву в позиції" +msgstr "Встановити позицію сфери закупорювання" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12758,9 +12778,8 @@ msgid "Class name can't be a reserved keyword" msgstr "Назвою класу не може бути зарезервоване ключове слово" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "Заповнити позначене" +msgstr "Зібрати рішення" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -14119,11 +14138,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "Форму не встановлено." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "Передбачено підтримку лише однорідних масштабів." #: scene/3d/particles.cpp msgid "" @@ -14486,6 +14505,10 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Варіанти «Плитка» і «За плиткою» для властивостей розтягування вісі працюють " +"лише при використанні модуля обробки даних GLES3.\n" +"Зараз використано модуль обробки GLES2, тому ці режими працюватимуть просто " +"як «Розтягнути»." #: scene/gui/popup.cpp msgid "" @@ -14524,6 +14547,19 @@ msgstr "" "Не вдалося завантажити типове середовище, як його визначено у параметрах " "проєкту (Обробка -> Середовище -> Типове середовище)." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"Дуже малі проміжки часу очікування за таймером (< 0.05 секунд) можуть " +"призводити до суттєво різних результатів для різних оброблених або фізичних " +"частот кадрів.\n" +"Вам варто скористатися циклом процесу скрипту замість Timer для дуже малих " +"проміжків очікування." + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14537,14 +14573,16 @@ msgstr "" "пов'язати її внутрішню текстуру з одним із вузлів для показу." #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" "Щоб програма могла хоч щось показати, розмір поля перегляду має бути більшим " -"за 0." +"або рівним 2 пікселям в обох вимірах." #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "Сфери набору OccluderShapeSphere" #: scene/resources/visual_shader_nodes.cpp msgid "" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index 332f5bd681..c557fa7dfc 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -8,6 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2018-12-13 14:44+0100\n" "Last-Translator: Muhammad Ali <ali@codeonion.com>\n" @@ -2372,6 +2373,14 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2488,6 +2497,10 @@ msgid "Save changes to '%s' before closing?" msgstr "" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2812,10 +2825,6 @@ msgid "Save Scene" msgstr "" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "" @@ -4250,15 +4259,23 @@ msgid "Clear Default for '%s'" msgstr "" #: editor/import_dock.cpp -msgid "Import As:" +msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Preset" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." msgstr "" #: editor/import_dock.cpp -msgid "Reimport" +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Preset" msgstr "" #: editor/import_dock.cpp @@ -7228,12 +7245,13 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp #, fuzzy -msgid "Next script" +msgid "Next Script" msgstr "سب سکریپشن بنائیں" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "سب سکریپشن بنائیں" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7586,11 +7604,11 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" +msgid "Set Rest Pose to Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" +msgid "Create Rest Pose from Bones" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp @@ -7652,7 +7670,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -7660,6 +7678,10 @@ msgid "Right Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8004,6 +8026,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -10868,11 +10910,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14057,6 +14099,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14066,7 +14116,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 518c301ca6..4e1718101e 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -23,6 +23,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2021-09-15 00:46+0000\n" "Last-Translator: IoeCmcomc <hopdaigia2004@gmail.com>\n" @@ -2405,6 +2406,15 @@ msgstr "" "Không thể lưu cảnh. Các phần phụ thuộc (trường hợp hoặc kế thừa) không thoả " "mãn." +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "Không thể bắt đầu quá trình phụ!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Lưu hết các Cảnh" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "Không thể ghi đè cảnh vẫn đang mở!" @@ -2537,6 +2547,10 @@ msgid "Save changes to '%s' before closing?" msgstr "Lưu thay đổi vào '%s' trước khi đóng?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2881,10 +2895,6 @@ msgid "Save Scene" msgstr "Lưu Cảnh" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "Lưu hết các Cảnh" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "Chuyển thành..." @@ -4366,6 +4376,18 @@ msgid "Clear Default for '%s'" msgstr "Dọn Mặc định cho '%s'" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "Nhập vào lại" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "Nhập vào với:" @@ -4374,10 +4396,6 @@ msgid "Preset" msgstr "Cài sẵn" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "Nhập vào lại" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "Lưu các cảnh, nhập lại, rồi tái khởi động" @@ -7338,11 +7356,13 @@ msgid "Move Down" msgstr "Hạ nút xuống" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "Tệp lệnh tiếp theo" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "Tệp lệnh trước đó" #: editor/plugins/script_editor_plugin.cpp @@ -7696,14 +7716,14 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "Bộ xương không có xương, tạo một số nút Bone2D." #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "Tạo tư thế nghỉ từ Xương" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "Đặt tư thế nghỉ cho Xương" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Tạo tư thế nghỉ từ Xương" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Skeleton2D" @@ -7768,7 +7788,7 @@ msgstr "Vuông góc" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "Phối cảnh" #: editor/plugins/spatial_editor_plugin.cpp @@ -7778,6 +7798,11 @@ msgstr "Vuông góc" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "Phối cảnh" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "Vuông góc" @@ -8134,6 +8159,27 @@ msgid "Right View" msgstr "Góc nhìn phải" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "Góc nhìn trực diện" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -11071,14 +11117,14 @@ msgstr "" "một ký tự '/'." #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "Khoá " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Khoá " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "" @@ -14387,6 +14433,14 @@ msgstr "" "Environment mặc định được chỉ định trong Cài đặt Dự án (Rendering -> " "Environment -> Default Environment) không thể nạp được." +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14396,7 +14450,9 @@ msgid "" msgstr "" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index e8084b8856..51e1b6212b 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -79,11 +79,15 @@ # suplife <2634557184@qq.com>, 2021. # luoji <564144019@qq.com>, 2021. # zeng haochen <m18621006730@163.com>, 2021. +# Sam Sun <oppositenormal@outlook.com>, 2021. +# 苏轼 <youwanyuyu@gmail.com>, 2021. +# nitenook <admin@alterbaum.net>, 2021. msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2021-09-06 16:32+0000\n" +"PO-Revision-Date: 2021-11-11 16:02+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" @@ -92,7 +96,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2433,6 +2437,14 @@ msgid "" "be satisfied." msgstr "无法保存场景。可能是因为依赖项(实例或继承)无法满足。" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "无法保存一个或多个场景!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "保存所有场景" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "无法覆盖仍处于打开状态的场景!" @@ -2562,6 +2574,10 @@ msgid "Save changes to '%s' before closing?" msgstr "是否在关闭前保存对 “%s” 的更改?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "路径 %s 已不存在!请重新选择新的保存路径。" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2603,29 +2619,27 @@ msgstr "当前场景尚未保存。是否仍要打开?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "" +msgstr "鼠标按下时无法撤销。" #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "无可撤销。" #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "撤销" +msgstr "撤销:%s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "鼠标按下时无法重做。" #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "无可重做。" #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "重做" +msgstr "重做:%s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2897,10 +2911,6 @@ msgid "Save Scene" msgstr "保存场景" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "保存所有场景" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "转换为..." @@ -3285,9 +3295,8 @@ msgid "Merge With Existing" msgstr "与现有合并" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "修改动画变换" +msgstr "应用 MeshInstance 变换" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3543,7 +3552,7 @@ msgstr "所选资源(%s)与该属性(%s)所需的类型都不匹配。" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "快速加载" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -4345,6 +4354,20 @@ msgid "Clear Default for '%s'" msgstr "清除 “%s” 的默认值" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "重新导入" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" +"有些修改未被应用。点击“重新导入”来应用导入的修改。\n" +"若在选择另一个资源前没有点击“重新导入”,则会忽略导入的修改。" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "导入为:" @@ -4353,10 +4376,6 @@ msgid "Preset" msgstr "预设" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "重新导入" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "保存场景、重新导入,然后重启" @@ -4383,7 +4402,7 @@ msgstr "粘贴属性" #: editor/inspector_dock.cpp msgid "Make Sub-Resources Unique" -msgstr "转为独立子资源" +msgstr "唯一化子资源" #: editor/inspector_dock.cpp msgid "Create a new resource in memory and edit it." @@ -5572,7 +5591,7 @@ msgstr "创建垂直水平参考线" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" -msgstr "将 CanvasItem “%s”的 Pivot Offset 设为 (%d, %d)" +msgstr "将 CanvasItem“%s”的 Pivot Offset 设为 (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate %d CanvasItems" @@ -5580,19 +5599,19 @@ msgstr "旋转 %d 个 CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate CanvasItem \"%s\" to %d degrees" -msgstr "旋转 CanvasItem “%s” 为 %d 度" +msgstr "将 CanvasItem“%s”的旋转设为 %d 度" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move CanvasItem \"%s\" Anchor" -msgstr "移动 CanvasItem “%s” 的锚点" +msgstr "移动 CanvasItem“%s”的锚点" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale Node2D \"%s\" to (%s, %s)" -msgstr "缩放 Node2D “%s” 为 (%s, %s)" +msgstr "将 Node2D“%s”缩放为 (%s, %s)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Resize Control \"%s\" to (%d, %d)" -msgstr "缩放 Control “%s” 为 (%d, %d)" +msgstr "将 Control“%s”的大小更改为 (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale %d CanvasItems" @@ -5600,7 +5619,7 @@ msgstr "缩放 %d 个 CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale CanvasItem \"%s\" to (%s, %s)" -msgstr "缩放 CanvasItem “%s” 为 (%s, %s)" +msgstr "将 CanvasItem“%s”缩放为 (%s, %s)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move %d CanvasItems" @@ -5608,19 +5627,17 @@ msgstr "移动 %s 个 CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move CanvasItem \"%s\" to (%d, %d)" -msgstr "移动 CanvasItem “%s” 至 (%d, %d)" +msgstr "移动 CanvasItem“%s”至 (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Locked" -msgstr "锁定所选项" +msgstr "已锁定" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "分组" +msgstr "已分组" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6546,14 +6563,12 @@ msgid "Remove Selected Item" msgstr "移除选中项目" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "从场景中导入" +msgstr "从场景中导入(忽略变换)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "从场景中导入" +msgstr "从场景中导入(应用变换)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -7139,14 +7154,12 @@ msgid "Flip Portal" msgstr "翻转入口" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" -msgstr "清除变换" +msgstr "遮挡集变换" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "创建节点" +msgstr "居中节点" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7280,11 +7293,11 @@ msgid "Move Down" msgstr "向下移动" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +msgid "Next Script" msgstr "下一个脚本" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +msgid "Previous Script" msgstr "上一个脚本" #: editor/plugins/script_editor_plugin.cpp @@ -7634,26 +7647,24 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "该骨架没有骨骼绑定,请创建一些 Bone2D 骨骼子节点。" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "从骨骼创建放松姿势" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "将放松姿势设置到骨骼" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "从骨骼创建放松姿势" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "2D 骨骼节点" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "将骨骼重置为放松姿势" +msgstr "重置为放松姿势" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Overwrite Rest Pose" -msgstr "覆盖" +msgstr "覆盖放松姿势" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Create physical bones" @@ -7680,69 +7691,62 @@ msgid "Perspective" msgstr "透视" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Orthogonal" -msgstr "正交" +msgstr "正交顶视图" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Top Perspective" -msgstr "透视" +msgstr "透视顶视图" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Orthogonal" -msgstr "正交" +msgstr "正交底视图" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Bottom Perspective" -msgstr "透视" +msgstr "透视底视图" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Left Orthogonal" -msgstr "正交" +msgstr "正交左视图" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Right Perspective" -msgstr "透视" +msgid "Left Perspective" +msgstr "透视左视图" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Right Orthogonal" -msgstr "正交" +msgstr "正交右视图" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "透视右视图" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Orthogonal" -msgstr "正交" +msgstr "正交前视图" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Front Perspective" -msgstr "透视" +msgstr "透视前视图" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Orthogonal" -msgstr "正交" +msgstr "正交后视图" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Rear Perspective" -msgstr "透视" +msgstr "透视后视图" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [auto]" -msgstr "" +msgstr " [自动]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr "" +msgstr " [入口生效]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8063,6 +8067,26 @@ msgid "Right View" msgstr "右视图" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "视图向下环绕" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "视图向左环绕" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "视图向右环绕" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "视图向上环绕" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "视图环绕至背面" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "切换透视图/正交视图" @@ -8136,9 +8160,8 @@ msgid "View Portal Culling" msgstr "显示入口剔除" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Occlusion Culling" -msgstr "显示入口剔除" +msgstr "显示遮挡剔除" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8206,9 +8229,8 @@ msgid "Post" msgstr "后置" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unnamed Gizmo" -msgstr "未命名项目" +msgstr "未命名控制器" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -10912,14 +10934,14 @@ msgstr "" "如果要根据名称和完整路径筛选,搜索内容应至少包含一个“/”字符。" #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "按键 " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "物理按键" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "按键 " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "手柄按键" @@ -12239,14 +12261,12 @@ msgid "Set Portal Point Position" msgstr "设置入口点位置" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "修改圆柱体半径" +msgstr "设置遮挡球体半径" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Sphere Position" -msgstr "设置曲线内控点位置" +msgstr "设置遮挡球体位置" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -12529,9 +12549,8 @@ msgid "Class name can't be a reserved keyword" msgstr "类名不能是保留关键字" #: modules/mono/csharp_script.cpp -#, fuzzy msgid "Build Solution" -msgstr "填充选中项" +msgstr "构建解决方案" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -13092,11 +13111,11 @@ msgstr "用于发布的密钥存储在导出预设中未被正确设置。" #: platform/android/export/export_plugin.cpp msgid "A valid Android SDK path is required in Editor Settings." -msgstr "编辑器设置中需要有效的Android SDK路径。" +msgstr "编辑器设置中需要有效的 Android SDK 路径。" #: platform/android/export/export_plugin.cpp msgid "Invalid Android SDK path in Editor Settings." -msgstr "编辑器设置中的Android SDK路径无效。" +msgstr "编辑器设置中的 Android SDK 路径无效。" #: platform/android/export/export_plugin.cpp msgid "Missing 'platform-tools' directory!" @@ -13104,11 +13123,11 @@ msgstr "缺失“platform-tools”目录!" #: platform/android/export/export_plugin.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "找不到Android SDK平台工具的adb命令。" +msgstr "找不到 Android SDK 平台工具的 adb 命令。" #: platform/android/export/export_plugin.cpp msgid "Please check in the Android SDK directory specified in Editor Settings." -msgstr "请签入编辑器设置中指定的Android SDK目录。" +msgstr "请签入编辑器设置中指定的 Android SDK 目录。" #: platform/android/export/export_plugin.cpp msgid "Missing 'build-tools' directory!" @@ -13116,7 +13135,7 @@ msgstr "缺失“build-tools”目录!" #: platform/android/export/export_plugin.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "找不到Android SDK生成工具的apksigner命令。" +msgstr "找不到 Android SDK 生成工具的 apksigner 命令。" #: platform/android/export/export_plugin.cpp msgid "Invalid public key for APK expansion." @@ -13320,7 +13339,7 @@ msgstr "预设中未指定必需的图标。" #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "停止 HTTP 服务" +msgstr "停止 HTTP 服务器" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -13790,11 +13809,11 @@ msgstr "" #: scene/3d/occluder.cpp msgid "No shape is set." -msgstr "" +msgstr "未设置形状。" #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "" +msgstr "仅支持统一的缩放。" #: scene/3d/particles.cpp msgid "" @@ -14131,6 +14150,8 @@ msgid "" "The GLES2 backend is currently in use, so these modes will act like Stretch " "instead." msgstr "" +"Axis Stretch 属性的 Tile 和 Tile Fit 选项仅在使用 GLES3 渲染后端时有效。\n" +"当前使用的是 GLES2 后端,将使用 Stretch 的行为代替这些模式。" #: scene/gui/popup.cpp msgid "" @@ -14167,6 +14188,17 @@ msgstr "" "无法加载项目设置中的默认环境 (Rendering -> Environment -> Default " "Environment)。" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" +"计时器等待时间非常短(小于 0.05 秒)时可能会根据渲染帧率和物理帧率的不同而表" +"现得极为不同。\n" +"建议使用脚本的 process 循环代替此类计时器。" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14174,17 +14206,19 @@ msgid "" "obtain a size. Otherwise, make it a RenderTarget and assign its internal " "texture to some node for display." msgstr "" -"这个 Viewport 未被设置为渲染目标。如果你想让其直接在屏幕上显示内容,请使其成" -"为 Control 的子节点,这样一来该 Viewport 才会有大小。否则请为其设置 " +"这个视窗未被设置为渲染目标。如果你想让其直接在屏幕上显示内容,请使其成为 " +"Control 的子节点,这样一来该 Viewport 才会有大小。否则请为其设置 " "RenderTarget 并分配其内部纹理来显示。" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." -msgstr "Viewport 大小大于 0 时才能进行渲染。" +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." +msgstr "Viewport 的宽高都大于等于 2 像素时才能进行渲染。" #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" -msgstr "" +msgstr "OccluderShapeSphere 设置 Spheres" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -15857,9 +15891,6 @@ msgstr "不允许修改常量。" #~ msgid "Couldn't save atlas image:" #~ msgstr "无法保存精灵集图片:" -#~ msgid "Couldn't save converted texture:" -#~ msgstr "无法保存转换的贴图:" - #~ msgid "Invalid translation source!" #~ msgstr "源语言文件非法!" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index b9461bffd0..a3c6a8fa3d 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -7,6 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2020-05-01 11:43+0000\n" "Last-Translator: zx-wt <ZX_WT@ymail.com>\n" @@ -2485,6 +2486,15 @@ msgid "" "be satisfied." msgstr "" +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Save All Scenes" +msgstr "儲存所有場景" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "" @@ -2606,6 +2616,10 @@ msgid "Save changes to '%s' before closing?" msgstr "關閉前要先儲存對 '%s' 任何更改嗎?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2958,11 +2972,6 @@ msgid "Save Scene" msgstr "儲存場景" #: editor/editor_node.cpp -#, fuzzy -msgid "Save All Scenes" -msgstr "儲存所有場景" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "轉為..." @@ -4489,20 +4498,28 @@ msgstr "" #: editor/import_dock.cpp #, fuzzy -msgid "Import As:" +msgid "Reimport" msgstr "導入" #: editor/import_dock.cpp -#, fuzzy -msgid "Preset" -msgstr "重設縮放比例" +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" #: editor/import_dock.cpp #, fuzzy -msgid "Reimport" +msgid "Import As:" msgstr "導入" #: editor/import_dock.cpp +#, fuzzy +msgid "Preset" +msgstr "重設縮放比例" + +#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "" @@ -7573,12 +7590,14 @@ msgid "Move Down" msgstr "下移" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "下一個腳本" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" -msgstr "" +#, fuzzy +msgid "Previous Script" +msgstr "上一個tab" #: editor/plugins/script_editor_plugin.cpp msgid "File" @@ -7957,15 +7976,15 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy msgid "Create Rest Pose from Bones" msgstr "運行場景" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Set Rest Pose to Bones" -msgstr "" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "" @@ -8026,7 +8045,7 @@ msgid "Left Orthogonal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Right Perspective" +msgid "Left Perspective" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -8035,6 +8054,10 @@ msgid "Right Orthogonal" msgstr "右𨫡" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" msgstr "" @@ -8389,6 +8412,26 @@ msgid "Right View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "" @@ -11352,11 +11395,11 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -msgid "Key " +msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp -msgid "Physical Key" +msgid "Key " msgstr "" #: editor/project_settings_editor.cpp @@ -14654,6 +14697,14 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14664,7 +14715,9 @@ msgstr "" #: scene/main/viewport.cpp #, fuzzy -msgid "Viewport size must be greater than 0 to render anything." +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "viewport大小必須大於0以渲染任何東西。" #: scene/resources/occluder_shape.cpp diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index db1603cc9b..a251712cb1 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -26,12 +26,14 @@ # BinotaLIU <me@binota.org>, 2020, 2021. # MintSoda <lionlxh@qq.com>, 2020. # meowmeowmeowcat <meowmeowcat1211@gmail.com>, 2021. +# anthonychen <anton1554970211@126.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-07-13 06:13+0000\n" -"Last-Translator: meowmeowmeowcat <meowmeowcat1211@gmail.com>\n" +"PO-Revision-Date: 2021-11-11 16:02+0000\n" +"Last-Translator: anthonychen <anton1554970211@126.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -39,7 +41,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7.2-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -387,13 +389,11 @@ msgstr "插入動畫" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "node '%s'" -msgstr "無法開啟 \"%s\"。" +msgstr "無法開啟 \"%s\"" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "animation" msgstr "動畫" @@ -403,7 +403,6 @@ msgstr "AnimationPlayer 不能播放自己,只可播放其他 Player。" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "property '%s'" msgstr "屬性「%s」不存在。" @@ -631,7 +630,6 @@ msgid "Use Bezier Curves" msgstr "使用貝茲曲線" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Create RESET Track(s)" msgstr "貼上關鍵畫格" @@ -976,7 +974,7 @@ msgstr "找不到與「%s」相關的結果。" #: editor/create_dialog.cpp editor/property_selector.cpp msgid "No description available for %s." -msgstr "" +msgstr "缺少對%s的可用解釋。" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp @@ -2407,6 +2405,15 @@ msgid "" "be satisfied." msgstr "無法保存場景。可能是由於相依性(實體或繼承)無法滿足。" +#: editor/editor_node.cpp +#, fuzzy +msgid "Could not save one or more scenes!" +msgstr "無法啟動子處理程序!" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "保存所有場景" + #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" msgstr "無法複寫未關閉的場景!" @@ -2536,6 +2543,10 @@ msgid "Save changes to '%s' before closing?" msgstr "關閉前是否保存對「%s」的更改?" #: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." @@ -2871,10 +2882,6 @@ msgid "Save Scene" msgstr "保存場景" #: editor/editor_node.cpp -msgid "Save All Scenes" -msgstr "保存所有場景" - -#: editor/editor_node.cpp msgid "Convert To..." msgstr "轉換成…" @@ -4352,6 +4359,18 @@ msgid "Clear Default for '%s'" msgstr "清除「%s」的預設" #: editor/import_dock.cpp +msgid "Reimport" +msgstr "重新匯入" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp msgid "Import As:" msgstr "匯入為:" @@ -4360,10 +4379,6 @@ msgid "Preset" msgstr "預設設定" #: editor/import_dock.cpp -msgid "Reimport" -msgstr "重新匯入" - -#: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" msgstr "保存場景、重新匯入、並重新啟動" @@ -7315,11 +7330,13 @@ msgid "Move Down" msgstr "下移" #: editor/plugins/script_editor_plugin.cpp -msgid "Next script" +#, fuzzy +msgid "Next Script" msgstr "下一個腳本" #: editor/plugins/script_editor_plugin.cpp -msgid "Previous script" +#, fuzzy +msgid "Previous Script" msgstr "上一個腳本" #: editor/plugins/script_editor_plugin.cpp @@ -7669,14 +7686,14 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "此骨架未包含骨骼,請建立一些子 Bone2D 節點。" #: editor/plugins/skeleton_2d_editor_plugin.cpp -msgid "Create Rest Pose from Bones" -msgstr "自骨骼建立靜止姿勢" - -#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" msgstr "設定靜止姿勢至骨骼" #: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "自骨骼建立靜止姿勢" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" msgstr "Sekeleton2D" @@ -7741,7 +7758,7 @@ msgstr "正交" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Right Perspective" +msgid "Left Perspective" msgstr "透視" #: editor/plugins/spatial_editor_plugin.cpp @@ -7751,6 +7768,11 @@ msgstr "正交" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Right Perspective" +msgstr "透視" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Front Orthogonal" msgstr "正交" @@ -8112,6 +8134,27 @@ msgid "Right View" msgstr "右視圖" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Orbit View Up" +msgstr "前視圖" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" msgstr "切換投影或正交視圖" @@ -11046,14 +11089,14 @@ msgstr "" "若要以名稱與完整路徑來過濾專案,搜尋內容應至少包含一個「/」字元。" #: editor/project_settings_editor.cpp -msgid "Key " -msgstr "按鍵 " - -#: editor/project_settings_editor.cpp msgid "Physical Key" msgstr "" #: editor/project_settings_editor.cpp +msgid "Key " +msgstr "按鍵 " + +#: editor/project_settings_editor.cpp msgid "Joy Button" msgstr "控制器按鈕" @@ -14306,6 +14349,14 @@ msgstr "" "無法載入專案設定中指定的預設環境 (Rendering -> Environment -> Default " "Environment)。" +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -14318,7 +14369,10 @@ msgstr "" "為其他節點以顯示。" #: scene/main/viewport.cpp -msgid "Viewport size must be greater than 0 to render anything." +#, fuzzy +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." msgstr "Viewport 大小必須大於 0 才可進行算繪。" #: scene/resources/occluder_shape.cpp |