diff options
Diffstat (limited to 'editor')
138 files changed, 5143 insertions, 2814 deletions
diff --git a/editor/action_map_editor.cpp b/editor/action_map_editor.cpp index 55640ca590..9949fd8199 100644 --- a/editor/action_map_editor.cpp +++ b/editor/action_map_editor.cpp @@ -307,7 +307,7 @@ void InputEventConfigurationDialog::_update_input_list() { mouse_root->set_collapsed(collapse); mouse_root->set_meta("__type", INPUT_MOUSE_BUTTON); - int mouse_buttons[9] = { BUTTON_LEFT, BUTTON_RIGHT, BUTTON_MIDDLE, BUTTON_WHEEL_UP, BUTTON_WHEEL_DOWN, BUTTON_WHEEL_LEFT, BUTTON_WHEEL_RIGHT, BUTTON_XBUTTON1, BUTTON_XBUTTON2 }; + 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 }; for (int i = 0; i < 9; i++) { Ref<InputEventMouseButton> mb; mb.instance(); diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index 5d2b825c4f..92b4683018 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -615,7 +615,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() == BUTTON_WHEEL_DOWN) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { float v_zoom_orig = v_zoom; if (mb->get_command()) { timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() * 1.05); @@ -628,7 +628,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { update(); } - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_UP) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { float v_zoom_orig = v_zoom; if (mb->get_command()) { timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05); @@ -641,7 +641,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { update(); } - if (mb.is_valid() && mb->get_button_index() == BUTTON_MIDDLE) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_MIDDLE) { if (mb->is_pressed()) { int x = mb->get_position().x - timeline->get_name_limit(); panning_timeline_from = x / timeline->get_zoom_scale(); @@ -652,7 +652,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_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()); @@ -672,7 +672,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + 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("close_request"); return; @@ -789,7 +789,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (box_selecting_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (box_selecting_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (box_selecting) { //do actual select if (!box_selecting_add) { @@ -819,7 +819,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() == BUTTON_LEFT) { + if (moving_handle != 0 && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_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); @@ -831,7 +831,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() == BUTTON_LEFT) { + if (moving_selection_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (moving_selection) { //combit it @@ -927,7 +927,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_MIDDLE) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { v_scroll += mm->get_relative().y * v_zoom; if (v_scroll > 100000) { v_scroll = 100000; diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index de8f8b1d3b..4274fb993f 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -1643,24 +1643,24 @@ void AnimationTimelineEdit::_play_position_draw() { void AnimationTimelineEdit::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && hsize_rect.has_point(mb->get_position())) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_LEFT && dragging_hsize) { + if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_LEFT) { + if (!panning_timeline && mb->get_button_index() == MOUSE_BUTTON_LEFT) { int x = mb->get_position().x - get_name_limit(); float ofs = x / get_zoom_scale() + get_value(); emit_signal("timeline_changed", ofs, false); dragging_timeline = true; } - if (!dragging_timeline && mb->get_button_index() == BUTTON_MIDDLE) { + if (!dragging_timeline && mb->get_button_index() == MOUSE_BUTTON_MIDDLE) { int x = mb->get_position().x - get_name_limit(); panning_timeline_from = x / get_zoom_scale(); panning_timeline = true; @@ -1668,11 +1668,11 @@ void AnimationTimelineEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (dragging_timeline && mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && !mb->is_pressed()) { + if (dragging_timeline && mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && !mb->is_pressed()) { dragging_timeline = false; } - if (panning_timeline && mb.is_valid() && mb->get_button_index() == BUTTON_MIDDLE && !mb->is_pressed()) { + if (panning_timeline && mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_MIDDLE && !mb->is_pressed()) { panning_timeline = false; } @@ -2540,7 +2540,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() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Point2 pos = mb->get_position(); if (check_rect.has_point(pos)) { @@ -2683,7 +2683,7 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_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. @@ -2713,7 +2713,7 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && clicking_on_name) { + if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && clicking_on_name) { if (!path) { path_popup = memnew(Popup); path_popup->set_wrap_controls(true); @@ -2735,7 +2735,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() == BUTTON_LEFT) { + if (!mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { moving_selection_attempt = false; if (moving_selection) { emit_signal("move_selection_commit"); @@ -2746,7 +2746,7 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { select_single_attempt = -1; } - if (moving_selection && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + if (moving_selection && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { moving_selection_attempt = false; moving_selection = false; emit_signal("move_selection_cancel"); @@ -2754,7 +2754,7 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT && moving_selection_attempt) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT && moving_selection_attempt) { if (!moving_selection) { moving_selection = true; emit_signal("move_selection_begin"); @@ -4955,17 +4955,17 @@ 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->get_command() && mb->get_button_index() == BUTTON_WHEEL_UP) { + if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == MOUSE_BUTTON_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->get_command() && mb->get_button_index() == BUTTON_WHEEL_DOWN) { + if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05); scroll->accept_event(); } - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { box_selecting = true; box_selecting_from = scroll->get_global_transform().xform(mb->get_position()); @@ -4993,12 +4993,12 @@ void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_MIDDLE) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { 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() & BUTTON_MASK_LEFT)) { + if (!(mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT)) { //no longer box_selection->hide(); box_selecting = false; diff --git a/editor/animation_track_editor_plugins.cpp b/editor/animation_track_editor_plugins.cpp index 0c0ee2856e..1028d34fb2 100644 --- a/editor/animation_track_editor_plugins.cpp +++ b/editor/animation_track_editor_plugins.cpp @@ -101,47 +101,67 @@ void AnimationTrackEditColor::draw_key_link(int p_index, float p_pixels_sec, int int font_size = get_theme_font_size("font_size", "Label"); int fh = (font->get_height(font_size) * 0.8); + fh /= 3; + int x_from = p_x + fh / 2 - 1; int x_to = p_next_x - fh / 2 + 1; - fh /= 3; + x_from = MAX(x_from, p_clip_left); + x_to = MIN(x_to, p_clip_right); + + int y_from = (get_size().height - fh) / 2; if (x_from > p_clip_right || x_to < p_clip_left) { return; } - Color color = get_animation()->track_get_key_value(get_track(), p_index); - Color color_next = get_animation()->track_get_key_value(get_track(), p_index + 1); + Vector<Color> color_samples; + color_samples.append(get_animation()->track_get_key_value(get_track(), p_index)); - if (x_from < p_clip_left) { - float c = float(p_clip_left - x_from) / (x_to - x_from); - color = color.lerp(color_next, c); - x_from = p_clip_left; - } + if (get_animation()->track_get_type(get_track()) == Animation::TYPE_VALUE) { + if (get_animation()->track_get_interpolation_type(get_track()) != Animation::INTERPOLATION_NEAREST && + (get_animation()->value_track_get_update_mode(get_track()) == Animation::UPDATE_CONTINUOUS || + get_animation()->value_track_get_update_mode(get_track()) == Animation::UPDATE_CAPTURE) && + !Math::is_zero_approx(get_animation()->track_get_key_transition(get_track(), p_index))) { + float start_time = get_animation()->track_get_key_time(get_track(), p_index); + float end_time = get_animation()->track_get_key_time(get_track(), p_index + 1); - if (x_to > p_clip_right) { - float c = float(p_clip_right - x_from) / (x_to - x_from); - color_next = color.lerp(color_next, c); - x_to = p_clip_right; - } + Color color_next = get_animation()->value_track_interpolate(get_track(), end_time); - int y_from = (get_size().height - fh) / 2; + if (!color_samples[0].is_equal_approx(color_next)) { + color_samples.resize(1 + (x_to - x_from) / 64); // Make a color sample every 64 px. + for (int i = 1; i < color_samples.size(); i++) { + float j = i; + color_samples.write[i] = get_animation()->value_track_interpolate( + get_track(), + Math::lerp(start_time, end_time, j / color_samples.size())); + } + } + color_samples.append(color_next); + } else { + color_samples.append(color_samples[0]); + } + } else { + color_samples.append(get_animation()->track_get_key_value(get_track(), p_index + 1)); + } - Vector<Vector2> points; - Vector<Color> colors; + for (int i = 0; i < color_samples.size() - 1; i++) { + Vector<Vector2> points; + Vector<Color> colors; - points.push_back(Vector2(x_from, y_from)); - colors.push_back(color); + points.push_back(Vector2(Math::lerp(x_from, x_to, float(i) / (color_samples.size() - 1)), y_from)); + colors.push_back(color_samples[i]); - points.push_back(Vector2(x_to, y_from)); - colors.push_back(color_next); + points.push_back(Vector2(Math::lerp(x_from, x_to, float(i + 1) / (color_samples.size() - 1)), y_from)); + colors.push_back(color_samples[i + 1]); - points.push_back(Vector2(x_to, y_from + fh)); - colors.push_back(color_next); + points.push_back(Vector2(Math::lerp(x_from, x_to, float(i + 1) / (color_samples.size() - 1)), y_from + fh)); + colors.push_back(color_samples[i + 1]); - points.push_back(Vector2(x_from, y_from + fh)); - colors.push_back(color); + points.push_back(Vector2(Math::lerp(x_from, x_to, float(i) / (color_samples.size() - 1)), y_from + fh)); + colors.push_back(color_samples[i]); - draw_primitive(points, colors, Vector<Vector2>()); + draw_primitive(points, colors, Vector<Vector2>()); + } } void AnimationTrackEditColor::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) { @@ -1076,7 +1096,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() == BUTTON_LEFT && get_default_cursor_shape() == CURSOR_HSIZE) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && get_default_cursor_shape() == CURSOR_HSIZE) { len_resizing = true; len_resizing_start = mb->get_shift(); len_resizing_from_px = mb->get_position().x; @@ -1086,7 +1106,7 @@ void AnimationTrackEditTypeAudio::_gui_input(const Ref<InputEvent> &p_event) { return; } - if (len_resizing && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (len_resizing && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_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/code_editor.cpp b/editor/code_editor.cpp index f4717830bc..11be365f0a 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -723,9 +723,9 @@ void CodeTextEditor::_text_editor_gui_input(const Ref<InputEvent> &p_event) { if (mb.is_valid()) { if (mb->is_pressed() && mb->get_command()) { - if (mb->get_button_index() == BUTTON_WHEEL_UP) { + if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { _zoom_in(); - } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { _zoom_out(); } } @@ -1548,7 +1548,7 @@ void CodeTextEditor::validate_script() { void CodeTextEditor::_warning_label_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { _warning_button_pressed(); } } @@ -1572,7 +1572,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() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { goto_error(); } } diff --git a/editor/debugger/editor_performance_profiler.cpp b/editor/debugger/editor_performance_profiler.cpp index 33d08a2f6b..fc0104c07a 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() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_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 9304b116d0..c4290b7cca 100644 --- a/editor/debugger/editor_profiler.cpp +++ b/editor/debugger/editor_profiler.cpp @@ -482,7 +482,7 @@ void EditorProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) { Ref<InputEventMouseMotion> mm = p_ev; if ( - (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) || + (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) || (mm.is_valid())) { int x = me->get_position().x; x = x * frame_metrics.size() / graph->get_size().width; @@ -510,7 +510,7 @@ void EditorProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) { hover_metric = -1; } - if (mb.is_valid() || mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mb.is_valid() || mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { //cursor_metric=x; updating_frame = true; diff --git a/editor/debugger/editor_visual_profiler.cpp b/editor/debugger/editor_visual_profiler.cpp index d825a980c7..5bb10b3794 100644 --- a/editor/debugger/editor_visual_profiler.cpp +++ b/editor/debugger/editor_visual_profiler.cpp @@ -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() == BUTTON_LEFT && mb->is_pressed()) || + (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_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() & BUTTON_MASK_LEFT) { + if (mb.is_valid() || mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { //cursor_metric=x; updating_frame = true; diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index 9a826ab106..3a5ebe8e85 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -532,7 +532,7 @@ void EditorAudioBus::_effect_add(int p_which) { void EditorAudioBus::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { Vector2 pos = Vector2(mb->get_position().x, mb->get_position().y); bus_popup->set_position(get_global_position() + pos); bus_popup->popup(); diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index 213c3f5631..fa4703d425 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -741,7 +741,7 @@ Ref<Script> EditorData::get_scene_root_script(int p_idx) const { return s; } -String EditorData::get_scene_title(int p_idx) const { +String EditorData::get_scene_title(int p_idx, bool p_always_strip_extension) const { ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), String()); if (!edited_scene[p_idx].root) { return TTR("[empty]"); @@ -749,12 +749,28 @@ String EditorData::get_scene_title(int p_idx) const { if (edited_scene[p_idx].root->get_filename() == "") { return TTR("[unsaved]"); } - bool show_ext = EDITOR_DEF("interface/scene_tabs/show_extension", false); - String name = edited_scene[p_idx].root->get_filename().get_file(); - if (!show_ext) { - name = name.get_basename(); + + const String filename = edited_scene[p_idx].root->get_filename().get_file(); + const String basename = filename.get_basename(); + + if (p_always_strip_extension) { + return basename; + } + + // Return the filename including the extension if there's ambiguity (e.g. both `foo.tscn` and `foo.scn` are being edited). + for (int i = 0; i < edited_scene.size(); i++) { + if (i == p_idx) { + // Don't compare the edited scene against itself. + continue; + } + + if (edited_scene[i].root && basename == edited_scene[i].root->get_filename().get_file().get_basename()) { + return filename; + } } - return name; + + // Else, return just the basename as there's no ambiguity. + return basename; } void EditorData::set_scene_path(int p_idx, const String &p_path) { diff --git a/editor/editor_data.h b/editor/editor_data.h index 18b4137162..dbe729d9d9 100644 --- a/editor/editor_data.h +++ b/editor/editor_data.h @@ -184,7 +184,7 @@ public: Node *get_edited_scene_root(int p_idx = -1); int get_edited_scene_count() const; Vector<EditedScene> get_edited_scenes() const; - String get_scene_title(int p_idx) const; + String get_scene_title(int p_idx, bool p_always_strip_extension = false) const; String get_scene_path(int p_idx) const; String get_scene_type(int p_idx) const; void set_scene_path(int p_idx, const String &p_path); diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 7f5f51cf70..a5ebfbfb8a 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -730,6 +730,12 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & if (p_preset->get_export_filter() == EditorExportPreset::EXPORT_ALL_RESOURCES) { //find stuff _export_find_resources(EditorFileSystem::get_singleton()->get_filesystem(), paths); + } else if (p_preset->get_export_filter() == EditorExportPreset::EXCLUDE_SELECTED_RESOURCES) { + _export_find_resources(EditorFileSystem::get_singleton()->get_filesystem(), paths); + Vector<String> files = p_preset->get_files_to_export(); + for (int i = 0; i < files.size(); i++) { + paths.erase(files[i]); + } } else { bool scenes_only = p_preset->get_export_filter() == EditorExportPreset::EXPORT_SELECTED_SCENES; @@ -874,6 +880,20 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & continue; } + String importer_type = config->get_value("remap", "importer"); + + if (importer_type == "keep") { + //just keep file as-is + Vector<uint8_t> array = FileAccess::get_file_as_array(path); + err = p_func(p_udata, path, array, idx, total, enc_in_filters, enc_ex_filters, key); + + if (err != OK) { + return err; + } + + continue; + } + List<String> remaps; config->get_section_keys("remap", &remaps); @@ -1380,6 +1400,10 @@ void EditorExport::_save() { config->set_value(section, "export_filter", "resources"); save_files = true; } break; + case EditorExportPreset::EXCLUDE_SELECTED_RESOURCES: { + config->set_value(section, "export_filter", "exclude"); + save_files = true; + } break; } if (save_files) { @@ -1558,6 +1582,9 @@ void EditorExport::load_config() { } else if (export_filter == "resources") { preset->set_export_filter(EditorExportPreset::EXPORT_SELECTED_RESOURCES); get_files = true; + } else if (export_filter == "exclude") { + preset->set_export_filter(EditorExportPreset::EXCLUDE_SELECTED_RESOURCES); + get_files = true; } if (get_files) { diff --git a/editor/editor_export.h b/editor/editor_export.h index e6026e7aae..c96c8fdbce 100644 --- a/editor/editor_export.h +++ b/editor/editor_export.h @@ -50,6 +50,7 @@ public: EXPORT_ALL_RESOURCES, EXPORT_SELECTED_SCENES, EXPORT_SELECTED_RESOURCES, + EXCLUDE_SELECTED_RESOURCES, }; enum ScriptExportMode { diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index dce022e86e..fb0dc57501 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -405,6 +405,10 @@ bool EditorFileSystem::_test_for_reimport(const String &p_path, bool p_only_impo memdelete(f); + if (importer_name == "keep") { + return false; //keep mode, do not reimport + } + Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); if (importer->get_format_version() > version) { @@ -1532,6 +1536,10 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector source_file_options[p_files[i]] = Map<StringName, Variant>(); importer_name = file_importer_name; + if (importer_name == "keep") { + continue; //do nothing + } + 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; @@ -1555,6 +1563,10 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector base_paths[p_files[i]] = ResourceFormatImporter::get_singleton()->get_import_base_path(p_files[i]); } + if (importer_name == "keep") { + return OK; // (do nothing) + } + ERR_FAIL_COND_V(importer_name == String(), ERR_UNCONFIGURED); Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); @@ -1668,7 +1680,7 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector return err; } -void EditorFileSystem::_reimport_file(const String &p_file) { +void EditorFileSystem::_reimport_file(const String &p_file, const Map<StringName, Variant> *p_custom_options, const String &p_custom_importer) { EditorFileSystemDirectory *fs = nullptr; int cpos = -1; bool found = _find_file(p_file, &fs, cpos); @@ -1677,23 +1689,32 @@ void EditorFileSystem::_reimport_file(const String &p_file) { //try to obtain existing params Map<StringName, Variant> params; - String importer_name; + String importer_name; //empty by default though + + if (p_custom_importer != String()) { + importer_name = p_custom_importer; + } + if (p_custom_options != nullptr) { + params = *p_custom_options; + } if (FileAccess::exists(p_file + ".import")) { //use existing - Ref<ConfigFile> cf; - cf.instance(); - Error err = cf->load(p_file + ".import"); - if (err == OK) { - if (cf->has_section("params")) { - List<String> sk; - cf->get_section_keys("params", &sk); - for (List<String>::Element *E = sk.front(); E; E = E->next()) { - params[E->get()] = cf->get_value("params", E->get()); + if (p_custom_options == nullptr) { + Ref<ConfigFile> cf; + cf.instance(); + Error err = cf->load(p_file + ".import"); + if (err == OK) { + if (cf->has_section("params")) { + List<String> sk; + cf->get_section_keys("params", &sk); + for (List<String>::Element *E = sk.front(); E; E = E->next()) { + params[E->get()] = cf->get_value("params", E->get()); + } + } + if (p_custom_importer == String() && cf->has_section("remap")) { + importer_name = cf->get_value("remap", "importer"); } - } - if (cf->has_section("remap")) { - importer_name = cf->get_value("remap", "importer"); } } @@ -1701,6 +1722,16 @@ void EditorFileSystem::_reimport_file(const String &p_file) { late_added_files.insert(p_file); //imported files do not call update_file(), but just in case.. } + if (importer_name == "keep") { + //keep files, do nothing. + fs->files[cpos]->modified_time = FileAccess::get_modified_time(p_file); + fs->files[cpos]->import_modified_time = FileAccess::get_modified_time(p_file + ".import"); + fs->files[cpos]->deps.clear(); + fs->files[cpos]->type = ""; + fs->files[cpos]->import_valid = false; + EditorResourcePreview::get_singleton()->check_for_invalidation(p_file); + return; + } Ref<ResourceImporter> importer; bool load_default = false; //find the importer @@ -1887,6 +1918,10 @@ void EditorFileSystem::_find_group_files(EditorFileSystemDirectory *efd, Map<Str } } +void EditorFileSystem::reimport_file_with_custom_parameters(const String &p_file, const String &p_importer, const Map<StringName, Variant> &p_custom_params) { + _reimport_file(p_file, &p_custom_params, p_importer); +} + void EditorFileSystem::reimport_files(const Vector<String> &p_files) { { // Ensure that ProjectSettings::IMPORTED_FILES_PATH exists. diff --git a/editor/editor_file_system.h b/editor/editor_file_system.h index 59bde238a8..6f4f058503 100644 --- a/editor/editor_file_system.h +++ b/editor/editor_file_system.h @@ -203,7 +203,7 @@ class EditorFileSystem : public Node { void _update_extensions(); - void _reimport_file(const String &p_file); + void _reimport_file(const String &p_file, const Map<StringName, Variant> *p_custom_options = nullptr, const String &p_custom_importer = String()); Error _reimport_group(const String &p_group_file, const Vector<String> &p_files); bool _test_for_reimport(const String &p_path, bool p_only_imported_files); @@ -257,6 +257,8 @@ public: void reimport_files(const Vector<String> &p_files); + void reimport_file_with_custom_parameters(const String &p_file, const String &p_importer, const Map<StringName, Variant> &p_custom_params); + void update_script_classes(); bool is_group_file(const String &p_path) const; diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index 9b03731fd8..70d1a514b5 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -693,7 +693,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() & BUTTON_MASK_LEFT; + bool button_left = me->get_button_mask() & MOUSE_BUTTON_MASK_LEFT; bool new_keying_hover = keying_rect.has_point(mpos) && !button_left; if (new_keying_hover != keying_hover) { @@ -722,7 +722,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() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Vector2 mpos = mb->get_position(); if (is_layout_rtl()) { mpos.x = get_size().x - mpos.x; @@ -1359,7 +1359,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() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Ref<Font> font = get_theme_font("font", "Tree"); int font_size = get_theme_font_size("font_size", "Tree"); if (mb->get_position().y > font->get_height(font_size)) { //clicked outside diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index c3e15f2840..21f1d05304 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -92,7 +92,6 @@ #include "editor/filesystem_dock.h" #include "editor/import/editor_import_collada.h" #include "editor/import/resource_importer_bitmask.h" -#include "editor/import/resource_importer_csv.h" #include "editor/import/resource_importer_csv_translation.h" #include "editor/import/resource_importer_image.h" #include "editor/import/resource_importer_layered_texture.h" @@ -102,6 +101,7 @@ #include "editor/import/resource_importer_texture.h" #include "editor/import/resource_importer_texture_atlas.h" #include "editor/import/resource_importer_wav.h" +#include "editor/import/scene_import_settings.h" #include "editor/import/scene_importer_mesh_node_3d.h" #include "editor/import_dock.h" #include "editor/multi_node_edit.h" @@ -592,6 +592,9 @@ void EditorNode::_notification(int p_what) { _editor_select(EDITOR_3D); } + // Save the project after opening to mark it as last modified. + ProjectSettings::get_singleton()->save(); + /* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */ } break; @@ -1378,14 +1381,14 @@ void EditorNode::_save_scene_with_preview(String p_file, int p_idx) { } else if (c3d < c2d) { Ref<ViewportTexture> viewport_texture = scene_root->get_texture(); if (viewport_texture->get_width() > 0 && viewport_texture->get_height() > 0) { - img = viewport_texture->get_data(); + img = viewport_texture->get_image(); } } else { // The 3D editor may be disabled as a feature, but scenes can still be opened. // This check prevents the preview from regenerating in case those scenes are then saved. Ref<EditorFeatureProfile> profile = feature_profile_manager->get_current_profile(); if (profile.is_valid() && !profile->is_feature_disabled(EditorFeatureProfile::FEATURE_3D)) { - img = Node3DEditor::get_singleton()->get_editor_viewport(0)->get_viewport_node()->get_texture()->get_data(); + img = Node3DEditor::get_singleton()->get_editor_viewport(0)->get_viewport_node()->get_texture()->get_image(); } } @@ -2832,7 +2835,7 @@ void EditorNode::_save_screenshot(NodePath p_path) { ERR_FAIL_COND_MSG(!viewport, "Cannot get editor main control viewport."); Ref<ViewportTexture> texture = viewport->get_texture(); ERR_FAIL_COND_MSG(texture.is_null(), "Cannot get editor main control viewport texture."); - Ref<Image> img = texture->get_data(); + Ref<Image> img = texture->get_image(); ERR_FAIL_COND_MSG(img.is_null(), "Cannot get editor main control viewport texture image."); Error error = img->save_png(p_path); ERR_FAIL_COND_MSG(error != OK, "Cannot save screenshot to file '" + p_path + "'."); @@ -4835,15 +4838,15 @@ 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() == BUTTON_MIDDLE && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_MIDDLE && mb->is_pressed()) { _scene_tab_closed(scene_tabs->get_hovered_tab()); } } else { - if ((mb->get_button_index() == BUTTON_LEFT && mb->is_doubleclick()) || (mb->get_button_index() == BUTTON_MIDDLE && mb->is_pressed())) { + if ((mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_doubleclick()) || (mb->get_button_index() == MOUSE_BUTTON_MIDDLE && mb->is_pressed())) { _menu_option_confirm(FILE_NEW_SCENE, true); } } - if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { // context menu scene_tabs_context_menu->clear(); scene_tabs_context_menu->set_size(Size2(1, 1)); @@ -5105,8 +5108,8 @@ Variant EditorNode::drag_resource(const Ref<Resource> &p_res, Control *p_from) { { //todo make proper previews - Ref<ImageTexture> pic = gui_base->get_theme_icon("FileBigThumb", "EditorIcons"); - Ref<Image> img = pic->get_data(); + Ref<ImageTexture> texture = gui_base->get_theme_icon("FileBigThumb", "EditorIcons"); + Ref<Image> img = texture->get_image(); img = img->duplicate(); img->resize(48, 48); //meh Ref<ImageTexture> resized_pic = Ref<ImageTexture>(memnew(ImageTexture)); @@ -5778,10 +5781,6 @@ EditorNode::EditorNode() { import_csv_translation.instance(); ResourceFormatImporter::get_singleton()->add_importer(import_csv_translation); - Ref<ResourceImporterCSV> import_csv; - import_csv.instance(); - ResourceFormatImporter::get_singleton()->add_importer(import_csv); - Ref<ResourceImporterWAV> import_wav; import_wav.instance(); ResourceFormatImporter::get_singleton()->add_importer(import_wav); @@ -6179,6 +6178,9 @@ EditorNode::EditorNode() { project_settings = memnew(ProjectSettingsEditor(&editor_data)); gui_base->add_child(project_settings); + scene_import_settings = memnew(SceneImportSettings); + gui_base->add_child(scene_import_settings); + export_template_manager = memnew(ExportTemplateManager); gui_base->add_child(export_template_manager); @@ -6467,8 +6469,8 @@ EditorNode::EditorNode() { video_driver->connect("item_selected", callable_mp(this, &EditorNode::_video_driver_selected)); video_driver->add_theme_font_override("font", gui_base->get_theme_font("bold", "EditorFonts")); video_driver->add_theme_font_size_override("font_size", gui_base->get_theme_font_size("bold_size", "EditorFonts")); - // TODO re-enable when GLES2 is ported - video_driver->set_disabled(true); + // TODO: Show again when OpenGL is ported. + video_driver->set_visible(false); right_menu_hb->add_child(video_driver); #ifndef _MSC_VER diff --git a/editor/editor_node.h b/editor/editor_node.h index 91d873d16f..7e16936f5d 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -88,6 +88,7 @@ class Button; class VSplitContainer; class Window; class SubViewport; +class SceneImportSettings; class EditorNode : public Node { GDCLASS(EditorNode, Node); @@ -410,6 +411,7 @@ private: EditorResourcePreview *resource_preview; EditorFolding editor_folding; + SceneImportSettings *scene_import_settings; struct BottomPanelItem { String name; Control *control = nullptr; diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 2d7235038a..f46d677aec 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -621,7 +621,7 @@ public: const Ref<InputEventMouseButton> mb = p_ev; - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed() && hovered_index >= 0) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed() && hovered_index >= 0) { // Toggle the flag. // We base our choice on the hovered flag, so that it always matches the hovered flag. if (value & (1 << hovered_index)) { @@ -927,11 +927,11 @@ EditorPropertyFloat::EditorPropertyFloat() { void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) { const Ref<InputEventMouseButton> mb = p_ev; if (mb.is_valid()) { - if (mb->is_doubleclick() && mb->get_button_index() == BUTTON_LEFT) { + if (mb->is_doubleclick() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { _setup_spin(); } - if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { preset->set_position(easing_draw->get_screen_transform().xform(mb->get_position())); preset->popup(); @@ -940,7 +940,7 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) { easing_draw->update(); } - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { dragging = mb->is_pressed(); // Update to display the correct dragging color easing_draw->update(); @@ -949,7 +949,7 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) { const Ref<InputEventMouseMotion> mm = p_ev; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { float rel = mm->get_relative().x; if (rel == 0) { return; @@ -2814,7 +2814,7 @@ void EditorPropertyResource::_sub_inspector_object_id_selected(int p_id) { void EditorPropertyResource::_button_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { _update_menu_items(); Vector2 pos = get_screen_position() + mb->get_position(); //pos = assign->get_global_transform().xform(pos); @@ -2975,6 +2975,7 @@ void EditorPropertyResource::update_property() { if (res == RES()) { assign->set_icon(Ref<Texture2D>()); assign->set_text(TTR("[empty]")); + assign->set_custom_minimum_size(Size2(1, 1)); } else { assign->set_icon(EditorNode::get_singleton()->get_object_icon(res.operator->(), "Object")); diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp index 77288be614..138830cdc6 100644 --- a/editor/editor_resource_preview.cpp +++ b/editor/editor_resource_preview.cpp @@ -174,7 +174,7 @@ void EditorResourcePreview::_generate_preview(Ref<ImageTexture> &r_texture, Ref< } if (!r_small_texture.is_valid() && r_texture.is_valid() && preview_generators[i]->generate_small_preview_automatically()) { - Ref<Image> small_image = r_texture->get_data(); + Ref<Image> small_image = r_texture->get_image(); small_image = small_image->duplicate(); small_image->resize(small_thumbnail_size, small_thumbnail_size, Image::INTERPOLATE_CUBIC); r_small_texture.instance(); diff --git a/editor/editor_run_native.cpp b/editor/editor_run_native.cpp index 9b92134368..1ffa20d1ea 100644 --- a/editor/editor_run_native.cpp +++ b/editor/editor_run_native.cpp @@ -43,7 +43,7 @@ void EditorRunNative::_notification(int p_what) { } Ref<ImageTexture> icon = eep->get_run_icon(); if (!icon.is_null()) { - Ref<Image> im = icon->get_data(); + Ref<Image> im = icon->get_image(); im = im->duplicate(); im->clear_mipmaps(); if (!im->is_empty()) { diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 814925f5c6..4ddae7c062 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -460,7 +460,6 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { hints["interface/theme/custom_theme"] = PropertyInfo(Variant::STRING, "interface/theme/custom_theme", PROPERTY_HINT_GLOBAL_FILE, "*.res,*.tres,*.theme", PROPERTY_USAGE_DEFAULT); // Scene tabs - _initial_set("interface/scene_tabs/show_extension", false); _initial_set("interface/scene_tabs/show_thumbnail_on_hover", true); _initial_set("interface/scene_tabs/resize_if_many_tabs", true); _initial_set("interface/scene_tabs/minimum_width", 50); diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index bbabc08ea4..c09d78826c 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -53,7 +53,7 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { if (updown_offset != -1 && mb->get_position().x > updown_offset) { //there is an updown, so use it. @@ -84,7 +84,7 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) { grabbing_spinner_attempt = false; } } - } else if (mb->get_button_index() == BUTTON_WHEEL_UP || mb->get_button_index() == BUTTON_WHEEL_DOWN) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP || mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { if (grabber->is_visible()) { call_deferred("update"); } @@ -146,17 +146,17 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) { if (grabbing_grabber) { if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_WHEEL_UP) { + if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { set_value(get_value() + get_step()); mousewheel_over_grabber = true; - } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { set_value(get_value() - get_step()); mousewheel_over_grabber = true; } } } - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { grabbing_grabber = true; if (!mousewheel_over_grabber) { diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 9aad1aa8d9..35cf330714 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -91,7 +91,7 @@ static Ref<Texture2D> flip_icon(Ref<Texture2D> p_texture, bool p_flip_y = false, } Ref<ImageTexture> texture(memnew(ImageTexture)); - Ref<Image> img = p_texture->get_data(); + Ref<Image> img = p_texture->get_image(); img = img->duplicate(); if (p_flip_y) { @@ -561,7 +561,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { style_tab_disabled->set_border_color(disabled_color); // Editor background - theme->set_stylebox("Background", "EditorStyles", make_flat_stylebox(background_color, default_margin_size, default_margin_size, default_margin_size, default_margin_size)); + Color background_color_opaque = background_color; + background_color_opaque.a = 1.0; + theme->set_stylebox("Background", "EditorStyles", make_flat_stylebox(background_color_opaque, default_margin_size, default_margin_size, default_margin_size, default_margin_size)); // Focus Ref<StyleBoxFlat> style_focus = style_default->duplicate(); @@ -1260,6 +1262,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // FileDialog theme->set_icon("folder", "FileDialog", theme->get_icon("Folder", "EditorIcons")); theme->set_icon("parent_folder", "FileDialog", theme->get_icon("ArrowUp", "EditorIcons")); + theme->set_icon("back_folder", "FileDialog", theme->get_icon("Back", "EditorIcons")); + theme->set_icon("forward_folder", "FileDialog", theme->get_icon("Forward", "EditorIcons")); theme->set_icon("reload", "FileDialog", theme->get_icon("Reload", "EditorIcons")); theme->set_icon("toggle_hidden", "FileDialog", theme->get_icon("GuiVisibilityVisible", "EditorIcons")); // Use a different color for folder icons to make them easier to distinguish from files. diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 99d36cfe8d..d6ae901ca9 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -944,8 +944,41 @@ void FileSystemDock::_select_file(const String &p_path, bool p_select_in_favorit fpath = fpath.substr(0, fpath.length() - 1); } } else if (fpath != "Favorites") { + if (FileAccess::exists(fpath + ".import")) { + Ref<ConfigFile> config; + config.instance(); + Error err = config->load(fpath + ".import"); + if (err == OK) { + if (config->has_section_key("remap", "importer")) { + String importer = config->get_value("remap", "importer"); + if (importer == "keep") { + EditorNode::get_singleton()->show_warning(TTR("Importing has been disabled for this file, so it can't be opened for editing.")); + return; + } + } + } + } + if (ResourceLoader::get_resource_type(fpath) == "PackedScene") { - editor->open_request(fpath); + bool is_imported = false; + + { + List<String> importer_exts; + ResourceImporterScene::get_singleton()->get_recognized_extensions(&importer_exts); + String extension = fpath.get_extension(); + for (List<String>::Element *E = importer_exts.front(); E; E = E->next()) { + if (extension.nocasecmp_to(E->get()) == 0) { + is_imported = true; + break; + } + } + } + + if (is_imported) { + ResourceImporterScene::get_singleton()->show_advanced_options(fpath); + } else { + editor->open_request(fpath); + } } else { editor->load_resource(fpath); } @@ -2626,7 +2659,10 @@ void FileSystemDock::_update_import_dock() { break; } - String type = cf->get_value("remap", "type"); + String type; + if (cf->has_section_key("remap", "type")) { + type = cf->get_value("remap", "type"); + } if (import_type == "") { import_type = type; } else if (import_type != type) { diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp index 0d361730ef..080393e570 100644 --- a/editor/import/editor_import_collada.cpp +++ b/editor/import/editor_import_collada.cpp @@ -79,6 +79,9 @@ struct ColladaImport { Vector<int> valid_animated_properties; Map<String, bool> bones_with_animation; + Set<String> mesh_unique_names; + Set<String> material_unique_names; + Error _populate_skeleton(Skeleton3D *p_skeleton, Collada::Node *p_node, int &r_bone, int p_parent); Error _create_scene_skeletons(Collada::Node *p_node); Error _create_scene(Collada::Node *p_node, Node3D *p_parent); @@ -326,12 +329,25 @@ Error ColladaImport::_create_material(const String &p_target) { Ref<StandardMaterial3D> material = memnew(StandardMaterial3D); + String base_name; if (src_mat.name != "") { - material->set_name(src_mat.name); + base_name = src_mat.name; } else if (effect.name != "") { - material->set_name(effect.name); + base_name = effect.name; + } else { + base_name = "Material"; } + String name = base_name; + int counter = 2; + while (material_unique_names.has(name)) { + name = base_name + itos(counter++); + } + + material_unique_names.insert(name); + + material->set_name(name); + // DIFFUSE if (effect.diffuse.texture != "") { @@ -1128,7 +1144,22 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres ERR_FAIL_COND_V(!collada.state.mesh_data_map.has(meshid), ERR_INVALID_DATA); mesh = Ref<EditorSceneImporterMesh>(memnew(EditorSceneImporterMesh)); const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid]; - mesh->set_name(meshdata.name); + String name = meshdata.name; + if (name == "") { + name = "Mesh"; + } + int counter = 2; + while (mesh_unique_names.has(name)) { + name = meshdata.name; + if (name == "") { + name = "Mesh"; + } + name += itos(counter++); + } + + mesh_unique_names.insert(name); + + mesh->set_name(name); Error err = _create_mesh_surfaces(morphs.size() == 0, mesh, ng2->material_map, meshdata, apply_xform, bone_remap, skin, morph, morphs, p_use_compression, use_mesh_builtin_materials); ERR_FAIL_COND_V_MSG(err, err, "Cannot create mesh surface."); @@ -1645,16 +1676,23 @@ void EditorSceneImporterCollada::get_extensions(List<String> *r_extensions) cons } Node *EditorSceneImporterCollada::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; + } ColladaImport state; uint32_t flags = Collada::IMPORT_FLAG_SCENE; if (p_flags & IMPORT_ANIMATION) { flags |= Collada::IMPORT_FLAG_ANIMATION; } - state.use_mesh_builtin_materials = !(p_flags & IMPORT_MATERIALS_IN_INSTANCES); + 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, p_flags & EditorSceneImporter::IMPORT_USE_COMPRESSION); + Error err = state.load(p_path, flags, p_flags & EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS, 0); + + if (r_err) { + *r_err = err; + } ERR_FAIL_COND_V_MSG(err != OK, nullptr, "Cannot load scene from file '" + p_path + "'."); @@ -1674,7 +1712,7 @@ Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_ } if (p_flags & IMPORT_ANIMATION) { - state.create_animations(p_flags & IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS, p_flags & EditorSceneImporter::IMPORT_ANIMATION_KEEP_VALUE_TRACKS); + state.create_animations(true, true); AnimationPlayer *ap = memnew(AnimationPlayer); for (int i = 0; i < state.animations.size(); i++) { String name; @@ -1684,12 +1722,6 @@ Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_ name = state.animations[i]->get_name(); } - if (p_flags & IMPORT_ANIMATION_DETECT_LOOP) { - if (name.begins_with("loop") || name.ends_with("loop") || name.begins_with("cycle") || name.ends_with("cycle")) { - state.animations.write[i]->set_loop(true); - } - } - ap->add_animation(name, state.animations[i]); } state.scene->add_child(ap); @@ -1707,7 +1739,7 @@ Ref<Animation> EditorSceneImporterCollada::import_animation(const String &p_path Error err = state.load(p_path, Collada::IMPORT_FLAG_ANIMATION, p_flags & EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS); ERR_FAIL_COND_V_MSG(err != OK, RES(), "Cannot load animation from file '" + p_path + "'."); - state.create_animations(p_flags & EditorSceneImporter::IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS, p_flags & EditorSceneImporter::IMPORT_ANIMATION_KEEP_VALUE_TRACKS); + state.create_animations(true, true); if (state.scene) { memdelete(state.scene); } @@ -1716,12 +1748,6 @@ Ref<Animation> EditorSceneImporterCollada::import_animation(const String &p_path return Ref<Animation>(); } Ref<Animation> anim = state.animations[0]; - String base = p_path.get_basename().to_lower(); - if (p_flags & IMPORT_ANIMATION_DETECT_LOOP) { - if (base.begins_with("loop") || base.ends_with("loop") || base.begins_with("cycle") || base.ends_with("cycle")) { - anim->set_loop(true); - } - } return anim; } diff --git a/editor/import/resource_importer_csv.cpp b/editor/import/resource_importer_csv.cpp deleted file mode 100644 index f621ce7855..0000000000 --- a/editor/import/resource_importer_csv.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/*************************************************************************/ -/* resource_importer_csv.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 "resource_importer_csv.h" - -#include "core/io/resource_saver.h" -#include "core/os/file_access.h" - -String ResourceImporterCSV::get_importer_name() const { - return "csv"; -} - -String ResourceImporterCSV::get_visible_name() const { - return "CSV"; -} - -void ResourceImporterCSV::get_recognized_extensions(List<String> *p_extensions) const { - p_extensions->push_back("csv"); -} - -String ResourceImporterCSV::get_save_extension() const { - return ""; //does not save a single resource -} - -String ResourceImporterCSV::get_resource_type() const { - return "TextFile"; -} - -bool ResourceImporterCSV::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { - return true; -} - -int ResourceImporterCSV::get_preset_count() const { - return 0; -} - -String ResourceImporterCSV::get_preset_name(int p_idx) const { - return ""; -} - -void ResourceImporterCSV::get_import_options(List<ImportOption> *r_options, int p_preset) const { -} - -Error ResourceImporterCSV::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) { - return OK; -} - -ResourceImporterCSV::ResourceImporterCSV() { -} diff --git a/editor/import/resource_importer_csv.h b/editor/import/resource_importer_csv.h deleted file mode 100644 index 0f137624b9..0000000000 --- a/editor/import/resource_importer_csv.h +++ /dev/null @@ -1,57 +0,0 @@ -/*************************************************************************/ -/* resource_importer_csv.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 RESOURCEIMPORTERCSV_H -#define RESOURCEIMPORTERCSV_H - -#include "core/io/resource_importer.h" - -class ResourceImporterCSV : public ResourceImporter { - GDCLASS(ResourceImporterCSV, ResourceImporter); - -public: - virtual String get_importer_name() const override; - virtual String get_visible_name() const override; - virtual void get_recognized_extensions(List<String> *p_extensions) const override; - virtual String get_save_extension() const override; - virtual String get_resource_type() const override; - - 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 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; - - ResourceImporterCSV(); -}; - -#endif // RESOURCEIMPORTERCSV_H diff --git a/editor/import/resource_importer_csv_translation.cpp b/editor/import/resource_importer_csv_translation.cpp index 7ea39ab3ef..4a4d9d8f06 100644 --- a/editor/import/resource_importer_csv_translation.cpp +++ b/editor/import/resource_importer_csv_translation.cpp @@ -32,7 +32,7 @@ #include "core/io/resource_saver.h" #include "core/os/file_access.h" -#include "core/string/compressed_translation.h" +#include "core/string/optimized_translation.h" #include "core/string/translation.h" String ResourceImporterCSVTranslation::get_importer_name() const { @@ -126,7 +126,7 @@ Error ResourceImporterCSVTranslation::import(const String &p_source_file, const Ref<Translation> xlt = translations[i]; if (compress) { - Ref<PHashTranslation> cxl = memnew(PHashTranslation); + Ref<OptimizedTranslation> cxl = memnew(OptimizedTranslation); cxl->generate(xlt); xlt = cxl; } diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp index 9111252943..5c522e3176 100644 --- a/editor/import/resource_importer_obj.cpp +++ b/editor/import/resource_importer_obj.cpp @@ -427,7 +427,7 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh>> &r_meshes, bool p_ Node *EditorOBJImporter::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) { List<Ref<Mesh>> meshes; - Error err = _parse_obj(p_path, meshes, false, p_flags & IMPORT_GENERATE_TANGENT_ARRAYS, p_flags & IMPORT_USE_COMPRESSION, Vector3(1, 1, 1), Vector3(0, 0, 0), r_missing_deps); + Error err = _parse_obj(p_path, meshes, false, p_flags & IMPORT_GENERATE_TANGENT_ARRAYS, 0, Vector3(1, 1, 1), Vector3(0, 0, 0), r_missing_deps); if (err != OK) { if (r_err) { diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index 14ecccc13e..9041b815ca 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -32,7 +32,9 @@ #include "core/io/resource_saver.h" #include "editor/editor_node.h" +#include "editor/import/scene_import_settings.h" #include "editor/import/scene_importer_mesh_node_3d.h" +#include "scene/3d/area_3d.h" #include "scene/3d/collision_shape_3d.h" #include "scene/3d/mesh_instance_3d.h" #include "scene/3d/navigation_region_3d.h" @@ -111,20 +113,14 @@ void EditorSceneImporter::_bind_methods() { BIND_CONSTANT(IMPORT_SCENE); BIND_CONSTANT(IMPORT_ANIMATION); - BIND_CONSTANT(IMPORT_ANIMATION_DETECT_LOOP); - BIND_CONSTANT(IMPORT_ANIMATION_OPTIMIZE); - BIND_CONSTANT(IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS); - BIND_CONSTANT(IMPORT_ANIMATION_KEEP_VALUE_TRACKS); - BIND_CONSTANT(IMPORT_GENERATE_TANGENT_ARRAYS); BIND_CONSTANT(IMPORT_FAIL_ON_MISSING_DEPENDENCIES); - BIND_CONSTANT(IMPORT_MATERIALS_IN_INSTANCES); - BIND_CONSTANT(IMPORT_USE_COMPRESSION); + BIND_CONSTANT(IMPORT_GENERATE_TANGENT_ARRAYS); + BIND_CONSTANT(IMPORT_USE_NAMED_SKIN_BINDS); } ///////////////////////////////// void EditorScenePostImport::_bind_methods() { BIND_VMETHOD(MethodInfo(Variant::OBJECT, "post_import", PropertyInfo(Variant::OBJECT, "scene"))); - ClassDB::bind_method(D_METHOD("get_source_folder"), &EditorScenePostImport::get_source_folder); ClassDB::bind_method(D_METHOD("get_source_file"), &EditorScenePostImport::get_source_file); } @@ -136,16 +132,11 @@ Node *EditorScenePostImport::post_import(Node *p_scene) { return p_scene; } -String EditorScenePostImport::get_source_folder() const { - return source_folder; -} - String EditorScenePostImport::get_source_file() const { return source_file; } -void EditorScenePostImport::init(const String &p_source_folder, const String &p_source_file) { - source_folder = p_source_folder; +void EditorScenePostImport::init(const String &p_source_file) { source_file = p_source_file; } @@ -183,29 +174,9 @@ bool ResourceImporterScene::get_option_visibility(const String &p_option, const if (p_option != "animation/import" && !bool(p_options["animation/import"])) { return false; } - - if (p_option == "animation/keep_custom_tracks" && int(p_options["animation/storage"]) == 0) { - return false; - } - - if (p_option.begins_with("animation/optimizer/") && p_option != "animation/optimizer/enabled" && !bool(p_options["animation/optimizer/enabled"])) { - return false; - } - - if (p_option.begins_with("animation/clip_")) { - int max_clip = p_options["animation/clips/amount"]; - int clip = p_option.get_slice("/", 1).get_slice("_", 1).to_int() - 1; - if (clip >= max_clip) { - return false; - } - } - } - - if (p_option == "materials/keep_on_reimport" && int(p_options["materials/storage"]) == 0) { - return false; } - if (p_option == "meshes/lightmap_texel_size" && int(p_options["meshes/light_baking"]) < 2) { + if (p_option == "meshes/lightmap_texel_size" && int(p_options["meshes/light_baking"]) < 3) { return false; } @@ -213,34 +184,11 @@ bool ResourceImporterScene::get_option_visibility(const String &p_option, const } int ResourceImporterScene::get_preset_count() const { - return PRESET_MAX; + return 0; } String ResourceImporterScene::get_preset_name(int p_idx) const { - switch (p_idx) { - case PRESET_SINGLE_SCENE: - return TTR("Import as Single Scene"); - case PRESET_SEPARATE_ANIMATIONS: - return TTR("Import with Separate Animations"); - case PRESET_SEPARATE_MATERIALS: - return TTR("Import with Separate Materials"); - case PRESET_SEPARATE_MESHES: - return TTR("Import with Separate Objects"); - case PRESET_SEPARATE_MESHES_AND_MATERIALS: - return TTR("Import with Separate Objects+Materials"); - case PRESET_SEPARATE_MESHES_AND_ANIMATIONS: - return TTR("Import with Separate Objects+Animations"); - case PRESET_SEPARATE_MATERIALS_AND_ANIMATIONS: - return TTR("Import with Separate Materials+Animations"); - case PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS: - return TTR("Import with Separate Objects+Materials+Animations"); - case PRESET_MULTIPLE_SCENES: - return TTR("Import as Multiple Scenes"); - case PRESET_MULTIPLE_SCENES_AND_MATERIALS: - return TTR("Import as Multiple Scenes+Materials"); - } - - return ""; + return String(); } static bool _teststr(const String &p_what, const String &p_str) { @@ -286,6 +234,7 @@ static String _fixstr(const String &p_what, const String &p_str) { } static void _gen_shape_list(const Ref<Mesh> &mesh, List<Ref<Shape3D>> &r_shape_list, bool p_convex) { + ERR_FAIL_NULL_MSG(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); @@ -299,10 +248,25 @@ static void _gen_shape_list(const Ref<Mesh> &mesh, List<Ref<Shape3D>> &r_shape_l } } -Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>, List<Ref<Shape3D>>> &collision_map, LightBakeMode p_light_bake_mode) { +static void _pre_gen_shape_list(const Ref<EditorSceneImporterMesh> &mesh, List<Ref<Shape3D>> &r_shape_list, bool p_convex) { + ERR_FAIL_NULL_MSG(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); + } else { + Vector<Ref<Shape3D>> cd = mesh->convex_decompose(); + if (cd.size()) { + for (int i = 0; i < cd.size(); i++) { + r_shape_list.push_back(cd[i]); + } + } + } +} + +Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<EditorSceneImporterMesh>, List<Ref<Shape3D>>> &collision_map) { // children first for (int i = 0; i < p_node->get_child_count(); i++) { - Node *r = _fix_node(p_node->get_child(i), p_root, collision_map, p_light_bake_mode); + Node *r = _pre_fix_node(p_node->get_child(i), p_root, collision_map); if (!r) { i--; //was erased } @@ -317,33 +281,29 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> return nullptr; } - if (Object::cast_to<MeshInstance3D>(p_node)) { - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); + if (Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); - Ref<ArrayMesh> m = mi->get_mesh(); + Ref<EditorSceneImporterMesh> m = mi->get_mesh(); if (m.is_valid()) { for (int i = 0; i < m->get_surface_count(); i++) { - Ref<StandardMaterial3D> mat = m->surface_get_material(i); + Ref<BaseMaterial3D> mat = m->get_surface_material(i); if (!mat.is_valid()) { continue; } if (_teststr(mat->get_name(), "alpha")) { - mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA); + mat->set_transparency(BaseMaterial3D::TRANSPARENCY_ALPHA); mat->set_name(_fixstr(mat->get_name(), "alpha")); } if (_teststr(mat->get_name(), "vcol")) { - mat->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true); - mat->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true); + mat->set_flag(BaseMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true); + mat->set_flag(BaseMaterial3D::FLAG_SRGB_VERTEX_COLOR, true); mat->set_name(_fixstr(mat->get_name(), "vcol")); } } } - - if (p_light_bake_mode != LIGHT_BAKE_DISABLED) { - mi->set_gi_mode(GeometryInstance3D::GI_MODE_BAKED); - } } if (Object::cast_to<AnimationPlayer>(p_node)) { @@ -367,6 +327,17 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> } } } + + String animname = E->get(); + const int loop_string_count = 3; + static const char *loop_strings[loop_string_count] = { "loops", "loop", "cycle" }; + for (int i = 0; i < loop_string_count; i++) { + if (_teststr(animname, loop_strings[i])) { + anim->set_loop(true); + animname = _fixstr(animname, loop_strings[i]); + ap->rename_animation(E->get(), animname); + } + } } } @@ -374,9 +345,9 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> if (isroot) { return p_node; } - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); if (mi) { - Ref<Mesh> mesh = mi->get_mesh(); + Ref<EditorSceneImporterMesh> mesh = mi->get_mesh(); if (mesh.is_valid()) { List<Ref<Shape3D>> shapes; @@ -384,10 +355,10 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> if (collision_map.has(mesh)) { shapes = collision_map[mesh]; } else if (_teststr(name, "colonly")) { - _gen_shape_list(mesh, shapes, false); + _pre_gen_shape_list(mesh, shapes, false); collision_map[mesh] = shapes; } else if (_teststr(name, "convcolonly")) { - _gen_shape_list(mesh, shapes, true); + _pre_gen_shape_list(mesh, shapes, true); collision_map[mesh] = shapes; } @@ -407,16 +378,7 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> memdelete(p_node); p_node = col; - int idx = 0; - for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) { - CollisionShape3D *cshape = memnew(CollisionShape3D); - cshape->set_shape(E->get()); - col->add_child(cshape); - - cshape->set_name("shape" + itos(idx)); - cshape->set_owner(col->get_owner()); - idx++; - } + _add_shapes(col, shapes); } } @@ -433,34 +395,30 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> BoxShape3D *boxShape = memnew(BoxShape3D); boxShape->set_size(Vector3(2, 2, 2)); colshape->set_shape(boxShape); - colshape->set_name("BoxShape3D"); } else if (empty_draw_type == "SINGLE_ARROW") { RayShape3D *rayShape = memnew(RayShape3D); rayShape->set_length(1); colshape->set_shape(rayShape); - colshape->set_name("RayShape3D"); Object::cast_to<Node3D>(sb)->rotate_x(Math_PI / 2); } else if (empty_draw_type == "IMAGE") { WorldMarginShape3D *world_margin_shape = memnew(WorldMarginShape3D); colshape->set_shape(world_margin_shape); - colshape->set_name("WorldMarginShape3D"); } else { SphereShape3D *sphereShape = memnew(SphereShape3D); sphereShape->set_radius(1); colshape->set_shape(sphereShape); - colshape->set_name("SphereShape3D"); } sb->add_child(colshape); colshape->set_owner(sb->get_owner()); } - } else if (_teststr(name, "rigid") && Object::cast_to<MeshInstance3D>(p_node)) { + } else if (_teststr(name, "rigid") && Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { if (isroot) { return p_node; } - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); - Ref<Mesh> mesh = mi->get_mesh(); + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); + Ref<EditorSceneImporterMesh> mesh = mi->get_mesh(); if (mesh.is_valid()) { List<Ref<Shape3D>> shapes; @@ -475,27 +433,17 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> p_node->replace_by(rigid_body); rigid_body->set_transform(mi->get_transform()); p_node = rigid_body; - mi->set_name("mesh"); mi->set_transform(Transform()); rigid_body->add_child(mi); mi->set_owner(rigid_body->get_owner()); - int idx = 0; - for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) { - CollisionShape3D *cshape = memnew(CollisionShape3D); - cshape->set_shape(E->get()); - rigid_body->add_child(cshape); - - cshape->set_name("shape" + itos(idx)); - cshape->set_owner(p_node->get_owner()); - idx++; - } + _add_shapes(rigid_body, shapes); } - } else if ((_teststr(name, "col") || (_teststr(name, "convcol"))) && Object::cast_to<MeshInstance3D>(p_node)) { - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); + } else if ((_teststr(name, "col") || (_teststr(name, "convcol"))) && Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); - Ref<Mesh> mesh = mi->get_mesh(); + Ref<EditorSceneImporterMesh> mesh = mi->get_mesh(); if (mesh.is_valid()) { List<Ref<Shape3D>> shapes; @@ -524,89 +472,38 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> if (shapes.size()) { StaticBody3D *col = memnew(StaticBody3D); - col->set_name("static_collision"); mi->add_child(col); col->set_owner(mi->get_owner()); - int idx = 0; - for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) { - CollisionShape3D *cshape = memnew(CollisionShape3D); - cshape->set_shape(E->get()); - col->add_child(cshape); - - cshape->set_name("shape" + itos(idx)); - cshape->set_owner(p_node->get_owner()); - - idx++; - } + _add_shapes(col, shapes); } } - } else if (_teststr(name, "navmesh") && Object::cast_to<MeshInstance3D>(p_node)) { + } else if (_teststr(name, "navmesh") && Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { if (isroot) { return p_node; } - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); - Ref<ArrayMesh> mesh = mi->get_mesh(); + Ref<EditorSceneImporterMesh> mesh = mi->get_mesh(); ERR_FAIL_COND_V(mesh.is_null(), nullptr); NavigationRegion3D *nmi = memnew(NavigationRegion3D); nmi->set_name(_fixstr(name, "navmesh")); - Ref<NavigationMesh> nmesh = memnew(NavigationMesh); - nmesh->create_from_mesh(mesh); + Ref<NavigationMesh> nmesh = mesh->create_navigation_mesh(); nmi->set_navigation_mesh(nmesh); Object::cast_to<Node3D>(nmi)->set_transform(mi->get_transform()); p_node->replace_by(nmi); memdelete(p_node); p_node = nmi; - } else if (_teststr(name, "vehicle")) { - if (isroot) { - return p_node; - } - - Node *owner = p_node->get_owner(); - Node3D *s = Object::cast_to<Node3D>(p_node); - VehicleBody3D *bv = memnew(VehicleBody3D); - String n = _fixstr(p_node->get_name(), "vehicle"); - bv->set_name(n); - p_node->replace_by(bv); - p_node->set_name(n); - bv->add_child(p_node); - bv->set_owner(owner); - p_node->set_owner(owner); - bv->set_transform(s->get_transform()); - s->set_transform(Transform()); - - p_node = bv; - - } else if (_teststr(name, "wheel")) { - if (isroot) { - return p_node; - } - Node *owner = p_node->get_owner(); - Node3D *s = Object::cast_to<Node3D>(p_node); - VehicleWheel3D *bv = memnew(VehicleWheel3D); - String n = _fixstr(p_node->get_name(), "wheel"); - bv->set_name(n); - p_node->replace_by(bv); - p_node->set_name(n); - bv->add_child(p_node); - bv->set_owner(owner); - p_node->set_owner(owner); - bv->set_transform(s->get_transform()); - s->set_transform(Transform()); - - p_node = bv; - - } else if (Object::cast_to<MeshInstance3D>(p_node)) { + } else if (Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { //last attempt, maybe collision inside the mesh data - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); - Ref<ArrayMesh> mesh = mi->get_mesh(); + Ref<EditorSceneImporterMesh> mesh = mi->get_mesh(); if (!mesh.is_null()) { List<Ref<Shape3D>> shapes; if (collision_map.has(mesh)) { @@ -623,19 +520,268 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> if (shapes.size()) { StaticBody3D *col = memnew(StaticBody3D); - col->set_name("static_collision"); p_node->add_child(col); col->set_owner(p_node->get_owner()); - int idx = 0; - for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) { - CollisionShape3D *cshape = memnew(CollisionShape3D); - cshape->set_shape(E->get()); - col->add_child(cshape); + _add_shapes(col, shapes); + } + } + } + + return p_node; +} + +Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref<EditorSceneImporterMesh>, List<Ref<Shape3D>>> &collision_map, Set<Ref<EditorSceneImporterMesh>> &r_scanned_meshes, const Dictionary &p_node_data, const Dictionary &p_material_data, const Dictionary &p_animation_data, float p_animation_fps) { + // children first + for (int i = 0; i < p_node->get_child_count(); i++) { + Node *r = _post_fix_node(p_node->get_child(i), p_root, collision_map, r_scanned_meshes, p_node_data, p_material_data, p_animation_data, p_animation_fps); + if (!r) { + i--; //was erased + } + } + + bool isroot = p_node == p_root; + + String import_id; + + if (p_node->has_meta("import_id")) { + import_id = p_node->get_meta("import_id"); + } else { + import_id = "PATH:" + p_root->get_path_to(p_node); + } + + Dictionary node_settings; + if (p_node_data.has(import_id)) { + node_settings = p_node_data[import_id]; + } + + if (!isroot && (node_settings.has("import/skip_import") && bool(node_settings["import/skip_import"]))) { + memdelete(p_node); + return nullptr; + } + + if (Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); + + Ref<EditorSceneImporterMesh> m = mi->get_mesh(); + + if (m.is_valid()) { + if (!r_scanned_meshes.has(m)) { + for (int i = 0; i < m->get_surface_count(); i++) { + Ref<Material> mat = m->get_surface_material(i); + if (mat.is_valid()) { + String mat_id; + if (mat->has_meta("import_id")) { + mat_id = mat->get_meta("import_id"); + } else { + mat_id = mat->get_name(); + } + + if (mat_id != String() && p_material_data.has(mat_id)) { + Dictionary matdata = p_material_data[mat_id]; + 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); + if (external_mat.is_valid()) { + m->set_surface_material(i, external_mat); + } + } + } + } + } + + r_scanned_meshes.insert(m); + } + + if (node_settings.has("generate/physics")) { + int mesh_physics_mode = node_settings["generate/physics"]; + + if (mesh_physics_mode != MESH_PHYSICS_DISABLED) { + List<Ref<Shape3D>> shapes; + + if (collision_map.has(m)) { + shapes = collision_map[m]; + } else { + switch (mesh_physics_mode) { + case MESH_PHYSICS_MESH_AND_STATIC_COLLIDER: { + _pre_gen_shape_list(m, shapes, false); + } break; + case MESH_PHYSICS_RIGID_BODY_AND_MESH: { + _pre_gen_shape_list(m, shapes, true); + } break; + case MESH_PHYSICS_STATIC_COLLIDER_ONLY: { + _pre_gen_shape_list(m, shapes, false); + } break; + case MESH_PHYSICS_AREA_ONLY: { + _pre_gen_shape_list(m, shapes, true); + } break; + } + } + + if (shapes.size()) { + CollisionObject3D *base = nullptr; + switch (mesh_physics_mode) { + case MESH_PHYSICS_MESH_AND_STATIC_COLLIDER: { + StaticBody3D *col = memnew(StaticBody3D); + p_node->add_child(col); + base = col; + } break; + case MESH_PHYSICS_RIGID_BODY_AND_MESH: { + RigidBody3D *rigid_body = memnew(RigidBody3D); + rigid_body->set_name(p_node->get_name()); + p_node->replace_by(rigid_body); + rigid_body->set_transform(mi->get_transform()); + p_node = rigid_body; + mi->set_transform(Transform()); + rigid_body->add_child(mi); + mi->set_owner(rigid_body->get_owner()); + base = rigid_body; + } break; + case MESH_PHYSICS_STATIC_COLLIDER_ONLY: { + StaticBody3D *col = memnew(StaticBody3D); + col->set_transform(mi->get_transform()); + col->set_name(p_node->get_name()); + p_node->replace_by(col); + memdelete(p_node); + p_node = col; + base = col; + } break; + case MESH_PHYSICS_AREA_ONLY: { + Area3D *area = memnew(Area3D); + area->set_transform(mi->get_transform()); + area->set_name(p_node->get_name()); + p_node->replace_by(area); + memdelete(p_node); + p_node = area; + base = area; + + } break; + } + + int idx = 0; + for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) { + CollisionShape3D *cshape = memnew(CollisionShape3D); + cshape->set_shape(E->get()); + base->add_child(cshape); + + cshape->set_owner(base->get_owner()); + idx++; + } + } + } + } + } + } + + //navmesh (node may have changed type above) + if (Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); - cshape->set_name("shape" + itos(idx)); - cshape->set_owner(p_node->get_owner()); - idx++; + Ref<EditorSceneImporterMesh> m = mi->get_mesh(); + + if (m.is_valid()) { + if (node_settings.has("generate/navmesh")) { + int navmesh_mode = node_settings["generate/navmesh"]; + + if (navmesh_mode != NAVMESH_DISABLED) { + NavigationRegion3D *nmi = memnew(NavigationRegion3D); + + Ref<NavigationMesh> nmesh = m->create_navigation_mesh(); + nmi->set_navigation_mesh(nmesh); + + if (navmesh_mode == NAVMESH_NAVMESH_ONLY) { + nmi->set_transform(mi->get_transform()); + p_node->replace_by(nmi); + memdelete(p_node); + p_node = nmi; + } else { + mi->add_child(nmi); + nmi->set_owner(mi->get_owner()); + } + } + } + } + } + + if (Object::cast_to<AnimationPlayer>(p_node)) { + AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(p_node); + + { + //make sure this is unique + node_settings = node_settings.duplicate(true); + //fill node settings for this node with default values + List<ImportOption> iopts; + get_internal_import_options(INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE, &iopts); + for (List<ImportOption>::Element *E = iopts.front(); E; E = E->next()) { + if (!node_settings.has(E->get().option.name)) { + node_settings[E->get().option.name] = E->get().default_value; + } + } + } + + 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"]; + float anim_optimizer_maxang = node_settings["optimizer/max_angle"]; + + if (use_optimizer) { + _optimize_animations(ap, anim_optimizer_linerr, anim_optimizer_angerr, anim_optimizer_maxang); + } + + Array animation_clips; + { + int clip_count = node_settings["clips/amount"]; + + for (int i = 0; i < clip_count; i++) { + 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"]; + 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"]; + + 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(save_to_file); + animation_clips.push_back(save_to_path); + animation_clips.push_back(save_to_file_keep_custom); + } + } + + if (animation_clips.size()) { + _create_clips(ap, animation_clips, true); + } else { + List<StringName> anims; + ap->get_animation_list(&anims); + for (List<StringName>::Element *E = anims.front(); E; E = E->next()) { + String name = E->get(); + Ref<Animation> anim = ap->get_animation(name); + if (p_animation_data.has(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 (List<ImportOption>::Element *F = iopts.front(); F; F = F->next()) { + if (!anim_settings.has(F->get().option.name)) { + anim_settings[F->get().option.name] = F->get().default_value; + } + } + } + + anim->set_loop(anim_settings["settings/loops"]); + 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"]; + + Ref<Animation> saved_anim = _save_animation_to_file(anim, save, path, keep_custom); + + if (saved_anim != anim) { + ap->add_animation(name, saved_anim); //replace + } } } } @@ -644,27 +790,52 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> return p_node; } -void ResourceImporterScene::_create_clips(Node *scene, const Array &p_clips, bool p_bake_all) { - if (!scene->has_node(String("AnimationPlayer"))) { - return; +Ref<Animation> ResourceImporterScene::_save_animation_to_file(Ref<Animation> anim, bool p_save_to_file, String p_save_to_path, bool p_keep_custom_tracks) { + if (!p_save_to_file || !p_save_to_path.is_resource_file()) { + return anim; } - Node *n = scene->get_node(String("AnimationPlayer")); - ERR_FAIL_COND(!n); - AnimationPlayer *anim = Object::cast_to<AnimationPlayer>(n); - ERR_FAIL_COND(!anim); + if (FileAccess::exists(p_save_to_path) && p_keep_custom_tracks) { + // Copy custom animation tracks from previously imported files. + Ref<Animation> old_anim = ResourceLoader::load(p_save_to_path, "Animation", ResourceFormatLoader::CACHE_MODE_IGNORE); + if (old_anim.is_valid()) { + for (int i = 0; i < old_anim->get_track_count(); i++) { + if (!old_anim->track_is_imported(i)) { + old_anim->copy_track(i, anim); + } + } + anim->set_loop(old_anim->has_loop()); + } + } + if (ResourceCache::has(p_save_to_path)) { + Ref<Animation> old_anim = Ref<Resource>(ResourceCache::get(p_save_to_path)); + if (old_anim.is_valid()) { + old_anim->copy_from(anim); + anim = old_anim; + } + } + anim->set_path(p_save_to_path, true); // Set path to save externally. + Error err = ResourceSaver::save(p_save_to_path, anim, ResourceSaver::FLAG_CHANGE_PATH); + ERR_FAIL_COND_V_MSG(err != OK, anim, "Saving of animation failed: " + p_save_to_path); + return anim; +} + +void ResourceImporterScene::_create_clips(AnimationPlayer *anim, const Array &p_clips, bool p_bake_all) { if (!anim->has_animation("default")) { return; } Ref<Animation> default_anim = anim->get_animation("default"); - for (int i = 0; i < p_clips.size(); i += 4) { + for (int i = 0; i < p_clips.size(); i += 7) { String name = p_clips[i]; float from = p_clips[i + 1]; float to = p_clips[i + 2]; bool loop = 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]; if (from >= to) { continue; } @@ -752,141 +923,17 @@ void ResourceImporterScene::_create_clips(Node *scene, const Array &p_clips, boo new_anim->set_loop(loop); new_anim->set_length(to - from); anim->add_animation(name, new_anim); - } - - anim->remove_animation("default"); //remove default (no longer needed) -} - -void ResourceImporterScene::_filter_anim_tracks(Ref<Animation> anim, Set<String> &keep) { - Ref<Animation> a = anim; - ERR_FAIL_COND(!a.is_valid()); - - for (int j = 0; j < a->get_track_count(); j++) { - String path = a->track_get_path(j); - if (!keep.has(path)) { - a->remove_track(j); - j--; + Ref<Animation> saved_anim = _save_animation_to_file(new_anim, save_to_file, save_to_path, keep_current); + if (saved_anim != new_anim) { + anim->add_animation(name, saved_anim); } } -} - -void ResourceImporterScene::_filter_tracks(Node *scene, const String &p_text) { - if (!scene->has_node(String("AnimationPlayer"))) { - return; - } - Node *n = scene->get_node(String("AnimationPlayer")); - ERR_FAIL_COND(!n); - AnimationPlayer *anim = Object::cast_to<AnimationPlayer>(n); - ERR_FAIL_COND(!anim); - - Vector<String> strings = p_text.split("\n"); - for (int i = 0; i < strings.size(); i++) { - strings.write[i] = strings[i].strip_edges(); - } - - List<StringName> anim_names; - anim->get_animation_list(&anim_names); - for (List<StringName>::Element *E = anim_names.front(); E; E = E->next()) { - String name = E->get(); - bool valid_for_this = false; - bool valid = false; - - Set<String> keep; - Set<String> keep_local; - - for (int i = 0; i < strings.size(); i++) { - if (strings[i].begins_with("@")) { - valid_for_this = false; - for (Set<String>::Element *F = keep_local.front(); F; F = F->next()) { - keep.insert(F->get()); - } - keep_local.clear(); - - Vector<String> filters = strings[i].substr(1, strings[i].length()).split(","); - for (int j = 0; j < filters.size(); j++) { - String fname = filters[j].strip_edges(); - if (fname == "") { - continue; - } - int fc = fname[0]; - bool plus; - if (fc == '+') { - plus = true; - } else if (fc == '-') { - plus = false; - } else { - continue; - } - String filter = fname.substr(1, fname.length()).strip_edges(); - - if (!name.matchn(filter)) { - continue; - } - valid_for_this = plus; - } - - if (valid_for_this) { - valid = true; - } - - } else if (valid_for_this) { - Ref<Animation> a = anim->get_animation(name); - if (!a.is_valid()) { - continue; - } - - for (int j = 0; j < a->get_track_count(); j++) { - String path = a->track_get_path(j); - - String tname = strings[i]; - if (tname == "") { - continue; - } - int fc = tname[0]; - bool plus; - if (fc == '+') { - plus = true; - } else if (fc == '-') { - plus = false; - } else { - continue; - } - - String filter = tname.substr(1, tname.length()).strip_edges(); - - if (!path.matchn(filter)) { - continue; - } - - if (plus) { - keep_local.insert(path); - } else if (!keep.has(path)) { - keep_local.erase(path); - } - } - } - } - - if (valid) { - for (Set<String>::Element *F = keep_local.front(); F; F = F->next()) { - keep.insert(F->get()); - } - _filter_anim_tracks(anim->get_animation(name), keep); - } - } + anim->remove_animation("default"); //remove default (no longer needed) } -void ResourceImporterScene::_optimize_animations(Node *scene, float p_max_lin_error, float p_max_ang_error, float p_max_angle) { - if (!scene->has_node(String("AnimationPlayer"))) { - return; - } - Node *n = scene->get_node(String("AnimationPlayer")); - ERR_FAIL_COND(!n); - AnimationPlayer *anim = Object::cast_to<AnimationPlayer>(n); - ERR_FAIL_COND(!anim); - +void ResourceImporterScene::_optimize_animations(AnimationPlayer *anim, float p_max_lin_error, float p_max_ang_error, float p_max_angle) { List<StringName> anim_names; anim->get_animation_list(&anim_names); for (List<StringName>::Element *E = anim_names.front(); E; E = E->next()) { @@ -895,208 +942,99 @@ void ResourceImporterScene::_optimize_animations(Node *scene, float p_max_lin_er } } -static String _make_extname(const String &p_str) { - String ext_name = p_str.replace(".", "_"); - ext_name = ext_name.replace(":", "_"); - ext_name = ext_name.replace("\"", "_"); - ext_name = ext_name.replace("<", "_"); - ext_name = ext_name.replace(">", "_"); - ext_name = ext_name.replace("/", "_"); - ext_name = ext_name.replace("|", "_"); - ext_name = ext_name.replace("\\", "_"); - ext_name = ext_name.replace("?", "_"); - ext_name = ext_name.replace("*", "_"); - - return ext_name; -} - -void ResourceImporterScene::_find_meshes(Node *p_node, Map<Ref<ArrayMesh>, Transform> &meshes) { - List<PropertyInfo> pi; - p_node->get_property_list(&pi); - - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); - - if (mi) { - Ref<ArrayMesh> mesh = mi->get_mesh(); - - if (mesh.is_valid() && !meshes.has(mesh)) { - Node3D *s = mi; - Transform transform; - while (s) { - transform = transform * s->get_transform(); - s = Object::cast_to<Node3D>(s->get_parent()); +void ResourceImporterScene::get_internal_import_options(InternalImportCategory p_category, List<ImportOption> *r_options) const { + switch (p_category) { + case INTERNAL_IMPORT_CATEGORY_NODE: { + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "import/skip_import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + } break; + case INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE: { + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "import/skip_import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "generate/physics", PROPERTY_HINT_ENUM, "Disabled,Mesh + Static Collider,Rigid Body + Mesh,Static Collider Only,Area Only"), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "generate/navmesh", PROPERTY_HINT_ENUM, "Disabled,Mesh + NavMesh,NavMesh Only"), 0)); + } break; + case INTERNAL_IMPORT_CATEGORY_MESH: { + 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/make_streamable"), "")); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "generate/shadow_meshes", PROPERTY_HINT_ENUM, "Default,Enable,Disable"), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "generate/lightmap_uv", PROPERTY_HINT_ENUM, "Default,Enable,Disable"), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "generate/lods", PROPERTY_HINT_ENUM, "Default,Enable,Disable"), 0)); + } break; + case INTERNAL_IMPORT_CATEGORY_MATERIAL: { + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "use_external/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + 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::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"), "")); + } break; + case INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE: { + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "import/skip_import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "optimizer/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true)); + 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::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::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)); } - - meshes[mesh] = transform; + } break; + default: { } } - for (int i = 0; i < p_node->get_child_count(); i++) { - _find_meshes(p_node->get_child(i), meshes); - } } -void ResourceImporterScene::_make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_animations_as_text, bool p_keep_animations, bool p_make_materials, bool p_materials_as_text, bool p_keep_materials, bool p_make_meshes, bool p_meshes_as_text, Map<Ref<Animation>, Ref<Animation>> &p_animations, Map<Ref<Material>, Ref<Material>> &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh>> &p_meshes) { - List<PropertyInfo> pi; - - if (p_make_animations) { - if (Object::cast_to<AnimationPlayer>(p_node)) { - AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(p_node); - - List<StringName> anims; - ap->get_animation_list(&anims); - for (List<StringName>::Element *E = anims.front(); E; E = E->next()) { - Ref<Animation> anim = ap->get_animation(E->get()); - ERR_CONTINUE(anim.is_null()); - - if (!p_animations.has(anim)) { - // Tracks from source file should be set as imported, anything else is a custom track. - for (int i = 0; i < anim->get_track_count(); i++) { - anim->track_set_imported(i, true); - } - - String ext_name; - - if (p_animations_as_text) { - ext_name = p_base_path.plus_file(_make_extname(E->get()) + ".tres"); - } else { - ext_name = p_base_path.plus_file(_make_extname(E->get()) + ".anim"); - } - - if (FileAccess::exists(ext_name) && p_keep_animations) { - // Copy custom animation tracks from previously imported files. - Ref<Animation> old_anim = ResourceLoader::load(ext_name, "Animation", ResourceFormatLoader::CACHE_MODE_IGNORE); - if (old_anim.is_valid()) { - for (int i = 0; i < old_anim->get_track_count(); i++) { - if (!old_anim->track_is_imported(i)) { - old_anim->copy_track(i, anim); - } - } - anim->set_loop(old_anim->has_loop()); - } - } - - anim->set_path(ext_name, true); // Set path to save externally. - ResourceSaver::save(ext_name, anim, ResourceSaver::FLAG_CHANGE_PATH); - p_animations[anim] = anim; - } +bool ResourceImporterScene::get_internal_option_visibility(InternalImportCategory p_category, const String &p_option, const Map<StringName, Variant> &p_options) const { + if (p_options.has("import/skip_import") && p_option != "import/skip_import" && bool(p_options["import/skip_import"])) { + return false; //if skip import + } + switch (p_category) { + case INTERNAL_IMPORT_CATEGORY_NODE: { + } break; + case INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE: { + } break; + case INTERNAL_IMPORT_CATEGORY_MESH: { + if (p_option == "save_to_file/path" || p_option == "save_to_file/make_streamable") { + return p_options["save_to_file/enabled"]; + } + } break; + case INTERNAL_IMPORT_CATEGORY_MATERIAL: { + if (p_option == "use_external/path") { + return p_options["use_external/enabled"]; + } + } break; + case INTERNAL_IMPORT_CATEGORY_ANIMATION: { + if (p_option == "save_to_file/path" || p_option == "save_to_file/keep_custom_tracks") { + return p_options["save_to_file/enabled"]; + } + } 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"])) { + return false; } - } - } - - p_node->get_property_list(&pi); - - for (List<PropertyInfo>::Element *E = pi.front(); E; E = E->next()) { - if (E->get().type == Variant::OBJECT) { - Ref<Material> mat = p_node->get(E->get().name); - - if (p_make_materials && mat.is_valid() && mat->get_name() != "") { - if (!p_materials.has(mat)) { - String ext_name; - - if (p_materials_as_text) { - ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".tres"); - } else { - ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".material"); - } - - if (p_keep_materials && FileAccess::exists(ext_name)) { - //if exists, use it - p_materials[mat] = ResourceLoader::load(ext_name); - } else { - ResourceSaver::save(ext_name, mat, ResourceSaver::FLAG_CHANGE_PATH); - p_materials[mat] = ResourceLoader::load(ext_name, "", ResourceFormatLoader::CACHE_MODE_IGNORE); // disable loading from the cache. - } - } - - if (p_materials[mat] != mat) { - p_node->set(E->get().name, p_materials[mat]); - } - } else { - Ref<ArrayMesh> mesh = p_node->get(E->get().name); - - if (mesh.is_valid()) { - bool mesh_just_added = false; - - if (p_make_meshes) { - if (!p_meshes.has(mesh)) { - //meshes are always overwritten, keeping them is not practical - String ext_name; - - if (p_meshes_as_text) { - ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".tres"); - } else { - ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".mesh"); - } - - ResourceSaver::save(ext_name, mesh, ResourceSaver::FLAG_CHANGE_PATH); - p_meshes[mesh] = ResourceLoader::load(ext_name); - p_node->set(E->get().name, p_meshes[mesh]); - mesh_just_added = true; - } - } - - if (p_make_materials) { - if (mesh_just_added || !p_meshes.has(mesh)) { - for (int i = 0; i < mesh->get_surface_count(); i++) { - mat = mesh->surface_get_material(i); - - if (!mat.is_valid()) { - continue; - } - if (mat->get_name() == "") { - continue; - } - - if (!p_materials.has(mat)) { - String ext_name; - - if (p_materials_as_text) { - ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".tres"); - } else { - ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".material"); - } - - if (p_keep_materials && FileAccess::exists(ext_name)) { - //if exists, use it - p_materials[mat] = ResourceLoader::load(ext_name); - } else { - ResourceSaver::save(ext_name, mat, ResourceSaver::FLAG_CHANGE_PATH); - p_materials[mat] = ResourceLoader::load(ext_name, "", ResourceFormatLoader::CACHE_MODE_IGNORE); // disable loading from the cache. - } - } - - if (p_materials[mat] != mat) { - mesh->surface_set_material(i, p_materials[mat]); - - //re-save the mesh since a material is now assigned - if (p_make_meshes) { - String ext_name; - - if (p_meshes_as_text) { - ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".tres"); - } else { - ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".mesh"); - } - - ResourceSaver::save(ext_name, mesh, ResourceSaver::FLAG_CHANGE_PATH); - p_meshes[mesh] = ResourceLoader::load(ext_name); - } - } - } - if (!p_make_meshes) { - p_meshes[mesh] = Ref<ArrayMesh>(); //save it anyway, so it won't be checked again - } - } - } + 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 (slice >= max_slice) { + return false; } } + } break; + default: { } } - for (int i = 0; i < p_node->get_child_count(); i++) { - _make_external_resources(p_node->get_child(i), p_base_path, p_make_animations, p_animations_as_text, p_keep_animations, p_make_materials, p_materials_as_text, p_keep_materials, p_make_meshes, p_meshes_as_text, p_animations, p_materials, p_meshes); - } + return true; } void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, int p_preset) const { @@ -1115,42 +1053,18 @@ void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, in script_ext_hint += "*." + E->get(); } - bool materials_out = p_preset == PRESET_SEPARATE_MATERIALS || p_preset == PRESET_SEPARATE_MESHES_AND_MATERIALS || p_preset == PRESET_MULTIPLE_SCENES_AND_MATERIALS || p_preset == PRESET_SEPARATE_MATERIALS_AND_ANIMATIONS || p_preset == PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS; - bool meshes_out = p_preset == PRESET_SEPARATE_MESHES || p_preset == PRESET_SEPARATE_MESHES_AND_MATERIALS || p_preset == PRESET_SEPARATE_MESHES_AND_ANIMATIONS || p_preset == PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS; - bool scenes_out = p_preset == PRESET_MULTIPLE_SCENES || p_preset == PRESET_MULTIPLE_SCENES_AND_MATERIALS; - bool animations_out = p_preset == PRESET_SEPARATE_ANIMATIONS || p_preset == PRESET_SEPARATE_MESHES_AND_ANIMATIONS || p_preset == PRESET_SEPARATE_MATERIALS_AND_ANIMATIONS || p_preset == PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS; - r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "nodes/root_scale", PROPERTY_HINT_RANGE, "0.001,1000,0.001"), 1.0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "nodes/custom_script", PROPERTY_HINT_FILE, script_ext_hint), "")); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "nodes/storage", PROPERTY_HINT_ENUM, "Single Scene,Instanced Sub-Scenes"), scenes_out ? 1 : 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "materials/location", PROPERTY_HINT_ENUM, "Node,Mesh"), (meshes_out || materials_out) ? 1 : 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "materials/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.material),Files (.tres)", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), materials_out ? 1 : 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "materials/keep_on_reimport"), materials_out)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "meshes/ensure_tangents"), true)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.mesh),Files (.tres)"), meshes_out ? 1 : 0)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "meshes/generate_lods"), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "meshes/create_shadow_meshes"), true)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/light_baking", PROPERTY_HINT_ENUM, "Disabled,Enable,Gen Lightmaps", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/light_baking", PROPERTY_HINT_ENUM, "Disabled,Dynamic,Static,Static Lightmaps", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 2)); 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, "external_files/store_in_subdir"), false)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/import"), 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::STRING, "animation/filter_script", PROPERTY_HINT_MULTILINE_TEXT), "")); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.anim),Files (.tres)", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), animations_out)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/keep_custom_tracks"), animations_out)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/optimizer/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true)); - r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/optimizer/max_linear_error"), 0.05)); - r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/optimizer/max_angular_error"), 0.01)); - r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/optimizer/max_angle"), 22)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/optimizer/remove_unused_tracks"), true)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/clips/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, "animation/clip_" + itos(i + 1) + "/name"), "")); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/clip_" + itos(i + 1) + "/start_frame"), 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/clip_" + itos(i + 1) + "/end_frame"), 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/clip_" + itos(i + 1) + "/loops"), false)); - } + 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())); } void ResourceImporterScene::_replace_owner(Node *p_node, Node *p_scene, Node *p_new_owner) { @@ -1222,7 +1136,7 @@ Ref<Animation> ResourceImporterScene::import_animation_from_other_importer(Edito return importer->import_animation(p_path, p_flags, p_bake_fps); } -void ResourceImporterScene::_generate_meshes(Node *p_node, bool p_generate_lods, bool p_create_shadow_meshes) { +void ResourceImporterScene::_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<uint8_t> &r_dst_lightmap_cache) { EditorSceneImporterMeshNode3D *src_mesh_node = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); if (src_mesh_node) { //is mesh @@ -1235,14 +1149,94 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, bool p_generate_lods, Ref<ArrayMesh> mesh; if (!src_mesh_node->get_mesh()->has_mesh()) { //do mesh processing - if (p_generate_lods) { + + bool generate_lods = p_generate_lods; + bool create_shadow_meshes = p_create_shadow_meshes; + bool bake_lightmaps = p_light_bake_mode == LIGHT_BAKE_STATIC_LIGHTMAPS; + String save_to_file; + + String mesh_id; + + if (src_mesh_node->get_mesh()->has_meta("import_id")) { + mesh_id = src_mesh_node->get_mesh()->get_meta("import_id"); + } else { + mesh_id = src_mesh_node->get_mesh()->get_name(); + } + + if (mesh_id != String() && p_mesh_data.has(mesh_id)) { + Dictionary mesh_settings = p_mesh_data[mesh_id]; + + if (mesh_settings.has("generate/shadow_meshes")) { + int shadow_meshes = mesh_settings["generate/shadow_meshes"]; + if (shadow_meshes == MESH_OVERRIDE_ENABLE) { + create_shadow_meshes = true; + } else if (shadow_meshes == MESH_OVERRIDE_DISABLE) { + create_shadow_meshes = false; + } + } + + if (mesh_settings.has("generate/lightmap_uv")) { + int lightmap_uv = mesh_settings["generate/lightmap_uv"]; + if (lightmap_uv == MESH_OVERRIDE_ENABLE) { + bake_lightmaps = true; + } else if (lightmap_uv == MESH_OVERRIDE_DISABLE) { + bake_lightmaps = false; + } + } + + if (mesh_settings.has("generate/lods")) { + int lods = mesh_settings["generate/lods"]; + if (lods == MESH_OVERRIDE_ENABLE) { + generate_lods = true; + } else if (lods == MESH_OVERRIDE_DISABLE) { + generate_lods = false; + } + } + + if (mesh_settings.has("save_to_file/enabled") && bool(mesh_settings["save_to_file/enabled"]) && mesh_settings.has("save_to_file/path")) { + save_to_file = mesh_settings["save_to_file/path"]; + if (!save_to_file.is_resource_file()) { + save_to_file = ""; + } + } + } + + if (generate_lods) { src_mesh_node->get_mesh()->generate_lods(); } - if (p_create_shadow_meshes) { + if (create_shadow_meshes) { src_mesh_node->get_mesh()->create_shadow_mesh(); } + + if (bake_lightmaps) { + Transform xf; + Node3D *n = src_mesh_node; + while (n) { + xf = n->get_transform() * xf; + n = n->get_parent_spatial(); + } + + //use xf as transform for mesh, and bake it + } + + if (save_to_file != String()) { + Ref<Mesh> existing = Ref<Resource>(ResourceCache::get(save_to_file)); + if (existing.is_valid()) { + //if somehow an existing one is useful, create + existing->reset_state(); + } + mesh = src_mesh_node->get_mesh()->get_mesh(existing); + + ResourceSaver::save(save_to_file, mesh); //override + + mesh->set_path(save_to_file, true); //takeover existing, if needed + + } else { + mesh = src_mesh_node->get_mesh()->get_mesh(); + } + } else { + mesh = src_mesh_node->get_mesh()->get_mesh(); } - mesh = src_mesh_node->get_mesh()->get_mesh(); if (mesh.is_valid()) { mesh_node->set_mesh(mesh); @@ -1251,15 +1245,78 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, bool p_generate_lods, } } } + + switch (p_light_bake_mode) { + case LIGHT_BAKE_DISABLED: { + mesh_node->set_gi_mode(GeometryInstance3D::GI_MODE_DISABLED); + } break; + case LIGHT_BAKE_DYNAMIC: { + mesh_node->set_gi_mode(GeometryInstance3D::GI_MODE_DYNAMIC); + } break; + case LIGHT_BAKE_STATIC: + case LIGHT_BAKE_STATIC_LIGHTMAPS: { + mesh_node->set_gi_mode(GeometryInstance3D::GI_MODE_BAKED); + } break; + } + p_node->replace_by(mesh_node); memdelete(p_node); p_node = mesh_node; } for (int i = 0; i < p_node->get_child_count(); i++) { - _generate_meshes(p_node->get_child(i), p_generate_lods, p_create_shadow_meshes); + _generate_meshes(p_node->get_child(i), p_mesh_data, p_generate_lods, p_create_shadow_meshes, p_light_bake_mode, p_lightmap_texel_size, p_src_lightmap_cache, r_dst_lightmap_cache); + } +} + +void ResourceImporterScene::_add_shapes(Node *p_node, const List<Ref<Shape3D>> &p_shapes) { + for (const List<Ref<Shape3D>>::Element *E = p_shapes.front(); E; E = E->next()) { + CollisionShape3D *cshape = memnew(CollisionShape3D); + cshape->set_shape(E->get()); + p_node->add_child(cshape); + + cshape->set_owner(p_node->get_owner()); } } + +Node *ResourceImporterScene::pre_import(const String &p_source_file) { + Ref<EditorSceneImporter> 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()) { + List<String> extensions; + E->get()->get_extensions(&extensions); + + for (List<String>::Element *F = extensions.front(); F; F = F->next()) { + if (F->get().to_lower() == ext) { + importer = E->get(); + break; + } + } + + if (importer.is_valid()) { + break; + } + } + + 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); + if (!scene || err != OK) { + return nullptr; + } + + Map<Ref<EditorSceneImporterMesh>, List<Ref<Shape3D>>> collision_map; + + _pre_fix_node(scene, scene, collision_map); + + return scene; +} + 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; @@ -1289,27 +1346,21 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p float fps = p_options["animation/fps"]; - int import_flags = EditorSceneImporter::IMPORT_ANIMATION_DETECT_LOOP; - if (!bool(p_options["animation/optimizer/remove_unused_tracks"])) { - import_flags |= EditorSceneImporter::IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS; - } + int import_flags = 0; if (bool(p_options["animation/import"])) { import_flags |= EditorSceneImporter::IMPORT_ANIMATION; } - if (bool(p_options["meshes/ensure_tangents"])) { - import_flags |= EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS; - } - - if (int(p_options["materials/location"]) == 0) { - import_flags |= EditorSceneImporter::IMPORT_MATERIALS_IN_INSTANCES; - } - if (bool(p_options["skins/use_named_skins"])) { import_flags |= EditorSceneImporter::IMPORT_USE_NAMED_SKIN_BINDS; } + bool ensure_tangents = p_options["meshes/ensure_tangents"]; + if (ensure_tangents) { + import_flags |= EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS; + } + Error err = OK; List<String> missing_deps; // for now, not much will be done with this Node *scene = importer->import_scene(src_path, import_flags, fps, &missing_deps, &err); @@ -1317,6 +1368,29 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p return err; } + Dictionary subresources = p_options["_subresources"]; + + Dictionary node_data; + if (subresources.has("nodes")) { + node_data = subresources["nodes"]; + } + + Dictionary material_data; + if (subresources.has("materials")) { + material_data = subresources["materials"]; + } + + Dictionary animation_data; + if (subresources.has("animations")) { + animation_data = subresources["animations"]; + } + + Set<Ref<EditorSceneImporterMesh>> scanned_meshes; + Map<Ref<EditorSceneImporterMesh>, List<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); + 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. @@ -1354,73 +1428,35 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p bool gen_lods = bool(p_options["meshes/generate_lods"]); bool create_shadow_meshes = bool(p_options["meshes/create_shadow_meshes"]); - - _generate_meshes(scene, gen_lods, create_shadow_meshes); - - err = OK; - - String animation_filter = String(p_options["animation/filter_script"]).strip_edges(); - - bool use_optimizer = p_options["animation/optimizer/enabled"]; - float anim_optimizer_linerr = p_options["animation/optimizer/max_linear_error"]; - float anim_optimizer_angerr = p_options["animation/optimizer/max_angular_error"]; - float anim_optimizer_maxang = p_options["animation/optimizer/max_angle"]; int light_bake_mode = p_options["meshes/light_baking"]; + float texel_size = p_options["meshes/lightmap_texel_size"]; + float lightmap_texel_size = MAX(0.001, texel_size); - Map<Ref<Mesh>, List<Ref<Shape3D>>> collision_map; - - scene = _fix_node(scene, scene, collision_map, LightBakeMode(light_bake_mode)); - - if (use_optimizer) { - _optimize_animations(scene, anim_optimizer_linerr, anim_optimizer_angerr, anim_optimizer_maxang); - } + Vector<uint8_t> src_lightmap_cache; + Vector<uint8_t> dst_lightmap_cache; - Array animation_clips; { - int clip_count = p_options["animation/clips/amount"]; - - for (int i = 0; i < clip_count; i++) { - String name = p_options["animation/clip_" + itos(i + 1) + "/name"]; - int from_frame = p_options["animation/clip_" + itos(i + 1) + "/start_frame"]; - int end_frame = p_options["animation/clip_" + itos(i + 1) + "/end_frame"]; - bool loop = p_options["animation/clip_" + itos(i + 1) + "/loops"]; - - animation_clips.push_back(name); - animation_clips.push_back(from_frame / fps); - animation_clips.push_back(end_frame / fps); - animation_clips.push_back(loop); + src_lightmap_cache = FileAccess::get_file_as_array(p_source_file + ".unwrap_cache", &err); + if (err != OK) { + src_lightmap_cache.clear(); } } - if (animation_clips.size()) { - _create_clips(scene, animation_clips, !bool(p_options["animation/optimizer/remove_unused_tracks"])); - } - if (animation_filter != "") { - _filter_tracks(scene, animation_filter); + Dictionary mesh_data; + if (subresources.has("meshes")) { + mesh_data = subresources["meshes"]; } + _generate_meshes(scene, mesh_data, gen_lods, create_shadow_meshes, LightBakeMode(light_bake_mode), lightmap_texel_size, src_lightmap_cache, dst_lightmap_cache); - bool external_animations = int(p_options["animation/storage"]) == 1 || int(p_options["animation/storage"]) == 2; - bool external_animations_as_text = int(p_options["animation/storage"]) == 2; - bool keep_custom_tracks = p_options["animation/keep_custom_tracks"]; - bool external_materials = int(p_options["materials/storage"]) == 1 || int(p_options["materials/storage"]) == 2; - bool external_materials_as_text = int(p_options["materials/storage"]) == 2; - bool external_meshes = int(p_options["meshes/storage"]) == 1 || int(p_options["meshes/storage"]) == 2; - bool external_meshes_as_text = int(p_options["meshes/storage"]) == 2; - bool external_scenes = int(p_options["nodes/storage"]) == 1; - - String base_path = p_source_file.get_base_dir(); - - if (external_animations || external_materials || external_meshes || external_scenes) { - if (bool(p_options["external_files/store_in_subdir"])) { - String subdir_name = p_source_file.get_file().get_basename(); - DirAccess *da = DirAccess::open(base_path); - Error err2 = da->make_dir(subdir_name); - memdelete(da); - ERR_FAIL_COND_V_MSG(err2 != OK && err2 != ERR_ALREADY_EXISTS, err2, "Cannot make directory '" + subdir_name + "'."); - base_path = base_path.plus_file(subdir_name); + if (dst_lightmap_cache.size()) { + FileAccessRef f = FileAccess::open(p_source_file + ".unwrap_cache", FileAccess::WRITE); + if (f) { + f->store_buffer(dst_lightmap_cache.ptr(), dst_lightmap_cache.size()); } } + err = OK; +#if 0 if (light_bake_mode == 2 /* || generate LOD */) { Map<Ref<ArrayMesh>, Transform> meshes; _find_meshes(scene, meshes); @@ -1445,9 +1481,6 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p } } - float texel_size = p_options["meshes/lightmap_texel_size"]; - texel_size = MAX(0.001, texel_size); - Map<String, unsigned int> used_unwraps; EditorProgress progress2("gen_lightmaps", TTR("Generating Lightmaps"), meshes.size()); @@ -1469,7 +1502,7 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p if (err2 != OK) { EditorNode::add_io_error("Mesh '" + name + "' failed lightmap generation. Please fix geometry."); } else { - String hash = String::md5((unsigned char *)ret_cache_data); +` String hash = String::md5((unsigned char *)ret_cache_data); used_unwraps.insert(hash, ret_cache_size); if (!ret_used_cache) { @@ -1482,7 +1515,7 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p } else { int current_size = cache_data.size(); cache_data.resize(cache_data.size() + ret_cache_size); - unsigned char *ptrw = cache_data.ptrw(); + unsigned char *ptrw = cache_data.ptrw(); memcpy(&ptrw[current_size], ret_cache_data, ret_cache_size); int *data = (int *)ptrw; data[0] += 1; @@ -1530,20 +1563,11 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p file->close(); } } - - if (external_animations || external_materials || external_meshes) { - Map<Ref<Animation>, Ref<Animation>> anim_map; - Map<Ref<Material>, Ref<Material>> mat_map; - Map<Ref<ArrayMesh>, Ref<ArrayMesh>> mesh_map; - - bool keep_materials = bool(p_options["materials/keep_on_reimport"]); - - _make_external_resources(scene, base_path, external_animations, external_animations_as_text, keep_custom_tracks, external_materials, external_materials_as_text, keep_materials, external_meshes, external_meshes_as_text, anim_map, mat_map, mesh_map); - } +#endif progress.step(TTR("Running Custom Script..."), 2); - String post_import_script_path = p_options["nodes/custom_script"]; + String post_import_script_path = p_options["import_script/path"]; Ref<EditorScenePostImport> post_import_script; if (post_import_script_path != "") { @@ -1562,7 +1586,7 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p } if (post_import_script.is_valid()) { - post_import_script->init(base_path, p_source_file); + post_import_script->init(p_source_file); scene = post_import_script->post_import(scene); if (!scene) { EditorNode::add_io_error( @@ -1574,29 +1598,6 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p progress.step(TTR("Saving..."), 104); - if (external_scenes) { - //save sub-scenes as instances! - for (int i = 0; i < scene->get_child_count(); i++) { - Node *child = scene->get_child(i); - if (child->get_owner() != scene) { - continue; //not a real child probably created by scene type (ig, a scrollbar) - } - _replace_owner(child, scene, child); - - String cn = String(child->get_name()).strip_edges().replace(".", "_").replace(":", "_"); - if (cn == String()) { - cn = "ChildNode" + itos(i); - } - String path = base_path.plus_file(cn + ".scn"); - child->set_filename(path); - - Ref<PackedScene> packer = memnew(PackedScene); - packer->pack(child); - err = ResourceSaver::save(path, packer); //do not take over, let the changed files reload themselves - ERR_FAIL_COND_V_MSG(err != OK, err, "Cannot save scene to file '" + path + "'."); - } - } - Ref<PackedScene> packer = memnew(PackedScene); packer->pack(scene); print_verbose("Saving scene to: " + p_save_path + ".scn"); @@ -1613,6 +1614,13 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p ResourceImporterScene *ResourceImporterScene::singleton = nullptr; +bool ResourceImporterScene::ResourceImporterScene::has_advanced_options() const { + return true; +} +void ResourceImporterScene::ResourceImporterScene::show_advanced_options(const String &p_path) { + SceneImportSettings::get_singleton()->open_settings(p_path); +} + ResourceImporterScene::ResourceImporterScene() { singleton = this; } diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h index aced0226ff..6c6af57c4c 100644 --- a/editor/import/resource_importer_scene.h +++ b/editor/import/resource_importer_scene.h @@ -39,7 +39,9 @@ #include "scene/resources/skin.h" class Material; +class AnimationPlayer; +class EditorSceneImporterMesh; class EditorSceneImporter : public Reference { GDCLASS(EditorSceneImporter, Reference); @@ -53,15 +55,9 @@ public: enum ImportFlags { IMPORT_SCENE = 1, IMPORT_ANIMATION = 2, - IMPORT_ANIMATION_DETECT_LOOP = 4, - IMPORT_ANIMATION_OPTIMIZE = 8, - IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS = 16, - IMPORT_ANIMATION_KEEP_VALUE_TRACKS = 32, - IMPORT_GENERATE_TANGENT_ARRAYS = 256, - IMPORT_FAIL_ON_MISSING_DEPENDENCIES = 512, - IMPORT_MATERIALS_IN_INSTANCES = 1024, - IMPORT_USE_COMPRESSION = 2048, - IMPORT_USE_NAMED_SKIN_BINDS = 4096, + IMPORT_FAIL_ON_MISSING_DEPENDENCIES = 4, + IMPORT_GENERATE_TANGENT_ARRAYS = 8, + IMPORT_USE_NAMED_SKIN_BINDS = 16, }; @@ -76,17 +72,15 @@ public: class EditorScenePostImport : public Reference { GDCLASS(EditorScenePostImport, Reference); - String source_folder; String source_file; protected: static void _bind_methods(); public: - String get_source_folder() const; String get_source_file() const; virtual Node *post_import(Node *p_scene); - virtual void init(const String &p_source_folder, const String &p_source_file); + virtual void init(const String &p_source_file); EditorScenePostImport(); }; @@ -97,31 +91,36 @@ class ResourceImporterScene : public ResourceImporter { static ResourceImporterScene *singleton; - enum Presets { - PRESET_SEPARATE_MATERIALS, - PRESET_SEPARATE_MESHES, - PRESET_SEPARATE_ANIMATIONS, - - PRESET_SINGLE_SCENE, + enum LightBakeMode { + LIGHT_BAKE_DISABLED, + LIGHT_BAKE_DYNAMIC, + LIGHT_BAKE_STATIC, + LIGHT_BAKE_STATIC_LIGHTMAPS + }; - PRESET_SEPARATE_MESHES_AND_MATERIALS, - PRESET_SEPARATE_MESHES_AND_ANIMATIONS, - PRESET_SEPARATE_MATERIALS_AND_ANIMATIONS, - PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS, + enum MeshPhysicsMode { + MESH_PHYSICS_DISABLED, + MESH_PHYSICS_MESH_AND_STATIC_COLLIDER, + MESH_PHYSICS_RIGID_BODY_AND_MESH, + MESH_PHYSICS_STATIC_COLLIDER_ONLY, + MESH_PHYSICS_AREA_ONLY, + }; - PRESET_MULTIPLE_SCENES, - PRESET_MULTIPLE_SCENES_AND_MATERIALS, - PRESET_MAX + enum NavMeshMode { + NAVMESH_DISABLED, + NAVMESH_MESH_AND_NAVMESH, + NAVMESH_NAVMESH_ONLY, }; - enum LightBakeMode { - LIGHT_BAKE_DISABLED, - LIGHT_BAKE_ENABLE, - LIGHT_BAKE_LIGHTMAPS + enum MeshOverride { + MESH_OVERRIDE_DEFAULT, + MESH_OVERRIDE_ENABLE, + MESH_OVERRIDE_DISABLE, }; void _replace_owner(Node *p_node, Node *p_scene, Node *p_new_owner); - void _generate_meshes(Node *p_node, bool p_generate_lods, bool p_create_shadow_meshes); + 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<uint8_t> &r_dst_lightmap_cache); + void _add_shapes(Node *p_node, const List<Ref<Shape3D>> &p_shapes); public: static ResourceImporterScene *get_singleton() { return singleton; } @@ -141,26 +140,39 @@ public: virtual int get_preset_count() const override; 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 + }; + + 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; + 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 int get_import_order() const override { return 100; } //after everything - void _find_meshes(Node *p_node, Map<Ref<ArrayMesh>, Transform> &meshes); + Node *_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<EditorSceneImporterMesh>, List<Ref<Shape3D>>> &collision_map); + Node *_post_fix_node(Node *p_node, Node *p_root, Map<Ref<EditorSceneImporterMesh>, List<Ref<Shape3D>>> &collision_map, Set<Ref<EditorSceneImporterMesh>> &r_scanned_meshes, const Dictionary &p_node_data, const Dictionary &p_material_data, const Dictionary &p_animation_data, float p_animation_fps); - void _make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_animations_as_text, bool p_keep_animations, bool p_make_materials, bool p_materials_as_text, bool p_keep_materials, bool p_make_meshes, bool p_meshes_as_text, Map<Ref<Animation>, Ref<Animation>> &p_animations, Map<Ref<Material>, Ref<Material>> &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh>> &p_meshes); - - Node *_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>, List<Ref<Shape3D>>> &collision_map, LightBakeMode p_light_bake_mode); - - void _create_clips(Node *scene, const Array &p_clips, bool p_bake_all); - void _filter_anim_tracks(Ref<Animation> anim, Set<String> &keep); - void _filter_tracks(Node *scene, const String &p_text); - void _optimize_animations(Node *scene, float p_max_lin_error, float p_max_ang_error, float p_max_angle); + 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); + 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); + virtual bool has_advanced_options() const override; + virtual void show_advanced_options(const String &p_path) override; + ResourceImporterScene(); }; diff --git a/editor/import/scene_import_settings.cpp b/editor/import/scene_import_settings.cpp new file mode 100644 index 0000000000..48340ac242 --- /dev/null +++ b/editor/import/scene_import_settings.cpp @@ -0,0 +1,1199 @@ +/*************************************************************************/ +/* scene_import_settings.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 "scene_import_settings.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/import/scene_importer_mesh_node_3d.h" +#include "scene/resources/surface_tool.h" + +class SceneImportSettingsData : public Object { + GDCLASS(SceneImportSettingsData, Object) + friend class SceneImportSettings; + Map<StringName, Variant> *settings = nullptr; + Map<StringName, Variant> current; + Map<StringName, Variant> defaults; + List<ResourceImporter::ImportOption> options; + + ResourceImporterScene::InternalImportCategory category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MAX; + + bool _set(const StringName &p_name, const Variant &p_value) { + if (settings) { + if (defaults.has(p_name) && defaults[p_name] == p_value) { + settings->erase(p_name); + } else { + (*settings)[p_name] = p_value; + } + + current[p_name] = p_value; + return true; + } + return false; + } + bool _get(const StringName &p_name, Variant &r_ret) const { + if (settings) { + if (settings->has(p_name)) { + r_ret = (*settings)[p_name]; + return true; + } + } + if (defaults.has(p_name)) { + r_ret = defaults[p_name]; + return true; + } + return false; + } + void _get_property_list(List<PropertyInfo> *p_list) const { + for (const List<ResourceImporter::ImportOption>::Element *E = options.front(); E; E = E->next()) { + if (ResourceImporterScene::get_singleton()->get_internal_option_visibility(category, E->get().option.name, current)) { + p_list->push_back(E->get().option); + } + } + } +}; + +void SceneImportSettings::_fill_material(Tree *p_tree, const Ref<Material> &p_material, TreeItem *p_parent) { + String import_id; + bool has_import_id = false; + + if (p_material->has_meta("import_id")) { + import_id = p_material->get_meta("import_id"); + has_import_id = true; + } else if (p_material->get_name() != "") { + import_id = p_material->get_name(); + has_import_id = true; + } else { + import_id = "@MATERIAL:" + itos(material_set.size()); + } + + if (!material_map.has(import_id)) { + MaterialData md; + md.has_import_id = has_import_id; + md.material = p_material; + + _load_default_subresource_settings(md.settings, "materials", import_id, ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MATERIAL); + + material_map[import_id] = md; + } + + MaterialData &material_data = material_map[import_id]; + + Ref<Texture2D> icon = get_theme_icon("StandardMaterial3D", "EditorIcons"); + + TreeItem *item = p_tree->create_item(p_parent); + item->set_text(0, p_material->get_name()); + item->set_icon(0, icon); + + bool created = false; + if (!material_set.has(p_material)) { + material_set.insert(p_material); + created = true; + } + + item->set_meta("type", "Material"); + item->set_meta("import_id", import_id); + item->set_tooltip(0, vformat(TTR("Import ID: %s"), import_id)); + item->set_selectable(0, true); + + if (p_tree == scene_tree) { + material_data.scene_node = item; + } else if (p_tree == mesh_tree) { + material_data.mesh_node = item; + } else { + material_data.material_node = item; + } + + if (created) { + _fill_material(material_tree, p_material, material_tree->get_root()); + } +} + +void SceneImportSettings::_fill_mesh(Tree *p_tree, const Ref<Mesh> &p_mesh, TreeItem *p_parent) { + String import_id; + + bool has_import_id = false; + if (p_mesh->has_meta("import_id")) { + import_id = p_mesh->get_meta("import_id"); + has_import_id = true; + } else if (p_mesh->get_name() != String()) { + import_id = p_mesh->get_name(); + has_import_id = true; + } else { + import_id = "@MESH:" + itos(mesh_set.size()); + } + + if (!mesh_map.has(import_id)) { + MeshData md; + md.has_import_id = has_import_id; + md.mesh = p_mesh; + + _load_default_subresource_settings(md.settings, "meshes", import_id, ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MESH); + + mesh_map[import_id] = md; + } + + MeshData &mesh_data = mesh_map[import_id]; + + Ref<Texture2D> icon = get_theme_icon("Mesh", "EditorIcons"); + + TreeItem *item = p_tree->create_item(p_parent); + item->set_text(0, p_mesh->get_name()); + item->set_icon(0, icon); + + bool created = false; + if (!mesh_set.has(p_mesh)) { + mesh_set.insert(p_mesh); + created = true; + } + + item->set_meta("type", "Mesh"); + item->set_meta("import_id", import_id); + item->set_tooltip(0, vformat(TTR("Import ID: %s"), import_id)); + + item->set_selectable(0, true); + + if (p_tree == scene_tree) { + mesh_data.scene_node = item; + } else { + mesh_data.mesh_node = item; + } + + item->set_collapsed(true); + + for (int i = 0; i < p_mesh->get_surface_count(); i++) { + Ref<Material> mat = p_mesh->surface_get_material(i); + if (mat.is_valid()) { + _fill_material(p_tree, mat, item); + } + } + + if (created) { + _fill_mesh(mesh_tree, p_mesh, mesh_tree->get_root()); + } +} + +void SceneImportSettings::_fill_animation(Tree *p_tree, const Ref<Animation> &p_anim, const String &p_name, TreeItem *p_parent) { + if (!animation_map.has(p_name)) { + AnimationData ad; + ad.animation = p_anim; + + _load_default_subresource_settings(ad.settings, "animations", p_name, ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_ANIMATION); + + animation_map[p_name] = ad; + } + + AnimationData &animation_data = animation_map[p_name]; + + Ref<Texture2D> icon = get_theme_icon("Animation", "EditorIcons"); + + TreeItem *item = p_tree->create_item(p_parent); + item->set_text(0, p_name); + item->set_icon(0, icon); + + item->set_meta("type", "Animation"); + item->set_meta("import_id", p_name); + + item->set_selectable(0, true); + + animation_data.scene_node = item; +} + +void SceneImportSettings::_fill_scene(Node *p_node, TreeItem *p_parent_item) { + String import_id; + + if (p_node->has_meta("import_id")) { + import_id = p_node->get_meta("import_id"); + } else { + import_id = "PATH:" + String(scene->get_path_to(p_node)); + p_node->set_meta("import_id", import_id); + } + + EditorSceneImporterMeshNode3D *src_mesh_node = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); + + if (src_mesh_node) { + MeshInstance3D *mesh_node = memnew(MeshInstance3D); + mesh_node->set_name(src_mesh_node->get_name()); + mesh_node->set_transform(src_mesh_node->get_transform()); + mesh_node->set_skin(src_mesh_node->get_skin()); + mesh_node->set_skeleton_path(src_mesh_node->get_skeleton_path()); + if (src_mesh_node->get_mesh().is_valid()) { + Ref<EditorSceneImporterMesh> editor_mesh = src_mesh_node->get_mesh(); + mesh_node->set_mesh(editor_mesh->get_mesh()); + } + + p_node->replace_by(mesh_node); + memdelete(p_node); + p_node = mesh_node; + } + + String type = p_node->get_class(); + + if (!has_theme_icon(type, "EditorIcons")) { + type = "Node3D"; + } + + Ref<Texture2D> icon = get_theme_icon(type, "EditorIcons"); + + TreeItem *item = scene_tree->create_item(p_parent_item); + item->set_text(0, p_node->get_name()); + + if (p_node == scene) { + icon = get_theme_icon("PackedScene", "EditorIcons"); + item->set_text(0, "Scene"); + } + + item->set_icon(0, icon); + + item->set_meta("type", "Node"); + item->set_meta("class", type); + item->set_meta("import_id", import_id); + item->set_tooltip(0, vformat(TTR("Type: %s\nImport ID: %s"), type, import_id)); + + item->set_selectable(0, true); + + if (!node_map.has(import_id)) { + NodeData nd; + + if (p_node != scene) { + ResourceImporterScene::InternalImportCategory category; + if (src_mesh_node) { + category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE; + } else if (Object::cast_to<AnimationPlayer>(p_node)) { + category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE; + } else { + category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_NODE; + } + + _load_default_subresource_settings(nd.settings, "nodes", import_id, category); + } + + node_map[import_id] = nd; + } + NodeData &node_data = node_map[import_id]; + + node_data.node = p_node; + node_data.scene_node = item; + + AnimationPlayer *anim_node = Object::cast_to<AnimationPlayer>(p_node); + if (anim_node) { + List<StringName> animations; + anim_node->get_animation_list(&animations); + for (List<StringName>::Element *E = animations.front(); E; E = E->next()) { + _fill_animation(scene_tree, anim_node->get_animation(E->get()), E->get(), item); + } + } + + for (int i = 0; i < p_node->get_child_count(); i++) { + _fill_scene(p_node->get_child(i), item); + } + MeshInstance3D *mesh_node = Object::cast_to<MeshInstance3D>(p_node); + if (mesh_node && mesh_node->get_mesh().is_valid()) { + _fill_mesh(scene_tree, mesh_node->get_mesh(), item); + + Transform accum_xform; + Node3D *base = mesh_node; + while (base) { + accum_xform = base->get_transform() * accum_xform; + base = Object::cast_to<Node3D>(base->get_parent()); + } + + AABB aabb = accum_xform.xform(mesh_node->get_mesh()->get_aabb()); + if (first_aabb) { + contents_aabb = aabb; + first_aabb = false; + } else { + contents_aabb.merge_with(aabb); + } + } +} + +void SceneImportSettings::_update_scene() { + scene_tree->clear(); + material_tree->clear(); + mesh_tree->clear(); + + //hiden roots + material_tree->create_item(); + mesh_tree->create_item(); + + _fill_scene(scene, nullptr); +} + +void SceneImportSettings::_update_camera() { + AABB camera_aabb; + + float rot_x = cam_rot_x; + float rot_y = cam_rot_y; + float zoom = cam_zoom; + + if (selected_type == "Node" || selected_type == "") { + camera_aabb = contents_aabb; + } else { + if (mesh_preview->get_mesh().is_valid()) { + camera_aabb = mesh_preview->get_transform().xform(mesh_preview->get_mesh()->get_aabb()); + } else { + camera_aabb = AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2)); + } + if (selected_type == "Mesh" && mesh_map.has(selected_id)) { + const MeshData &md = mesh_map[selected_id]; + rot_x = md.cam_rot_x; + rot_y = md.cam_rot_y; + zoom = md.cam_zoom; + } else if (selected_type == "Material" && material_map.has(selected_id)) { + const MaterialData &md = material_map[selected_id]; + rot_x = md.cam_rot_x; + rot_y = md.cam_rot_y; + zoom = md.cam_zoom; + } + } + + Vector3 center = camera_aabb.position + camera_aabb.size * 0.5; + float camera_size = camera_aabb.get_longest_axis_size(); + + camera->set_orthogonal(camera_size * zoom, 0.0001, camera_size * 2); + + Transform xf; + xf.basis = Basis(Vector3(0, 1, 0), rot_y) * Basis(Vector3(1, 0, 0), rot_x); + xf.origin = center; + xf.translate(0, 0, camera_size); + + camera->set_transform(xf); +} + +void SceneImportSettings::_load_default_subresource_settings(Map<StringName, Variant> &settings, const String &p_type, const String &p_import_id, ResourceImporterScene::InternalImportCategory p_category) { + if (base_subresource_settings.has(p_type)) { + Dictionary d = base_subresource_settings[p_type]; + if (d.has(p_import_id)) { + d = d[p_import_id]; + List<ResourceImporterScene::ImportOption> options; + ResourceImporterScene::get_singleton()->get_internal_import_options(p_category, &options); + for (List<ResourceImporterScene::ImportOption>::Element *E = options.front(); E; E = E->next()) { + String key = E->get().option.name; + if (d.has(key)) { + settings[key] = d[key]; + } + } + } + } +} + +void SceneImportSettings::open_settings(const String &p_path) { + if (scene) { + memdelete(scene); + scene = nullptr; + } + scene = ResourceImporterScene::get_singleton()->pre_import(p_path); + if (scene == nullptr) { + EditorNode::get_singleton()->show_warning(TTR("Error opening scene")); + return; + } + + base_path = p_path; + + material_set.clear(); + mesh_set.clear(); + material_map.clear(); + mesh_map.clear(); + node_map.clear(); + defaults.clear(); + + selected_id = ""; + selected_type = ""; + + cam_rot_x = -Math_PI / 4; + cam_rot_y = -Math_PI / 4; + cam_zoom = 1; + + { + base_subresource_settings.clear(); + + Ref<ConfigFile> config; + config.instance(); + Error err = config->load(p_path + ".import"); + if (err == OK) { + List<String> keys; + config->get_section_keys("params", &keys); + for (List<String>::Element *E = keys.front(); E; E = E->next()) { + Variant value = config->get_value("params", E->get()); + if (E->get() == "_subresources") { + base_subresource_settings = value; + } else { + defaults[E->get()] = value; + } + } + } + } + + first_aabb = true; + + _update_scene(); + + base_viewport->add_child(scene); + + if (first_aabb) { + contents_aabb = AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2)); + first_aabb = false; + } + + popup_centered_ratio(); + _update_camera(); + + set_title(vformat(TTR("Advanced Import Settings for '%s'"), base_path.get_file())); +} + +SceneImportSettings *SceneImportSettings::singleton = nullptr; + +SceneImportSettings *SceneImportSettings::get_singleton() { + return singleton; +} + +void SceneImportSettings::_select(Tree *p_from, String p_type, String p_id) { + selecting = true; + + if (p_type == "Node") { + node_selected->hide(); //always hide just in case + mesh_preview->hide(); + if (Object::cast_to<Node3D>(scene)) { + Object::cast_to<Node3D>(scene)->show(); + } + //NodeData &nd=node_map[p_id]; + material_tree->deselect_all(); + mesh_tree->deselect_all(); + NodeData &nd = node_map[p_id]; + + MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(nd.node); + if (mi) { + Ref<Mesh> base_mesh = mi->get_mesh(); + if (base_mesh.is_valid()) { + AABB aabb = base_mesh->get_aabb(); + Transform aabb_xf; + aabb_xf.basis.scale(aabb.size); + aabb_xf.origin = aabb.position; + + aabb_xf = mi->get_global_transform() * aabb_xf; + node_selected->set_transform(aabb_xf); + node_selected->show(); + } + } + + if (nd.node == scene) { + scene_import_settings_data->settings = &defaults; + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MAX; + } else { + scene_import_settings_data->settings = &nd.settings; + if (mi) { + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE; + } else if (Object::cast_to<AnimationPlayer>(nd.node)) { + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE; + } else { + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_NODE; + } + } + } else if (p_type == "Animation") { + node_selected->hide(); //always hide just in case + mesh_preview->hide(); + if (Object::cast_to<Node3D>(scene)) { + Object::cast_to<Node3D>(scene)->show(); + } + //NodeData &nd=node_map[p_id]; + material_tree->deselect_all(); + mesh_tree->deselect_all(); + AnimationData &ad = animation_map[p_id]; + + scene_import_settings_data->settings = &ad.settings; + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_ANIMATION; + } else if (p_type == "Mesh") { + node_selected->hide(); + if (Object::cast_to<Node3D>(scene)) { + Object::cast_to<Node3D>(scene)->hide(); + } + + MeshData &md = mesh_map[p_id]; + if (p_from != mesh_tree) { + md.mesh_node->uncollapse_tree(); + md.mesh_node->select(0); + mesh_tree->ensure_cursor_is_visible(); + } + if (p_from != scene_tree) { + md.scene_node->uncollapse_tree(); + md.scene_node->select(0); + scene_tree->ensure_cursor_is_visible(); + } + + mesh_preview->set_mesh(md.mesh); + mesh_preview->show(); + + material_tree->deselect_all(); + + scene_import_settings_data->settings = &md.settings; + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MESH; + } else if (p_type == "Material") { + node_selected->hide(); + if (Object::cast_to<Node3D>(scene)) { + Object::cast_to<Node3D>(scene)->hide(); + } + + mesh_preview->show(); + + MaterialData &md = material_map[p_id]; + + material_preview->set_material(md.material); + mesh_preview->set_mesh(material_preview); + + if (p_from != mesh_tree) { + md.mesh_node->uncollapse_tree(); + md.mesh_node->select(0); + mesh_tree->ensure_cursor_is_visible(); + } + if (p_from != scene_tree) { + md.scene_node->uncollapse_tree(); + md.scene_node->select(0); + scene_tree->ensure_cursor_is_visible(); + } + if (p_from != material_tree) { + md.material_node->uncollapse_tree(); + md.material_node->select(0); + material_tree->ensure_cursor_is_visible(); + } + + scene_import_settings_data->settings = &md.settings; + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MATERIAL; + } + + selected_type = p_type; + selected_id = p_id; + + selecting = false; + + _update_camera(); + + List<ResourceImporter::ImportOption> options; + + if (scene_import_settings_data->category == ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MAX) { + ResourceImporterScene::get_singleton()->get_import_options(&options); + } else { + ResourceImporterScene::get_singleton()->get_internal_import_options(scene_import_settings_data->category, &options); + } + + scene_import_settings_data->defaults.clear(); + scene_import_settings_data->current.clear(); + + for (List<ResourceImporter::ImportOption>::Element *E = options.front(); E; E = E->next()) { + scene_import_settings_data->defaults[E->get().option.name] = E->get().default_value; + //needed for visibility toggling (fails if something is missing) + if (scene_import_settings_data->settings->has(E->get().option.name)) { + scene_import_settings_data->current[E->get().option.name] = (*scene_import_settings_data->settings)[E->get().option.name]; + } else { + scene_import_settings_data->current[E->get().option.name] = E->get().default_value; + } + } + scene_import_settings_data->options = options; + inspector->edit(scene_import_settings_data); + scene_import_settings_data->notify_property_list_changed(); +} + +void SceneImportSettings::_material_tree_selected() { + if (selecting) { + return; + } + TreeItem *item = material_tree->get_selected(); + String type = item->get_meta("type"); + String import_id = item->get_meta("import_id"); + + _select(material_tree, type, import_id); +} +void SceneImportSettings::_mesh_tree_selected() { + if (selecting) { + return; + } + + TreeItem *item = mesh_tree->get_selected(); + String type = item->get_meta("type"); + String import_id = item->get_meta("import_id"); + + _select(mesh_tree, type, import_id); +} +void SceneImportSettings::_scene_tree_selected() { + if (selecting) { + return; + } + TreeItem *item = scene_tree->get_selected(); + String type = item->get_meta("type"); + String import_id = item->get_meta("import_id"); + + _select(scene_tree, type, import_id); +} + +void SceneImportSettings::_viewport_input(const Ref<InputEvent> &p_input) { + float *rot_x = &cam_rot_x; + float *rot_y = &cam_rot_y; + float *zoom = &cam_zoom; + + if (selected_type == "Mesh" && mesh_map.has(selected_id)) { + MeshData &md = mesh_map[selected_id]; + rot_x = &md.cam_rot_x; + rot_y = &md.cam_rot_y; + zoom = &md.cam_zoom; + } else if (selected_type == "Material" && material_map.has(selected_id)) { + MaterialData &md = material_map[selected_id]; + rot_x = &md.cam_rot_x; + rot_y = &md.cam_rot_y; + zoom = &md.cam_zoom; + } + Ref<InputEventMouseMotion> mm = p_input; + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + (*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) { + (*zoom) *= 1.1; + if ((*zoom) > 10.0) { + (*zoom) = 10.0; + } + _update_camera(); + } + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { + (*zoom) /= 1.1; + if ((*zoom) < 0.1) { + (*zoom) = 0.1; + } + _update_camera(); + } +} + +void SceneImportSettings::_re_import() { + Map<StringName, Variant> main_settings; + + main_settings = defaults; + main_settings.erase("_subresources"); + Dictionary nodes; + Dictionary materials; + Dictionary meshes; + Dictionary animations; + + Dictionary subresources; + + for (Map<String, NodeData>::Element *E = node_map.front(); E; E = E->next()) { + if (E->get().settings.size()) { + Dictionary d; + for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) { + d[String(F->key())] = F->get(); + } + nodes[E->key()] = d; + } + } + if (nodes.size()) { + subresources["nodes"] = nodes; + } + + for (Map<String, MaterialData>::Element *E = material_map.front(); E; E = E->next()) { + if (E->get().settings.size()) { + Dictionary d; + for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) { + d[String(F->key())] = F->get(); + } + materials[E->key()] = d; + } + } + if (materials.size()) { + subresources["materials"] = materials; + } + + for (Map<String, MeshData>::Element *E = mesh_map.front(); E; E = E->next()) { + if (E->get().settings.size()) { + Dictionary d; + for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) { + d[String(F->key())] = F->get(); + } + meshes[E->key()] = d; + } + } + if (meshes.size()) { + subresources["meshes"] = meshes; + } + + for (Map<String, AnimationData>::Element *E = animation_map.front(); E; E = E->next()) { + if (E->get().settings.size()) { + Dictionary d; + for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) { + d[String(F->key())] = F->get(); + } + animations[E->key()] = d; + } + } + if (animations.size()) { + subresources["animations"] = animations; + } + + if (subresources.size()) { + main_settings["_subresources"] = subresources; + } + + EditorFileSystem::get_singleton()->reimport_file_with_custom_parameters(base_path, "scene", main_settings); +} + +void SceneImportSettings::_notification(int p_what) { + if (p_what == NOTIFICATION_READY) { + connect("confirmed", callable_mp(this, &SceneImportSettings::_re_import)); + } +} + +void SceneImportSettings::_menu_callback(int p_id) { + switch (p_id) { + case ACTION_EXTRACT_MATERIALS: { + save_path->set_text(TTR("Select folder to extract material resources")); + external_extension_type->select(0); + } break; + case ACTION_CHOOSE_MESH_SAVE_PATHS: { + save_path->set_text(TTR("Select folder where mesh resources will save on import")); + external_extension_type->select(1); + } break; + case ACTION_CHOOSE_ANIMATION_SAVE_PATHS: { + save_path->set_text(TTR("Select folder where animations will save on import")); + external_extension_type->select(1); + } break; + } + + save_path->set_current_dir(base_path.get_base_dir()); + current_action = p_id; + save_path->popup_centered_ratio(); +} + +void SceneImportSettings::_save_path_changed(const String &p_path) { + save_path_item->set_text(1, p_path); + + if (FileAccess::exists(p_path)) { + save_path_item->set_text(2, "Warning: File exists"); + save_path_item->set_tooltip(2, TTR("Existing file with the same name will be replaced.")); + save_path_item->set_icon(2, get_theme_icon("StatusWarning", "EditorIcons")); + + } else { + save_path_item->set_text(2, "Will create new File"); + save_path_item->set_icon(2, get_theme_icon("StatusSuccess", "EditorIcons")); + } +} + +void SceneImportSettings::_browse_save_callback(Object *p_item, int p_column, int p_id) { + TreeItem *item = Object::cast_to<TreeItem>(p_item); + + String path = item->get_text(1); + + item_save_path->set_current_file(path); + save_path_item = item; + + item_save_path->popup_centered_ratio(); +} + +void SceneImportSettings::_save_dir_callback(const String &p_path) { + external_path_tree->clear(); + TreeItem *root = external_path_tree->create_item(); + save_path_items.clear(); + + switch (current_action) { + case ACTION_EXTRACT_MATERIALS: { + for (Map<String, MaterialData>::Element *E = material_map.front(); E; E = E->next()) { + MaterialData &md = material_map[E->key()]; + + TreeItem *item = external_path_tree->create_item(root); + + String name = md.material_node->get_text(0); + + item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); + item->set_icon(0, get_theme_icon("StandardMaterial3D", "EditorIcons")); + item->set_text(0, name); + + if (md.has_import_id) { + if (md.settings.has("use_external/enabled") && bool(md.settings["use_external/enabled"])) { + item->set_text(2, "Already External"); + item->set_tooltip(2, TTR("This material already references an external file, no action will be taken.\nDisable the external property for it to be extracted again.")); + } else { + item->set_metadata(0, E->key()); + item->set_editable(0, true); + item->set_checked(0, true); + String path = p_path.plus_file(name); + if (external_extension_type->get_selected() == 0) { + path += ".tres"; + } else { + path += ".res"; + } + + item->set_text(1, path); + if (FileAccess::exists(path)) { + item->set_text(2, "Warning: File exists"); + item->set_tooltip(2, TTR("Existing file with the same name will be replaced.")); + item->set_icon(2, get_theme_icon("StatusWarning", "EditorIcons")); + + } else { + item->set_text(2, "Will create new File"); + item->set_icon(2, get_theme_icon("StatusSuccess", "EditorIcons")); + } + + item->add_button(1, get_theme_icon("Folder", "EditorIcons")); + } + + } else { + item->set_text(2, "No import ID"); + item->set_tooltip(2, TTR("Material has no name nor any other way to identify on re-import.\nPlease name it or ensure it is exported with an unique ID.")); + item->set_icon(2, get_theme_icon("StatusError", "EditorIcons")); + } + + save_path_items.push_back(item); + } + + external_paths->set_title(TTR("Extract Materials to Resource Files")); + external_paths->get_ok_button()->set_text(TTR("Extract")); + } break; + case ACTION_CHOOSE_MESH_SAVE_PATHS: { + for (Map<String, MeshData>::Element *E = mesh_map.front(); E; E = E->next()) { + MeshData &md = mesh_map[E->key()]; + + TreeItem *item = external_path_tree->create_item(root); + + String name = md.mesh_node->get_text(0); + + item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); + item->set_icon(0, get_theme_icon("Mesh", "EditorIcons")); + item->set_text(0, name); + + if (md.has_import_id) { + if (md.settings.has("save_to_file/enabled") && bool(md.settings["save_to_file/enabled"])) { + item->set_text(2, "Already Saving"); + item->set_tooltip(2, TTR("This mesh already saves to an external resource, no action will be taken.")); + } else { + item->set_metadata(0, E->key()); + item->set_editable(0, true); + item->set_checked(0, true); + String path = p_path.plus_file(name); + if (external_extension_type->get_selected() == 0) { + path += ".tres"; + } else { + path += ".res"; + } + + item->set_text(1, path); + if (FileAccess::exists(path)) { + item->set_text(2, "Warning: File exists"); + item->set_tooltip(2, TTR("Existing file with the same name will be replaced on import.")); + item->set_icon(2, get_theme_icon("StatusWarning", "EditorIcons")); + + } else { + item->set_text(2, "Will save to new File"); + item->set_icon(2, get_theme_icon("StatusSuccess", "EditorIcons")); + } + + item->add_button(1, get_theme_icon("Folder", "EditorIcons")); + } + + } else { + item->set_text(2, "No import ID"); + item->set_tooltip(2, TTR("Mesh has no name nor any other way to identify on re-import.\nPlease name it or ensure it is exported with an unique ID.")); + item->set_icon(2, get_theme_icon("StatusError", "EditorIcons")); + } + + save_path_items.push_back(item); + } + + external_paths->set_title(TTR("Set paths to save meshes as resource files on Reimport")); + external_paths->get_ok_button()->set_text(TTR("Set Paths")); + } break; + case ACTION_CHOOSE_ANIMATION_SAVE_PATHS: { + for (Map<String, AnimationData>::Element *E = animation_map.front(); E; E = E->next()) { + AnimationData &ad = animation_map[E->key()]; + + TreeItem *item = external_path_tree->create_item(root); + + String name = ad.scene_node->get_text(0); + + item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); + item->set_icon(0, get_theme_icon("Animation", "EditorIcons")); + item->set_text(0, name); + + if (ad.settings.has("save_to_file/enabled") && bool(ad.settings["save_to_file/enabled"])) { + item->set_text(2, "Already Saving"); + item->set_tooltip(2, TTR("This animation already saves to an external resource, no action will be taken.")); + } else { + item->set_metadata(0, E->key()); + item->set_editable(0, true); + item->set_checked(0, true); + String path = p_path.plus_file(name); + if (external_extension_type->get_selected() == 0) { + path += ".tres"; + } else { + path += ".res"; + } + + item->set_text(1, path); + if (FileAccess::exists(path)) { + item->set_text(2, "Warning: File exists"); + item->set_tooltip(2, TTR("Existing file with the same name will be replaced on import.")); + item->set_icon(2, get_theme_icon("StatusWarning", "EditorIcons")); + + } else { + item->set_text(2, "Will save to new File"); + item->set_icon(2, get_theme_icon("StatusSuccess", "EditorIcons")); + } + + item->add_button(1, get_theme_icon("Folder", "EditorIcons")); + } + + save_path_items.push_back(item); + } + + external_paths->set_title(TTR("Set paths to save animations as resource files on Reimport")); + external_paths->get_ok_button()->set_text(TTR("Set Paths")); + + } break; + } + + external_paths->popup_centered_ratio(); +} + +void SceneImportSettings::_save_dir_confirm() { + for (int i = 0; i < save_path_items.size(); i++) { + TreeItem *item = save_path_items[i]; + if (!item->is_checked(0)) { + continue; //ignore + } + String path = item->get_text(1); + if (!path.is_resource_file()) { + continue; + } + + String id = item->get_metadata(0); + + switch (current_action) { + case ACTION_EXTRACT_MATERIALS: { + ERR_CONTINUE(!material_map.has(id)); + MaterialData &md = material_map[id]; + + Error err = ResourceSaver::save(path, md.material); + if (err != OK) { + EditorNode::get_singleton()->add_io_error(TTR("Can't make material external to file, write error:") + "\n\t" + path); + continue; + } + + md.settings["use_external/enabled"] = true; + md.settings["use_external/path"] = path; + + } break; + case ACTION_CHOOSE_MESH_SAVE_PATHS: { + ERR_CONTINUE(!mesh_map.has(id)); + MeshData &md = mesh_map[id]; + + md.settings["save_to_file/enabled"] = true; + md.settings["save_to_file/path"] = path; + } break; + case ACTION_CHOOSE_ANIMATION_SAVE_PATHS: { + ERR_CONTINUE(!animation_map.has(id)); + AnimationData &ad = animation_map[id]; + + ad.settings["save_to_file/enabled"] = true; + ad.settings["save_to_file/path"] = path; + + } break; + } + } + + if (current_action == ACTION_EXTRACT_MATERIALS) { + //as this happens right now, the scene needs to be saved and reimported. + _re_import(); + open_settings(base_path); + } else { + scene_import_settings_data->notify_property_list_changed(); + } +} + +SceneImportSettings::SceneImportSettings() { + singleton = this; + + VBoxContainer *main_vb = memnew(VBoxContainer); + add_child(main_vb); + HBoxContainer *menu_hb = memnew(HBoxContainer); + main_vb->add_child(menu_hb); + + action_menu = memnew(MenuButton); + action_menu->set_text(TTR("Actions...")); + menu_hb->add_child(action_menu); + + action_menu->get_popup()->add_item(TTR("Extract Materials"), ACTION_EXTRACT_MATERIALS); + action_menu->get_popup()->add_separator(); + action_menu->get_popup()->add_item(TTR("Set Animation Save Paths"), ACTION_CHOOSE_ANIMATION_SAVE_PATHS); + action_menu->get_popup()->add_item(TTR("Set Mesh Save Paths"), ACTION_CHOOSE_MESH_SAVE_PATHS); + + action_menu->get_popup()->connect("id_pressed", callable_mp(this, &SceneImportSettings::_menu_callback)); + + tree_split = memnew(HSplitContainer); + main_vb->add_child(tree_split); + tree_split->set_v_size_flags(Control::SIZE_EXPAND_FILL); + + data_mode = memnew(TabContainer); + tree_split->add_child(data_mode); + data_mode->set_custom_minimum_size(Size2(300 * EDSCALE, 0)); + + property_split = memnew(HSplitContainer); + tree_split->add_child(property_split); + property_split->set_h_size_flags(Control::SIZE_EXPAND_FILL); + + scene_tree = memnew(Tree); + scene_tree->set_name(TTR("Scene")); + data_mode->add_child(scene_tree); + scene_tree->connect("cell_selected", callable_mp(this, &SceneImportSettings::_scene_tree_selected)); + + mesh_tree = memnew(Tree); + mesh_tree->set_name(TTR("Meshes")); + data_mode->add_child(mesh_tree); + mesh_tree->set_hide_root(true); + mesh_tree->connect("cell_selected", callable_mp(this, &SceneImportSettings::_mesh_tree_selected)); + + material_tree = memnew(Tree); + material_tree->set_name(TTR("Materials")); + data_mode->add_child(material_tree); + material_tree->connect("cell_selected", callable_mp(this, &SceneImportSettings::_material_tree_selected)); + + material_tree->set_hide_root(true); + + SubViewportContainer *vp_container = memnew(SubViewportContainer); + vp_container->set_h_size_flags(Control::SIZE_EXPAND_FILL); + vp_container->set_custom_minimum_size(Size2(10, 10)); + vp_container->set_stretch(true); + vp_container->connect("gui_input", callable_mp(this, &SceneImportSettings::_viewport_input)); + property_split->add_child(vp_container); + + base_viewport = memnew(SubViewport); + vp_container->add_child(base_viewport); + + base_viewport->set_use_own_world_3d(true); + + camera = memnew(Camera3D); + base_viewport->add_child(camera); + camera->make_current(); + + light = memnew(DirectionalLight3D); + light->set_transform(Transform().looking_at(Vector3(-1, -2, -0.6), Vector3(0, 1, 0))); + base_viewport->add_child(light); + light->set_shadow(true); + + { + Ref<StandardMaterial3D> selection_mat; + selection_mat.instance(); + selection_mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); + selection_mat->set_albedo(Color(1, 0.8, 1.0)); + + Ref<SurfaceTool> st; + st.instance(); + st->begin(Mesh::PRIMITIVE_LINES); + + AABB base_aabb; + base_aabb.size = Vector3(1, 1, 1); + + for (int i = 0; i < 12; i++) { + Vector3 a, b; + base_aabb.get_edge(i, a, b); + + st->add_vertex(a); + st->add_vertex(a.lerp(b, 0.2)); + st->add_vertex(b); + st->add_vertex(b.lerp(a, 0.2)); + } + + selection_mesh.instance(); + st->commit(selection_mesh); + selection_mesh->surface_set_material(0, selection_mat); + + node_selected = memnew(MeshInstance3D); + node_selected->set_mesh(selection_mesh); + base_viewport->add_child(node_selected); + node_selected->hide(); + } + + { + mesh_preview = memnew(MeshInstance3D); + base_viewport->add_child(mesh_preview); + mesh_preview->hide(); + + material_preview.instance(); + } + + inspector = memnew(EditorInspector); + inspector->set_custom_minimum_size(Size2(300 * EDSCALE, 0)); + + property_split->add_child(inspector); + + scene_import_settings_data = memnew(SceneImportSettingsData); + + get_ok_button()->set_text(TTR("Reimport")); + get_cancel_button()->set_text(TTR("Close")); + + external_paths = memnew(ConfirmationDialog); + add_child(external_paths); + external_path_tree = memnew(Tree); + external_paths->add_child(external_path_tree); + external_path_tree->connect("button_pressed", callable_mp(this, &SceneImportSettings::_browse_save_callback)); + external_paths->connect("confirmed", callable_mp(this, &SceneImportSettings::_save_dir_confirm)); + external_path_tree->set_columns(3); + external_path_tree->set_column_titles_visible(true); + external_path_tree->set_column_expand(0, true); + external_path_tree->set_column_min_width(0, 100 * EDSCALE); + external_path_tree->set_column_title(0, TTR("Resource")); + external_path_tree->set_column_expand(1, true); + external_path_tree->set_column_min_width(1, 100 * EDSCALE); + external_path_tree->set_column_title(1, TTR("Path")); + external_path_tree->set_column_expand(2, false); + external_path_tree->set_column_min_width(2, 200 * EDSCALE); + external_path_tree->set_column_title(2, TTR("Status")); + save_path = memnew(EditorFileDialog); + save_path->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_DIR); + HBoxContainer *extension_hb = memnew(HBoxContainer); + save_path->get_vbox()->add_child(extension_hb); + extension_hb->add_spacer(); + extension_hb->add_child(memnew(Label(TTR("Save Extension: ")))); + external_extension_type = memnew(OptionButton); + extension_hb->add_child(external_extension_type); + external_extension_type->add_item(TTR("Text: *.tres")); + external_extension_type->add_item(TTR("Binary: *.res")); + external_path_tree->set_hide_root(true); + add_child(save_path); + + item_save_path = memnew(EditorFileDialog); + item_save_path->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); + item_save_path->add_filter("*.tres;Text Resource"); + item_save_path->add_filter("*.res;Binary Resource"); + add_child(item_save_path); + item_save_path->connect("file_selected", callable_mp(this, &SceneImportSettings::_save_path_changed)); + + save_path->connect("dir_selected", callable_mp(this, &SceneImportSettings::_save_dir_callback)); +} + +SceneImportSettings::~SceneImportSettings() { + memdelete(scene_import_settings_data); +} diff --git a/editor/import/scene_import_settings.h b/editor/import/scene_import_settings.h new file mode 100644 index 0000000000..ddcf4a6d5d --- /dev/null +++ b/editor/import/scene_import_settings.h @@ -0,0 +1,199 @@ +/*************************************************************************/ +/* scene_import_settings.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 SCENEIMPORTSETTINGS_H +#define SCENEIMPORTSETTINGS_H + +#include "editor/editor_file_dialog.h" +#include "editor/editor_inspector.h" +#include "editor/import/resource_importer_scene.h" +#include "scene/3d/camera_3d.h" +#include "scene/3d/light_3d.h" +#include "scene/3d/mesh_instance_3d.h" +#include "scene/gui/dialogs.h" +#include "scene/gui/item_list.h" +#include "scene/gui/menu_button.h" +#include "scene/gui/option_button.h" +#include "scene/gui/split_container.h" +#include "scene/gui/subviewport_container.h" +#include "scene/gui/tab_container.h" +#include "scene/gui/tree.h" +#include "scene/resources/primitive_meshes.h" + +class SceneImportSettingsData; + +class SceneImportSettings : public ConfirmationDialog { + GDCLASS(SceneImportSettings, ConfirmationDialog) + + static SceneImportSettings *singleton; + + enum Actions { + ACTION_EXTRACT_MATERIALS, + ACTION_CHOOSE_MESH_SAVE_PATHS, + ACTION_CHOOSE_ANIMATION_SAVE_PATHS, + }; + + Node *scene = nullptr; + + HSplitContainer *tree_split; + HSplitContainer *property_split; + TabContainer *data_mode; + Tree *scene_tree; + Tree *mesh_tree; + Tree *material_tree; + + EditorInspector *inspector; + + SubViewport *base_viewport; + + Camera3D *camera; + bool first_aabb = false; + AABB contents_aabb; + + DirectionalLight3D *light; + Ref<ArrayMesh> selection_mesh; + MeshInstance3D *node_selected; + + MeshInstance3D *mesh_preview; + Ref<SphereMesh> material_preview; + + float cam_rot_x; + float cam_rot_y; + float cam_zoom; + + void _update_scene(); + + struct MaterialData { + bool has_import_id; + Ref<Material> material; + TreeItem *scene_node; + TreeItem *mesh_node; + TreeItem *material_node; + + float cam_rot_x = -Math_PI / 4; + float cam_rot_y = -Math_PI / 4; + float cam_zoom = 1; + + Map<StringName, Variant> settings; + }; + Map<String, MaterialData> material_map; + + struct MeshData { + bool has_import_id; + Ref<Mesh> mesh; + TreeItem *scene_node; + TreeItem *mesh_node; + + float cam_rot_x = -Math_PI / 4; + float cam_rot_y = -Math_PI / 4; + float cam_zoom = 1; + Map<StringName, Variant> settings; + }; + Map<String, MeshData> mesh_map; + + struct AnimationData { + Ref<Animation> animation; + TreeItem *scene_node; + Map<StringName, Variant> settings; + }; + Map<String, AnimationData> animation_map; + + struct NodeData { + Node *node; + TreeItem *scene_node; + Map<StringName, Variant> settings; + }; + Map<String, NodeData> node_map; + + void _fill_material(Tree *p_tree, const Ref<Material> &p_material, TreeItem *p_parent); + void _fill_mesh(Tree *p_tree, const Ref<Mesh> &p_mesh, TreeItem *p_parent); + void _fill_animation(Tree *p_tree, const Ref<Animation> &p_anim, const String &p_name, TreeItem *p_parent); + void _fill_scene(Node *p_node, TreeItem *p_parent_item); + + Set<Ref<Mesh>> mesh_set; + Set<Ref<Material>> material_set; + + String selected_type; + String selected_id; + + bool selecting = false; + + void _update_camera(); + void _select(Tree *p_from, String p_type, String p_id); + void _material_tree_selected(); + void _mesh_tree_selected(); + void _scene_tree_selected(); + + void _viewport_input(const Ref<InputEvent> &p_input); + + Map<StringName, Variant> defaults; + + SceneImportSettingsData *scene_import_settings_data; + + void _re_import(); + + String base_path; + + MenuButton *action_menu; + + ConfirmationDialog *external_paths; + Tree *external_path_tree; + EditorFileDialog *save_path; + OptionButton *external_extension_type; + + EditorFileDialog *item_save_path; + + void _menu_callback(int p_id); + void _save_dir_callback(const String &p_path); + + int current_action; + + Vector<TreeItem *> save_path_items; + + TreeItem *save_path_item = nullptr; + void _save_path_changed(const String &p_path); + void _browse_save_callback(Object *p_item, int p_column, int p_id); + void _save_dir_confirm(); + + Dictionary base_subresource_settings; + + void _load_default_subresource_settings(Map<StringName, Variant> &settings, const String &p_type, const String &p_import_id, ResourceImporterScene::InternalImportCategory p_category); + +protected: + void _notification(int p_what); + +public: + void open_settings(const String &p_path); + static SceneImportSettings *get_singleton(); + SceneImportSettings(); + ~SceneImportSettings(); +}; + +#endif // SCENEIMPORTSETTINGS_H diff --git a/editor/import/scene_importer_mesh.cpp b/editor/import/scene_importer_mesh.cpp index 46eb4e4fdc..28fdd4ddbd 100644 --- a/editor/import/scene_importer_mesh.cpp +++ b/editor/import/scene_importer_mesh.cpp @@ -136,6 +136,11 @@ Ref<Material> EditorSceneImporterMesh::get_surface_material(int p_surface) const return surfaces[p_surface].material; } +void EditorSceneImporterMesh::set_surface_material(int p_surface, const Ref<Material> &p_material) { + ERR_FAIL_INDEX(p_surface, surfaces.size()); + surfaces.write[p_surface].material = p_material; +} + void EditorSceneImporterMesh::generate_lods() { if (!SurfaceTool::simplify_func) { return; @@ -219,11 +224,20 @@ bool EditorSceneImporterMesh::has_mesh() const { return mesh.is_valid(); } -Ref<ArrayMesh> EditorSceneImporterMesh::get_mesh() { +Ref<ArrayMesh> EditorSceneImporterMesh::get_mesh(const Ref<Mesh> &p_base) { ERR_FAIL_COND_V(surfaces.size() == 0, Ref<ArrayMesh>()); if (mesh.is_null()) { - mesh.instance(); + if (p_base.is_valid()) { + mesh = p_base; + } + if (mesh.is_null()) { + mesh.instance(); + } + mesh->set_name(get_name()); + if (has_meta("import_id")) { + mesh->set_meta("import_id", get_meta("import_id")); + } for (int i = 0; i < blend_shapes.size(); i++) { mesh->add_blend_shape(blend_shapes[i]); } @@ -251,6 +265,8 @@ Ref<ArrayMesh> EditorSceneImporterMesh::get_mesh() { } } + mesh->set_lightmap_size_hint(lightmap_size_hint); + if (shadow_mesh.is_valid()) { Ref<ArrayMesh> shadow = shadow_mesh->get_mesh(); mesh->set_shadow_mesh(shadow); @@ -436,6 +452,338 @@ Dictionary EditorSceneImporterMesh::_get_data() const { return data; } +Vector<Face3> EditorSceneImporterMesh::get_faces() const { + Vector<Face3> faces; + for (int i = 0; i < surfaces.size(); i++) { + if (surfaces[i].primitive == Mesh::PRIMITIVE_TRIANGLES) { + Vector<Vector3> vertices = surfaces[i].arrays[Mesh::ARRAY_VERTEX]; + Vector<int> indices = surfaces[i].arrays[Mesh::ARRAY_INDEX]; + if (indices.size()) { + for (int j = 0; j < indices.size(); j += 3) { + Face3 f; + f.vertex[0] = vertices[indices[j + 0]]; + f.vertex[1] = vertices[indices[j + 1]]; + f.vertex[2] = vertices[indices[j + 2]]; + faces.push_back(f); + } + } else { + for (int j = 0; j < vertices.size(); j += 3) { + Face3 f; + f.vertex[0] = vertices[j + 0]; + f.vertex[1] = vertices[j + 1]; + f.vertex[2] = vertices[j + 2]; + faces.push_back(f); + } + } + } + } + + return faces; +} + +Vector<Ref<Shape3D>> EditorSceneImporterMesh::convex_decompose() const { + ERR_FAIL_COND_V(!Mesh::convex_composition_function, Vector<Ref<Shape3D>>()); + + const Vector<Face3> faces = get_faces(); + + Vector<Vector<Face3>> decomposed = Mesh::convex_composition_function(faces); + + Vector<Ref<Shape3D>> ret; + + for (int i = 0; i < decomposed.size(); i++) { + Set<Vector3> points; + for (int j = 0; j < decomposed[i].size(); j++) { + points.insert(decomposed[i][j].vertex[0]); + points.insert(decomposed[i][j].vertex[1]); + points.insert(decomposed[i][j].vertex[2]); + } + + Vector<Vector3> convex_points; + convex_points.resize(points.size()); + { + Vector3 *w = convex_points.ptrw(); + int idx = 0; + for (Set<Vector3>::Element *E = points.front(); E; E = E->next()) { + w[idx++] = E->get(); + } + } + + Ref<ConvexPolygonShape3D> shape; + shape.instance(); + shape->set_points(convex_points); + ret.push_back(shape); + } + + return ret; +} + +Ref<Shape3D> EditorSceneImporterMesh::create_trimesh_shape() const { + Vector<Face3> faces = get_faces(); + if (faces.size() == 0) { + return Ref<Shape3D>(); + } + + Vector<Vector3> face_points; + face_points.resize(faces.size() * 3); + + for (int i = 0; i < face_points.size(); i += 3) { + Face3 f = faces.get(i / 3); + face_points.set(i, f.vertex[0]); + face_points.set(i + 1, f.vertex[1]); + face_points.set(i + 2, f.vertex[2]); + } + + Ref<ConcavePolygonShape3D> shape = memnew(ConcavePolygonShape3D); + shape->set_faces(face_points); + return shape; +} + +Ref<NavigationMesh> EditorSceneImporterMesh::create_navigation_mesh() { + Vector<Face3> faces = get_faces(); + if (faces.size() == 0) { + return Ref<NavigationMesh>(); + } + + Map<Vector3, int> unique_vertices; + LocalVector<int> face_indices; + + for (int i = 0; i < faces.size(); i++) { + for (int j = 0; j < 3; j++) { + Vector3 v = faces[i].vertex[j]; + int idx; + if (unique_vertices.has(v)) { + idx = unique_vertices[v]; + } else { + idx = unique_vertices.size(); + unique_vertices[v] = idx; + } + face_indices.push_back(idx); + } + } + + Vector<Vector3> vertices; + vertices.resize(unique_vertices.size()); + for (Map<Vector3, int>::Element *E = unique_vertices.front(); E; E = E->next()) { + vertices.write[E->get()] = E->key(); + } + + Ref<NavigationMesh> nm; + nm.instance(); + nm->set_vertices(vertices); + + Vector<int> v3; + v3.resize(3); + for (uint32_t i = 0; i < face_indices.size(); i += 3) { + v3.write[0] = face_indices[i + 0]; + v3.write[1] = face_indices[i + 1]; + v3.write[2] = face_indices[i + 2]; + nm->add_polygon(v3); + } + + return nm; +} + +extern bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y, int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache); + +struct EditorSceneImporterMeshLightmapSurface { + Ref<Material> material; + LocalVector<SurfaceTool::Vertex> vertices; + Mesh::PrimitiveType primitive = Mesh::PrimitiveType::PRIMITIVE_MAX; + uint32_t format = 0; + String name; +}; + +Error EditorSceneImporterMesh::lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache, const Transform &p_base_transform, float p_texel_size) { + ERR_FAIL_COND_V(!array_mesh_lightmap_unwrap_callback, ERR_UNCONFIGURED); + ERR_FAIL_COND_V_MSG(blend_shapes.size() != 0, ERR_UNAVAILABLE, "Can't unwrap mesh with blend shapes."); + + Vector<float> vertices; + Vector<float> normals; + Vector<int> indices; + Vector<float> uv; + Vector<Pair<int, int>> uv_indices; + + Vector<EditorSceneImporterMeshLightmapSurface> lightmap_surfaces; + + // Keep only the scale + Transform transform = p_base_transform; + transform.origin = Vector3(); + transform.looking_at(Vector3(1, 0, 0), Vector3(0, 1, 0)); + + Basis normal_basis = transform.basis.inverse().transposed(); + + for (int i = 0; i < get_surface_count(); i++) { + EditorSceneImporterMeshLightmapSurface s; + s.primitive = get_surface_primitive_type(i); + + ERR_FAIL_COND_V_MSG(s.primitive != Mesh::PRIMITIVE_TRIANGLES, ERR_UNAVAILABLE, "Only triangles are supported for lightmap unwrap."); + Array arrays = get_surface_arrays(i); + s.material = get_surface_material(i); + s.name = get_surface_name(i); + + SurfaceTool::create_vertex_array_from_triangle_arrays(arrays, s.vertices, &s.format); + + Vector<Vector3> rvertices = arrays[Mesh::ARRAY_VERTEX]; + int vc = rvertices.size(); + const Vector3 *r = rvertices.ptr(); + + Vector<Vector3> rnormals = arrays[Mesh::ARRAY_NORMAL]; + + ERR_FAIL_COND_V_MSG(rnormals.size() == 0, ERR_UNAVAILABLE, "Normals are required for lightmap unwrap."); + + const Vector3 *rn = rnormals.ptr(); + + int vertex_ofs = vertices.size() / 3; + + vertices.resize((vertex_ofs + vc) * 3); + normals.resize((vertex_ofs + vc) * 3); + uv_indices.resize(vertex_ofs + vc); + + for (int j = 0; j < vc; j++) { + Vector3 v = transform.xform(r[j]); + Vector3 n = normal_basis.xform(rn[j]).normalized(); + + vertices.write[(j + vertex_ofs) * 3 + 0] = v.x; + vertices.write[(j + vertex_ofs) * 3 + 1] = v.y; + vertices.write[(j + vertex_ofs) * 3 + 2] = v.z; + normals.write[(j + vertex_ofs) * 3 + 0] = n.x; + normals.write[(j + vertex_ofs) * 3 + 1] = n.y; + normals.write[(j + vertex_ofs) * 3 + 2] = n.z; + uv_indices.write[j + vertex_ofs] = Pair<int, int>(i, j); + } + + Vector<int> rindices = arrays[Mesh::ARRAY_INDEX]; + int ic = rindices.size(); + + if (ic == 0) { + for (int j = 0; j < vc / 3; j++) { + if (Face3(r[j * 3 + 0], r[j * 3 + 1], r[j * 3 + 2]).is_degenerate()) { + continue; + } + + indices.push_back(vertex_ofs + j * 3 + 0); + indices.push_back(vertex_ofs + j * 3 + 1); + indices.push_back(vertex_ofs + j * 3 + 2); + } + + } else { + const int *ri = rindices.ptr(); + + for (int j = 0; j < ic / 3; j++) { + if (Face3(r[ri[j * 3 + 0]], r[ri[j * 3 + 1]], r[ri[j * 3 + 2]]).is_degenerate()) { + continue; + } + indices.push_back(vertex_ofs + ri[j * 3 + 0]); + indices.push_back(vertex_ofs + ri[j * 3 + 1]); + indices.push_back(vertex_ofs + ri[j * 3 + 2]); + } + } + + lightmap_surfaces.push_back(s); + } + + //unwrap + + float *gen_uvs; + int *gen_vertices; + int *gen_indices; + int gen_vertex_count; + int gen_index_count; + int size_x; + int size_y; + + bool ok = array_mesh_lightmap_unwrap_callback(p_texel_size, vertices.ptr(), normals.ptr(), vertices.size() / 3, indices.ptr(), indices.size(), &gen_uvs, &gen_vertices, &gen_vertex_count, &gen_indices, &gen_index_count, &size_x, &size_y, r_cache_data, r_cache_size, r_used_cache); + + if (!ok) { + return ERR_CANT_CREATE; + } + + //remove surfaces + clear(); + + //create surfacetools for each surface.. + Vector<Ref<SurfaceTool>> surfaces_tools; + + for (int i = 0; i < lightmap_surfaces.size(); i++) { + Ref<SurfaceTool> st; + st.instance(); + st->begin(Mesh::PRIMITIVE_TRIANGLES); + st->set_material(lightmap_surfaces[i].material); + st->set_meta("name", lightmap_surfaces[i].name); + surfaces_tools.push_back(st); //stay there + } + + print_verbose("Mesh: Gen indices: " + itos(gen_index_count)); + //go through all indices + for (int i = 0; i < gen_index_count; i += 3) { + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 0]], uv_indices.size(), ERR_BUG); + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 1]], uv_indices.size(), ERR_BUG); + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 2]], uv_indices.size(), ERR_BUG); + + ERR_FAIL_COND_V(uv_indices[gen_vertices[gen_indices[i + 0]]].first != uv_indices[gen_vertices[gen_indices[i + 1]]].first || uv_indices[gen_vertices[gen_indices[i + 0]]].first != uv_indices[gen_vertices[gen_indices[i + 2]]].first, ERR_BUG); + + int surface = uv_indices[gen_vertices[gen_indices[i + 0]]].first; + + for (int j = 0; j < 3; j++) { + SurfaceTool::Vertex v = lightmap_surfaces[surface].vertices[uv_indices[gen_vertices[gen_indices[i + j]]].second]; + + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_COLOR) { + surfaces_tools.write[surface]->set_color(v.color); + } + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_TEX_UV) { + surfaces_tools.write[surface]->set_uv(v.uv); + } + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_NORMAL) { + surfaces_tools.write[surface]->set_normal(v.normal); + } + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_TANGENT) { + Plane t; + t.normal = v.tangent; + t.d = v.binormal.dot(v.normal.cross(v.tangent)) < 0 ? -1 : 1; + surfaces_tools.write[surface]->set_tangent(t); + } + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_BONES) { + surfaces_tools.write[surface]->set_bones(v.bones); + } + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_WEIGHTS) { + surfaces_tools.write[surface]->set_weights(v.weights); + } + + Vector2 uv2(gen_uvs[gen_indices[i + j] * 2 + 0], gen_uvs[gen_indices[i + j] * 2 + 1]); + surfaces_tools.write[surface]->set_uv2(uv2); + + surfaces_tools.write[surface]->add_vertex(v.vertex); + } + } + + //generate surfaces + + for (int i = 0; i < surfaces_tools.size(); i++) { + surfaces_tools.write[i]->index(); + Array arrays = surfaces_tools.write[i]->commit_to_arrays(); + add_surface(surfaces_tools.write[i]->get_primitive(), arrays, Array(), Dictionary(), surfaces_tools.write[i]->get_material(), surfaces_tools.write[i]->get_meta("name")); + } + + set_lightmap_size_hint(Size2(size_x, size_y)); + + if (!r_used_cache) { + //free stuff + ::free(gen_vertices); + ::free(gen_indices); + ::free(gen_uvs); + } + + return OK; +} + +void EditorSceneImporterMesh::set_lightmap_size_hint(const Size2i &p_size) { + lightmap_size_hint = p_size; +} + +Size2i EditorSceneImporterMesh::get_lightmap_size_hint() const { + return lightmap_size_hint; +} + void EditorSceneImporterMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("add_blend_shape", "name"), &EditorSceneImporterMesh::add_blend_shape); ClassDB::bind_method(D_METHOD("get_blend_shape_count"), &EditorSceneImporterMesh::get_blend_shape_count); @@ -462,5 +810,8 @@ void EditorSceneImporterMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("_set_data", "data"), &EditorSceneImporterMesh::_set_data); ClassDB::bind_method(D_METHOD("_get_data"), &EditorSceneImporterMesh::_get_data); + ClassDB::bind_method(D_METHOD("set_lightmap_size_hint", "size"), &EditorSceneImporterMesh::set_lightmap_size_hint); + ClassDB::bind_method(D_METHOD("get_lightmap_size_hint"), &EditorSceneImporterMesh::get_lightmap_size_hint); + ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "_data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_data", "_get_data"); } diff --git a/editor/import/scene_importer_mesh.h b/editor/import/scene_importer_mesh.h index 42507cbe8c..3326fab55d 100644 --- a/editor/import/scene_importer_mesh.h +++ b/editor/import/scene_importer_mesh.h @@ -32,7 +32,10 @@ #define EDITOR_SCENE_IMPORTER_MESH_H #include "core/io/resource.h" +#include "scene/resources/concave_polygon_shape_3d.h" +#include "scene/resources/convex_polygon_shape_3d.h" #include "scene/resources/mesh.h" +#include "scene/resources/navigation_mesh.h" // The following classes are used by importers instead of ArrayMesh and MeshInstance3D // so the data is not registered (hence, quality loss), importing happens faster and // its easier to modify before saving @@ -63,6 +66,8 @@ class EditorSceneImporterMesh : public Resource { Ref<EditorSceneImporterMesh> shadow_mesh; + Size2i lightmap_size_hint; + protected: void _set_data(const Dictionary &p_data); Dictionary _get_data() const; @@ -89,13 +94,24 @@ public: float get_surface_lod_size(int p_surface, int p_lod) const; Ref<Material> get_surface_material(int p_surface) const; + void set_surface_material(int p_surface, const Ref<Material> &p_material); + void generate_lods(); void create_shadow_mesh(); Ref<EditorSceneImporterMesh> get_shadow_mesh() const; + Vector<Face3> get_faces() const; + Vector<Ref<Shape3D>> convex_decompose() const; + Ref<Shape3D> create_trimesh_shape() const; + Ref<NavigationMesh> create_navigation_mesh(); + Error lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache, const Transform &p_base_transform, float p_texel_size); + + void set_lightmap_size_hint(const Size2i &p_size); + Size2i get_lightmap_size_hint() const; + bool has_mesh() const; - Ref<ArrayMesh> get_mesh(); + Ref<ArrayMesh> get_mesh(const Ref<Mesh> &p_base = Ref<Mesh>()); void clear(); }; #endif // EDITOR_SCENE_IMPORTER_MESH_H diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp index 97a04e6557..17c51f0f85 100644 --- a/editor/import_dock.cpp +++ b/editor/import_dock.cpp @@ -98,11 +98,9 @@ void ImportDock::set_edit_path(const String &p_path) { return; } - params->importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(config->get_value("remap", "importer")); - if (params->importer.is_null()) { - clear(); - return; - } + String importer_name = config->get_value("remap", "importer"); + + params->importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); params->paths.clear(); params->paths.push_back(p_path); @@ -124,11 +122,18 @@ void ImportDock::set_edit_path(const String &p_path) { for (List<Pair<String, String>>::Element *E = importer_names.front(); E; E = E->next()) { import_as->add_item(E->get().first); import_as->set_item_metadata(import_as->get_item_count() - 1, E->get().second); - if (E->get().second == params->importer->get_importer_name()) { + if (E->get().second == importer_name) { import_as->select(import_as->get_item_count() - 1); } } + import_as->add_separator(); + import_as->add_item(TTR("Keep File (No Import)")); + import_as->set_item_metadata(import_as->get_item_count() - 1, "keep"); + if (importer_name == "keep") { + import_as->select(import_as->get_item_count() - 1); + } + import->set_disabled(false); import_as->set_disabled(false); preset->set_disabled(false); @@ -138,7 +143,10 @@ void ImportDock::set_edit_path(const String &p_path) { void ImportDock::_update_options(const Ref<ConfigFile> &p_config) { List<ResourceImporter::ImportOption> options; - params->importer->get_import_options(&options); + + if (params->importer.is_valid()) { + params->importer->get_import_options(&options); + } params->properties.clear(); params->values.clear(); @@ -156,6 +164,14 @@ void ImportDock::_update_options(const Ref<ConfigFile> &p_config) { params->update(); _update_preset_menu(); + + if (params->importer.is_valid() && params->paths.size() == 1 && params->importer->has_advanced_options()) { + advanced->show(); + advanced_spacer->show(); + } else { + advanced->hide(); + advanced_spacer->hide(); + } } void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) { @@ -178,6 +194,10 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) { } } + if (!config->has_section("params")) { + continue; + } + List<String> keys; config->get_section_keys("params", &keys); @@ -258,11 +278,26 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) { preset->set_disabled(false); imported->set_text(vformat(TTR("%d Files"), p_paths.size())); + + if (params->paths.size() == 1 && params->importer->has_advanced_options()) { + advanced->show(); + advanced_spacer->show(); + } else { + advanced->hide(); + advanced_spacer->hide(); + } } void ImportDock::_update_preset_menu() { preset->get_popup()->clear(); + if (params->importer.is_null()) { + preset->get_popup()->add_item(TTR("Default")); + preset->hide(); + return; + } + preset->show(); + if (params->importer->get_preset_count() == 0) { preset->get_popup()->add_item(TTR("Default")); } else { @@ -282,20 +317,25 @@ void ImportDock::_update_preset_menu() { void ImportDock::_importer_selected(int i_idx) { String name = import_as->get_selected_metadata(); - Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(name); - ERR_FAIL_COND(importer.is_null()); + if (name == "keep") { + params->importer.unref(); + _update_options(Ref<ConfigFile>()); + } else { + Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(name); + ERR_FAIL_COND(importer.is_null()); - params->importer = importer; + params->importer = importer; - Ref<ConfigFile> config; - if (params->paths.size()) { - config.instance(); - Error err = config->load(params->paths[0] + ".import"); - if (err != OK) { - config.unref(); + Ref<ConfigFile> config; + if (params->paths.size()) { + config.instance(); + Error err = config->load(params->paths[0] + ".import"); + if (err != OK) { + config.unref(); + } } + _update_options(config); } - _update_options(config); } void ImportDock::_preset_selected(int p_idx) { @@ -391,6 +431,13 @@ static bool _find_owners(EditorFileSystemDirectory *efsd, const String &p_path) void ImportDock::_reimport_attempt() { bool need_restart = false; bool used_in_resources = false; + + String importer_name; + if (params->importer.is_valid()) { + importer_name = params->importer->get_importer_name(); + } else { + importer_name = "keep"; + } for (int i = 0; i < params->paths.size(); i++) { Ref<ConfigFile> config; config.instance(); @@ -398,7 +445,7 @@ void ImportDock::_reimport_attempt() { ERR_CONTINUE(err != OK); String imported_with = config->get_value("remap", "importer"); - if (imported_with != params->importer->get_importer_name()) { + if (imported_with != importer_name) { need_restart = true; if (_find_owners(EditorFileSystem::get_singleton()->get_filesystem(), params->paths[i])) { used_in_resources = true; @@ -422,6 +469,11 @@ void ImportDock::_reimport_and_restart() { EditorNode::get_singleton()->restart_editor(); } +void ImportDock::_advanced_options() { + if (params->paths.size() == 1 && params->importer.is_valid()) { + params->importer->show_advanced_options(params->paths[0]); + } +} void ImportDock::_reimport() { for (int i = 0; i < params->paths.size(); i++) { Ref<ConfigFile> config; @@ -429,38 +481,45 @@ void ImportDock::_reimport() { Error err = config->load(params->paths[i] + ".import"); ERR_CONTINUE(err != OK); - String importer_name = params->importer->get_importer_name(); + if (params->importer.is_valid()) { + String importer_name = params->importer->get_importer_name(); - if (params->checking && config->get_value("remap", "importer") == params->importer->get_importer_name()) { - //update only what is edited (checkboxes) if the importer is the same - for (List<PropertyInfo>::Element *E = params->properties.front(); E; E = E->next()) { - if (params->checked.has(E->get().name)) { + if (params->checking && config->get_value("remap", "importer") == params->importer->get_importer_name()) { + //update only what is edited (checkboxes) if the importer is the same + for (List<PropertyInfo>::Element *E = params->properties.front(); E; E = E->next()) { + if (params->checked.has(E->get().name)) { + config->set_value("params", E->get().name, params->values[E->get().name]); + } + } + } else { + //override entirely + config->set_value("remap", "importer", importer_name); + if (config->has_section("params")) { + config->erase_section("params"); + } + + for (List<PropertyInfo>::Element *E = params->properties.front(); E; E = E->next()) { config->set_value("params", E->get().name, params->values[E->get().name]); } } - } else { - //override entirely - config->set_value("remap", "importer", importer_name); - if (config->has_section("params")) { - config->erase_section("params"); - } - for (List<PropertyInfo>::Element *E = params->properties.front(); E; E = E->next()) { - config->set_value("params", E->get().name, params->values[E->get().name]); + //handle group file + Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); + ERR_CONTINUE(!importer.is_valid()); + String group_file_property = importer->get_option_group_file(); + if (group_file_property != String()) { + //can import from a group (as in, atlas) + ERR_CONTINUE(!params->values.has(group_file_property)); + String group_file = params->values[group_file_property]; + config->set_value("remap", "group_file", group_file); + } else { + config->set_value("remap", "group_file", Variant()); //clear group file if unused } - } - //handle group file - Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); - ERR_CONTINUE(!importer.is_valid()); - String group_file_property = importer->get_option_group_file(); - if (group_file_property != String()) { - //can import from a group (as in, atlas) - ERR_CONTINUE(!params->values.has(group_file_property)); - String group_file = params->values[group_file_property]; - config->set_value("remap", "group_file", group_file); } else { - config->set_value("remap", "group_file", Variant()); //clear group file if unused + //set to no import + config->clear(); + config->set_value("remap", "importer", "keep"); } config->save(params->paths[i] + ".import"); @@ -531,10 +590,27 @@ ImportDock::ImportDock() { import->set_text(TTR("Reimport")); import->set_disabled(true); import->connect("pressed", callable_mp(this, &ImportDock::_reimport_attempt)); + if (!DisplayServer::get_singleton()->get_swap_cancel_ok()) { + advanced_spacer = hb->add_spacer(); + advanced = memnew(Button); + advanced->set_text(TTR("Advanced...")); + hb->add_child(advanced); + } hb->add_spacer(); hb->add_child(import); hb->add_spacer(); + if (DisplayServer::get_singleton()->get_swap_cancel_ok()) { + advanced = memnew(Button); + advanced->set_text(TTR("Advanced...")); + hb->add_child(advanced); + advanced_spacer = hb->add_spacer(); + } + + advanced->hide(); + advanced_spacer->hide(); + advanced->connect("pressed", callable_mp(this, &ImportDock::_advanced_options)); + reimport_confirm = memnew(ConfirmationDialog); reimport_confirm->get_ok_button()->set_text(TTR("Save Scenes, Re-Import, and Restart")); add_child(reimport_confirm); diff --git a/editor/import_dock.h b/editor/import_dock.h index 6c5779ddce..2be48dd505 100644 --- a/editor/import_dock.h +++ b/editor/import_dock.h @@ -57,6 +57,9 @@ class ImportDock : public VBoxContainer { Label *label_warning; Button *import; + Control *advanced_spacer; + Button *advanced; + ImportDockParameters *params; void _preset_selected(int p_idx); @@ -69,6 +72,7 @@ class ImportDock : public VBoxContainer { void _reimport_and_restart(); void _reimport(); + void _advanced_options(); enum { ITEM_SET_AS_DEFAULT = 100, ITEM_LOAD_DEFAULT, diff --git a/editor/node_3d_editor_gizmos.cpp b/editor/node_3d_editor_gizmos.cpp index 64cf9a7bb7..7dcabafece 100644 --- a/editor/node_3d_editor_gizmos.cpp +++ b/editor/node_3d_editor_gizmos.cpp @@ -3531,7 +3531,7 @@ String CollisionObject3DGizmoPlugin::get_gizmo_name() const { } int CollisionObject3DGizmoPlugin::get_priority() const { - return -1; + return -2; } void CollisionObject3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp index c90f87de56..80d0a7db60 100644 --- a/editor/plugins/abstract_polygon_2d_editor.cpp +++ b/editor/plugins/abstract_polygon_2d_editor.cpp @@ -264,7 +264,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) Vector2 cpoint = _get_node()->get_global_transform().affine_inverse().xform(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() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { if (mb->get_control() || mb->get_shift() || mb->get_alt()) { return false; @@ -326,7 +326,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) return true; } } - } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && !edited_point.valid()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_LEFT && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_LEFT && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_RIGHT && mb->is_pressed() && wip_active) { + } else if (mb->get_button_index() == MOUSE_BUTTON_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() & BUTTON_MASK_LEFT))) { + if (edited_point.valid() && (wip_active || (mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT))) { Vector2 cpoint = _get_node()->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint))); //Move the point in a single axis. Should only work when editing a polygon and while holding shift. diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp index d69913cc46..025fcaf818 100644 --- a/editor/plugins/animation_blend_space_1d_editor.cpp +++ b/editor/plugins/animation_blend_space_1d_editor.cpp @@ -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() == BUTTON_RIGHT) || (mb->get_button_index() == BUTTON_LEFT && tool_create->is_pressed()))) { + 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()))) { 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() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_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() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && tool_blend->is_pressed() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { 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_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp index 6a57463dbc..af9c391174 100644 --- a/editor/plugins/animation_blend_space_2d_editor.cpp +++ b/editor/plugins/animation_blend_space_2d_editor.cpp @@ -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() == BUTTON_RIGHT) || (mb->get_button_index() == BUTTON_LEFT && tool_create->is_pressed()))) { + 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()))) { menu->clear(); animations_menu->clear(); animations_to_add.clear(); @@ -134,7 +134,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() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { blend_space_draw->update(); //update anyway //try to see if a point can be selected selected_point = -1; @@ -174,7 +174,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() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_triangle->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { blend_space_draw->update(); //update anyway //try to see if a point can be selected selected_point = -1; @@ -209,7 +209,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven } } - if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (dragging_selected) { //move Vector2 point = blend_space->get_blend_point_position(selected_point); @@ -236,7 +236,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() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_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()); @@ -270,7 +270,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() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && tool_blend->is_pressed() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { 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_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 7c623505b5..03481dfb38 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -117,8 +117,8 @@ void AnimationPlayerEditor::_notification(int p_what) { autoplay_icon = get_theme_icon("AutoPlay", "EditorIcons"); reset_icon = get_theme_icon("Reload", "EditorIcons"); { - Ref<Image> autoplay_img = autoplay_icon->get_data(); - Ref<Image> reset_img = reset_icon->get_data(); + Ref<Image> autoplay_img = autoplay_icon->get_image(); + Ref<Image> reset_img = reset_icon->get_image(); Ref<Image> autoplay_reset_img; Size2 icon_size = Size2(autoplay_img->get_width(), autoplay_img->get_height()); autoplay_reset_img.instance(); diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp index c6d2faf849..a9709bbb16 100644 --- a/editor/plugins/animation_state_machine_editor.cpp +++ b/editor/plugins/animation_state_machine_editor.cpp @@ -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() == BUTTON_RIGHT) || (tool_create->is_pressed() && mb->get_button_index() == BUTTON_LEFT))) { + 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))) { 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->get_shift() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && !mb->get_shift() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_LEFT && !mb->is_pressed()) { + if (mb.is_valid() && dragging_selected_attempt && mb->get_button_index() == MOUSE_BUTTON_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->get_shift()) || tool_connect->is_pressed()) && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) { + if (mb.is_valid() && ((tool_select->is_pressed() && mb->get_shift()) || tool_connect->is_pressed()) && mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_LEFT && !mb->is_pressed()) { + if (mb.is_valid() && connecting && mb->get_button_index() == MOUSE_BUTTON_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() & BUTTON_MASK_MIDDLE) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { 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 b7484aa748..1345adc8ee 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -144,8 +144,8 @@ void EditorAssetLibraryItemDescription::set_image(int p_type, int p_index, const for (int i = 0; i < preview_images.size(); i++) { if (preview_images[i].id == p_index) { if (preview_images[i].is_video) { - Ref<Image> overlay = previews->get_theme_icon("PlayOverlay", "EditorIcons")->get_data(); - Ref<Image> thumbnail = p_image->get_data(); + Ref<Image> overlay = previews->get_theme_icon("PlayOverlay", "EditorIcons")->get_image(); + Ref<Image> thumbnail = p_image->get_image(); thumbnail = thumbnail->duplicate(); Point2 overlay_pos = Point2((thumbnail->get_width() - overlay->get_width()) / 2, (thumbnail->get_height() - overlay->get_height()) / 2); diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 23467c8377..d4e06aa9ca 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -1095,7 +1095,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() == BUTTON_LEFT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed()) { // Press button if (b->get_position().x < RULER_WIDTH && b->get_position().y < RULER_WIDTH) { // Drag a new double guide @@ -1154,7 +1154,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() == BUTTON_LEFT && !b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { if (show_guides && EditorNode::get_singleton()->get_edited_scene()) { Transform2D xform = viewport_scrollable->get_transform() * transform; @@ -1268,7 +1268,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() == BUTTON_WHEEL_LEFT || (b->get_shift() && b->get_button_index() == BUTTON_WHEEL_UP))) { + (b->get_button_index() == MOUSE_BUTTON_WHEEL_LEFT || (b->get_shift() && b->get_button_index() == MOUSE_BUTTON_WHEEL_UP))) { // Pan left view_offset.x -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); @@ -1276,7 +1276,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo } if (b->is_pressed() && - (b->get_button_index() == BUTTON_WHEEL_RIGHT || (b->get_shift() && b->get_button_index() == BUTTON_WHEEL_DOWN))) { + (b->get_button_index() == MOUSE_BUTTON_WHEEL_RIGHT || (b->get_shift() && b->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN))) { // Pan right view_offset.x += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); @@ -1284,7 +1284,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo } } - if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_DOWN) { + if (b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_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(); @@ -1299,7 +1299,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo return true; } - if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_UP) { + if (b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_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(); @@ -1316,17 +1316,17 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo if (!panning) { if (b->is_pressed() && - (b->get_button_index() == BUTTON_MIDDLE || - b->get_button_index() == BUTTON_RIGHT || - (b->get_button_index() == BUTTON_LEFT && tool == TOOL_PAN) || - (b->get_button_index() == BUTTON_LEFT && !EditorSettings::get_singleton()->get("editors/2d/simple_panning") && pan_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))) { // Pan the viewport panning = true; } } if (panning) { - if (!b->is_pressed() && (pan_on_scroll || (b->get_button_index() != BUTTON_WHEEL_DOWN && b->get_button_index() != BUTTON_WHEEL_UP))) { + if (!b->is_pressed() && (pan_on_scroll || (b->get_button_index() != MOUSE_BUTTON_WHEEL_DOWN && b->get_button_index() != MOUSE_BUTTON_WHEEL_UP))) { // Stop panning the viewport (for any mouse button press except zooming) panning = false; } @@ -1412,7 +1412,7 @@ 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() == BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) || + 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)) { List<CanvasItem *> selection = _get_edited_canvas_items(); @@ -1466,7 +1466,7 @@ 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() == BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) || + ((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))) { _commit_canvas_item_state( drag_selection, @@ -1480,7 +1480,7 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -1566,7 +1566,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() == BUTTON_LEFT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed()) { if ((b->get_command() && !b->get_alt() && tool == TOOL_SELECT) || tool == TOOL_ROTATE) { List<CanvasItem *> selection = _get_edited_canvas_items(); @@ -1610,7 +1610,7 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) { } // Confirms the node rotation - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && !b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { if (drag_selection.size() != 1) { _commit_canvas_item_state( drag_selection, @@ -1634,7 +1634,7 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -1648,7 +1648,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() == BUTTON_LEFT && b->is_pressed() && b->is_doubleclick() && tool == TOOL_SELECT) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && b->is_doubleclick() && tool == TOOL_SELECT) { List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { CanvasItem *canvas_item = selection[0]; @@ -1667,7 +1667,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() == BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_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]); @@ -1787,7 +1787,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() == BUTTON_LEFT && !b->is_pressed()) { + if (drag_selection.size() >= 1 && b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { _commit_canvas_item_state( drag_selection, vformat(TTR("Move CanvasItem \"%s\" Anchor"), drag_selection[0]->get_name())); @@ -1796,7 +1796,7 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -1812,7 +1812,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() == BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { CanvasItem *canvas_item = selection[0]; @@ -1966,7 +1966,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() == BUTTON_LEFT && !b->is_pressed()) { + if (drag_selection.size() >= 1 && b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { const Node2D *node2d = Object::cast_to<Node2D>(drag_selection[0]); if (node2d) { // Extends from Node2D. @@ -2003,7 +2003,7 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; @@ -2021,7 +2021,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() == BUTTON_LEFT && b->is_pressed() && ((b->get_alt() && b->get_control()) || tool == TOOL_SCALE)) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && ((b->get_alt() && b->get_control()) || tool == TOOL_SCALE)) { List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { CanvasItem *canvas_item = selection[0]; @@ -2117,7 +2117,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { } // Confirm resize - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && !b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { if (drag_selection.size() != 1) { _commit_canvas_item_state( drag_selection, @@ -2142,7 +2142,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -2159,7 +2159,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() == BUTTON_LEFT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed()) { if ((b->get_alt() && !b->get_control()) || tool == TOOL_MOVE) { List<CanvasItem *> selection = _get_edited_canvas_items(); @@ -2262,7 +2262,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { } // Confirm the move (only if it was moved) - if (b.is_valid() && !b->is_pressed() && b->get_button_index() == BUTTON_LEFT) { + if (b.is_valid() && !b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT) { if (transform.affine_inverse().xform(b->get_position()) != drag_from) { if (drag_selection.size() != 1) { _commit_canvas_item_state( @@ -2295,7 +2295,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection, true); snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; @@ -2435,8 +2435,8 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { if (drag_type == DRAG_NONE) { if (b.is_valid() && - ((b->get_button_index() == BUTTON_RIGHT && b->get_alt() && tool == TOOL_SELECT) || - (b->get_button_index() == BUTTON_LEFT && tool == TOOL_LIST_SELECT))) { + ((b->get_button_index() == MOUSE_BUTTON_RIGHT && b->get_alt() && tool == TOOL_SELECT) || + (b->get_button_index() == MOUSE_BUTTON_LEFT && tool == TOOL_LIST_SELECT))) { // Popup the selection menu list Point2 click = transform.affine_inverse().xform(b->get_position()); @@ -2497,7 +2497,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { } } - if (b.is_valid() && b->is_pressed() && b->get_button_index() == BUTTON_RIGHT && b->get_control()) { + if (b.is_valid() && b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->get_control()) { add_node_menu->set_position(get_global_transform().xform(get_local_mouse_position())); add_node_menu->set_size(Vector2(1, 1)); add_node_menu->popup(); @@ -2505,7 +2505,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { return true; } - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { // Single item selection Point2 click = transform.affine_inverse().xform(b->get_position()); @@ -2571,7 +2571,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() == BUTTON_LEFT) { + if (b.is_valid() && !b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT) { // Confirms box selection Node *scene = editor->get_edited_scene(); if (scene) { @@ -2597,7 +2597,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { return true; } - if (b.is_valid() && b->is_pressed() && b->get_button_index() == BUTTON_RIGHT) { + if (b.is_valid() && b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_RIGHT) { // Cancel box selection drag_type = DRAG_NONE; viewport->update(); @@ -2634,7 +2634,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() == BUTTON_LEFT) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT) { if (b->is_pressed()) { ruler_tool_active = true; } else { diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.cpp b/editor/plugins/collision_polygon_3d_editor_plugin.cpp index 0c18975258..b50a497ccf 100644 --- a/editor/plugins/collision_polygon_3d_editor_plugin.cpp +++ b/editor/plugins/collision_polygon_3d_editor_plugin.cpp @@ -142,7 +142,7 @@ bool CollisionPolygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, con switch (mode) { case MODE_CREATE: { - if (mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) { if (!wip_active) { wip.clear(); wip.push_back(cpoint); @@ -166,14 +166,14 @@ bool CollisionPolygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, con return true; } } - } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && wip_active) { + } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && wip_active) { _wip_close(); } } break; case MODE_EDIT: { - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { if (mb->get_control()) { if (poly.size() < 3) { @@ -267,7 +267,7 @@ bool CollisionPolygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, con } } } - if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && edited_point == -1) { + if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && edited_point == -1) { int closest_idx = -1; Vector2 closest_pos; real_t closest_dist = 1e10; @@ -301,7 +301,7 @@ bool CollisionPolygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, con Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - if (edited_point != -1 && (wip_active || mm->get_button_mask() & BUTTON_MASK_LEFT)) { + if (edited_point != -1 && (wip_active || mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT)) { Vector2 gpoint = mm->get_position(); Vector3 ray_from = p_camera->project_ray_origin(gpoint); diff --git a/editor/plugins/collision_shape_2d_editor_plugin.cpp b/editor/plugins/collision_shape_2d_editor_plugin.cpp index 141ee35cdb..c38458c37f 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.cpp +++ b/editor/plugins/collision_shape_2d_editor_plugin.cpp @@ -325,7 +325,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() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { for (int i = 0; i < handles.size(); i++) { if (xform.xform(handles[i]).distance_to(gpoint) < 8) { diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp index bff5cb8d2a..db999f50ab 100644 --- a/editor/plugins/curve_editor_plugin.cpp +++ b/editor/plugins/curve_editor_plugin.cpp @@ -115,22 +115,22 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) { } switch (mb.get_button_index()) { - case BUTTON_RIGHT: + case MOUSE_BUTTON_RIGHT: _context_click_pos = mpos; open_context_menu(get_global_transform().xform(mpos)); break; - case BUTTON_MIDDLE: + case MOUSE_BUTTON_MIDDLE: remove_point(_hover_point); break; - case BUTTON_LEFT: + case MOUSE_BUTTON_LEFT: _dragging = true; break; } } - if (!mb.is_pressed() && _dragging && mb.get_button_index() == BUTTON_LEFT) { + if (!mb.is_pressed() && _dragging && mb.get_button_index() == MOUSE_BUTTON_LEFT) { _dragging = false; if (_has_undo_data) { UndoRedo &ur = *EditorNode::get_singleton()->get_undo_redo(); diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp index eb3c06fba1..d3e5854786 100644 --- a/editor/plugins/editor_preview_plugins.cpp +++ b/editor/plugins/editor_preview_plugins.cpp @@ -88,7 +88,7 @@ Ref<Texture2D> EditorTexturePreviewPlugin::generate(const RES &p_from, const Siz return Ref<Texture2D>(); } - Ref<Image> atlas = tex->get_data(); + Ref<Image> atlas = tex->get_image(); if (!atlas.is_valid()) { return Ref<Texture2D>(); } @@ -99,7 +99,7 @@ Ref<Texture2D> EditorTexturePreviewPlugin::generate(const RES &p_from, const Siz } else { Ref<Texture2D> tex = p_from; if (tex.is_valid()) { - img = tex->get_data(); + img = tex->get_image(); if (img.is_valid()) { img = img->duplicate(); } diff --git a/editor/plugins/mesh_editor_plugin.cpp b/editor/plugins/mesh_editor_plugin.cpp index 1e4553a967..77719104b1 100644 --- a/editor/plugins/mesh_editor_plugin.cpp +++ b/editor/plugins/mesh_editor_plugin.cpp @@ -34,7 +34,7 @@ void MeshEditor::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { 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/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 449968eb7b..81c59fc0a9 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -186,7 +186,7 @@ void ViewportRotationControl::_get_sorted_axis(Vector<Axis2D> &r_axis) { void ViewportRotationControl::_gui_input(Ref<InputEvent> p_event) { const Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Vector2 pos = mb->get_position(); if (mb->is_pressed()) { if (pos.distance_to(get_size() / 2.0) < get_size().x / 2.0) { @@ -1123,23 +1123,21 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { float zoom_factor = 1 + (ZOOM_FREELOOK_MULTIPLIER - 1) * b->get_factor(); switch (b->get_button_index()) { - case BUTTON_WHEEL_UP: { + case MOUSE_BUTTON_WHEEL_UP: { if (is_freelook_active()) { scale_freelook_speed(zoom_factor); } else { scale_cursor_distance(1.0 / zoom_factor); } } break; - - case BUTTON_WHEEL_DOWN: { + case MOUSE_BUTTON_WHEEL_DOWN: { if (is_freelook_active()) { scale_freelook_speed(1.0 / zoom_factor); } else { scale_cursor_distance(zoom_factor); } } break; - - case BUTTON_RIGHT: { + case MOUSE_BUTTON_RIGHT: { NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int(); if (b->is_pressed() && _edit.gizmo.is_valid()) { @@ -1200,7 +1198,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } break; - case BUTTON_MIDDLE: { + case MOUSE_BUTTON_MIDDLE: { if (b->is_pressed() && _edit.mode != TRANSFORM_NONE) { switch (_edit.plane) { case TRANSFORM_VIEW: { @@ -1231,7 +1229,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } } break; - case BUTTON_LEFT: { + case MOUSE_BUTTON_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->get_alt()) { @@ -1440,7 +1438,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() & BUTTON_MASK_LEFT) { + } else if (m->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { if (nav_scheme == NAVIGATION_MAYA && m->get_alt()) { nav_mode = NAVIGATION_ORBIT; } else if (nav_scheme == NAVIGATION_MODO && m->get_alt() && m->get_shift()) { @@ -1830,8 +1828,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } } - - } else if ((m->get_button_mask() & BUTTON_MASK_RIGHT) || freelook_active) { + } else if ((m->get_button_mask() & MOUSE_BUTTON_MASK_RIGHT) || freelook_active) { if (nav_scheme == NAVIGATION_MAYA && m->get_alt()) { nav_mode = NAVIGATION_ZOOM; } else if (freelook_active) { @@ -1840,7 +1837,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { nav_mode = NAVIGATION_PAN; } - } else if (m->get_button_mask() & BUTTON_MASK_MIDDLE) { + } else if (m->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { const int mod = _get_key_modifier(m); if (nav_scheme == NAVIGATION_GODOT) { if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) { @@ -1851,13 +1848,11 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { // Always allow Alt as a modifier to better support graphic tablets. nav_mode = NAVIGATION_ORBIT; } - } else if (nav_scheme == NAVIGATION_MAYA) { if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) { nav_mode = NAVIGATION_PAN; } } - } 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); @@ -4199,7 +4194,7 @@ Node3DEditorViewport::~Node3DEditorViewport() { void Node3DEditorViewportContainer::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { Vector2 size = get_size(); @@ -4582,7 +4577,12 @@ void _update_all_gizmos(Node *p_node) { void Node3DEditor::update_all_gizmos(Node *p_node) { if (!p_node) { - p_node = SceneTree::get_singleton()->get_root(); + if (SceneTree::get_singleton()) { + p_node = SceneTree::get_singleton()->get_root(); + } else { + // No scene tree, so nothing to update. + return; + } } _update_all_gizmos(p_node); } @@ -6611,7 +6611,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() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { float x = -mm->get_relative().y * 0.02 * EDSCALE; float y = mm->get_relative().x * 0.02 * EDSCALE; diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp index 908235f89f..84b4516452 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() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mode == MODE_EDIT && !mb->get_shift() && 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() == BUTTON_RIGHT && mode == MODE_EDIT) || (mb->get_button_index() == BUTTON_LEFT && mode == MODE_DELETE)) { + if ((mb->get_button_index() == MOUSE_BUTTON_RIGHT && mode == MODE_EDIT) || (mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_LEFT && ((mb->get_command() && mode == MODE_EDIT) || mode == MODE_CREATE)) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && ((mb->get_command() && 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() == BUTTON_LEFT && mode == MODE_EDIT && on_edge) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_LEFT && action != ACTION_NONE) { + if (!mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && action != ACTION_NONE) { Ref<Curve2D> curve = node->get_curve(); Vector2 new_pos = moving_from + xform.affine_inverse().basis_xform(gpoint - moving_screen_from); diff --git a/editor/plugins/path_3d_editor_plugin.cpp b/editor/plugins/path_3d_editor_plugin.cpp index 3783af8fc6..47bd1114d2 100644 --- a/editor/plugins/path_3d_editor_plugin.cpp +++ b/editor/plugins/path_3d_editor_plugin.cpp @@ -316,7 +316,7 @@ bool Path3DEditorPlugin::forward_spatial_gui_input(Camera3D *p_camera, const Ref set_handle_clicked(false); } - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && (curve_create->is_pressed() || (curve_edit->is_pressed() && mb->get_control()))) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && (curve_create->is_pressed() || (curve_edit->is_pressed() && mb->get_control()))) { //click into curve, break it down Vector<Vector3> v3a = c->tessellate(); int idx = 0; @@ -411,7 +411,7 @@ bool Path3DEditorPlugin::forward_spatial_gui_input(Camera3D *p_camera, const Ref //add new at pos } - } else if (mb->is_pressed() && ((mb->get_button_index() == BUTTON_LEFT && curve_del->is_pressed()) || (mb->get_button_index() == BUTTON_RIGHT && curve_edit->is_pressed()))) { + } 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()))) { 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); diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index 3d7b01c149..470d897dcc 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() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { uv_drag_from = snap_point(Vector2(mb->get_position().x, mb->get_position().y)); uv_drag = true; @@ -759,7 +759,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { bone_painting = false; } } - } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_WHEEL_UP && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_WHEEL_DOWN && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_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() & BUTTON_MASK_MIDDLE) || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { + if ((mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { Vector2 drag(mm->get_relative().x, mm->get_relative().y); 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/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 8bf5d0611d..b298474406 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -2737,7 +2737,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 BUTTON_MIDDLE: { + case MOUSE_BUTTON_MIDDLE: { // Right-click selects automatically; middle-click does not. int idx = script_list->get_item_at_position(mb->get_position(), true); if (idx >= 0) { @@ -2747,7 +2747,7 @@ void ScriptEditor::_script_list_gui_input(const Ref<InputEvent> &ev) { } } break; - case BUTTON_RIGHT: { + case MOUSE_BUTTON_RIGHT: { _make_script_list_context_menu(); } break; } diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index b6df66b8af..3534809891 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -601,8 +601,7 @@ void ScriptTextEditor::_bookmark_item_pressed(int p_idx) { if (p_idx < 4) { // Any item before the separator. _edit_option(bookmarks_menu->get_item_id(p_idx)); } else { - code_editor->goto_line(bookmarks_menu->get_item_metadata(p_idx)); - code_editor->get_text_editor()->call_deferred("center_viewport_to_cursor"); //Need to be deferred, because goto uses call_deferred(). + code_editor->goto_line_centered(bookmarks_menu->get_item_metadata(p_idx)); } } @@ -791,7 +790,7 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c emit_signal("request_open_script_at_line", result.script, result.location - 1); } else { emit_signal("request_save_history"); - _goto_line(result.location - 1); + goto_line_centered(result.location - 1); } } break; case ScriptLanguage::LookupResult::RESULT_CLASS: { @@ -1517,7 +1516,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() == BUTTON_RIGHT && mb->is_pressed()) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { local_pos = mb->get_global_position() - tx->get_global_position(); create_menu = true; } else if (k.is_valid() && k->get_keycode() == KEY_MENU) { diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index c8a46715ad..8f8a4b3054 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -460,7 +460,7 @@ void ShaderEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { Ref<InputEventMouseButton> mb = ev; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { int col, row; CodeEdit *tx = shader_editor->get_text_editor(); tx->_get_mouse_pos(mb->get_global_position() - tx->get_global_position(), row, col); diff --git a/editor/plugins/sprite_2d_editor_plugin.cpp b/editor/plugins/sprite_2d_editor_plugin.cpp index 4acacf3058..4a7f6c0f7e 100644 --- a/editor/plugins/sprite_2d_editor_plugin.cpp +++ b/editor/plugins/sprite_2d_editor_plugin.cpp @@ -171,7 +171,7 @@ void Sprite2DEditor::_update_mesh_data() { return; } - Ref<Image> image = texture->get_data(); + Ref<Image> image = texture->get_image(); ERR_FAIL_COND(image.is_null()); if (image->is_compressed()) { diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index a6949c873e..bd6dac7490 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -105,7 +105,7 @@ void SpriteFramesEditor::_sheet_preview_draw() { void SpriteFramesEditor::_sheet_preview_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Size2i size = split_sheet_preview->get_size(); int h = split_sheet_h->get_value(); int v = split_sheet_v->get_value(); @@ -150,11 +150,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() == BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) { + if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) { _sheet_zoom_in(); // Don't scroll up after zooming in. accept_event(); - } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) { _sheet_zoom_out(); // Don't scroll down after zooming out. accept_event(); @@ -694,11 +694,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() == BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) { + if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) { _zoom_in(); // Don't scroll up after zooming in. accept_event(); - } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) { _zoom_out(); // Don't scroll down after zooming out. accept_event(); diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index b88f1c91e6..2b8bfe067d 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -469,7 +469,7 @@ void TextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { Ref<InputEventMouseButton> mb = ev; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_RIGHT) { + if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) { int col, row; CodeEdit *tx = code_editor->get_text_editor(); tx->_get_mouse_pos(mb->get_global_position() - tx->get_global_position(), row, col); diff --git a/editor/plugins/texture_layered_editor_plugin.cpp b/editor/plugins/texture_layered_editor_plugin.cpp index 254ad3d56e..265d4ccc1e 100644 --- a/editor/plugins/texture_layered_editor_plugin.cpp +++ b/editor/plugins/texture_layered_editor_plugin.cpp @@ -36,7 +36,7 @@ void TextureLayeredEditor::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { y_rot += -mm->get_relative().x * 0.01; x_rot += mm->get_relative().y * 0.01; _update_material(); diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index 4cbfe18594..7b927ad98b 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -285,7 +285,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseButton> mb = p_input; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { if (node_ninepatch || obj_styleBox.is_valid()) { edited_margin = -1; @@ -447,7 +447,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { creating = false; } - } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { if (drag) { drag = false; if (edited_margin >= 0) { @@ -466,9 +466,9 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { drag_index = -1; } } - } else if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_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() == BUTTON_WHEEL_DOWN && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed()) { _zoom_on_position(draw_zoom * (1 - (0.05 * mb->get_factor())), mb->get_position()); } } @@ -476,7 +476,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseMotion> mm = p_input; if (mm.is_valid()) { - if (mm->get_button_mask() & BUTTON_MASK_MIDDLE || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { + if (mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE || 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/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp index 59730a4fd3..bd721244ea 100644 --- a/editor/plugins/tile_map_editor_plugin.cpp +++ b/editor/plugins/tile_map_editor_plugin.cpp @@ -233,11 +233,11 @@ void TileMapEditor::_palette_input(const Ref<InputEvent> &p_event) { // Zoom in/out using Ctrl + mouse wheel. if (mb.is_valid() && mb->is_pressed() && mb->get_command()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_UP) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { size_slider->set_value(size_slider->get_value() + 0.2); } - if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_DOWN) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { size_slider->set_value(size_slider->get_value() - 0.2); } } @@ -1027,7 +1027,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { if (Input::get_singleton()->is_key_pressed(KEY_SPACE)) { return false; // Drag. @@ -1177,7 +1177,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return true; } } - } else if (mb->get_button_index() == BUTTON_RIGHT) { + } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) { if (mb->is_pressed()) { if (tool == TOOL_SELECTING || selection_active) { tool = TOOL_NONE; @@ -1462,7 +1462,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return true; } - if (tool == TOOL_PICKING && Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { + if (tool == TOOL_PICKING && Input::get_singleton()->is_mouse_button_pressed(MOUSE_BUTTON_LEFT)) { _pick_tile(over_tile); return true; diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp index 66d7d3dbaa..feaf609557 100644 --- a/editor/plugins/tile_set_editor_plugin.cpp +++ b/editor/plugins/tile_set_editor_plugin.cpp @@ -1246,12 +1246,12 @@ void TileSetEditor::_on_scroll_container_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() == BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) { + if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) { print_line("zooming in"); _zoom_in(); // Don't scroll up after zooming in. accept_event(); - } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) { print_line("zooming out"); _zoom_out(); // Don't scroll down after zooming out. @@ -1280,7 +1280,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { const Ref<InputEventMouseMotion> mm = p_ie; if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && !creating_shape) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && !creating_shape) { if (!current_tile_region.has_point(mb->get_position())) { List<int> *tiles = new List<int>(); tileset->get_tile_list(tiles); @@ -1304,7 +1304,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { } // Drag Middle Mouse if (mm.is_valid()) { - if (mm->get_button_mask() & BUTTON_MASK_MIDDLE) { + if (mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { Vector2 dragged(mm->get_relative().x, mm->get_relative().y); scroll->set_h_scroll(scroll->get_h_scroll() - dragged.x * workspace->get_scale().x); scroll->set_v_scroll(scroll->get_v_scroll() - dragged.y * workspace->get_scale().x); @@ -1313,7 +1313,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { if (edit_mode == EDITMODE_REGION) { if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (get_current_tile() >= 0 || workspace_mode != WORKSPACE_EDIT) { dragging = true; region_from = mb->get_position(); @@ -1322,13 +1322,13 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { workspace_overlay->update(); return; } - } else if (dragging && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + } else if (dragging && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { dragging = false; edited_region = Rect2(); workspace->update(); workspace_overlay->update(); return; - } else if (dragging && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + } else if (dragging && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { dragging = false; update_edited_region(mb->get_position()); edited_region.position -= WORKSPACE_MARGIN; @@ -1428,7 +1428,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { switch (edit_mode) { case EDITMODE_ICON: { if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && current_tile_region.has_point(mb->get_position())) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && current_tile_region.has_point(mb->get_position())) { Vector2 coord((int)((mb->get_position().x - current_tile_region.position.x) / (spacing + size.x)), (int)((mb->get_position().y - current_tile_region.position.y) / (spacing + size.y))); undo_redo->create_action(TTR("Set Tile Icon")); undo_redo->add_do_method(tileset.ptr(), "autotile_set_icon_coordinate", get_current_tile(), coord); @@ -1445,9 +1445,9 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { if (dragging) { return; } - if ((mb->get_button_index() == BUTTON_RIGHT || mb->get_button_index() == BUTTON_LEFT) && current_tile_region.has_point(mb->get_position())) { + if ((mb->get_button_index() == MOUSE_BUTTON_RIGHT || mb->get_button_index() == MOUSE_BUTTON_LEFT) && current_tile_region.has_point(mb->get_position())) { dragging = true; - erasing = (mb->get_button_index() == BUTTON_RIGHT); + erasing = (mb->get_button_index() == MOUSE_BUTTON_RIGHT); alternative = Input::get_singleton()->is_key_pressed(KEY_SHIFT); Vector2 coord((int)((mb->get_position().x - current_tile_region.position.x) / (spacing + size.x)), (int)((mb->get_position().y - current_tile_region.position.y) / (spacing + size.y))); Vector2 pos(coord.x * (spacing + size.x), coord.y * (spacing + size.y)); @@ -1518,7 +1518,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { } } } else { - if ((erasing && mb->get_button_index() == BUTTON_RIGHT) || (!erasing && mb->get_button_index() == BUTTON_LEFT)) { + if ((erasing && mb->get_button_index() == MOUSE_BUTTON_RIGHT) || (!erasing && mb->get_button_index() == MOUSE_BUTTON_LEFT)) { dragging = false; erasing = false; alternative = false; @@ -1612,7 +1612,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { shape_anchor += current_tile_region.position; if (tools[TOOL_SELECT]->is_pressed()) { if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (edit_mode != EDITMODE_PRIORITY && current_shape.size() > 0) { int grabbed_point = get_grabbed_point(mb->get_position(), grab_threshold); @@ -1630,7 +1630,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { } } workspace->update(); - } else if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + } else if (!mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (edit_mode == EDITMODE_COLLISION) { if (dragging_point >= 0) { dragging_point = -1; @@ -1705,7 +1705,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { } } else if (tools[SHAPE_NEW_POLYGON]->is_pressed()) { if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Vector2 pos = mb->get_position(); pos = snap_point(pos); if (creating_shape) { @@ -1725,7 +1725,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { current_shape.push_back(snap_point(pos)); workspace->update(); } - } else if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + } else if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { if (creating_shape) { creating_shape = false; _select_edited_shape_coord(); @@ -1739,7 +1739,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { } } else if (tools[SHAPE_NEW_RECTANGLE]->is_pressed()) { if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { _set_edited_collision_shape(Ref<ConvexPolygonShape2D>()); current_shape.resize(0); Vector2 pos = mb->get_position(); @@ -1751,13 +1751,13 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { creating_shape = true; workspace->update(); return; - } else if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + } else if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { if (creating_shape) { creating_shape = false; _select_edited_shape_coord(); workspace->update(); } - } else if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + } else if (!mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (creating_shape) { // if the first two corners are within grabbing distance of one another, expand the rect to fill the tile if (is_within_grabbing_distance_of_first_point(current_shape[1], grab_threshold)) { diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index a63e641c2b..69bdc05b3a 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -2504,7 +2504,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() == BUTTON_RIGHT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { selected_constants.clear(); selected_uniforms.clear(); diff --git a/editor/project_export.cpp b/editor/project_export.cpp index 4bcb616fbd..3ede50320a 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -37,7 +37,7 @@ #include "core/os/dir_access.h" #include "core/os/file_access.h" #include "core/os/os.h" -#include "core/string/compressed_translation.h" +#include "core/string/optimized_translation.h" #include "editor_data.h" #include "editor_node.h" #include "editor_scale.h" @@ -1082,6 +1082,7 @@ ProjectExportDialog::ProjectExportDialog() { export_filter->add_item(TTR("Export all resources in the project")); export_filter->add_item(TTR("Export selected scenes (and dependencies)")); export_filter->add_item(TTR("Export selected resources (and dependencies)")); + export_filter->add_item(TTR("Export all resources in the project except resources checked below")); resources_vb->add_margin_child(TTR("Export Mode:"), export_filter); export_filter->connect("item_selected", callable_mp(this, &ProjectExportDialog::_export_type_changed)); diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index f4aa628b65..eda9499783 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -100,6 +100,7 @@ private: FileDialog *fdialog_install; String zip_path; String zip_title; + String zip_root; AcceptDialog *dialog_error; String fav_dir; @@ -200,7 +201,9 @@ private: char fname[16384]; ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, nullptr, 0, nullptr, 0); - if (String(fname).ends_with("project.godot")) { + String fname_str = String(fname); + if (fname_str.ends_with("project.godot")) { + zip_root = fname_str.substr(0, fname_str.rfind("project.godot")); break; } @@ -533,44 +536,34 @@ private: String path = fname; - int depth = 1; //stuff from github comes with tag - bool skip = false; - while (depth > 0) { - int pp = path.find("/"); - if (pp == -1) { - skip = true; - break; - } - path = path.substr(pp + 1, path.length()); - depth--; - } - - if (skip || path == String()) { + if (path == String() || path == zip_root || !zip_root.is_subsequence_of(path)) { // } else if (path.ends_with("/")) { // a dir path = path.substr(0, path.length() - 1); + String rel_path = path.substr(zip_root.length()); DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); - da->make_dir(dir.plus_file(path)); + da->make_dir(dir.plus_file(rel_path)); memdelete(da); } else { Vector<uint8_t> data; data.resize(info.uncompressed_size); + String rel_path = path.substr(zip_root.length()); //read unzOpenCurrentFile(pkg); unzReadCurrentFile(pkg, data.ptrw(), data.size()); unzCloseCurrentFile(pkg); - FileAccess *f = FileAccess::open(dir.plus_file(path), FileAccess::WRITE); + FileAccess *f = FileAccess::open(dir.plus_file(rel_path), FileAccess::WRITE); if (f) { f->store_buffer(data.ptr(), data.size()); memdelete(f); } else { - failed_files.push_back(path); + failed_files.push_back(rel_path); } } @@ -1741,7 +1734,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() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->get_shift() && _selected_project_keys.size() > 0 && _last_clicked != "" && clicked_project.project_key != _last_clicked) { int anchor_index = -1; for (int i = 0; i < _projects.size(); ++i) { @@ -2425,8 +2418,10 @@ ProjectManager::ProjectManager() { // Define a minimum window size to prevent UI elements from overlapping or being cut off DisplayServer::get_singleton()->window_set_min_size(Size2(750, 420) * EDSCALE); - // TODO: Resize windows on hiDPI displays on Windows and Linux and remove the line below - DisplayServer::get_singleton()->window_set_size(DisplayServer::get_singleton()->window_get_size() * MAX(1, EDSCALE)); + // TODO: Resize windows on hiDPI displays on Windows and Linux and remove the lines below + float scale_factor = MAX(1, EDSCALE); + Vector2i window_size = DisplayServer::get_singleton()->window_get_size(); + DisplayServer::get_singleton()->window_set_size(Vector2i(window_size.x * scale_factor, window_size.y * scale_factor)); } // TRANSLATORS: This refers to the application where users manage their Godot projects. diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 8ce7153355..0a4f432e4a 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -1353,7 +1353,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() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { float rel = mm->get_relative().x; if (rel == 0) { return; diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp index 48aa0471c9..b51524b299 100644 --- a/editor/rename_dialog.cpp +++ b/editor/rename_dialog.cpp @@ -434,7 +434,10 @@ String RenameDialog::_substitute(const String &subject, const Node *node, int co } int current = EditorNode::get_singleton()->get_editor_data().get_edited_scene(); - result = result.replace("${SCENE}", EditorNode::get_singleton()->get_editor_data().get_scene_title(current)); + // Always request the scene title with the extension stripped. + // Otherwise, the result could vary depending on whether a scene with the same name + // (but different extension) is currently open. + result = result.replace("${SCENE}", EditorNode::get_singleton()->get_editor_data().get_scene_title(current, true)); Node *root_node = SceneTree::get_singleton()->get_edited_scene_root(); if (root_node) { diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 53edee0181..57d517b7e9 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -63,7 +63,7 @@ void SceneTreeDock::_quick_open() { void SceneTreeDock::_input(Ref<InputEvent> p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { restore_script_editor_on_drag = false; //lost chance } } @@ -897,7 +897,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { Node *scene = editor_data->get_edited_scene_root(); if (!scene) { - accept->set_text(TTR("This operation can't be done without a scene.")); + accept->set_text(TTR("Saving the branch as a scene requires having a scene open in the editor.")); accept->popup_centered(); break; } @@ -905,7 +905,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { List<Node *> selection = editor_selection->get_selected_node_list(); if (selection.size() != 1) { - accept->set_text(TTR("This operation requires a single selected node.")); + accept->set_text(vformat(TTR("Saving the branch as a scene requires selecting only one node, but you have selected %d nodes."), selection.size())); accept->popup_centered(); break; } @@ -913,13 +913,13 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { Node *tocopy = selection.front()->get(); if (tocopy == scene) { - accept->set_text(TTR("Can not perform with the root node.")); + accept->set_text(TTR("Can't save the root node branch as an instanced scene.\nTo create an editable copy of the current scene, duplicate it using the FileSystem dock context menu\nor create an inherited scene using Scene > New Inherited Scene... instead.")); accept->popup_centered(); break; } if (tocopy != editor_data->get_edited_scene_root() && tocopy->get_filename() != "") { - accept->set_text(TTR("This operation can't be done on instanced scenes.")); + accept->set_text(TTR("Can't save the branch of an already instanced scene.\nTo create a variation of a scene, you can make an inherited scene based on the instanced scene using Scene > New Inherited Scene... instead.")); accept->popup_centered(); break; } diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index e9de91f851..b5e9aec854 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -994,9 +994,6 @@ bool SceneTreeEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_d if (!can_rename) { return false; //not editable tree } - if (filter != String()) { - return false; //can't rearrange tree with filter turned on - } Dictionary d = p_data; if (!d.has("type")) { @@ -1049,7 +1046,7 @@ bool SceneTreeEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_d } } - return String(d["type"]) == "nodes"; + return String(d["type"]) == "nodes" && filter == String(); } void SceneTreeEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { diff --git a/editor/translations/af.po b/editor/translations/af.po index bda0eed750..cfee3af954 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -3667,6 +3667,11 @@ 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 "" @@ -4095,6 +4100,10 @@ msgid "Reset to Defaults" msgstr "Laai Verstek" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr "Vind" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 5c03984e01..f4b65c0065 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -3691,6 +3691,11 @@ 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 "لا يمكن مسح/إعادة تسمية جذر الموارد." @@ -4092,6 +4097,10 @@ msgid "Reset to Defaults" msgstr "تحميل الإفتراضي" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d ملفات" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index 848574a1f1..cb2b9e1bd2 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -3537,6 +3537,11 @@ 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 "" @@ -3927,6 +3932,10 @@ msgid "Reset to Defaults" msgstr "Връщане на стандартните настройки" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d файла" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index ca8fff0724..c8d082fbd5 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -3872,6 +3872,11 @@ 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 #, fuzzy msgid "Cannot move/rename resources root." msgstr "ফন্টের উৎস লোড/প্রসেস করা সম্ভব হচ্ছে না।" @@ -4323,6 +4328,10 @@ msgid "Reset to Defaults" msgstr "প্রাথমিক sRGB ব্যবহার করুন" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr "ফাইল" diff --git a/editor/translations/br.po b/editor/translations/br.po index 7600dd4eb1..29f9cd2d79 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -3512,6 +3512,11 @@ 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 "" @@ -3902,6 +3907,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 141f2cd58f..ca28ea5eaf 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -3714,6 +3714,11 @@ msgid "Status: Import of file failed. Please fix file and reimport manually." msgstr "Estat: No s'ha pogut importar. Corregiu el fitxer i torneu a importar." #: 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 "No es pot moure/reanomenar l'arrel dels recursos." @@ -4121,6 +4126,10 @@ msgid "Reset to Defaults" msgstr "Carrega Valors predeterminats" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Fitxers" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 2c21fc0e63..bc20742d40 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -3674,6 +3674,11 @@ msgstr "" "znovu ručně." #: 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 "Nelze přesunout/přejmenovat kořen zdrojů." @@ -4077,6 +4082,10 @@ msgid "Reset to Defaults" msgstr "Načíst výchozí" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d souborů" diff --git a/editor/translations/da.po b/editor/translations/da.po index 72b2bf0e81..7de7e428c5 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-03-16 10:40+0000\n" +"PO-Revision-Date: 2021-03-20 04:18+0000\n" "Last-Translator: snakatk <snaqii@live.dk>\n" "Language-Team: Danish <https://hosted.weblate.org/projects/godot-engine/" "godot/da/>\n" @@ -406,7 +406,7 @@ msgstr "Anim Indsæt Nøgle" #: editor/animation_track_editor.cpp #, fuzzy msgid "Change Animation Step" -msgstr "Ændre Animation Navn:" +msgstr "Ændre animationsskridt" #: editor/animation_track_editor.cpp #, fuzzy @@ -549,7 +549,7 @@ msgstr "Grupper spor efter node eller vis dem som almindelig liste." #: editor/animation_track_editor.cpp #, fuzzy msgid "Snap:" -msgstr "Trin: " +msgstr "Trin:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -595,8 +595,9 @@ msgid "Duplicate Selection" msgstr "Duplikér Valgte" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Duplicate Transposed" -msgstr "Duplicate transposed" +msgstr "Duplikér Transposed" #: editor/animation_track_editor.cpp msgid "Delete Selection" @@ -673,7 +674,7 @@ msgstr "Skalaforhold:" #: editor/animation_track_editor.cpp #, fuzzy msgid "Select Tracks to Copy" -msgstr "Vælg spor til kopiering:" +msgstr "Vælg spor til kopiering" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -690,9 +691,8 @@ msgid "Select All/None" msgstr "Vælg Node" #: editor/animation_track_editor_plugins.cpp -#, fuzzy msgid "Add Audio Track Clip" -msgstr "Lydklip:" +msgstr "Tilføj lydspor klip" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" @@ -798,7 +798,7 @@ msgstr "Metode i target Node skal angives!" #: editor/connections_dialog.cpp #, fuzzy msgid "Method name must be a valid identifier." -msgstr "Navnet er ikke et gyldigt id:" +msgstr "Metodenavnet er ikke et gyldigt id." #: editor/connections_dialog.cpp #, fuzzy @@ -856,7 +856,7 @@ msgstr "Ekstra Call Argumenter:" #: editor/connections_dialog.cpp #, fuzzy msgid "Receiver Method:" -msgstr "Vælg Method" +msgstr "Modtager Metode:" #: editor/connections_dialog.cpp #, fuzzy @@ -936,9 +936,8 @@ msgid "Connect a Signal to a Method" msgstr "Forbind Signal: " #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection:" -msgstr "Redigere Forbindelse: " +msgstr "Redigér Forbindelse:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" @@ -1082,14 +1081,15 @@ msgid "Owners Of:" msgstr "Ejere af:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "Fjern de valgte filer fra projektet? (ej fortrydes)" +msgstr "" +"Fjern de valgte filer fra projektet? (ej fortrydes)\n" +"Du kan finde de fjernede filer i systemets skraldespand for at genoprette " +"dem." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1097,7 +1097,9 @@ msgid "" "You can find the removed files in the system trash to restore them." msgstr "" "De filer der fjernes er nødvendige for, at andre ressourcer kan fungere.\n" -"Fjern dem alligevel? (ej fortrydes)" +"Fjern dem alligevel? (ej fortrydes)\n" +"Du kan finde de fjernede filer i systemets skraldespand for at genoprette " +"dem." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1129,7 +1131,7 @@ msgstr "Fejl ved indlæsning!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "Slette %d styk(s) permanent? (ej fortryd)" +msgstr "Slet %d styk(s) permanent? (ej fortrydes)" #: editor/dependency_editor.cpp #, fuzzy @@ -1204,14 +1206,12 @@ msgid "Gold Sponsors" msgstr "Guld Sponsorer" #: editor/editor_about.cpp -#, fuzzy msgid "Silver Sponsors" -msgstr "Sølv Donorer" +msgstr "Sølv Sponsorer" #: editor/editor_about.cpp -#, fuzzy msgid "Bronze Sponsors" -msgstr "Bronze Donorer" +msgstr "Bronze Sponsorer" #: editor/editor_about.cpp msgid "Mini Sponsors" @@ -1238,22 +1238,21 @@ msgid "License" msgstr "Licens" #: editor/editor_about.cpp -#, fuzzy msgid "Third-party Licenses" -msgstr "Tredjeparts Licens" +msgstr "Tredjepartslicenser" #: editor/editor_about.cpp -#, fuzzy 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 "" -"Godot Engine er afhængig af en række tredjeparts biblioteker som er gratis " +"Godot Engine er afhængig af en række tredjepartsbiblioteker, som er gratis " "og open source. Alle bibliotekerne er kompatible med vilkårene i MIT-" -"licensen. Følgende er en udtømmende liste over alle sådanne tredjeparts " -"komponenter med deres respektive ophavsretlige udsagn og licensbetingelser." +"licensen. Følgende er en udtømmende liste over alle sådanne " +"tredjepartskomponenter med deres respektive ophavsretlige udsagn og " +"licensbetingelser." #: editor/editor_about.cpp msgid "All Components" @@ -1268,9 +1267,8 @@ msgid "Licenses" msgstr "Licenser" #: editor/editor_asset_installer.cpp editor/project_manager.cpp -#, fuzzy msgid "Error opening package file, not in ZIP format." -msgstr "Fejl ved åbning af pakke fil, ikke i zip format." +msgstr "Fejl ved åbning af pakkefil, ikke i ZIP-format." #: editor/editor_asset_installer.cpp #, fuzzy @@ -1286,9 +1284,8 @@ msgid "The following files failed extraction from package:" msgstr "De følgende filer kunne ikke trækkes ud af pakken:" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "And %s more files." -msgstr "%d flere filer" +msgstr "Og %s flere filer." #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package installed successfully!" @@ -1380,7 +1377,7 @@ msgstr "Bus muligheder" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "Duplikere" +msgstr "Duplikér" #: editor/editor_audio_buses.cpp msgid "Reset Volume" @@ -1431,12 +1428,10 @@ msgid "Open Audio Bus Layout" msgstr "Åben Audio Bus Layout" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "There is no '%s' file." msgstr "Der er ingen '%s' fil." #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Layout" msgstr "Layout" @@ -1454,9 +1449,8 @@ msgid "Add Bus" msgstr "Tilføj Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add a new Audio Bus to this layout." -msgstr "Gem Audio Bus Layout Som..." +msgstr "Tilføj en ny Audio Bus til dette layout." #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1550,9 +1544,8 @@ msgid "Rearrange Autoloads" msgstr "Flytte om på Autoloads" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Can't add autoload:" -msgstr "Kan ikke tilføje autoload:" +msgstr "Autoload kan ikke tilføjes:" #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" @@ -1604,9 +1597,8 @@ msgid "[unsaved]" msgstr "[ikke gemt]" #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first." -msgstr "Vælg en basis mappe først" +msgstr "Vælg en basismappe først." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1639,16 +1631,14 @@ msgid "Storing File:" msgstr "Lagrings Fil:" #: editor/editor_export.cpp -#, fuzzy msgid "No export template found at the expected path:" -msgstr "Ingen eksporterings-skabelon fundet ved den forventede sti:" +msgstr "Ingen eksporterings-skabelon fundet på den forventede sti:" #: editor/editor_export.cpp msgid "Packing" msgstr "Pakker" #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." @@ -1657,7 +1647,6 @@ msgstr "" "i Projektindstillingerne." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." @@ -1672,18 +1661,25 @@ msgid "" "Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"Målplatform kræver 'ETC' teksturkomprimering for driver fallback til GLES2.\n" +"Aktivér 'Import Etc' i Projektindstillingerne, eller deaktivér 'Driver " +"Fallback Aktiveret'." #: editor/editor_export.cpp msgid "" "Target platform requires 'PVRTC' texture compression for GLES2. Enable " "'Import Pvrtc' in Project Settings." msgstr "" +"Målplatform kræver 'PVRTC' teksturkomprimering for GLES2. Aktivér 'Import " +"Pvrtc' i Projektindstillingerne." #: 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ålplatformen kræver 'ETC2' eller 'PVRTC' teksturkomprimering for GLES3. " +"Aktivér 'Import Etc 2' eller 'Import Pvrtc' i Projektindstillingerne." #: editor/editor_export.cpp msgid "" @@ -1692,12 +1688,16 @@ msgid "" "Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"Målplatform kræver 'PVRTC' teksturkomprimering for driver fallback til " +"GLES2.\n" +"Aktivér 'Import Pvrtc' i Projektindstillingerne, eller deaktivér 'Driver " +"Fallback Aktiveret'." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom debug template not found." -msgstr "Brugerdefineret debug skabelonfil ikke fundet:" +msgstr "Brugerdefineret debug skabelonfil ikke fundet." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -1711,7 +1711,7 @@ msgstr "Skabelonfil ikke fundet:" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." -msgstr "" +msgstr "Den indlejrede PCK kan ikke overstige 4 GiB ved 32-bit eksport." #: editor/editor_feature_profile.cpp #, fuzzy @@ -1797,7 +1797,7 @@ msgstr "Funktions Liste:" #: editor/editor_feature_profile.cpp #, fuzzy msgid "Enabled Classes:" -msgstr "Søg Classes" +msgstr "Aktiverede Classes:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." @@ -2074,14 +2074,13 @@ msgid "Inherited by:" msgstr "Arvet af:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "Beskrivelse:" +msgstr "Beskrivelse" #: editor/editor_help.cpp #, fuzzy msgid "Online Tutorials" -msgstr "Online Undervisning:" +msgstr "Online Vejledninger" #: editor/editor_help.cpp msgid "Properties" @@ -2092,9 +2091,8 @@ msgid "override:" msgstr "" #: editor/editor_help.cpp -#, fuzzy msgid "default:" -msgstr "Standard" +msgstr "standardindstilling:" #: editor/editor_help.cpp msgid "Methods" @@ -2117,9 +2115,8 @@ msgid "Property Descriptions" msgstr "Egenskab beskrivelser" #: editor/editor_help.cpp -#, fuzzy msgid "(value)" -msgstr "Værdi:" +msgstr "(værdi)" #: editor/editor_help.cpp msgid "" @@ -2880,7 +2877,7 @@ msgstr "Projekt Indstillinger" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Version Control" -msgstr "Version:" +msgstr "Versionskontrol" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" @@ -3773,14 +3770,17 @@ msgid "Favorites" msgstr "Favoritter" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Status: Import of file failed. Please fix file and reimport manually." msgstr "" -"\n" "Status: Import af filen fejlede. Venligst reparer filen og genimporter " "manuelt." #: 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 "Kan ikke flytte/omdøbe resourcen root." @@ -4219,6 +4219,10 @@ msgid "Reset to Defaults" msgstr "Indlæs Default" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Filer" @@ -9994,9 +9998,8 @@ msgid "Export All" msgstr "Eksporter" #: editor/project_export.cpp editor/project_manager.cpp -#, fuzzy msgid "ZIP File" -msgstr " Filer" +msgstr "ZIP-Fil" #: editor/project_export.cpp msgid "Godot Game Pack" diff --git a/editor/translations/de.po b/editor/translations/de.po index ffd8a8874e..4521c7fdbc 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -3758,6 +3758,11 @@ msgstr "" "Status: Dateiimport fehlgeschlagen. Manuelle Reparatur und Neuimport nötig." #: 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 "Ressourcen-Wurzel kann nicht verschoben oder umbenannt werden." @@ -4160,6 +4165,10 @@ msgid "Reset to Defaults" msgstr "Auf Standardwerte zurücksetzen" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Dateien" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index d11d4f42ac..2c0294e8b8 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -3490,6 +3490,11 @@ 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 "" @@ -3880,6 +3885,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index 8cd3397399..2aa33c39aa 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -11,12 +11,13 @@ # KostasMSC <kargyris@athtech.gr>, 2020. # lawfulRobot <czavantias@gmail.com>, 2020. # Michalis <michalisntovas@yahoo.gr>, 2021. +# leriaz <leriaz@live.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-03-03 15:50+0000\n" -"Last-Translator: Michalis <michalisntovas@yahoo.gr>\n" +"PO-Revision-Date: 2021-03-29 21:57+0000\n" +"Last-Translator: leriaz <leriaz@live.com>\n" "Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/" "el/>\n" "Language: el\n" @@ -24,7 +25,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.5.1-dev\n" +"X-Generator: Weblate 4.6-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -825,7 +826,7 @@ msgstr "Μέθοδος Δέκτη:" #: editor/connections_dialog.cpp msgid "Advanced" -msgstr "Για Προχωρημένους" +msgstr "Για προχωρημένους" #: editor/connections_dialog.cpp msgid "Deferred" @@ -1041,11 +1042,13 @@ msgid "Owners Of:" msgstr "Ιδιοκτήτες του:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "Αφαίρεση επιλεγμένων αρχείων από το έργο; (Αδυναμία αναίρεσης)" +msgstr "" +"Αφαίρεση επιλεγμένων αρχείων από το έργο; (Αδυναμία αναίρεσης)\n" +"Μπορείτε να βρείτε τα διεγραμμένα αρχεία στον κάδο ανακύκλωσης για να τα " +"επαναφέρετε." #: editor/dependency_editor.cpp #, fuzzy @@ -3700,6 +3703,11 @@ 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 "Δεν ήταν δυνατή η μετακίνηση/μετονομασία του πηγαίου καταλόγου." @@ -4104,6 +4112,10 @@ msgid "Reset to Defaults" msgstr "Χρήση προεπιλεγμένου sRGB" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d αρχεία" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 46e3a6b28d..3cb57c4089 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -3593,6 +3593,11 @@ 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 "" @@ -3994,6 +3999,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr "Trovi en dosierojn" diff --git a/editor/translations/es.po b/editor/translations/es.po index 4f8441fbfc..78a2edd4ce 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -3756,6 +3756,11 @@ msgstr "" "reimpórtalo manualmente." #: 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 "No se puede mover/renombrar la raíz de los recursos." @@ -4157,6 +4162,10 @@ msgid "Reset to Defaults" msgstr "Restablecer Valores por Defecto" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d archivos" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 11e55b2dfa..c628655b4d 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -3708,6 +3708,11 @@ msgstr "" "reimportá manualmente." #: 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 "No se puede mover/renombrar la raiz de recursos." @@ -4108,6 +4113,10 @@ msgid "Reset to Defaults" msgstr "Restablecer Valores Por Defecto" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Archivos" diff --git a/editor/translations/et.po b/editor/translations/et.po index ba7272db84..d1f68d4402 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -3545,6 +3545,11 @@ 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 "" @@ -3938,6 +3943,10 @@ msgid "Reset to Defaults" msgstr "Laadi vaikimisi" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index 95e87167e5..0fda17a8d5 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -3507,6 +3507,11 @@ 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 "" @@ -3901,6 +3906,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d fitxategi" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 1ac27a6fd6..4b2ad80f34 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -3585,6 +3585,11 @@ 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 "" @@ -4017,6 +4022,10 @@ msgid "Reset to Defaults" msgstr "بارگیری پیش فرض" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr " پوشه ها" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 4d690bd29d..19959ec1f0 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -3666,6 +3666,11 @@ msgstr "" "Tila: Tuonti epäonnistui. Ole hyvä, korjaa tiedosto ja tuo se uudelleen." #: 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 "Ei voitu siirtää/nimetä uudelleen resurssien päätasoa." @@ -4068,6 +4073,10 @@ msgid "Reset to Defaults" msgstr "Palauta oletusarvoihin" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d tiedostoa" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index e9c24cf0f2..ef48d8b143 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -3507,6 +3507,11 @@ 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 "" @@ -3897,6 +3902,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 7b9d411e6d..3e6dc5fb35 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -82,7 +82,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-22 10:21+0000\n" +"PO-Revision-Date: 2021-03-21 12:25+0000\n" "Last-Translator: Pierre Caye <pierrecaye@laposte.net>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" @@ -91,7 +91,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.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -3779,6 +3779,13 @@ msgstr "" "le réimporter manuellement." #: editor/filesystem_dock.cpp +msgid "" +"Importing has been disabled for this file, so it can't be opened for editing." +msgstr "" +"L'importation a été désactivée pour ce fichier, il ne peut donc pas être " +"ouvert dans l'éditeur." + +#: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." msgstr "Impossible de déplacer / renommer les ressources root." @@ -4180,6 +4187,10 @@ msgid "Reset to Defaults" msgstr "Réinitialiser" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "Conserver le fichier (non importé)" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d fichiers" @@ -12648,10 +12659,14 @@ msgstr "Un CollisionPolygon2D vide n'a pas d'effet sur les collisions." #: scene/2d/collision_polygon_2d.cpp msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." msgstr "" +"Polygone non valide. Il doit avoir au moins trois points en mode de " +"construction 'Solide'." #: scene/2d/collision_polygon_2d.cpp msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." msgstr "" +"Polygone non valide. Il doit y avoir au moins 2 points en mode de " +"construction 'Segments'." #: scene/2d/collision_shape_2d.cpp msgid "" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 4e537d9882..3bedee8314 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -3500,6 +3500,11 @@ 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 "" @@ -3892,6 +3897,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr "Amharc ar Chomhaid" diff --git a/editor/translations/gl.po b/editor/translations/gl.po index 5559444f0c..519fc06c8d 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -3657,6 +3657,11 @@ msgstr "" "impórtao manualmente." #: 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 "" @@ -4060,6 +4065,10 @@ msgid "Reset to Defaults" msgstr "Cargar Valores por Defecto" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Arquivos" diff --git a/editor/translations/he.po b/editor/translations/he.po index ab97d97c0a..30a3212661 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -3646,6 +3646,11 @@ 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 "לא ניתן להעביר/לשנות שם למקור של משאבים." @@ -4071,6 +4076,10 @@ msgid "Reset to Defaults" msgstr "טעינת בררת המחדל" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d קבצים" diff --git a/editor/translations/hi.po b/editor/translations/hi.po index 034451542b..8425dd284f 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -3646,6 +3646,11 @@ 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 "संसाधनों की जड़ को स्थानांतरित/नाम नहीं दे सकते ।" @@ -4051,6 +4056,10 @@ msgid "Reset to Defaults" msgstr "प्रायिक लोड कीजिये" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index 047363db63..861f3e6c1c 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -3512,6 +3512,11 @@ 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 "" @@ -3909,6 +3914,10 @@ msgid "Reset to Defaults" msgstr "Učitaj Zadano" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Fajlovi" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 3966959f91..cf758b874f 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -3663,6 +3663,11 @@ msgstr "" "újra manuálisan." #: 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 "Az erőforrások gyökere nem mozgatható vagy átnevezhető." @@ -4063,6 +4068,10 @@ msgid "Reset to Defaults" msgstr "Alapértelmezett Betöltése" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d fájl" diff --git a/editor/translations/id.po b/editor/translations/id.po index 5dc5b9751a..5a31ccdd6e 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -11,7 +11,7 @@ # Khairul Hidayat <khairulcyber4rt@gmail.com>, 2016. # Reza Hidayat Bayu Prabowo <rh.bayu.prabowo@gmail.com>, 2018, 2019. # Romi Kusuma Bakti <romikusumab@gmail.com>, 2017, 2018. -# Sofyan Sugianto <sofyanartem@gmail.com>, 2017-2018, 2019, 2020. +# Sofyan Sugianto <sofyanartem@gmail.com>, 2017-2018, 2019, 2020, 2021. # Tito <ijavadroid@gmail.com>, 2018. # Tom My <tom.asadinawan@gmail.com>, 2017. # yursan9 <rizal.sagi@gmail.com>, 2016. @@ -24,16 +24,17 @@ # Modeus Darksono <garuga17@gmail.com>, 2019. # Akhmad Zulfikar <azuldegratz@gmail.com>, 2020. # Ade Fikri Malihuddin <ade.fm97@gmail.com>, 2020. -# zephyroths <ridho.hikaru@gmail.com>, 2020. +# zephyroths <ridho.hikaru@gmail.com>, 2020, 2021. # Richard Urban <redasuio1@gmail.com>, 2020. # yusuf afandi <afandi.yusuf.04@gmail.com>, 2020. # Habib Rohman <revolusi147id@gmail.com>, 2020. # Hanz <hanzhaxors@gmail.com>, 2021. +# Reza Almanda <rezaalmanda27@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-03-08 15:33+0000\n" +"PO-Revision-Date: 2021-03-29 21:57+0000\n" "Last-Translator: Hanz <hanzhaxors@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" @@ -42,13 +43,12 @@ 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.5.1\n" +"X-Generator: Weblate 4.6-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 "" -"Tipe argumen salah dalam menggunakan convert(), gunakan konstanta TYPE_*." +msgstr "Tipe argumen salah dalam penggunaan convert(), gunakan konstan TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -59,7 +59,8 @@ msgstr "String dengan panjang 1 (karakter) yang diharapkan." #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "" -"Tidak cukup bytes untuk merubah bytes ke nilai asal, atau format tidak valid." +"Tidak memiliki bytes yang cukup untuk merubah bytes ke nilai asal, atau " +"format tidak valid." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" @@ -534,7 +535,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." -msgstr "Hanya tampilkan track dari node terpilih dalam tree." +msgstr "Hanya tampilkan track dari node terpilih dalam tree." #: editor/animation_track_editor.cpp msgid "Group tracks by node or display them as plain list." @@ -597,11 +598,11 @@ msgstr "Hapus Pilihan" #: editor/animation_track_editor.cpp msgid "Go to Next Step" -msgstr "Menuju Langkah Berikutnya" +msgstr "Pergi ke Langkah Berikutnya" #: editor/animation_track_editor.cpp msgid "Go to Previous Step" -msgstr "Menuju Langkah Sebelumnya" +msgstr "Pergi ke Langkah Sebelumnya" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -1751,7 +1752,7 @@ msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" -"Sudah ada profil '%s'. Hapus profil ini terlebih dahulu sebelum mengimpor, " +"Sudah ada profil '%s'. Hapus profil ini terlebih dahulu sebelum mengimpor, " "impor dibatalkan." #: editor/editor_feature_profile.cpp @@ -2851,7 +2852,7 @@ msgstr "" "file yang bisa dieksekusi mencoba untuk terhubung ke IP komputer ini, " "sehingga proyek yang sedang berajalan dapat didebug.\n" "Pilihan ini dimaksudkan untuk digunakan sebagai cara men-debug jarak jauh " -"(biasanya menggunakan perangkat selular).\n" +"(biasanya menggunakan perangkat selular).\n" "Kamu tidak perlu mengaktifkan ini jika menggunakan GDScript debugger secara " "lokal." @@ -3689,6 +3690,11 @@ msgstr "" "manual." #: 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 "Tidak bisa memindah/mengubah nama resource root." @@ -3938,9 +3944,8 @@ msgid "%d matches in %d file." msgstr "Ditemukan %d kecocokan." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d files." -msgstr "Ditemukan %d kecocokan." +msgstr "Ditemukan %d kecocokan dalam %d berkas." #: editor/groups_editor.cpp msgid "Add to Group" @@ -4071,25 +4076,27 @@ msgstr "Kesalahan saat menjalankan skrip post-import:" #: editor/import/resource_importer_scene.cpp msgid "Did you return a Node-derived object in the `post_import()` method?" msgstr "" +"Apakan Anda mengembalikan objek berturunan Node dalam method `post_import()`?" #: editor/import/resource_importer_scene.cpp msgid "Saving..." msgstr "Menyimpan..." #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Select Importer" -msgstr "Mode Seleksi" +msgstr "Pilih Importir" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Importer:" -msgstr "Impor" +msgstr "Importir:" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Reset to Defaults" -msgstr "Muat Default" +msgstr "Kembalikan ke Nilai Baku" + +#: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" #: editor/import_dock.cpp msgid "%d Files" @@ -5054,9 +5061,8 @@ msgid "Got:" msgstr "Yang Didapat:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Gagal mengecek hash sha256" +msgstr "Gagal mengecek hash SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5187,14 +5193,12 @@ msgid "Assets ZIP File" msgstr "Berkas Aset ZIP" #: 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 "" "Tidak dapat menentukan lokasi penyimpanan untuk gambar lightmap.\n" -"Simpan skena Anda (untuk gambar yang akan disimpan di direktori yang sama), " -"atau pilih lokasi penyimpanan dari properti BakedLightmap." +"Simpan skena Anda dan coba lagi." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -5211,26 +5215,30 @@ msgstr "Gagal membuat gambar lightmap, pastikan path dapat ditulis." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" msgstr "" +"Gagal menentukan ukuran lightmap. Ukuran lightmap maksimumnya terlalu kecil?" #: 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 "" +"Banyak mesh tak valid. Pastikan nilai kanal UV2 diisi dalam rentang wilayah " +"persegi [0.0,1.0]." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Godot editor was built without ray tracing support, lightmaps can't be baked." msgstr "" +"Editor Godot di-build tanpa dukungan ray tracing, sehingga lightmaps tidak " +"dapat di-bake." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" msgstr "Panggang Lightmaps" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "Select lightmap bake file:" -msgstr "Pilih berkas templat" +msgstr "Pilih berkas lightmap bake:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5299,50 +5307,43 @@ msgstr "Buat Panduan Horisontal dan Vertikal" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" -msgstr "" +msgstr "Atur Offset Pivot CanvasItem \"%s\" ke (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotate %d CanvasItems" -msgstr "Putar CanvasItem" +msgstr "Putar %d CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotate CanvasItem \"%s\" to %d degrees" -msgstr "Putar CanvasItem" +msgstr "Putar CanvasItem \"%s\" menjadi %d derajat" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move CanvasItem \"%s\" Anchor" -msgstr "Pindahkan CanvasItem" +msgstr "Pindahkan Anchor CanvasItem \"%s\"" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale Node2D \"%s\" to (%s, %s)" -msgstr "" +msgstr "Skalakan Node2D \"%s\" menjadi (%s, %s)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Resize Control \"%s\" to (%d, %d)" -msgstr "" +msgstr "Ubah ukuran Control \"%s\" menjadi (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale %d CanvasItems" -msgstr "Skalakan CanvasItem" +msgstr "Skalakan %d CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale CanvasItem \"%s\" to (%s, %s)" -msgstr "Skalakan CanvasItem" +msgstr "Skalakan CanvasItem \"%s\" menjadi (%s, %s)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move %d CanvasItems" -msgstr "Pindahkan CanvasItem" +msgstr "Pindahkan %d CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move CanvasItem \"%s\" to (%d, %d)" -msgstr "Pindahkan CanvasItem" +msgstr "Pindahkan CanvasItem \"%s\" ke (%d,%d)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5677,7 +5678,7 @@ msgstr "Tampilkan Tulang-tulang" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make Custom Bone(s) from Node(s)" -msgstr "Buat Tulang Kustom(satu/lebih) dari Node(satu/lebih)" +msgstr "Buat Tulang Kustom(satu/lebih) dari Node(satu/lebih)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Custom Bones" @@ -6335,9 +6336,8 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Hanya dapat mengatur titik ke dalam material proses ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles2D" -msgstr "Konversikan menjadi CPUParticles" +msgstr "Konversikan menjadi CPUParticles2D" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -6626,18 +6626,16 @@ msgid "Move Points" msgstr "Geser Titik" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Command: Rotate" -msgstr "Geser: Putar" +msgstr "Comand: Putar" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift: Move All" msgstr "Shift: Geser Semua" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Shift+Command: Scale" -msgstr "Shift+Ctrl: Skala" +msgstr "Shift+Command: Skala" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Ctrl: Rotate" @@ -6684,14 +6682,12 @@ msgid "Radius:" msgstr "Radius:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Copy Polygon to UV" -msgstr "Buat Poligon & UV" +msgstr "Salin Polygon ke UV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Copy UV to Polygon" -msgstr "Konversikan menjadi Polygon2D" +msgstr "Salin UV ke Polygon" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Clear UV" @@ -7086,9 +7082,8 @@ msgstr "" "'%s' ke node '%s'." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "[Ignore]" -msgstr "(abaikan)" +msgstr "[abaikan]" #: editor/plugins/script_text_editor.cpp msgid "Line" @@ -7376,9 +7371,8 @@ msgid "Yaw" msgstr "Oleng" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size" -msgstr "Ukuran: " +msgstr "Ukuran" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" @@ -7580,6 +7574,12 @@ msgid "" "Closed eye: Gizmo is hidden.\n" "Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")." msgstr "" +"Klik untuk mengatur visibilitas.\n" +"\n" +"Mata terbuka: Gizmo tampak.\n" +"Mata tertutup: Gizmo disembunyikan.\n" +"Mata setengah terbuka: Gizmo juga tampak melalui permukaan tidak tembus " +"pandang (\"sinar-x\")." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Nodes To Floor" @@ -7919,9 +7919,8 @@ msgid "New Animation" msgstr "Animasi Baru" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Speed:" -msgstr "Kecepatan (FPS):" +msgstr "Kecepatan:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" @@ -8239,13 +8238,12 @@ msgid "Paint Tile" msgstr "Cat Tile" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "" "Shift+LMB: Line Draw\n" "Shift+Command+LMB: Rectangle Paint" msgstr "" "Shift + Klik Kiri: Menggambar Garis\n" -"Shift + Ctrl + Klik Kiri: Cat Persegi Panjang" +"Shift + Command + Klik Kiri: Cat Persegi Panjang" #: editor/plugins/tile_map_editor_plugin.cpp msgid "" @@ -8400,23 +8398,20 @@ msgid "Create a new rectangle." msgstr "Buat persegi panjang baru." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "New Rectangle" -msgstr "Cat Persegi Panjang" +msgstr "Persegi Panjang Baru" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create a new polygon." msgstr "Buat poligon baru." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "New Polygon" -msgstr "Geser Poligon" +msgstr "Poligon Baru" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete Selected Shape" -msgstr "Hapus yang Dipilih" +msgstr "Hapus Shape yang Dipilih" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." @@ -8781,7 +8776,6 @@ msgid "Add Node to Visual Shader" msgstr "Tambah Node ke Visual Shader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Node(s) Moved" msgstr "Node Dipindahkan" @@ -8803,9 +8797,8 @@ msgid "Visual Shader Input Type Changed" msgstr "Tipe Input Visual Shader Berubah" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "UniformRef Name Changed" -msgstr "Tetapkan Nama Uniform" +msgstr "Nama UniformRef diubah" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -9230,7 +9223,7 @@ msgstr "Mengembalikan nilai tangen dari parameter." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic tangent of the parameter." -msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the truncated value of the parameter." @@ -9527,7 +9520,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "A reference to an existing uniform." -msgstr "" +msgstr "Referensi ke uniform yang ada." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Scalar derivative function." @@ -9702,7 +9695,7 @@ msgstr "" #: editor/project_export.cpp msgid "Features" -msgstr "Fitur" +msgstr "Fitur-fitur" #: editor/project_export.cpp msgid "Custom (comma-separated):" @@ -9897,7 +9890,7 @@ msgstr "OpenGL ES 3.0" #: editor/project_manager.cpp msgid "Not supported by your GPU drivers." -msgstr "" +msgstr "Tidak didukung oleh driver GPU Anda." #: editor/project_manager.cpp msgid "" @@ -10074,9 +10067,8 @@ msgid "Projects" msgstr "Proyek" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "Mendapatkan informasi cermin, silakan tunggu..." +msgstr "Memuat, tunggu sejenak..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10383,7 +10375,7 @@ msgstr "Aksi" #: editor/project_settings_editor.cpp msgid "Deadzone" -msgstr "Deadzone" +msgstr "Zona tidak aktif" #: editor/project_settings_editor.cpp msgid "Device:" @@ -10450,9 +10442,8 @@ msgid "Plugins" msgstr "Pengaya" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Import Defaults" -msgstr "Muat Default" +msgstr "Impor Nilai Baku" #: editor/property_editor.cpp msgid "Preset..." @@ -10515,19 +10506,16 @@ msgid "Batch Rename" msgstr "Ubah Nama Massal" #: editor/rename_dialog.cpp -#, fuzzy msgid "Replace:" -msgstr "Ganti: " +msgstr "Ganti:" #: editor/rename_dialog.cpp -#, fuzzy msgid "Prefix:" -msgstr "Awalan" +msgstr "Awalan:" #: editor/rename_dialog.cpp -#, fuzzy msgid "Suffix:" -msgstr "Akhiran" +msgstr "Akhiran:" #: editor/rename_dialog.cpp msgid "Use Regular Expressions" @@ -10574,9 +10562,9 @@ msgid "Per-level Counter" msgstr "Penghitung per Level" #: editor/rename_dialog.cpp -#, fuzzy msgid "If set, the counter restarts for each group of child nodes." -msgstr "Jika diatur, penghitung akan dimulai ulang untuk setiap grup node anak" +msgstr "" +"Jika diatur, penghitung akan dimulai ulang untuk setiap grup node anak." #: editor/rename_dialog.cpp msgid "Initial value for the counter" @@ -10635,9 +10623,8 @@ msgid "Reset" msgstr "Reset" #: editor/rename_dialog.cpp -#, fuzzy msgid "Regular Expression Error:" -msgstr "Kesalahan Ekspresi Reguler" +msgstr "Kesalahan Ekspresi Reguler:" #: editor/rename_dialog.cpp msgid "At character %s" @@ -10708,19 +10695,16 @@ msgid "Instance Child Scene" msgstr "Instansi Skena Anak" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "Tidak dapat bekerja pada node dari skena luar!" +msgstr "Tidak dapat menempelkan node akar ke dalam skena yang sama." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" -msgstr "Rekatkan Node" +msgstr "Tempel Node" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Detach Script" -msgstr "Lampirkan Skrip" +msgstr "Lepas Skrip" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on the tree root." @@ -10757,9 +10741,8 @@ msgid "Make node as Root" msgstr "Jadikan node sebagai Dasar" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Hapus node \"%s\" dan anak-anaknya?" +msgstr "Hapus %d node dan semua anaknya?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" @@ -10849,7 +10832,6 @@ msgid "Attach Script" msgstr "Lampirkan Skrip" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" msgstr "Potong Node" @@ -10898,14 +10880,14 @@ msgid "Open Documentation" msgstr "Buka Dokumentasi" #: editor/scene_tree_dock.cpp -#, fuzzy 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 "" -"Tidak dapat melampirkan skrip: tidak ada bahasa yang terdaftar.\n" -"Ini mungkin karena editor ini dibuat dengan semua modul bahasa dinonaktifkan." +"Tidak dapat melampirkan skrip: tidak ada bahasa terdaftar.\n" +"Ini mungkin karena editor ini di-build dengan semua modul bahasa " +"dinonaktifkan." #: editor/scene_tree_dock.cpp msgid "Add Child Node" @@ -10956,14 +10938,12 @@ msgstr "" "akar." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Attach a new or existing script to the selected node." msgstr "Lampirkan skrip baru atau yang sudah ada untuk node yang dipilih." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Detach the script from the selected node." -msgstr "Bersihkan skrip untuk node yang dipilih." +msgstr "Lepas skrip dari node yang dipilih." #: editor/scene_tree_dock.cpp msgid "Remote" @@ -11664,36 +11644,31 @@ msgstr "" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "" +msgstr "Mulai Bake" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" -msgstr "" +msgstr "Menyiapkan struktur data" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Generate buffers" -msgstr "Buat AABB" +msgstr "Ciptakan buffer" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "Arah" +msgstr "PEncahayaan langsung" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "Indentasi Kanan" +msgstr "Pencahayaan tak langsung" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" -msgstr "Pasca Proses" +msgstr "Pasca pemrosesan" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Plotting lightmaps" -msgstr "Plotting Lights:" +msgstr "Memetakan lightmap" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -12209,7 +12184,7 @@ msgstr "Pilih perangkat pada daftar" #: platform/android/export/export.cpp msgid "Unable to find the 'apksigner' tool." -msgstr "" +msgstr "Tak dapat menemukan perkakas 'apksigner'." #: platform/android/export/export.cpp msgid "" @@ -12226,48 +12201,37 @@ msgstr "" "prasetel proyek." #: platform/android/export/export.cpp -#, fuzzy msgid "Release keystore incorrectly configured in the export preset." -msgstr "" -"Berkas debug keystore belum dikonfigurasi dalam Pengaturan Editor maupun di " -"prasetel proyek." +msgstr "Berkas keystore rilis belum dikonfigurasi di prasetel ekspor." #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "" -"Lokasi Android SDK tidak valid untuk membuat kustom APK dalam Pengaturan " -"Editor." +msgstr "Lokasi Android SDK yang valid dibutuhkan di Pengaturan Editor." #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "" -"Lokasi Android SDK tidak valid untuk membuat kustom APK dalam Pengaturan " -"Editor." +msgstr "Lokasi Android SDK tidak valid di Pengaturan Editor." #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" -msgstr "" +msgstr "Direktori 'platform-tools' tidak ada!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "" +msgstr "Tidak dapat menemukan perintah adb di Android SDK platform-tools." #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." msgstr "" -"Lokasi Android SDK tidak valid untuk membuat kustom APK dalam Pengaturan " -"Editor." +"Silakan cek direktori Android SDK yang diisikan dalam Pengaturan Editor." #: platform/android/export/export.cpp msgid "Missing 'build-tools' directory!" -msgstr "" +msgstr "Direktori 'build-tools' tidak ditemukan!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "" +msgstr "Tidak dapat menemukan apksigner dalam Android SDK build-tools." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -12282,42 +12246,51 @@ msgid "" "Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " "project setting (changed in Godot 3.2.2).\n" msgstr "" +"Modul \"GodotPaymentV3\" tidak valid yang dimasukkan dalam pengaturan proyek " +"\"android/modules\" (diubah di Godot 3.2.2)\n" #: platform/android/export/export.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" +msgstr "\"Gunakan Build Custom\" harus diaktifkan untuk menggunakan plugin." #: platform/android/export/export.cpp msgid "" "\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR" "\"." msgstr "" +"\"Derajat Kebebasan\" hanya valid ketika \"Mode Xr\" bernilai \"Occulus " +"Mobile VR\"." #: platform/android/export/export.cpp msgid "" "\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"." msgstr "" +"\"Pelacakan Tangan\" hanya valid ketika \"Mode Xr\" bernilai \"Oculus Mobile " +"VR\"." #: platform/android/export/export.cpp msgid "" "\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"." msgstr "" +"\"Focus Awareness\" hanya valid ketika \"Mode Xr\" bernilai \"Oculus Mobile " +"VR\"." #: platform/android/export/export.cpp msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." msgstr "" +"\"Expor AAB\" hanya bisa valid ketika \"Gunakan Build Custom\" diaktifkan." #: platform/android/export/export.cpp msgid "Invalid filename! Android App Bundle requires the *.aab extension." -msgstr "" +msgstr "Nama berkas tak valid! Android App Bundle memerlukan ekstensi *.aab ." #: platform/android/export/export.cpp msgid "APK Expansion not compatible with Android App Bundle." -msgstr "" +msgstr "Ekspansi APK tidak kompatibel dengan Android App Bundle." #: platform/android/export/export.cpp msgid "Invalid filename! Android APK requires the *.apk extension." -msgstr "" +msgstr "Nama berkas tidak valid! APK Android memerlukan ekstensi *.apk ." #: platform/android/export/export.cpp msgid "" @@ -12353,13 +12326,15 @@ msgstr "" #: platform/android/export/export.cpp msgid "Moving output" -msgstr "" +msgstr "Memindahkan keluaran" #: platform/android/export/export.cpp msgid "" "Unable to copy and rename export file, check gradle project directory for " "outputs." msgstr "" +"Tidak dapat menyalin dan mengubah nama berkas ekspor, cek direktori proyek " +"gradle untuk hasilnya." #: platform/iphone/export/export.cpp msgid "Identifier is missing." @@ -12517,10 +12492,14 @@ msgstr "" #: scene/2d/collision_polygon_2d.cpp msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." msgstr "" +"Poligon tidak valid. Minimal 3 titik dibutuhkan untuk mode pembangunan " +"'Solid'." #: scene/2d/collision_polygon_2d.cpp msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." msgstr "" +"Poligon tidak valid. Minimal 2 titik dibutuhkan untuk mode pembangunan " +"'Segmen\"." #: scene/2d/collision_shape_2d.cpp msgid "" @@ -12542,14 +12521,13 @@ msgstr "" "ciptakan resource shape untuknya!" #: scene/2d/collision_shape_2d.cpp -#, fuzzy msgid "" "Polygon-based shapes are not meant be used nor edited directly through the " "CollisionShape2D node. Please use the CollisionPolygon2D node instead." msgstr "" -"Bentuk Polygon-based tidak dimaksudkan untuk digunakan atau diedit secara " -"langsung melalui node CollisionShape2D. Silakan gunakan node " -"CollisionPolygon2D sebagai gantinya." +"Bentuk Polygon-based tidak dimaksudkan untuk digunakan atau diedit langsung " +"melalui node CollisionShape2D. Gunakan node CollisionPolygon2D sebagai " +"gantinya." #: scene/2d/cpu_particles_2d.cpp msgid "" @@ -12561,23 +12539,23 @@ msgstr "" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be PhysicsBody2Ds" -msgstr "" +msgstr "Node A dan Node B harus berupa PhysicsBody2D" #: scene/2d/joints_2d.cpp msgid "Node A must be a PhysicsBody2D" -msgstr "" +msgstr "Node A harus PhysicsBody2D" #: scene/2d/joints_2d.cpp msgid "Node B must be a PhysicsBody2D" -msgstr "" +msgstr "Node B harus PhysicsBody2D" #: scene/2d/joints_2d.cpp msgid "Joint is not connected to two PhysicsBody2Ds" -msgstr "" +msgstr "Persendian tidak terkoneksi dengan 2 PhysicsBody2D" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be different PhysicsBody2Ds" -msgstr "" +msgstr "Node A dan Node B harus PhysicsBody2D yang berbeda" #: scene/2d/light_2d.cpp msgid "" @@ -12736,32 +12714,27 @@ msgstr "ARVROrigin membutuhkan node anak ARVRCamera." #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "" +msgstr "Mencari mesh dan cahaya" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "Mengurai Geometri..." +msgstr "Menyiapkan geometri (%d/%d)" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing environment" -msgstr "Tampilkan Lingkungan" +msgstr "Menyiapkan lingkungan" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generating capture" -msgstr "Membuat Pemetaan Cahaya" +msgstr "Membuat capture" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Saving lightmaps" -msgstr "Membuat Pemetaan Cahaya" +msgstr "Menyimpan lightmap" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Done" -msgstr "Selesai!" +msgstr "Selesai" #: scene/3d/collision_object.cpp msgid "" @@ -12769,6 +12742,10 @@ msgid "" "Consider adding a CollisionShape or CollisionPolygon as a child to define " "its shape." msgstr "" +"Node ini tidak memiliki shape, jadi tidak bisa bertabrakan atau berinteraksi " +"dengan objek lain.\n" +"Pertimbangkan untuk menambah CollisionShape atau CollisionPolygon sebagai " +"anak untuk mendefinisikan shape-nya." #: scene/3d/collision_polygon.cpp msgid "" @@ -12809,22 +12786,26 @@ msgid "" "Plane shapes don't work well and will be removed in future versions. Please " "don't use them." msgstr "" +"Bentuk plane tidak bekerja baik dan akan dihapus dalam versi mendatang. " +"Mohon untuk tidak menggunakannya." #: scene/3d/collision_shape.cpp msgid "" "ConcavePolygonShape doesn't support RigidBody in another mode than static." msgstr "" +"ConcavePolygonShape tidak mendukung RigidBody dengan mode selain statis." #: scene/3d/cpu_particles.cpp -#, fuzzy msgid "Nothing is visible because no mesh has been assigned." -msgstr "Tidak ada yang tampak karena tidak ada mesh yang ditetapkan." +msgstr "Tidak ada yang tampil karena tidak ada mesh yang ditetapkan." #: scene/3d/cpu_particles.cpp msgid "" "CPUParticles animation requires the usage of a SpatialMaterial whose " "Billboard Mode is set to \"Particle Billboard\"." msgstr "" +"Animasi CPUParticle membutuhkan penggunaan SpatialMaterial yang Mode " +"Billboard nya diatur ke \"Particle Billboard\"." #: scene/3d/gi_probe.cpp msgid "Plotting Meshes" @@ -12845,6 +12826,7 @@ msgstr "" #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" +"SpotLight dengan sudut lebih dari 90 derajat tidak dapat memberikan bayangan." #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -12866,17 +12848,24 @@ msgid "" "Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" "\" option for this purpose." msgstr "" +"Partikel berbasis GPU tidak didukung oleh driver video GLES2.\n" +"Gunakan CPUParticles saja. Anda dapat menggunakan opsi \"Konversikan ke " +"CPUParticles\" untuk ini." #: scene/3d/particles.cpp msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" +"Tidak ada yang ditampilkan karena mesh tidak ditetapkan untuk menggambar " +"lintasan." #: scene/3d/particles.cpp msgid "" "Particles animation requires the usage of a SpatialMaterial whose Billboard " "Mode is set to \"Particle Billboard\"." msgstr "" +"Animasi Partikel memerlukan penggunaan SpatialMaterial dengan Mode Billboard " +"\"Particle Billboard\"." #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." @@ -12898,39 +12887,41 @@ msgid "" "by the physics engine when running.\n" "Change the size in children collision shapes instead." msgstr "" +"Perubahan ukuran RigidBody (dalam mode karakter atau rigid) akan ditimpa " +"oleh mesin fisika ketika dijalankan.\n" +"Ubah ukuran dari \"collision shape\"-anaknya saja." #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" -msgstr "" +msgstr "Node A dan Node B harus PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Node A must be a PhysicsBody" -msgstr "" +msgstr "Node A harus PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Node B must be a PhysicsBody" -msgstr "" +msgstr "Node B harus PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Joint is not connected to any PhysicsBodies" -msgstr "" +msgstr "Persendian tidak terkoneksi dengan PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be different PhysicsBodies" -msgstr "" +msgstr "Node A dan Node B harus PhysicsBody yang berbeda" #: scene/3d/remote_transform.cpp -#, fuzzy msgid "" "The \"Remote Path\" property must point to a valid Spatial or Spatial-" "derived node to work." msgstr "" -"Properti path harus menunjuk ke sebuah node Particles2D yang sah agar " -"bekerja." +"Properti \"Remote Path\" harus menunjuk ke Spatial atau turunannya yang " +"valid agar bekerja." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." -msgstr "" +msgstr "Body ini akan diabaikan hingga Anda mengatur mesh-nya." #: scene/3d/soft_body.cpp msgid "" @@ -12938,6 +12929,8 @@ msgid "" "running.\n" "Change the size in children collision shapes instead." msgstr "" +"Perubahan ukuran SoftBody akan ditimpa oleh mesin fisika ketika dijalankan.\n" +"Ubah ukurannya melalui \"collision shape\"-anaknya saja." #: scene/3d/sprite_3d.cpp msgid "" @@ -12952,6 +12945,8 @@ msgid "" "VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " "it as a child of a VehicleBody." msgstr "" +"VehicleWheel berfungsi menyediakan sistem roda ke VehicleBody. Gunakan itu " +"sebagai anak dari VehicleBody." #: scene/3d/world_environment.cpp msgid "" @@ -13082,9 +13077,8 @@ msgid "Must use a valid extension." msgstr "Harus menggunakan ekstensi yang sah." #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Enable grid minimap." -msgstr "Aktifkan Pengancingan" +msgstr "Aktifkan peta mini grid." #: scene/gui/popup.cpp msgid "" @@ -13147,6 +13141,8 @@ msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." msgstr "" +"Porta sampler terhubung tapi tidak digunakan. Pertimbangkan untuk mengubah " +"sumbernya ke 'SamplerPort'." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." diff --git a/editor/translations/is.po b/editor/translations/is.po index 8d36556c04..9ae40b5085 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -3542,6 +3542,11 @@ 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 "" @@ -3937,6 +3942,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 67b524937c..a0fb10367a 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -29,8 +29,8 @@ # Giuseppe Guerra <me@nyodev.xyz>, 2019. # RHC <rhc.throwaway@gmail.com>, 2019, 2020. # Antonio Giungato <antonio.giungato@gmail.com>, 2019, 2020. -# Marco Galli <mrcgll98@gmail.com>, 2019, 2020. -# MassiminoilTrace <omino.gis@gmail.com>, 2019, 2020. +# Marco Galli <mrcgll98@gmail.com>, 2019, 2020, 2021. +# MassiminoilTrace <omino.gis@gmail.com>, 2019, 2020, 2021. # MARCO BANFI <mbanfi@gmail.com>, 2019. # Marco <rodomar705@gmail.com>, 2019. # Davide Giuliano <davidegiuliano00@gmail.com>, 2019. @@ -56,12 +56,13 @@ # Federico Manzella <ferdiu.manzella@gmail.com>, 2020. # Ziv D <wizdavid@gmail.com>, 2020. # Riteo Siuga <lorenzocerqua@tutanota.com>, 2021. +# Alessandro Mandelli <mandelli.alessandro@ngi.it>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-03-10 22:14+0000\n" -"Last-Translator: riccardo boffelli <riccardo.boffelli.96@gmail.com>\n" +"PO-Revision-Date: 2021-03-24 23:44+0000\n" +"Last-Translator: Alessandro Mandelli <mandelli.alessandro@ngi.it>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -391,9 +392,8 @@ msgid "Remove Anim Track" msgstr "Rimuovi una traccia d'animazione" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Create NEW track for %s and insert key?" -msgstr "Creare una NUOVA traccia per %s e inserirci la chiave?" +msgstr "Creare una NUOVA traccia per %s e inserire la chiave?" #: editor/animation_track_editor.cpp msgid "Create %d NEW tracks and insert keys?" @@ -1159,7 +1159,7 @@ msgstr "Possiede" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" -msgstr "Risorse non Possedute Esplicitamente:" +msgstr "Risorse senza proprietario esplicito:" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" @@ -1890,7 +1890,7 @@ msgstr "Aggiorna" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" -msgstr "Tutti i risconosciuti" +msgstr "Tutti i formati riconosciuti" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Files (*)" @@ -2007,7 +2007,7 @@ msgstr "File:" #: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "Scansiona sorgenti" +msgstr "Scansiona i sorgenti" #: editor/editor_file_system.cpp msgid "" @@ -2379,8 +2379,8 @@ msgid "" "option and delete the Default layout." msgstr "" "Layout predefinito dell'editor sovrascritto.\n" -"Per ripristinare il layout predefinito alle impostazioni di base, usa " -"l'opzione elimina layout ed elimina il layout predefinito." +"Per ripristinare il layout predefinito alle impostazioni di base, usare " +"l'opzione elimina layout ed eliminare il layout predefinito." #: editor/editor_node.cpp msgid "Layout name not found!" @@ -3746,6 +3746,11 @@ msgstr "" "reimportarlo manualmente." #: 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 "Impossibile spostare/rinominare risorse root." @@ -4135,20 +4140,22 @@ msgid "Saving..." msgstr "Salvataggio..." #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Select Importer" -msgstr "Modalità di selezione" +msgstr "Seleziona Importatore" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Importer:" -msgstr "Importare" +msgstr "Importatore:" #: editor/import_defaults_editor.cpp msgid "Reset to Defaults" msgstr "Ripristinare le impostazioni predefinite" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d File" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 8afa2de349..5fa91fdc34 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -3692,6 +3692,11 @@ 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 "ルートのリソースは移動/リネームできません。" @@ -4095,6 +4100,10 @@ msgid "Reset to Defaults" msgstr "デフォルトを読込む" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d ファイル" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index 6828baf211..6d7d40a6ad 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -3633,6 +3633,11 @@ 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 "" @@ -4042,6 +4047,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index 693b726ebf..f2809af204 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -3664,6 +3664,11 @@ 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 "리소스 루트를 옮기거나 이름을 바꿀 수 없습니다." @@ -4063,6 +4068,10 @@ msgid "Reset to Defaults" msgstr "기본값으로 재설정" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "파일 %d개" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 585e4d4447..0796f01fbe 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -3591,6 +3591,11 @@ 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 "" @@ -4001,6 +4006,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr "Redaguoti Filtrus" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 5512d59238..d8a665caa6 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -3543,6 +3543,11 @@ 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 "" @@ -3938,6 +3943,10 @@ msgid "Reset to Defaults" msgstr "Ielādēt Noklusējumu" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Failā" diff --git a/editor/translations/mi.po b/editor/translations/mi.po index 260543a475..5198022282 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -3488,6 +3488,11 @@ 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 "" @@ -3878,6 +3883,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/mk.po b/editor/translations/mk.po index cd72ecd259..0b4e23cccf 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -3495,6 +3495,11 @@ 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 "" @@ -3885,6 +3890,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index fb9de4a419..a445086dd6 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -3500,6 +3500,11 @@ 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 "" @@ -3890,6 +3895,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index cf3a24a739..00e8ced169 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -3495,6 +3495,11 @@ 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 "" @@ -3885,6 +3890,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index c0a7f7cea2..363f8895a3 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -3810,6 +3810,11 @@ 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 "" @@ -4208,6 +4213,10 @@ msgid "Reset to Defaults" msgstr "Muatkan Lalai" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 9e69510739..df1f7395ce 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -3804,6 +3804,11 @@ msgstr "" "Status: Import av fil feilet. Reparer filen eller importer igjen manuelt." #: 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 #, fuzzy msgid "Cannot move/rename resources root." msgstr "Kan ikke flytte/endre navn ressursrot" @@ -4238,6 +4243,10 @@ msgid "Reset to Defaults" msgstr "Last Standard" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Filer" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 52c63ffa85..2716664b7a 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -3726,6 +3726,11 @@ msgstr "" "handmatig." #: 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 "Kan de hoofdmap voor bronnen niet verplaatsen of van naam veranderen." @@ -4129,6 +4134,10 @@ msgid "Reset to Defaults" msgstr "Laad standaard" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Bestanden" diff --git a/editor/translations/or.po b/editor/translations/or.po index 19b87260d6..5e396315c2 100644 --- a/editor/translations/or.po +++ b/editor/translations/or.po @@ -3494,6 +3494,11 @@ 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 "" @@ -3884,6 +3889,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index d55fee8b72..0679df64ce 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -51,7 +51,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-03-10 22:14+0000\n" +"PO-Revision-Date: 2021-03-24 23:44+0000\n" "Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" @@ -3702,6 +3702,11 @@ msgstr "" "zaimportować ręcznie." #: 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 "Nie można przenieść/zmienić nazwy korzenia zasobów." @@ -4104,6 +4109,10 @@ msgid "Reset to Defaults" msgstr "Resetuj do domyślnych" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d plików" @@ -10446,7 +10455,7 @@ msgstr "Wtyczki" #: editor/project_settings_editor.cpp msgid "Import Defaults" -msgstr "Importuj domyślne" +msgstr "Domyślny import" #: editor/property_editor.cpp msgid "Preset..." diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 09d967e01d..6f67b1c1be 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -3609,6 +3609,11 @@ 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 "" @@ -4018,6 +4023,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr "Edit yer Variable:" diff --git a/editor/translations/pt.po b/editor/translations/pt.po index dd745d7c56..6020f0557f 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -3687,6 +3687,11 @@ msgstr "" "manualmente." #: 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 "Não consegui mover/renomear raiz dos recursos." @@ -4087,6 +4092,10 @@ msgid "Reset to Defaults" msgstr "Restaurar Predefinições" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Ficheiros" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index c2e8116938..0907db141e 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -112,11 +112,12 @@ # Lucas Castro <castroclucas@gmail.com>, 2021. # Ricardo Zamarrenho Carvalho Correa <ricardozcc17@gmail.com>, 2021. # Diego dos Reis Macedo <diego_dragon97@hotmail.com>, 2021. +# Lucas E. <lukas.ed45@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2021-03-10 22:14+0000\n" +"PO-Revision-Date: 2021-03-24 23:44+0000\n" "Last-Translator: Renato Rotenberg <renato.rotenberg@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" @@ -2635,23 +2636,24 @@ msgstr "" "falhou." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" -"Não foi possível encontrar o campo de script para o plugin em: 'res://addons/" -"%s'." +"Não foi possível localizar a área do script para o complemento do plugin em: " +"'%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." -msgstr "Não foi possível carregar o script complementar do caminho: '%s'." +msgstr "" +"Não foi possível localizar a área do script para o complemento do plugin em: " +"'%s'." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' There seems to be an error in " "the code, please check the syntax." msgstr "" -"Não foi possível carregar o script complementar do caminho: '%s' Parece " -"haver um erro no código, por favor verifique a sintaxe." +"Não foi possível localizar a área do script para o complemento do plugin em: " +"'%s'." #: editor/editor_node.cpp msgid "" @@ -3785,6 +3787,11 @@ msgstr "" "reimporte manualmente." #: 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 "Impossível mover/renomear raiz dos recursos." @@ -4173,19 +4180,20 @@ msgid "Saving..." msgstr "Salvando..." #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Select Importer" -msgstr "Modo de Seleção" +msgstr "Selecione o arquivo para importar" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Importer:" -msgstr "Importar" +msgstr "Importar:" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Reset to Defaults" -msgstr "Usar sRGB Padrão" +msgstr "Redefinir para os padrões" + +#: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" #: editor/import_dock.cpp msgid "%d Files" @@ -5159,9 +5167,8 @@ msgid "Got:" msgstr "Obtido:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Falha na verificação da hash sha256" +msgstr "Falha na verificação do hash SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5336,7 +5343,7 @@ msgstr "" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" -msgstr "Bake Lightmaps" +msgstr "Faça mapas de luz" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Select lightmap bake file:" @@ -7446,7 +7453,7 @@ msgstr "Escala: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Translating: " -msgstr "Transladando: " +msgstr "Transladar: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -8892,7 +8899,7 @@ msgstr "Tipo de Entrada de Shader Visual Alterado" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "UniformRef Name Changed" -msgstr "UniformRef Name foi altearado" +msgstr "Ref. Uniforme Nome alterado" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -10500,7 +10507,7 @@ msgstr "Remapeamentos por Localidade:" #: editor/project_settings_editor.cpp msgid "Locale" -msgstr "Locale" +msgstr "Localizar" #: editor/project_settings_editor.cpp msgid "Locales Filter" @@ -10531,9 +10538,8 @@ msgid "Plugins" msgstr "Plugins" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Import Defaults" -msgstr "Carregar Padrão" +msgstr "Importar padrões" #: editor/property_editor.cpp msgid "Preset..." @@ -10545,11 +10551,11 @@ msgstr "Zero" #: editor/property_editor.cpp msgid "Easing In-Out" -msgstr "Easing In-Out" +msgstr "Facilitar Entrada-Saída" #: editor/property_editor.cpp msgid "Easing Out-In" -msgstr "Easing Out-In" +msgstr "Facilitar Saída-Entrada" #: editor/property_editor.cpp msgid "File..." @@ -11750,12 +11756,10 @@ msgid "Indirect lighting" msgstr "Iluminação indireta" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" msgstr "Pós-processamento" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Plotting lightmaps" msgstr "Traçando mapas de luz" @@ -12826,9 +12830,8 @@ msgid "Generating capture" msgstr "Gerando captura" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Saving lightmaps" -msgstr "Salvando mapas de luz" +msgstr "Salvando mapas de luz" #: scene/3d/baked_lightmap.cpp msgid "Done" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index 33f5264d71..c1ee0a6492 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -14,12 +14,13 @@ # Teodor <teo.virghi@yahoo.ro>, 2020. # f0roots <f0rootss@gmail.com>, 2020. # Gigel2 <mihalacher02@gmail.com>, 2020. +# R3ktGamerRO <bluegamermc1@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-10-22 21:37+0000\n" -"Last-Translator: Gigel2 <mihalacher02@gmail.com>\n" +"PO-Revision-Date: 2021-03-20 04:18+0000\n" +"Last-Translator: R3ktGamerRO <bluegamermc1@gmail.com>\n" "Language-Team: Romanian <https://hosted.weblate.org/projects/godot-engine/" "godot/ro/>\n" "Language: ro\n" @@ -28,18 +29,16 @@ 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.3.1\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp -#, fuzzy msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "Argument invalid pentru transformare(), folosiți constante TYPE_*." +msgstr "Argument invalid pentru convert(), folosiți constante TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp -#, fuzzy msgid "Expected a string of length 1 (a character)." -msgstr "Se așteaptă un șir de lungime 1 (un caracter)." +msgstr "Se așteaptă un text cu lungime de 1 (un caracter)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -52,9 +51,8 @@ msgid "Invalid input %i (not passed) in expression" msgstr "Intrare invalida %i (nu a fost transmisă) in expresie" #: core/math/expression.cpp -#, fuzzy msgid "self can't be used because instance is null (not passed)" -msgstr "insuși nu poate fi folosit deoarece instanța este nulă(nu a trecut)" +msgstr "insuși nu poate fi folosit deoarece instanța este nulă (nu a trecut)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -314,7 +312,7 @@ msgstr "Linear" #: editor/animation_track_editor.cpp msgid "Cubic" -msgstr "Cubic" +msgstr "Cub" #: editor/animation_track_editor.cpp msgid "Clamp Loop Interp" @@ -703,7 +701,7 @@ msgstr "Linia Numărul:" #: editor/code_editor.cpp msgid "%d replaced." -msgstr "%d Înlocuit" +msgstr "%d Înlocuit." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." @@ -1042,14 +1040,14 @@ msgid "Owners Of:" msgstr "Stăpâni La:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "Ștergeți fișierele selectate din proiect? (Acțiune ireversibilă)" +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." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1058,7 +1056,8 @@ msgid "" msgstr "" "Fișierele în proces de ștergere sunt necesare pentru alte resurse ca ele să " "sa funcționeze.\n" -"Ștergeți oricum? (fără anulare)" +"Ștergeți oricum? (fără anulare)\n" +"Poți găsi fișierele șterse in coșul de gunoi dacă vrei să le restabilești." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -2665,9 +2664,8 @@ msgid "Close Other Tabs" msgstr "Închideți Celelalte File" #: editor/editor_node.cpp -#, fuzzy msgid "Close Tabs to the Right" -msgstr "Închidere file la dreapta" +msgstr "Închidere file de la dreapta" #: editor/editor_node.cpp msgid "Close All Tabs" @@ -3141,11 +3139,12 @@ msgid "Open & Run a Script" msgstr "Deschide și Execută un Script" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" -msgstr "Următoarele file au eșuat extragerea din pachet:" +msgstr "" +"Următoarele fișiere sunt mai noi pe disk.\n" +"Ce măsuri ar trebui luate?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3673,6 +3672,11 @@ msgstr "" "manual." #: 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 "Nu se poate muta/redenumi rădăcina resurselor." @@ -4062,9 +4066,8 @@ msgid "Select Importer" msgstr "Selectare mod" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Importer:" -msgstr "Importare" +msgstr "Importator:" #: editor/import_defaults_editor.cpp #, fuzzy @@ -4072,6 +4075,10 @@ msgid "Reset to Defaults" msgstr "Încărcați Implicit" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Fișiere" @@ -5239,9 +5246,8 @@ msgid "Bake Lightmaps" msgstr "Procesează Lightmaps" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "Select lightmap bake file:" -msgstr "Selectare fișier șablon" +msgstr "Selectare fișier șablon pentru harta de lumină:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -10534,7 +10540,7 @@ msgstr "Redenumește" #: editor/rename_dialog.cpp #, fuzzy msgid "Replace:" -msgstr "Înlocuiți: " +msgstr "Înlocuiți:" #: editor/rename_dialog.cpp msgid "Prefix:" @@ -10648,9 +10654,8 @@ msgid "Reset" msgstr "Resetați Zoom-area" #: editor/rename_dialog.cpp -#, fuzzy msgid "Regular Expression Error:" -msgstr "Folosiți expresii regulate" +msgstr "Eroare de expresie regulată:" #: editor/rename_dialog.cpp msgid "At character %s" @@ -12674,14 +12679,12 @@ msgid "Finding meshes and lights" msgstr "" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "Analiza geometriei..." +msgstr "Analiza geometriei (%d/%d)" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing environment" -msgstr "Analiza geometriei..." +msgstr "Pregătim mediul de lucru" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -12694,9 +12697,8 @@ msgid "Saving lightmaps" msgstr "Se Genereaza Lightmaps" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Done" -msgstr "Efectuat!" +msgstr "Efectuat" #: scene/3d/collision_object.cpp msgid "" @@ -12975,9 +12977,8 @@ msgid "Must use a valid extension." msgstr "Trebuie să utilizaţi o extensie valida." #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Enable grid minimap." -msgstr "Activează aliniere" +msgstr "Activează minimapa in format grilă." #: scene/gui/popup.cpp msgid "" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 5a443fd1e3..471c8a13b7 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -96,7 +96,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-03-16 10:40+0000\n" +"PO-Revision-Date: 2021-03-16 15:25+0000\n" "Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" @@ -3564,7 +3564,7 @@ msgstr "(Текущий)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait..." -msgstr "Получение зеркал, пожалуйста, подождите..." +msgstr "Получение зеркал, пожалуйста, ждите..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -3756,6 +3756,11 @@ 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 "Нельзя переместить/переименовать корень." @@ -3919,7 +3924,7 @@ msgid "" "Please Wait..." msgstr "" "Сканирование файлов,\n" -"пожалуйста, подождите..." +"пожалуйста, ждите..." #: editor/filesystem_dock.cpp msgid "Move" @@ -4156,6 +4161,10 @@ msgid "Reset to Defaults" msgstr "Сбросить настройки" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d файлов" diff --git a/editor/translations/si.po b/editor/translations/si.po index 0c3a01f0e4..67903c8677 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -3521,6 +3521,11 @@ 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 "" @@ -3913,6 +3918,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 68da1b1221..3bed9c2661 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -3655,6 +3655,11 @@ msgstr "" "Status:Import súboru zlihal. Prosím opravte súbor a manuálne reimportujte." #: 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 "Nedá sa presunúť/premenovať \"resources root\"." @@ -4056,6 +4061,10 @@ msgid "Reset to Defaults" msgstr "Načítať predvolené" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Súbory" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index 69819f0a36..55c60530b7 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -3794,6 +3794,11 @@ msgstr "" "Stanje: Uvoz datoteke ni uspel. Popravi datoteko in ponovno ročno uvozi." #: 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 "Ni mogoče premakniti/preimenovati osnovne vire." @@ -4225,6 +4230,10 @@ msgid "Reset to Defaults" msgstr "Naložite Prevzeto" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr " Datoteke" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index f53d0b630a..4ed115ecfb 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -3733,6 +3733,11 @@ msgstr "" "importoje manualisht." #: 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 "Nuk mund të leviz/riemërtoj rrenjën e resurseve." @@ -4148,6 +4153,10 @@ msgid "Reset to Defaults" msgstr "Ngarko të Parazgjedhur" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr " Skedarët" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index 4fe901f414..b8edfd5d95 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -3984,6 +3984,11 @@ 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 "Не могу померити/преименовати корен ресурса." @@ -4431,6 +4436,10 @@ msgid "Reset to Defaults" msgstr "Учитај уобичајено" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr " %d Датотеке" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index 3d979c3fc6..8f79f445d8 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -3537,6 +3537,11 @@ 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 "" @@ -3930,6 +3935,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index a7bc3d6288..125d4c733e 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -15,18 +15,19 @@ # Anonymous <noreply@weblate.org>, 2020. # Joakim Lundberg <joakim@joakimlundberg.com>, 2020. # Kristoffer Grundström <swedishsailfishosuser@tutanota.com>, 2020. -# Jonas Robertsson <jonas.robertsson@posteo.net>, 2020. +# Jonas Robertsson <jonas.robertsson@posteo.net>, 2020, 2021. # André Andersson <andre.eric.andersson@gmail.com>, 2020. # Andreas Westrell <andreas.westrell@gmail.com>, 2020. # Gustav Andersson <gustav.andersson96@outlook.com>, 2020. # Shaggy <anton_christoffersson@hotmail.com>, 2020. # Marcus Toftedahl <marcus.toftedahl@his.se>, 2020. +# Alex25820 <Alexander_sjogren@hotmail.se>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-11-04 02:39+0000\n" -"Last-Translator: Marcus Toftedahl <marcus.toftedahl@his.se>\n" +"PO-Revision-Date: 2021-03-24 23:44+0000\n" +"Last-Translator: Jonas Robertsson <jonas.robertsson@posteo.net>\n" "Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/" "godot/sv/>\n" "Language: sv\n" @@ -34,7 +35,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.3.2-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -43,13 +44,13 @@ msgstr "Ogiltligt typargument till convert(), använd TYPE_* konstanter." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "Förväntas en string av längden 1 (en karaktär)." +msgstr "Förväntade en sträng av längden 1 (ett tecken)." #: 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 "Inte tillräckligt med bytes för avkodning byte, eller ogiltigt format." +msgstr "Inte nog med bytes för att avkoda, eller ogiltigt format." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" @@ -579,7 +580,7 @@ msgstr "Fördubbla val" #: editor/animation_track_editor.cpp msgid "Duplicate Transposed" -msgstr "Fördubbla Transponerade" +msgstr "Duplicera Transponerade" #: editor/animation_track_editor.cpp msgid "Delete Selection" @@ -599,7 +600,7 @@ msgstr "Optimera Animation" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation" -msgstr "Rensa Animation" +msgstr "Städa-upp Animation" #: editor/animation_track_editor.cpp msgid "Pick the node that will be animated:" @@ -844,6 +845,7 @@ msgstr "" "vilotid." #: editor/connections_dialog.cpp +#, fuzzy msgid "Oneshot" msgstr "Oneshot" @@ -1044,14 +1046,14 @@ msgid "Owners Of:" msgstr "Ägare av:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "Ta bort valda filer från projektet? (Kan ej återställas)" +msgstr "" +"Ta bort valda filer från projektet? (Kan ej återställas)\n" +"Du kan hitta de borttagna filerna i systemets papperskorg." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1059,7 +1061,8 @@ msgid "" "You can find the removed files in the system trash to restore them." msgstr "" "Filerna som tas bort krävs av andra resurser för att de ska fungera.\n" -"Ta bort dem ändå? (går inte ångra)" +"Ta bort dem ändå? (går inte ångra)\n" +"Du kan hitta de borttagna filerna i systemets papperskorg." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1070,9 +1073,8 @@ msgid "Error loading:" msgstr "Fel vid laddning:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Load failed due to missing dependencies:" -msgstr "Scenen misslyckades att ladda på grund av att beroenden saknas:" +msgstr "Inladdning misslyckades på grund av att beroenden saknas:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" @@ -1239,7 +1241,7 @@ msgstr "Dekomprimerar Tillgångar" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "The following files failed extraction from package:" -msgstr "Följande filer gick inte att packa upp från tillägget:" +msgstr "Följande filer misslyckades att packas upp från paketet:" #: editor/editor_asset_installer.cpp msgid "And %s more files." @@ -1256,7 +1258,7 @@ msgstr "Klart!" #: editor/editor_asset_installer.cpp msgid "Package Contents:" -msgstr "Packet Innehåll:" +msgstr "Paketets Innehåll:" #: editor/editor_asset_installer.cpp editor/editor_node.cpp msgid "Install" @@ -1280,7 +1282,7 @@ msgstr "Byt namn på Ljud-Buss" #: editor/editor_audio_buses.cpp msgid "Change Audio Bus Volume" -msgstr "Växla Ljud-Buss Volum" +msgstr "Växla Ljud-Buss Volym" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" @@ -1405,7 +1407,7 @@ msgstr "Lägg till Buss" #: editor/editor_audio_buses.cpp msgid "Add a new Audio Bus to this layout." -msgstr "Lägg till en ny Audio-Buss för detta layout" +msgstr "Lägg till en ny Audio-Buss för denna layout." #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1446,21 +1448,16 @@ msgid "Valid characters:" msgstr "Giltiga tecken:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing engine class name." -msgstr "" -"Ogiltigt namn. Får inte vara samma som ett befintligt engine class-namn." +msgstr "Får inte vara samma som ett befintligt engine class-namn." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." -msgstr "Ogiltigt namn. Får inte vara samma som ett befintligt inbyggt typnamn." +msgstr "Får inte vara samma som ett befintligt inbyggt typ-namn." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing global constant name." -msgstr "" -"Ogiltigt namn. Får inte vara samma som ett befintligt global constant-namn." +msgstr "Får inte vara samma som ett befintligt globalt konstant-namn." #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." @@ -1532,7 +1529,6 @@ msgid "Updating Scene" msgstr "Uppdaterar Scen" #: editor/editor_data.cpp -#, fuzzy msgid "Storing local changes..." msgstr "Lagrar lokala ändringar..." @@ -1541,18 +1537,16 @@ msgid "Updating scene..." msgstr "Uppdaterar scen..." #: editor/editor_data.cpp editor/editor_properties.cpp -#, fuzzy msgid "[empty]" -msgstr "(tom)" +msgstr "[tom]" #: editor/editor_data.cpp msgid "[unsaved]" msgstr "[inte sparad]" #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first." -msgstr "Vänligen välj en baskatalog först" +msgstr "Vänligen välj en baskatalog först." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1639,21 +1633,20 @@ msgstr "" "Etc 2' i Projektinställningarna." #: editor/editor_export.cpp -#, fuzzy 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 "" -"Målplattformen kräver 'ETC' texturkomprimering för GLES2. Aktivera 'Import " -"Etc' i Projektinställningarna." +"Målplattformen kräver 'ETC' texturkomprimering för GLES2.\n" +"Aktivera 'Import Etc' i Projektinställningarna." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom debug template not found." -msgstr "Mallfil hittades inte:" +msgstr "Mallfil hittades inte." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -1684,14 +1677,12 @@ msgid "Asset Library" msgstr "Tillgångsbibliotek" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Scene Tree Editing" -msgstr "Scenträd (Noder):" +msgstr "Scenträd Redigering" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Node Dock" -msgstr "Node Namn:" +msgstr "Nod Docka" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1741,22 +1732,20 @@ msgid "Enable Contextual Editor" msgstr "Aktivera kontextuell redigerare" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Properties:" -msgstr "Egenskaper" +msgstr "Egenskaper:" #: editor/editor_feature_profile.cpp msgid "Enabled Features:" msgstr "Aktivera funktioner:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Classes:" -msgstr "Sök Klasser" +msgstr "Aktiverade Klasser:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "Fil '%s''s format är ogiltig, import avbruten" +msgstr "Fil '%s''s format är ogiltig, import avbruten." #: editor/editor_feature_profile.cpp msgid "" @@ -1767,9 +1756,8 @@ msgstr "" "avbruten." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Error saving profile to path: '%s'." -msgstr "Fel vid laddning av mall '%s'" +msgstr "Fel vid laddning av mall '%s'." #: editor/editor_feature_profile.cpp msgid "Unset" @@ -1781,9 +1769,8 @@ msgid "Current Profile:" msgstr "Nuvarande Version:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Make Current" -msgstr "Nuvarande:" +msgstr "Gör till Nuvarande" #: editor/editor_feature_profile.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1836,7 +1823,7 @@ msgstr "Exportera Projekt" #: editor/editor_feature_profile.cpp msgid "Manage Editor Feature Profiles" -msgstr "" +msgstr "Hantera Redigerarens Funktions Profiler" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -1852,7 +1839,7 @@ msgstr "Välj Denna Mapp" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "Kopiera Sökvägen" +msgstr "Kopiera Sökväg" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp #, fuzzy @@ -1946,33 +1933,28 @@ msgid "Move Favorite Down" msgstr "Flytta Favorit Ner" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to previous folder." -msgstr "Gå till överordnad mapp" +msgstr "Gå till föregående mapp." #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to next folder." -msgstr "Gå till överordnad mapp" +msgstr "Gå till nästa mapp." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Gå till överordnad mapp." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Refresh files." -msgstr "Sök Klasser" +msgstr "Uppdatera filer." #: editor/editor_file_dialog.cpp -#, fuzzy msgid "(Un)favorite current folder." -msgstr "Kunde inte skapa mapp." +msgstr "Ta bort nuvarande mapp från favoriter." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Toggle the visibility of hidden files." -msgstr "Växla Dolda Filer" +msgstr "Växla synligheten av dolda filer." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." @@ -1998,13 +1980,15 @@ msgstr "Fil:" #: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "ScanSources" +msgstr "ScanKällor" #: editor/editor_file_system.cpp msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" +"Det finns flera importörer för olika typer som pekar på filen %s, import " +"avbruten" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -2028,9 +2012,8 @@ msgid "Inherited by:" msgstr "Ärvd av:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "Beskrivning:" +msgstr "Beskrivning" #: editor/editor_help.cpp #, fuzzy @@ -2043,12 +2026,11 @@ msgstr "Egenskaper" #: editor/editor_help.cpp msgid "override:" -msgstr "" +msgstr "skriv över:" #: editor/editor_help.cpp -#, fuzzy msgid "default:" -msgstr "Standard" +msgstr "standard:" #: editor/editor_help.cpp msgid "Methods" @@ -2068,9 +2050,8 @@ msgid "Constants" msgstr "Konstanter" #: editor/editor_help.cpp -#, fuzzy msgid "Property Descriptions" -msgstr "Egenskapsbeskrivning:" +msgstr "Egenskapsbeskrivningar" #: editor/editor_help.cpp #, fuzzy @@ -2086,9 +2067,8 @@ msgstr "" "oss genom att [color=$color][url=$url]bidra med en[/url][/color]!" #: editor/editor_help.cpp -#, fuzzy msgid "Method Descriptions" -msgstr "Metodbeskrivning:" +msgstr "Metodbeskrivningar" #: editor/editor_help.cpp msgid "" @@ -2183,15 +2163,15 @@ msgstr "Egenskaper" #: editor/editor_inspector.cpp editor/project_settings_editor.cpp msgid "Property:" -msgstr "" +msgstr "Egenskap:" #: editor/editor_inspector.cpp msgid "Set" -msgstr "" +msgstr "Sätt" #: editor/editor_inspector.cpp msgid "Set Multiple:" -msgstr "" +msgstr "Sätt Flera:" #: editor/editor_log.cpp msgid "Output:" @@ -2213,9 +2193,8 @@ msgid "Clear" msgstr "Rensa" #: editor/editor_log.cpp -#, fuzzy msgid "Clear Output" -msgstr "Output:" +msgstr "Rensa Utdata" #: editor/editor_network_profiler.cpp editor/editor_node.cpp #: editor/editor_profiler.cpp @@ -2225,11 +2204,11 @@ msgstr "Stanna" #: editor/editor_network_profiler.cpp editor/editor_profiler.cpp #: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp msgid "Start" -msgstr "" +msgstr "Starta" #: editor/editor_network_profiler.cpp msgid "%s/s" -msgstr "" +msgstr "%s/s" #: editor/editor_network_profiler.cpp #, fuzzy @@ -2238,7 +2217,7 @@ msgstr "Ladda ner" #: editor/editor_network_profiler.cpp msgid "Up" -msgstr "" +msgstr "Upp" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" @@ -2246,27 +2225,27 @@ msgstr "Nod" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" -msgstr "" +msgstr "Inkommande RPC" #: editor/editor_network_profiler.cpp msgid "Incoming RSET" -msgstr "" +msgstr "Inkommande RSET" #: editor/editor_network_profiler.cpp msgid "Outgoing RPC" -msgstr "" +msgstr "Utgående RPC" #: editor/editor_network_profiler.cpp msgid "Outgoing RSET" -msgstr "" +msgstr "Utgående RSET" #: editor/editor_node.cpp editor/project_manager.cpp msgid "New Window" -msgstr "" +msgstr "Nytt Fönster" #: editor/editor_node.cpp msgid "Imported resources can't be saved." -msgstr "" +msgstr "Importerade resurser kan inte sparas." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp @@ -2282,6 +2261,8 @@ msgid "" "This resource can't be saved because it does not belong to the edited scene. " "Make it unique first." msgstr "" +"Resursen kan inte sparas för att den inte hör inte till den redigerade " +"scenen. Gör den unik först." #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As..." @@ -2301,7 +2282,7 @@ msgstr "Fel vid sparande." #: 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 "Kan inte öppna '%s'. Filen kan ha flyttats eller tagits bort." #: editor/editor_node.cpp msgid "Error while parsing '%s'." @@ -2340,6 +2321,8 @@ 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 "" +"Scenen kan inte sparas för att det finns en cyklisk instansnings inkusion.\n" +"Försök lösa det och pröva sedan att spara igen." #: editor/editor_node.cpp #, fuzzy @@ -2352,7 +2335,7 @@ msgstr "" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" -msgstr "" +msgstr "Kan inte skriva över en scen som fortfarande är öppen!" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" @@ -2375,6 +2358,8 @@ msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" +"Ett fel uppstod medans editor layouten sparades.\n" +"Se till att editorns användardata sökväg är skriv tillgänglig." #: editor/editor_node.cpp msgid "" @@ -2382,6 +2367,9 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" +"Standard editor layouten överskriven.\n" +"För att återställa Standard layouten till sina bas inställningar, använd " +"Radera Layout valet och radera Standard Layouten." #: editor/editor_node.cpp msgid "Layout name not found!" @@ -2389,7 +2377,7 @@ msgstr "Layoutnamn hittades inte!" #: editor/editor_node.cpp msgid "Restored the Default layout to its base settings." -msgstr "" +msgstr "Återställde Standard layouten till sina bas inställningar." #: editor/editor_node.cpp msgid "" @@ -2448,7 +2436,7 @@ msgstr "Det finns ingen definierad scen att köra." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "Spara scenen innan du kör..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2492,7 +2480,7 @@ msgstr "Misslyckades att ladda resurs." #: editor/editor_node.cpp msgid "A root node is required to save the scene." -msgstr "" +msgstr "En root nod krävs för att spara scenen." #: editor/editor_node.cpp msgid "Save Scene As..." @@ -2536,6 +2524,8 @@ msgid "" "The current scene has unsaved changes.\n" "Reload the saved scene anyway? This action cannot be undone." msgstr "" +"Den aktiva scenen har osparade ändringar.\n" +"Vill du ladda om den ändå? Detta kan inte ångras." #: editor/editor_node.cpp #, fuzzy @@ -2721,7 +2711,7 @@ msgstr "Stänga Övriga Flikar" #: editor/editor_node.cpp msgid "Close Tabs to the Right" -msgstr "" +msgstr "Stäng flikar till höger" #: editor/editor_node.cpp #, fuzzy @@ -2746,7 +2736,7 @@ msgstr "%d fler filer" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "Dockposition" #: editor/editor_node.cpp msgid "Distraction Free Mode" @@ -2836,7 +2826,7 @@ msgstr "Ångra" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Redo" -msgstr "Ångra" +msgstr "Återställ" #: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." @@ -2848,45 +2838,40 @@ msgid "Project" msgstr "Projekt" #: editor/editor_node.cpp -#, fuzzy msgid "Project Settings..." -msgstr "Projektinställningar" +msgstr "Projektinställningar..." #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Version Control" -msgstr "Version:" +msgstr "Versionshantering" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" -msgstr "" +msgstr "Ställ In Versionshantering" #: editor/editor_node.cpp msgid "Shut Down Version Control" -msgstr "" +msgstr "Stäng Ner Versionshantering" #: editor/editor_node.cpp -#, fuzzy msgid "Export..." -msgstr "Exportera" +msgstr "Exportera..." #: editor/editor_node.cpp msgid "Install Android Build Template..." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Open Project Data Folder" -msgstr "Öppna Projekthanteraren?" +msgstr "Öppna Projekthanteraren" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" msgstr "Verktyg" #: editor/editor_node.cpp -#, fuzzy msgid "Orphan Resource Explorer..." -msgstr "Föräldralös Resursutforskare" +msgstr "Föräldralös Resursutforskare..." #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2895,7 +2880,7 @@ msgstr "Avsluta till Projektlistan" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/project_export.cpp msgid "Debug" -msgstr "Debugga" +msgstr "Felsök" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -2927,7 +2912,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "" +msgstr "Synliga Kollisionsformer" #: editor/editor_node.cpp msgid "" @@ -2976,9 +2961,8 @@ msgid "Editor" msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Editor Settings..." -msgstr "Övergångar" +msgstr "Redigerarinställningar..." #: editor/editor_node.cpp msgid "Editor Layout" @@ -2994,7 +2978,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "Fullskärm" +msgstr "Växla Fullskärm" #: editor/editor_node.cpp #, fuzzy @@ -3018,9 +3002,8 @@ msgid "Manage Editor Features..." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Manage Export Templates..." -msgstr "Mallar" +msgstr "Hantera exportmallar..." #: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp msgid "Help" @@ -3186,11 +3169,12 @@ msgid "Open & Run a Script" msgstr "Öppna & Kör ett Skript" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" -msgstr "Följande filer gick inte att packa upp från tillägget:" +msgstr "" +"Följande filer är nyare på disken.\n" +"Vilka åtgärder ska vidtas?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3243,9 +3227,8 @@ msgid "Warning!" msgstr "Varning!" #: editor/editor_path.cpp -#, fuzzy msgid "No sub-resources found." -msgstr "Resurser" +msgstr "Inga underresurser hittades." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -3257,9 +3240,8 @@ msgid "Thumbnail..." msgstr "Miniatyr..." #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Main Script:" -msgstr "Öppna Skript" +msgstr "Huvud Skript:" #: editor/editor_plugin_settings.cpp #, fuzzy @@ -3288,9 +3270,8 @@ msgid "Status:" msgstr "Status:" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Edit:" -msgstr "Redigera" +msgstr "Redigera:" #: editor/editor_profiler.cpp msgid "Measure:" @@ -3325,18 +3306,16 @@ msgid "Frame #:" msgstr "" #: editor/editor_profiler.cpp -#, fuzzy msgid "Time" -msgstr "Tid:" +msgstr "Tid" #: editor/editor_profiler.cpp msgid "Calls" msgstr "" #: editor/editor_properties.cpp -#, fuzzy msgid "Edit Text:" -msgstr "Redigera tema..." +msgstr "Redigera Text:" #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" @@ -3355,9 +3334,8 @@ msgid "[Empty]" msgstr "" #: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp -#, fuzzy msgid "Assign..." -msgstr "Tilldela" +msgstr "Tilldela..." #: editor/editor_properties.cpp #, fuzzy @@ -3556,9 +3534,8 @@ msgid "No version.txt found inside templates." msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:" -msgstr "Fel vid laddning av mall '%s'" +msgstr "Fel vid skapande av sökväg för mallar:" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" @@ -3722,15 +3699,19 @@ msgid "Select mirror from list: (Shift+Click: Open in Browser)" msgstr "" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Favorites" -msgstr "Favoriter:" +msgstr "Favoriter" #: 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 "" @@ -3788,9 +3769,8 @@ msgid "Renaming folder:" msgstr "Byter namn på mappen:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Duplicating file:" -msgstr "Duplicera" +msgstr "Duplicerar fil:" #: editor/filesystem_dock.cpp #, fuzzy @@ -3798,9 +3778,8 @@ msgid "Duplicating folder:" msgstr "Byter namn på mappen:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Inherited Scene" -msgstr "Ny Ärvd Scen..." +msgstr "Ny Ärvd Scen" #: editor/filesystem_dock.cpp #, fuzzy @@ -3817,9 +3796,8 @@ msgid "Instance" msgstr "Instans" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Add to Favorites" -msgstr "Favoriter:" +msgstr "Lägg till i Favoriter" #: editor/filesystem_dock.cpp #, fuzzy @@ -3841,14 +3819,12 @@ msgid "Move To..." msgstr "Flytta Till..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Scene..." -msgstr "Ny Scen" +msgstr "Ny Scen..." #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "New Script..." -msgstr "Nytt Skript" +msgstr "Nytt Skript..." #: editor/filesystem_dock.cpp #, fuzzy @@ -3868,9 +3844,8 @@ msgid "Collapse All" msgstr "Stäng Alla" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Duplicate..." -msgstr "Duplicera" +msgstr "Duplicera..." #: editor/filesystem_dock.cpp #, fuzzy @@ -3942,19 +3917,16 @@ msgid "Find in Files" msgstr "%d fler filer" #: editor/find_in_files.cpp -#, fuzzy msgid "Find:" -msgstr "Hitta" +msgstr "Hitta:" #: editor/find_in_files.cpp -#, fuzzy msgid "Folder:" -msgstr "Skapa Mapp" +msgstr "Mapp:" #: editor/find_in_files.cpp -#, fuzzy msgid "Filters:" -msgstr "Filtrera noder" +msgstr "Filter:" #: editor/find_in_files.cpp msgid "" @@ -3979,11 +3951,11 @@ msgstr "Avbryt" #: editor/find_in_files.cpp msgid "Find: " -msgstr "Hitta:" +msgstr "Hitta: " #: editor/find_in_files.cpp msgid "Replace: " -msgstr "Ersätt:" +msgstr "Ersätt: " #: editor/find_in_files.cpp #, fuzzy @@ -4158,9 +4130,8 @@ msgid "Select Importer" msgstr "Välj Node" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Importer:" -msgstr "Importera" +msgstr "Importör:" #: editor/import_defaults_editor.cpp #, fuzzy @@ -4168,6 +4139,10 @@ msgid "Reset to Defaults" msgstr "Ladda Standard" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Filer" @@ -4258,9 +4233,8 @@ msgid "Load an existing resource from disk and edit it." msgstr "" #: editor/inspector_dock.cpp -#, fuzzy msgid "Save the currently edited resource." -msgstr "Spara den nuvarande animationen" +msgstr "Spara den nuvarande redigerade resursen." #: editor/inspector_dock.cpp msgid "Go to the previous edited object in history." @@ -4315,14 +4289,12 @@ msgid "Subfolder:" msgstr "" #: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Language:" -msgstr "Språk" +msgstr "Språk:" #: editor/plugin_config_dialog.cpp -#, fuzzy msgid "Script Name:" -msgstr "Skript giltigt" +msgstr "Skript Namn:" #: editor/plugin_config_dialog.cpp msgid "Activate now?" @@ -4337,9 +4309,8 @@ msgstr "Skapa Prenumeration" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Create points." -msgstr "Radera punkter" +msgstr "Skapa punkter." #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "" @@ -4350,9 +4321,8 @@ msgstr "" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Erase points." -msgstr "Radera punkter" +msgstr "Radera punkter." #: editor/plugins/abstract_polygon_2d_editor.cpp #, fuzzy @@ -4385,9 +4355,8 @@ msgstr "Lägg till Animation" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Load..." -msgstr "Ladda" +msgstr "Ladda..." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4550,9 +4519,8 @@ msgid "Add Node to BlendTree" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Node Moved" -msgstr "Node Namn:" +msgstr "Nod Flyttad" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Unable to connect, port may be in use or connection may be invalid." @@ -4587,9 +4555,8 @@ msgid "Delete Node(s)" msgstr "Ta bort Nod(er)" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Toggle Filter On/Off" -msgstr "Växla distraktionsfritt läge." +msgstr "Växla Filter På/Av" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy @@ -4617,9 +4584,8 @@ msgid "Anim Clips" msgstr "Animklipp:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Audio Clips" -msgstr "Ljudklipp:" +msgstr "Ljudklipp" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Functions" @@ -4627,21 +4593,18 @@ msgstr "Funktioner" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Node Renamed" -msgstr "Node Namn:" +msgstr "Nod har bytt Namn" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Node..." -msgstr "Lägg Till Node" +msgstr "Lägg Till Node..." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp -#, fuzzy msgid "Edit Filtered Tracks:" -msgstr "Redigera Filter" +msgstr "Redigera Filtrerade Spår:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy @@ -4762,9 +4725,8 @@ msgid "Animation" msgstr "Animation" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Edit Transitions..." -msgstr "Övergångar" +msgstr "Ändra Övergångar..." #: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy @@ -4932,14 +4894,12 @@ msgid "" msgstr "" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Create new nodes." -msgstr "Skapa Ny" +msgstr "Skapa nya noder." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Connect nodes." -msgstr "Anslut Noder" +msgstr "Anslut noder." #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -4956,12 +4916,11 @@ msgstr "" #: editor/plugins/animation_state_machine_editor.cpp msgid "Transition: " -msgstr "Övergång:" +msgstr "Övergång: " #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Play Mode:" -msgstr "Raw-Läge" +msgstr "Spel Läge:" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -5549,9 +5508,8 @@ msgid "Full Rect" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Keep Ratio" -msgstr "Skalnings förhållande:" +msgstr "Behåll Förhållande" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -5865,9 +5823,8 @@ msgid "Scale mask for inserting keys." msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Insert keys (based on mask)." -msgstr "Anim Infoga Nyckel" +msgstr "Infoga nycklar (baserat på mask)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6314,16 +6271,16 @@ msgid "Remove item %d?" msgstr "" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "" "Update from existing scene?:\n" "%s" -msgstr "Uppdatera från scen" +msgstr "" +"Uppdatera från existerande scen?:\n" +"%s" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Mesh Library" -msgstr "MeshLibrary..." +msgstr "MeshLibrary" #: editor/plugins/mesh_library_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -6930,21 +6887,16 @@ msgid "Clear Recent Files" msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Close and save changes?" -msgstr "" -"Stäng och spara ändringar?\n" -"\"" +msgstr "Stäng och spara ändringar?" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error writing TextFile:" -msgstr "Fel vid sparande av TileSet!" +msgstr "Fel vid sparande av TextFil:" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Could not load file at:" -msgstr "Fel - Kunde inte skapa Skript i filsystemet." +msgstr "Kunde inte ladda filen vid:" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -6967,9 +6919,8 @@ msgid "Error importing theme." msgstr "Fel vid sparande av scenen." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Importing" -msgstr "Fel vid laddning:" +msgstr "Fel vid Importering" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -7077,9 +7028,8 @@ msgid "File" msgstr "Fil" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open..." -msgstr "Öppen" +msgstr "Öppna..." #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -7114,9 +7064,8 @@ msgid "Theme" msgstr "Tema" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Import Theme..." -msgstr "Importera Tema" +msgstr "Importera Tema..." #: editor/plugins/script_editor_plugin.cpp msgid "Reload Theme" @@ -7172,9 +7121,8 @@ msgid "Debug with External Editor" msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open Godot online documentation." -msgstr "Öppna Senaste" +msgstr "Öppna Godot online dokumentation." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." @@ -7218,33 +7166,30 @@ msgid "Connections to method:" msgstr "Anslut Till Node:" #: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp -#, fuzzy msgid "Source" -msgstr "Källa:" +msgstr "Källa" #: editor/plugins/script_text_editor.cpp msgid "Target" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." -msgstr "Anslut '%s' till '%s'" +msgstr "" +"Saknar ansluten metod '%s' för signalen '%s' från noden '%s' till noden '%s'." #: editor/plugins/script_text_editor.cpp msgid "[Ignore]" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Line" -msgstr "Rad:" +msgstr "Rad" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Function" -msgstr "Funktion:" +msgstr "Gå till Funktion" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." @@ -7397,14 +7342,12 @@ msgid "Remove All Bookmarks" msgstr "Ta bort Alla" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Function..." -msgstr "Ta bort Funktion" +msgstr "Gå till Funktion..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Line..." -msgstr "Gå till Rad" +msgstr "Gå till Rad..." #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -7862,9 +7805,8 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Settings..." -msgstr "Inställningar" +msgstr "Inställningar..." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" @@ -8034,9 +7976,8 @@ msgid "Update Preview" msgstr "Förhandsgranska" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Settings:" -msgstr "Inställningar" +msgstr "Inställningar:" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -8052,9 +7993,8 @@ msgid "Add Frame" msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Unable to load images" -msgstr "Misslyckades att ladda resurs." +msgstr "Det gick inte att läsa in bilder" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" @@ -8086,9 +8026,8 @@ msgid "Move Frame" msgstr "Flytta Nod(er)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Animations:" -msgstr "Animationer" +msgstr "Animationer:" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -8109,9 +8048,8 @@ msgid "Animation Frames:" msgstr "Nytt Animationsnamn:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Add a Texture from File" -msgstr "Flytta nuvarande spår upp." +msgstr "Lägg till en Textur från en Fil" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" @@ -8222,9 +8160,8 @@ msgid "Remove All" msgstr "Ta bort Alla" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Theme" -msgstr "Redigera tema..." +msgstr "Redigera Tema" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." @@ -8371,9 +8308,8 @@ msgid "Erase Selection" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Fix Invalid Tiles" -msgstr "Ogiltigt namn." +msgstr "Fixa Ogiltiga Tiles" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8595,19 +8531,16 @@ msgid "Copy bitmask." msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Paste bitmask." -msgstr "Klistra in Animation" +msgstr "Klistra in bitmask." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Erase bitmask." -msgstr "Radera punkter" +msgstr "Radera bitmask." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create a new rectangle." -msgstr "Skapa Ny" +msgstr "Skapa en ny rektangel." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8615,9 +8548,8 @@ msgid "New Rectangle" msgstr "Ny Scen" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create a new polygon." -msgstr "Skapa Prenumeration" +msgstr "Skapa en ny polygon." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8684,25 +8616,28 @@ msgid "Delete selected Rect." msgstr "Ta bort valda filer?" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select current edited sub-tile.\n" "Click on another Tile to edit it." -msgstr "Skapa Mapp" +msgstr "" +"Markera nuvarande redigerad sub-tile.\n" +"Klicka på en annan Tile för att redigera den." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete polygon." -msgstr "Radera punkter" +msgstr "Radera polygon." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy 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 "Skapa Mapp" +msgstr "" +"LMB: Aktivera bit.\n" +"RMB: Avaktivera bit.\n" +"Shift+LMB: Aktivera vildkorts bit.\n" +"Klicka på en annan Tile för att redigera den." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -8718,11 +8653,12 @@ msgid "" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select sub-tile to change its z index.\n" "Click on another Tile to edit it." -msgstr "Skapa Mapp" +msgstr "" +"Välj sub-tile för att ändra dess z-index.\n" +"Klicka på en annan Tile för att redigera den." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Region" @@ -8829,9 +8765,8 @@ msgid "This property can't be changed." msgstr "Åtgärden kan inte göras utan en scen." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "TileSet" -msgstr "TileSet..." +msgstr "TileSet" #: editor/plugins/version_control_editor_plugin.cpp msgid "No VCS addons are available." @@ -8932,14 +8867,12 @@ msgid "(GLES3 only)" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "Output:" +msgstr "Lägg till Utdata" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar" -msgstr "Skala:" +msgstr "Skalär" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector" @@ -8954,9 +8887,8 @@ msgid "Sampler" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add input port" -msgstr "Favoriter:" +msgstr "Lägg till inmatningsport" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" @@ -8972,9 +8904,8 @@ msgid "Change output port type" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port name" -msgstr "Ändra Animationsnamn:" +msgstr "Ändra inmatningsport namn" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change output port name" @@ -8991,9 +8922,8 @@ msgid "Remove output port" msgstr "Ta Bort Mall" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set expression" -msgstr "Nuvarande Version:" +msgstr "Ställ in uttryck" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Resize VisualShader node" @@ -9012,9 +8942,8 @@ msgid "Add Node to Visual Shader" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Node(s) Moved" -msgstr "Node Namn:" +msgstr "Nod(er) Flyttade" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9054,9 +8983,8 @@ msgid "Light" msgstr "Höger" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Show resulted shader code." -msgstr "Skapa Node" +msgstr "Visa den resulterande skuggningskoden." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9064,18 +8992,16 @@ msgid "Create Shader Node" msgstr "Skapa Node" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color function." -msgstr "Funktion:" +msgstr "Färg funktion." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Grayscale function." -msgstr "Skapa Funktion" +msgstr "Gråskala funktion." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts HSV vector to RGB equivalent." @@ -9086,9 +9012,8 @@ msgid "Converts RGB vector to HSV equivalent." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sepia function." -msgstr "Byt namn på funktion" +msgstr "Sepia funktion." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Burn operator." @@ -9127,14 +9052,12 @@ msgid "SoftLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color constant." -msgstr "Konstant" +msgstr "Färg konstant." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color uniform." -msgstr "Transformera" +msgstr "Färg enhetlig." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the %s comparison between two parameters." @@ -9243,9 +9166,8 @@ msgid "'%s' input parameter for vertex and fragment shader mode." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar function." -msgstr "Skala urval" +msgstr "Skalär funktion." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar operator." @@ -9478,9 +9400,8 @@ msgid "Scalar constant." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar uniform." -msgstr "Transformera" +msgstr "Skalär uniform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the cubic texture lookup." @@ -9503,9 +9424,8 @@ msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform function." -msgstr "Transformera" +msgstr "Transformera funktion." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9547,19 +9467,16 @@ msgid "Multiplies vector by transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform constant." -msgstr "Transformera" +msgstr "Transformera konstant." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform uniform." -msgstr "Transformera" +msgstr "Transformera uniform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector function." -msgstr "Ta bort Funktion" +msgstr "Vektor funktion." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector operator." @@ -9800,9 +9717,8 @@ msgid "Exporting All" msgstr "Exportera" #: editor/project_export.cpp -#, fuzzy msgid "The given export path doesn't exist:" -msgstr "Sökvägen finns inte." +msgstr "Den angivna export vägen finns inte:" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted:" @@ -9881,9 +9797,8 @@ msgid "Script" msgstr "Nytt Skript" #: editor/project_export.cpp -#, fuzzy msgid "Script Export Mode:" -msgstr "Exportera Projekt" +msgstr "Skript Exporterings Läge:" #: editor/project_export.cpp msgid "Text" @@ -9980,9 +9895,8 @@ msgid "Imported Project" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Invalid Project Name." -msgstr "Projektnamn:" +msgstr "Ogiltigt projektnamn." #: editor/project_manager.cpp #, fuzzy @@ -10115,9 +10029,8 @@ msgid "Error: Project is missing on the filesystem." msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project at '%s'." -msgstr "Kan inte öppna projekt" +msgstr "Kan inte öppna projekt vid '%s'." #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" @@ -10299,9 +10212,8 @@ msgid "Rename Input Action Event" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Change Action deadzone" -msgstr "Ändra Animationsnamn:" +msgstr "Ändra Åtgärdens Dödzon" #: editor/project_settings_editor.cpp msgid "Add Input Action Event" @@ -10670,9 +10582,8 @@ msgid "Suffix:" msgstr "" #: editor/rename_dialog.cpp -#, fuzzy msgid "Use Regular Expressions" -msgstr "Nuvarande Version:" +msgstr "Använd Vanliga Uttryck" #: editor/rename_dialog.cpp #, fuzzy @@ -10684,18 +10595,16 @@ msgid "Substitute" msgstr "" #: editor/rename_dialog.cpp -#, fuzzy msgid "Node name" -msgstr "Node Namn:" +msgstr "Nod namn" #: editor/rename_dialog.cpp msgid "Node's parent name, if available" msgstr "" #: editor/rename_dialog.cpp -#, fuzzy msgid "Node type" -msgstr "Node Namn:" +msgstr "Nod typ" #: editor/rename_dialog.cpp #, fuzzy @@ -10726,9 +10635,8 @@ msgid "Initial value for the counter" msgstr "" #: editor/rename_dialog.cpp -#, fuzzy msgid "Step" -msgstr "Steg (s):" +msgstr "Steg" #: editor/rename_dialog.cpp msgid "Amount by which counter is incremented for each node" @@ -10785,9 +10693,8 @@ msgid "Regular Expression Error:" msgstr "Nuvarande Version:" #: editor/rename_dialog.cpp -#, fuzzy msgid "At character %s" -msgstr "Giltiga tecken:" +msgstr "Vid tecken %s" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent Node" @@ -10898,14 +10805,12 @@ msgid "Make node as Root" msgstr "Gör nod som Rot" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Ta bort Nod(er)" +msgstr "Ta bort %d noder och alla barn?" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes?" -msgstr "Ta bort Nod(er)" +msgstr "Ta bort %d noder?" #: editor/scene_tree_dock.cpp msgid "Delete the root node \"%s\"?" @@ -10916,9 +10821,8 @@ msgid "Delete node \"%s\" and its children?" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete node \"%s\"?" -msgstr "Ta bort Nod(er)" +msgstr "Ta bort nod \"%s\"?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." @@ -10955,9 +10859,8 @@ msgid "New Scene Root" msgstr "Ny Scenrot" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Create Root Node:" -msgstr "Skapa Node" +msgstr "Skapa Rot Nod:" #: editor/scene_tree_dock.cpp #, fuzzy @@ -11049,7 +10952,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Add Child Node" -msgstr "Lägg till Barn-Node" +msgstr "Lägg till Barn-Nod" #: editor/scene_tree_dock.cpp #, fuzzy @@ -11079,16 +10982,15 @@ msgstr "" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Copy Node Path" -msgstr "Kopiera Node-Sökväg" +msgstr "Kopiera Nod-Sökväg" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Lägga till/Skapa en Ny Node" +msgstr "Lägg till/Skapa en Ny Node." #: editor/scene_tree_dock.cpp msgid "" @@ -11161,9 +11063,8 @@ msgid "" msgstr "" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open Script:" -msgstr "Öppna Skript" +msgstr "Öppna Skript:" #: editor/scene_tree_editor.cpp msgid "" @@ -11172,13 +11073,12 @@ msgid "" msgstr "" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "" "Children are not selectable.\n" "Click to make selectable." msgstr "" "Barn är inte valbara.\n" -"Klicka för att göra valbara" +"Klicka för att göra valbara." #: editor/scene_tree_editor.cpp msgid "Toggle Visibility" @@ -11211,14 +11111,12 @@ msgid "Select a Node" msgstr "Välj en Node" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is empty." -msgstr "Sökvägen är tom" +msgstr "Sökvägen är tom." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Filename is empty." -msgstr "Sökvägen är tom" +msgstr "Filnamn är tom." #: editor/script_create_dialog.cpp msgid "Path is not local." @@ -11230,9 +11128,8 @@ msgid "Invalid base path." msgstr "Ogiltig Sökväg." #: editor/script_create_dialog.cpp -#, fuzzy msgid "A directory with the same name exists." -msgstr "Katalog med samma namn finns redan" +msgstr "Katalog med samma namn finns redan." #: editor/script_create_dialog.cpp msgid "File does not exist." @@ -11296,14 +11193,12 @@ msgid "Invalid inherited parent name or path." msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script path/name is valid." -msgstr "Skript giltigt" +msgstr "Skript väg/namn är ogiltigt." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Allowed: a-z, A-Z, 0-9, _ and ." -msgstr "Tillåtna: a-z, a-Z, 0-9 och _" +msgstr "Tillåtna: a-z, A-Z, 0-9, _ och ." #: editor/script_create_dialog.cpp #, fuzzy @@ -11311,14 +11206,12 @@ msgid "Built-in script (into scene file)." msgstr "Åtgärder med scenfiler." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will create a new script file." -msgstr "Skapa ny Skript-fil" +msgstr "Kommer att skapa ny skript-fil." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will load an existing script file." -msgstr "Ladda in befintlig Skript-fil" +msgstr "Kommer att ladda en befintlig Skript-fil." #: editor/script_create_dialog.cpp msgid "Script file already exists." @@ -11331,19 +11224,16 @@ msgid "" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "Klassnamn" +msgstr "Klassnamn:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "Mall" +msgstr "Mall:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Öppna Skript" +msgstr "Inbyggd Skript:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -11358,9 +11248,8 @@ msgid "Bytes:" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Warning:" -msgstr "Varning" +msgstr "Varning:" #: editor/script_editor_debugger.cpp msgid "Error:" @@ -11377,9 +11266,8 @@ msgid "C++ Error:" msgstr "Fel:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Source" -msgstr "Källa:" +msgstr "C++ Källa" #: editor/script_editor_debugger.cpp #, fuzzy @@ -11400,9 +11288,8 @@ msgid "Errors" msgstr "Fel" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Child process connected." -msgstr "Barnprocess Ansluten" +msgstr "Barnprocess ansluten." #: editor/script_editor_debugger.cpp #, fuzzy @@ -11615,9 +11502,8 @@ msgid "Select dependencies of the library for this entry" msgstr "" #: modules/gdnative/gdnative_library_editor_plugin.cpp -#, fuzzy msgid "Remove current entry" -msgstr "Flytta nuvarande spår upp." +msgstr "Ta bort aktuell post" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Double click to create a new entry" @@ -11849,18 +11735,16 @@ msgid "Generate buffers" msgstr "" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "Sektioner:" +msgstr "Direkt ljus" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Indirect lighting" msgstr "" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" -msgstr "Nuvarande Version:" +msgstr "Efterbehandling" #: modules/lightmapper_cpu/lightmapper_cpu.cpp #, fuzzy @@ -11986,14 +11870,12 @@ msgid "Set Variable Type" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" -msgstr "Favoriter:" +msgstr "Lägg till Ingångsport" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" -msgstr "Favoriter:" +msgstr "Lägg till Utgångsport" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12001,27 +11883,24 @@ msgid "Override an existing built-in function." msgstr "Ogiltigt namn. Får inte vara samma som ett befintligt inbyggt typnamn." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create a new function." -msgstr "Skapa Ny" +msgstr "Skapa en ny funktion." #: modules/visual_script/visual_script_editor.cpp msgid "Variables:" msgstr "Variabler:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create a new variable." -msgstr "Skapa Ny" +msgstr "Skapa en ny variabel." #: modules/visual_script/visual_script_editor.cpp msgid "Signals:" msgstr "Signaler:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create a new signal." -msgstr "Skapa Prenumeration" +msgstr "Skapa en ny signal." #: modules/visual_script/visual_script_editor.cpp msgid "Name is not a valid identifier:" @@ -12226,33 +12105,28 @@ msgid "Editing Signal:" msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Tool:" -msgstr "Gör Patch" +msgstr "Skapa Verktyg:" #: modules/visual_script/visual_script_editor.cpp msgid "Members:" msgstr "Medlemmar:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Base Type:" -msgstr "Ändra Typ" +msgstr "Ändra Bas Typ:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Nodes..." -msgstr "Lägg Till Node" +msgstr "Lägg Till Noder..." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Function..." -msgstr "Lägg till Funktion" +msgstr "Lägg till Funktion..." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "Funktioner:" +msgstr "funktions_namn" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." @@ -12436,9 +12310,8 @@ msgid "Invalid public key for APK expansion." msgstr "" #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid package name:" -msgstr "Ogiltigt namn." +msgstr "Ogiltigt paket namn:" #: platform/android/export/export.cpp msgid "" @@ -12529,9 +12402,8 @@ msgid "App Store Team ID not specified - cannot configure the project." msgstr "" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Invalid Identifier:" -msgstr "Ogiltig teckenstorlek." +msgstr "Ogiltig identifierare:" #: platform/iphone/export/export.cpp msgid "Required icon is not specified in the preset." @@ -12554,9 +12426,8 @@ msgid "Could not write file:" msgstr "Kunde inte skriva till filen:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export:" -msgstr "Kunde inte skapa mapp." +msgstr "Kunde inte öppna mall för export:" #: platform/javascript/export/export.cpp msgid "Invalid export template:" @@ -12590,14 +12461,12 @@ msgid "Invalid package publisher display name." msgstr "Ogiltigt namn." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid product GUID." -msgstr "Projektnamn:" +msgstr "Ogiltig produkt GUID." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid publisher GUID." -msgstr "Ogiltig Sökväg" +msgstr "Ogiltigt GUID utgivare." #: platform/uwp/export/export.cpp #, fuzzy @@ -12848,9 +12717,8 @@ msgid "" msgstr "" #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVROrigin requires an ARVRCamera child node." -msgstr "ARVROrigin kräver en ARVRCamera Barn-Node" +msgstr "ARVROrigin kräver en ARVRCamera Barn-Node." #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" @@ -12875,9 +12743,8 @@ msgid "Saving lightmaps" msgstr "Genererar Lightmaps" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Done" -msgstr "Klar!" +msgstr "Klar" #: scene/3d/collision_object.cpp msgid "" @@ -13088,9 +12955,8 @@ msgid "Invalid animation: '%s'." msgstr "Ogiltig animation: '%s'." #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Nothing connected to input '%s' of node '%s'." -msgstr "Anslut '%s' till '%s'" +msgstr "Inget anslutet till inmatning '%s' av nod '%s'." #: scene/animation/animation_tree.cpp msgid "No root AnimationNode for the graph is set." @@ -13137,9 +13003,8 @@ msgid "Switch between hexadecimal and code values." msgstr "" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Add current color as a preset." -msgstr "Lägg till nuvarande färg som en förinställning" +msgstr "Lägg till nuvarande färg som en förinställning." #: scene/gui/container.cpp msgid "" diff --git a/editor/translations/ta.po b/editor/translations/ta.po index 9f9f40b54b..0fbcb5c3eb 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -3527,6 +3527,11 @@ 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 "" @@ -3921,6 +3926,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index 50c0fb5a4b..de9f84e3a4 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -3497,6 +3497,11 @@ 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 "" @@ -3887,6 +3892,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index 76a2d3c125..844bf4b4ac 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -3603,6 +3603,11 @@ 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 "ไม่สามารถย้าย/เปลี่ยนชื่อโฟลเดอร์ราก" @@ -4003,6 +4008,10 @@ msgid "Reset to Defaults" msgstr "โหลดค่าเริ่มต้น" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "ไฟล์ %d" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 9a815d3f25..b10bf6f02b 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -3722,6 +3722,11 @@ msgstr "" "aktarın." #: 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 "Kaynakların kökü taşınamaz/yeniden adlandırılamaz." @@ -4124,6 +4129,10 @@ msgid "Reset to Defaults" msgstr "Varsayılanlara dön" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d Dosya" diff --git a/editor/translations/tzm.po b/editor/translations/tzm.po index c4614c7eb3..893d4134db 100644 --- a/editor/translations/tzm.po +++ b/editor/translations/tzm.po @@ -3495,6 +3495,11 @@ 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 "" @@ -3885,6 +3890,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 6a8af58119..0fabbe77b4 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -3695,6 +3695,11 @@ 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 "Неможливо перемістити/перейменувати корінь ресурсів." @@ -4095,6 +4100,10 @@ msgid "Reset to Defaults" msgstr "Відновити типові параметри" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d файлів" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index a2e1decab6..78698e90ba 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -3561,6 +3561,11 @@ 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 "" @@ -3965,6 +3970,10 @@ msgid "Reset to Defaults" msgstr "" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr "اثاثہ کی زپ فائل" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 94692dc9b2..d01cefc0c7 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-03-08 15:33+0000\n" +"PO-Revision-Date: 2021-03-29 21:57+0000\n" "Last-Translator: Rev <revolnoom7801@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot/vi/>\n" @@ -31,7 +31,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.5.1\n" +"X-Generator: Weblate 4.6-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -51,11 +51,11 @@ msgstr "Không đủ byte để giải mã, hoặc định dạng không hợp l #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "Dữ liệu vào không hợp lệ %i (không được thông qua)" +msgstr "Đầu vào %i không hợp lệ (không được thông qua) trong biểu thức" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "self không thể sử dụng vì instance là null (không thông qua)" +msgstr "Không thể sử dụng self vì instance là null (không thông qua)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -75,7 +75,7 @@ msgstr "Đối số không hợp lệ để dựng '%s'" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "Khi cuộc gọi đến '%s':" +msgstr "Khi gọi đến '%s':" #: core/ustring.cpp msgid "B" @@ -175,27 +175,23 @@ msgstr "Đổi Function Gọi Animation" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" -msgstr "Đổi nhiều thời gian khung hình" +msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Transition" -msgstr "Đổi Transition Animation" +msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Transform" -msgstr "Đổi Transform Animation" +msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Keyframe Value" -msgstr "Đổi giá trị khung hình" +msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Call" -msgstr "Đổi Function Gọi Animation" +msgstr "" #: editor/animation_track_editor.cpp msgid "Change Animation Length" @@ -224,11 +220,11 @@ msgstr "Theo dõi đường cong Bezier" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "Bản nhạc phát lại âm thanh" +msgstr "Kênh Âm Thanh" #: editor/animation_track_editor.cpp msgid "Animation Playback Track" -msgstr "Ngưng chạy animation. (S)" +msgstr "Kênh Hoạt Ảnh" #: editor/animation_track_editor.cpp msgid "Animation length (frames)" @@ -265,7 +261,7 @@ msgstr "Thay đổi đường dẫn Track" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." -msgstr "Bật hoặc tắt track này, on/off" +msgstr "Bật/tắt kênh này." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" @@ -285,7 +281,7 @@ msgstr "Bỏ track này." #: editor/animation_track_editor.cpp msgid "Time (s): " -msgstr "Bước: " +msgstr "Thời gian (s): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -407,7 +403,7 @@ msgstr "Sắp xếp lại Tracks" #: editor/animation_track_editor.cpp msgid "Transform tracks only apply to Spatial-based nodes." -msgstr "Các chuyển đổi chỉ có thể áp dụng cho các node Spatial" +msgstr "Các chuyển đổi chỉ có thể áp dụng cho các nút dựa trên kiểu Spatial." #: editor/animation_track_editor.cpp msgid "" @@ -432,7 +428,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" -msgstr "Không thể thêm track mới mà không có root." +msgstr "Không thể thêm track mới mà không có root" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" @@ -444,7 +440,7 @@ msgstr "Thêm Bezier Track" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "Đường dẫn không hợp lệ, không thể thêm khoá." +msgstr "Đường dẫn không hợp lệ, nên không thể thêm khóa." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" @@ -503,25 +499,21 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" -"Cáianimation này thuộc về một cảnh đã nhập, vì vậy những thay đổi đối với " -"các bản nhạc đã nhập sẽ không được lưu.\n" +"Hoạt ảnh này thuộc về một Cảnh được Nhập, nên các thay đổi lên track được " +"Nhập sẽ không được lưu lại.\n" "\n" -"Để bật khả năng thêm các bản nhạc tùy chỉnh, hãy điều hướng đến cài đặt nhập " -"của cảnh và đặt\n" -"\"animation > Lưu trữ\" thành \"Tệp\", bật \"Hoạt hình> Giữ các bản nhạc tùy " -"chỉnh\", sau đó nhập lại.(vn)\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", sau đó nhập lại (english).\n" -"Hoặc, sử dụng cài đặt trước nhập khẩu nhập hình ảnh động để tách các tệp." +"Để bật khả năng thêm track tùy ý, đi đến cài đặt của Cảnh được Nhập rồi đặt\n" +"\"Hoạt Ảnh > Lưu trữ\" thành \"Tệp\", bật \"Hoạt ảnh > Giữ các track tùy " +"chỉnh\", sau đó Nhập lại.\n" +"Hoặc, dùng một Cài đặt trước nhập để Nhập hoạt ảnh ra các tệp khác nhau." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" msgstr "Cảnh bảo: Chỉnh sửa hoạt ảnh đã nhập" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select an AnimationPlayer node to create and edit animations." -msgstr "Chọn một AnimationPlayer từ Scene Tree để chỉnh sửa animation." +msgstr "Chọn một AnimationPlayer để tạo và chỉnh sửa Hoạt Ảnh." #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -532,8 +524,9 @@ msgid "Group tracks by node or display them as plain list." msgstr "Nhóm các track bởi nút hoặc hiển thị chúng dạng danh sách đơn giản." #: editor/animation_track_editor.cpp +#, fuzzy msgid "Snap:" -msgstr "Chụp:" +msgstr "Dính:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -652,12 +645,11 @@ msgstr "Dọn dẹp" #: editor/animation_track_editor.cpp msgid "Scale Ratio:" -msgstr "Tỉ lệ Scale:" +msgstr "Tỉ lệ phóng đại:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Chọn các Track để sao chép:" +msgstr "Chọn các Track để sao chép" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -670,7 +662,7 @@ msgstr "Sao chép" #: editor/animation_track_editor.cpp msgid "Select All/None" -msgstr "Chọn tất cả/ hoặc không" +msgstr "Chọn/Bỏ tất cả" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -678,7 +670,7 @@ msgstr "Thêm Track Âm thanh" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "Thay đổi thời điểm bắt đầu phát track âm thanh." +msgstr "Thay đổi thời điểm bắt đầu phát track âm thanh" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" @@ -705,19 +697,16 @@ msgid "Line Number:" msgstr "Dòng số:" #: editor/code_editor.cpp -#, fuzzy msgid "%d replaced." -msgstr "Thay thế ..." +msgstr "Đã thay %d." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d match." -msgstr "Tìm thấy %d khớp." +msgstr "%d khớp." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d matches." -msgstr "Tìm thấy %d khớp." +msgstr "%d khớp." #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" @@ -737,7 +726,7 @@ msgstr "Thay thế tất cả" #: editor/code_editor.cpp msgid "Selection Only" -msgstr "Chỉ lựa chọn" +msgstr "Chỉ chọn" #: editor/code_editor.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/text_editor.cpp @@ -746,7 +735,7 @@ msgstr "Chuẩn" #: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" -msgstr "" +msgstr "Hiện/Ẩn bảng Tệp lệnh" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -762,7 +751,7 @@ msgstr "Thu nhỏ" #: editor/code_editor.cpp msgid "Reset Zoom" -msgstr "Đặt lại phóng" +msgstr "Đặt lại độ phóng" #: editor/code_editor.cpp msgid "Warnings" @@ -827,7 +816,7 @@ msgstr "Thêm đối số mở rộng:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "Mở rộng Đối số được gọi:" +msgstr "Đối số mở rộng được gọi:" #: editor/connections_dialog.cpp msgid "Receiver Method:" @@ -845,7 +834,7 @@ msgstr "Trì hoãn" msgid "" "Defers the signal, storing it in a queue and only firing it at idle time." msgstr "" -"Trì hoãn tín hiệu, lưu vào một hàng chờ và chỉ kích nó vào thời gian rãnh." +"Trì hoãn tín hiệu, lưu vào một hàng chờ và chỉ kích nó vào thời gian rảnh." #: editor/connections_dialog.cpp msgid "Oneshot" @@ -1048,11 +1037,12 @@ msgid "Owners Of:" msgstr "Sở hữu của:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "Gỡ bỏ các tệp đã chọn trong dự án? (Không thể khôi phục)" +msgstr "" +"Gỡ bỏ các tệp đã chọn trong dự án? (Không thể khôi phục)\n" +"Bạn có thể khôi phục chúng trong thùng rác của hệ thống." #: editor/dependency_editor.cpp msgid "" @@ -1061,6 +1051,9 @@ msgid "" "Remove them anyway? (no undo)\n" "You can find the removed files in the system trash to restore them." msgstr "" +"Các tài nguyên khác cần những tệp bị xóa này mới hoạt động được.\n" +"Vẫn xóa hả? (không hồi được đâu)\n" +"Bạn có thể khôi phục chúng trong thùng rác hệ thống." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1072,11 +1065,11 @@ msgstr "Lỗi tải nạp:" #: editor/dependency_editor.cpp msgid "Load failed due to missing dependencies:" -msgstr "" +msgstr "Tải thất bại do thiếu phần phụ thuộc:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "Luôn mở" +msgstr "Cứ mở thôi" #: editor/dependency_editor.cpp msgid "Which action should be taken?" @@ -1092,7 +1085,7 @@ msgstr "Lỗi tải nạp!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "Xoá vĩnh viễn các đối tượng %d? (Không thể hoàn lại!)" +msgstr "Xoá vĩnh viễn %d đối tượng? (Không thể hoàn lại!)" #: editor/dependency_editor.cpp msgid "Show Dependencies" @@ -1116,7 +1109,7 @@ msgstr "Sở hữu" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" -msgstr "" +msgstr "Tài nguyên không có quyền sở hữu rõ ràng:" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" @@ -1166,14 +1159,12 @@ msgid "Gold Sponsors" msgstr "Nhà tài trợ Vàng" #: editor/editor_about.cpp -#, fuzzy msgid "Silver Sponsors" -msgstr "Người ủng hộ Bạc" +msgstr "Nhà tài trợ Bạc" #: editor/editor_about.cpp -#, fuzzy msgid "Bronze Sponsors" -msgstr "Người ủng hộ Đồng" +msgstr "Nhà tài trợ Đồng" #: editor/editor_about.cpp msgid "Mini Sponsors" @@ -1197,15 +1188,13 @@ msgstr "Người ủng hộ" #: editor/editor_about.cpp msgid "License" -msgstr "Cấp phép" +msgstr "Giấy phép" #: editor/editor_about.cpp -#, fuzzy msgid "Third-party Licenses" -msgstr "Cấp phép nhóm thứ ba" +msgstr "Giấy phép bên thứ ba" #: editor/editor_about.cpp -#, fuzzy 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 " @@ -1230,27 +1219,24 @@ msgid "Licenses" msgstr "Các giấy phép" #: editor/editor_asset_installer.cpp editor/project_manager.cpp -#, fuzzy msgid "Error opening package file, not in ZIP format." -msgstr "Lỗi không thể mở gói, không phải dạng nén." +msgstr "Lỗi không thể mở gói, không phải dạng nén ZIP." #: editor/editor_asset_installer.cpp -#, fuzzy msgid "%s (Already Exists)" -msgstr "Tam giác đã tồn tại." +msgstr "%s (Đã tồn tại)" #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" -msgstr "Giải nén Assets" +msgstr "Giải nén tài nguyên" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "The following files failed extraction from package:" -msgstr "" +msgstr "Không thể lấy các tệp sau khỏi gói:" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "And %s more files." -msgstr "%d thêm các tệp tin" +msgstr "Và %s tệp nữa." #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package installed successfully!" @@ -1262,9 +1248,8 @@ msgid "Success!" msgstr "Thành công!" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Package Contents:" -msgstr "Nội dung:" +msgstr "Trong Gói có:" #: editor/editor_asset_installer.cpp editor/editor_node.cpp msgid "Install" @@ -1284,11 +1269,11 @@ msgstr "Thêm hiệu ứng" #: editor/editor_audio_buses.cpp msgid "Rename Audio Bus" -msgstr "" +msgstr "Đổi tên Bus âm thanh" #: editor/editor_audio_buses.cpp msgid "Change Audio Bus Volume" -msgstr "" +msgstr "Thay đổi âm lượng Bus" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" @@ -1296,7 +1281,7 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Mute" -msgstr "" +msgstr "Bật/Tắt Âm Thanh của Bus" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Bypass Effects" @@ -1308,19 +1293,19 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "" +msgstr "Thêm hiệu ứng vào Bus âm thanh" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "" +msgstr "Di chuyển hiệu ứng Bus" #: editor/editor_audio_buses.cpp msgid "Delete Bus Effect" -msgstr "" +msgstr "Xóa hiệu ứng của Bus" #: editor/editor_audio_buses.cpp msgid "Drag & drop to rearrange." -msgstr "" +msgstr "Kéo & thả để sắp xếp lại." #: editor/editor_audio_buses.cpp msgid "Solo" @@ -1336,12 +1321,12 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Bus options" -msgstr "" +msgstr "Tùy chọn Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "Nhân bản" +msgstr "Nhân đôi" #: editor/editor_audio_buses.cpp msgid "Reset Volume" @@ -1357,23 +1342,23 @@ msgstr "Âm thanh" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" -msgstr "" +msgstr "Thêm Bus âm thanh" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "Không thể xóa Bus âm thanh chủ!" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" -msgstr "" +msgstr "Xóa Bus âm thanh" #: editor/editor_audio_buses.cpp msgid "Duplicate Audio Bus" -msgstr "" +msgstr "Nhân bản Bus âm thanh" #: editor/editor_audio_buses.cpp msgid "Reset Bus Volume" -msgstr "" +msgstr "Đặt lại âm lượng Bus" #: editor/editor_audio_buses.cpp msgid "Move Audio Bus" @@ -1381,7 +1366,7 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As..." -msgstr "" +msgstr "Lưu bố cục Bus âm thanh thành..." #: editor/editor_audio_buses.cpp msgid "Location for New Layout..." @@ -1389,7 +1374,7 @@ msgstr "Vị trí cho Bố cục mới..." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Mở bố cục Bus âm thanh" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." @@ -1401,20 +1386,19 @@ msgstr "Bố trí" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." -msgstr "" +msgstr "Sai kiểu tệp, không phải bố cục bus âm thanh." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Error saving file: %s" -msgstr "Lỗi tải font." +msgstr "Lỗi lưu tệp: %s" #: editor/editor_audio_buses.cpp msgid "Add Bus" -msgstr "" +msgstr "Thêm Bus" #: editor/editor_audio_buses.cpp msgid "Add a new Audio Bus to this layout." -msgstr "" +msgstr "Thêm Bus âm thanh mới cho bố cục." #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1424,7 +1408,7 @@ msgstr "Nạp" #: editor/editor_audio_buses.cpp msgid "Load an existing Bus Layout." -msgstr "" +msgstr "Nạp một bố cục Bus có sẵn." #: editor/editor_audio_buses.cpp msgid "Save As" @@ -1432,7 +1416,7 @@ msgstr "Lưu thành" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "" +msgstr "Lưu bố cục Bus này vào tệp." #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" @@ -1440,11 +1424,11 @@ msgstr "Nạp mặc định" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "" +msgstr "Nạp bố cục Bus mặc định." #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." -msgstr "" +msgstr "Tạo bố cục Bus mới." #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1456,15 +1440,15 @@ msgstr "Ký tự hợp lệ:" #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing engine class name." -msgstr "" +msgstr "Không được trùng tên với một lớp có sẵn của công cụ lập trình." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing built-in type name." -msgstr "" +msgstr "Không được trùng với tên một kiểu có sẵn đã tồn tại." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing global constant name." -msgstr "" +msgstr "Không được trùng với tên một hằng số toàn cục đã tồn tại." #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." @@ -1476,7 +1460,7 @@ msgstr "Nạp tự động '%s' đã tồn tại!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "Đổi tên" +msgstr "Đổi tên Nạp tự động" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" @@ -1488,7 +1472,7 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" -msgstr "" +msgstr "Xóa Nạp tự động" #: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" @@ -1500,7 +1484,7 @@ msgstr "Sắp xếp lại Autoloads" #: editor/editor_autoload_settings.cpp msgid "Can't add autoload:" -msgstr "" +msgstr "Không thể thêm nạp tự động:" #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" @@ -1549,7 +1533,7 @@ msgstr "[rỗng]" #: editor/editor_data.cpp msgid "[unsaved]" -msgstr "[chưa save]" +msgstr "[chưa lưu]" #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first." @@ -1725,7 +1709,7 @@ msgstr "(Đã tắt trình chỉnh sửa)" #: editor/editor_feature_profile.cpp msgid "Class Options:" -msgstr "Tuỳ chọn lớp:" +msgstr "Tuỳ chọn Lớp:" #: editor/editor_feature_profile.cpp msgid "Enable Contextual Editor" @@ -1748,11 +1732,10 @@ msgid "File '%s' format is invalid, import aborted." msgstr "Tệp '%s' định dạng không hợp lệ, huỷ nhập vào." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." -msgstr "Hồ sơ '%s' đã tồn tại. Di chuyển hồ sơ trước khi nhập, huỷ nhập." +msgstr "Hồ sơ '%s' đã tồn tại. Hãy xóa hồ sơ đấy trước khi nhập, đã dừng nhập." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." @@ -1763,9 +1746,8 @@ msgid "Unset" msgstr "Bỏ đặt" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Hồ sơ hiện tại" +msgstr "Hồ sơ hiện tại:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1780,16 +1762,15 @@ msgstr "Mới" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "Nhập vào" +msgstr "Nhập" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" msgstr "Xuất ra" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Hồ sơ khả dụng" +msgstr "Hồ sơ khả dụng:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1856,7 +1837,7 @@ msgstr "Làm mới" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" -msgstr "" +msgstr "Đã nhận diện hết" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Files (*)" @@ -1919,39 +1900,35 @@ msgstr "Tập trung Đường dẫn" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" -msgstr "Di chuyển Ưa thích lên" +msgstr "Di chuyển mục Ưa thích lên" #: editor/editor_file_dialog.cpp msgid "Move Favorite Down" -msgstr "Di chuyển Ưa thích xuống" +msgstr "Di chuyển mục Ưa thích xuống" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to previous folder." -msgstr "Đến thư mục cha" +msgstr "Quay lại thư mục trước." #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to next folder." -msgstr "Đến thư mục cha" +msgstr "Đến thư mục tiếp theo." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." -msgstr "Đến thư mục cha" +msgstr "Đến thư mục mẹ." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Refresh files." -msgstr "Tìm kiếm tệp tin" +msgstr "Làm mới các tệp." #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Bỏ yêu thích thư mục hiện tại." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Toggle the visibility of hidden files." -msgstr "Bật tắt hiện các tệp tin ẩn." +msgstr "Hiện/ẩn các tệp ẩn." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." @@ -1984,10 +1961,12 @@ msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" +"Có nhiều trình nhập cho nhiều loại khác nhau cùng chỉ đến tệp %s, đã ngừng " +"nhập" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" -msgstr "" +msgstr "Nhập lại tài nguyên" #: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Top" @@ -2007,28 +1986,24 @@ msgid "Inherited by:" msgstr "Được thừa kế bởi:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "Mô tả:" +msgstr "Mô tả" #: editor/editor_help.cpp -#, fuzzy msgid "Online Tutorials" -msgstr "Hướng dẫn trực tuyến:" +msgstr "Hướng dẫn trực tuyến" #: editor/editor_help.cpp msgid "Properties" msgstr "Thuộc tính" #: editor/editor_help.cpp -#, fuzzy msgid "override:" -msgstr "Ghi đè" +msgstr "Ghi đè:" #: editor/editor_help.cpp -#, fuzzy msgid "default:" -msgstr "Mặc định" +msgstr "mặc định:" #: editor/editor_help.cpp msgid "Methods" @@ -2036,7 +2011,7 @@ msgstr "Hàm" #: editor/editor_help.cpp msgid "Theme Properties" -msgstr "" +msgstr "Cài đặt Tông màu" #: editor/editor_help.cpp msgid "Enumerations" @@ -2044,23 +2019,23 @@ msgstr "" #: editor/editor_help.cpp msgid "Constants" -msgstr "" +msgstr "Hằng số" #: editor/editor_help.cpp -#, fuzzy msgid "Property Descriptions" -msgstr "Mô tả ngắn gọn:" +msgstr "Mô tả thuộc tính" #: editor/editor_help.cpp -#, fuzzy msgid "(value)" -msgstr "Giá trị:" +msgstr "(giá trị)" #: 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 "" +"Hiện thuộc tính này chưa được mô tả. Các bạn [color=$color][url=$url]đóng " +"góp[/url][/color] giúp chúng mình nha!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2071,21 +2046,21 @@ msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Hiện phương thức này chưa được mô tả. Các bạn [color=$color][url=$url]đóng " +"góp[/url][/color] giúp chúng mình nha!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp msgid "Search Help" -msgstr "Tìm sự giúp đỡ" +msgstr "Tìm trợ giúp" #: editor/editor_help_search.cpp -#, fuzzy msgid "Case Sensitive" -msgstr "Đóng Cảnh" +msgstr "Phân biệt hoa thường" #: editor/editor_help_search.cpp -#, fuzzy msgid "Show Hierarchy" -msgstr "Tìm kiếm" +msgstr "Hiện cấp bậc" #: editor/editor_help_search.cpp msgid "Display All" @@ -2093,27 +2068,28 @@ msgstr "Hiển thị tất cả" #: editor/editor_help_search.cpp msgid "Classes Only" -msgstr "Chỉ các Lớp" +msgstr "Chỉ tìm Lớp" #: editor/editor_help_search.cpp msgid "Methods Only" -msgstr "Chỉ các Hàm" +msgstr "Chỉ tìm Hàm" #: editor/editor_help_search.cpp msgid "Signals Only" -msgstr "Chỉ các Tín hiệu" +msgstr "Chỉ tìm Tín hiệu" #: editor/editor_help_search.cpp msgid "Constants Only" -msgstr "Chỉ các Định nghĩa" +msgstr "Chỉ tìm Hằng số" #: editor/editor_help_search.cpp msgid "Properties Only" -msgstr "Chỉ các Thuộc tính" +msgstr "Chỉ tìm Thuộc tính" #: editor/editor_help_search.cpp +#, fuzzy msgid "Theme Properties Only" -msgstr "" +msgstr "Chỉ tìm thuộc tính Tông màu" #: editor/editor_help_search.cpp msgid "Member Type" @@ -2124,28 +2100,25 @@ msgid "Class" msgstr "Lớp" #: editor/editor_help_search.cpp -#, fuzzy msgid "Method" msgstr "Hàm" #: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Signal" msgstr "Tín hiệu" #: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constant" -msgstr "Cố định" +msgstr "Hằng số" #: editor/editor_help_search.cpp -#, fuzzy msgid "Property" -msgstr "Thuộc tính:" +msgstr "Thuộc tính" #: editor/editor_help_search.cpp #, fuzzy msgid "Theme Property" -msgstr "Thuộc tính:" +msgstr "Thuộc tính Tông màu" #: editor/editor_inspector.cpp editor/project_settings_editor.cpp msgid "Property:" @@ -2193,16 +2166,15 @@ msgstr "Bắt đầu" #: editor/editor_network_profiler.cpp msgid "%s/s" -msgstr "" +msgstr "%s/s" #: editor/editor_network_profiler.cpp -#, fuzzy msgid "Down" -msgstr "Tải" +msgstr "Xuống" #: editor/editor_network_profiler.cpp msgid "Up" -msgstr "" +msgstr "Lên" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" @@ -2210,23 +2182,23 @@ msgstr "Nút" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" -msgstr "" +msgstr "RPC đến" #: editor/editor_network_profiler.cpp msgid "Incoming RSET" -msgstr "" +msgstr "RSET đến" #: editor/editor_network_profiler.cpp msgid "Outgoing RPC" -msgstr "" +msgstr "RPC đi" #: editor/editor_network_profiler.cpp msgid "Outgoing RSET" -msgstr "" +msgstr "RSET đi" #: editor/editor_node.cpp editor/project_manager.cpp msgid "New Window" -msgstr "" +msgstr "Cửa sổ mới" #: editor/editor_node.cpp msgid "Imported resources can't be saved." @@ -2235,19 +2207,19 @@ msgstr "Tài nguyên đã nhập không thể lưu." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp msgid "OK" -msgstr "" +msgstr "OK" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Error saving resource!" -msgstr "" +msgstr "Lỗi lưu tài nguyên!" #: 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 "" -"Tài nguyên này không thể lưu vì nó không thuộc cảnh đã chỉnh sửa. Tạo nó là " -"duy nhất." +"Không thể lưu tài nguyên này vì nó không thuộc cảnh đã chỉnh sửa. Làm nó độc " +"nhất đã." #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As..." @@ -2275,11 +2247,11 @@ msgstr "Lỗi khi đang phân tích '%s'." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "Tệp kết thúc bất ngờ '%s'." #: editor/editor_node.cpp msgid "Missing '%s' or its dependencies." -msgstr "" +msgstr "Thiếu '%s' hoặc các phần phụ thuộc." #: editor/editor_node.cpp msgid "Error while loading '%s'." @@ -2299,15 +2271,15 @@ msgstr "Tạo hình thu nhỏ" #: editor/editor_node.cpp msgid "This operation can't be done without a tree root." -msgstr "Hoạt động không thể hoàn tất khi không có nút gốc." +msgstr "Hành động không thể hoàn thành mà không có nút gốc." #: 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 "" -"Cảnh này không thể lưu vì đây bao một trường hợp theo chu kỳ.\n" -"Giải quyết nó và cố gắng lưu lại." +"Không thể lưu cảnh này vì bạn đang instancing chồng chéo nối vòng nhau.\n" +"Giải quyết vòng nối đã rồi hãy thử lưu lại sau." #: editor/editor_node.cpp msgid "" @@ -2323,15 +2295,15 @@ msgstr "Không thể ghi đè cảnh vẫn đang mở!" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "" +msgstr "Không thể nạp MeshLibrary để sáp nhập!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "" +msgstr "Lỗi lưu MeshLibrary!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" -msgstr "" +msgstr "Không thể tải TileSet để sáp nhập!" #: editor/editor_node.cpp msgid "Error saving TileSet!" @@ -2342,6 +2314,8 @@ msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" +"Có lỗi khi đang lưu bố cục trình chỉnh sửa.\n" +"Hãy thử kiểm tra quyền ghi lên đường dẫn dữ liệu của người dùng xem." #: editor/editor_node.cpp msgid "" @@ -2349,15 +2323,17 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" +"Bố cục mặc định của trình chỉnh sửa đã bị ghi đè.\n" +"Để hồi lại bố cục mặc định về cài đặt gốc, sử dụng tùy chọn \"Xóa bố cục\" " +"rồi xóa bố cục \"Mặc định\"." #: editor/editor_node.cpp msgid "Layout name not found!" -msgstr "Tên bố cục không tìm thấy!" +msgstr "Không tìm thấy tên bố cục!" #: editor/editor_node.cpp -#, fuzzy msgid "Restored the Default layout to its base settings." -msgstr "Đã khôi phục bố cục mặc định cho các thiết lập." +msgstr "Đã khôi phục bố cục mặc định về thiết lập gốc." #: editor/editor_node.cpp msgid "" @@ -2365,8 +2341,8 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" -"Tài nguyên thuộc về cảnh đã nhập, nó không thể chỉnh sửa.\n" -"Đọc tài liệu liên quan để cách nhập Cảnh để hiểu rõ quy trình việc này." +"Tài nguyên thuộc về cảnh đã nhập, nên không thể sửa được.\n" +"Hãy đọc hướng dẫn về cách nhập Cảnh để hiểu thêm về quy trình này." #: editor/editor_node.cpp msgid "" @@ -2381,8 +2357,8 @@ msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" -"Tài nguyên đã được nhập vào, không thể chỉnh sửa. Thay đổi cài đặt của nó " -"trong bảng Nhập vào, sau đó nhập vào lại." +"Tài nguyên này được nhập, nên không thể chỉnh sửa. Thay đổi cài đặt của nó " +"trong bảng Nhập, sau đó Nhập lại." #: editor/editor_node.cpp msgid "" @@ -2391,10 +2367,9 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" -"Cảnh này đã được nhập vào, những thay đổi sẽ không được giữ lại.\n" -"Tạo thực thể nó hoặc kế thừa sẽ cho phép thực hiện các thay đổi.\n" -"Đọc tài liệu tài liệu liên quan đến nhập Cảnh để hiểu rõ về quy trình việc " -"này." +"Do Cảnh này được nhập, nên những thay đổi sẽ không được giữ lại.\n" +"Thực hiện khởi tạo đối tượng hoặc kế thừa sẽ cho phép việc chỉnh sửa.\n" +"Hãy đọc hướng dẫn liên quan đến nhập Cảnh để hiểu thêm về quy trình này." #: editor/editor_node.cpp msgid "" @@ -2411,19 +2386,19 @@ msgstr "Không có cảnh được xác định để chạy." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "Lưu cảnh trước khi chạy..." #: editor/editor_node.cpp msgid "Could not start subprocess!" -msgstr "Không thể bắt đầu quá trình nhỏ!" +msgstr "Không thể bắt đầu quá trình phụ!" #: editor/editor_node.cpp editor/filesystem_dock.cpp msgid "Open Scene" -msgstr "Mở Scene" +msgstr "Mở Cảnh" #: editor/editor_node.cpp msgid "Open Base Scene" -msgstr "Mở Scene Mẫu" +msgstr "Mở Cảnh cơ sở" #: editor/editor_node.cpp msgid "Quick Open..." @@ -2431,11 +2406,11 @@ msgstr "Mở nhanh ..." #: editor/editor_node.cpp msgid "Quick Open Scene..." -msgstr "Mở Scene nhanh..." +msgstr "Mở Nhanh Cảnh..." #: editor/editor_node.cpp msgid "Quick Open Script..." -msgstr "Mở Script nhanh..." +msgstr "Mở Nhanh Tệp lệnh..." #: editor/editor_node.cpp msgid "Save & Close" @@ -2455,11 +2430,11 @@ msgstr "Yêu cầu một nút gốc khi lưu cảnh." #: editor/editor_node.cpp msgid "Save Scene As..." -msgstr "Lưu Scene với tên..." +msgstr "Lưu Cảnh thành..." #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "This operation can't be done without a scene." -msgstr "Thao tác này phải có scene mới làm được." +msgstr "Thao tác này phải có Cảnh mới làm được." #: editor/editor_node.cpp msgid "Export Mesh Library" @@ -2479,26 +2454,27 @@ msgstr "Thao tác này phải có node được chọn mới làm được." #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" -msgstr "Scene hiện tại chưa save. Kệ mở luôn?" +msgstr "Cảnh hiện tại chưa lưu. Kệ mở luôn?" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "Không thể nạp một cảnh mà chưa lưu bao giờ." +msgstr "Không thể nạp một cảnh chưa lưu bao giờ." #: editor/editor_node.cpp -#, fuzzy msgid "Reload Saved Scene" -msgstr "Lưu Cảnh" +msgstr "Tải lại Cảnh đã lưu" #: editor/editor_node.cpp msgid "" "The current scene has unsaved changes.\n" "Reload the saved scene anyway? This action cannot be undone." msgstr "" +"Cảnh hiện tại có thay đổi chưa được lưu.\n" +"Vẫn tải lại à? Không hoàn tác được đâu." #: editor/editor_node.cpp msgid "Quick Run Scene..." -msgstr "Chạy Scene nhanh..." +msgstr "Chạy nhanh Cảnh..." #: editor/editor_node.cpp msgid "Quit" @@ -2545,9 +2521,8 @@ msgid "Close Scene" msgstr "Đóng Cảnh" #: editor/editor_node.cpp -#, fuzzy msgid "Reopen Closed Scene" -msgstr "Đóng Cảnh" +msgstr "Mở lại Cảnh đã đóng" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." @@ -2676,7 +2651,7 @@ msgstr "Chuyển Tab cảnh" #: editor/editor_node.cpp msgid "%d more files or folders" -msgstr "%d thêm các tệp hoặc thư mục." +msgstr "%d tệp hoặc thư mục nữa" #: editor/editor_node.cpp msgid "%d more folders" @@ -2692,11 +2667,11 @@ msgstr "Vị trí Dock" #: editor/editor_node.cpp msgid "Distraction Free Mode" -msgstr "" +msgstr "Chế độ tập trung" #: editor/editor_node.cpp msgid "Toggle distraction-free mode." -msgstr "" +msgstr "Bật tắt chế độ tập trung." #: editor/editor_node.cpp msgid "Add a new scene." @@ -2753,7 +2728,7 @@ msgstr "Lưu Cảnh" #: editor/editor_node.cpp msgid "Save All Scenes" -msgstr "Lưu tất cả Cảnh" +msgstr "Lưu hết các Cảnh" #: editor/editor_node.cpp msgid "Convert To..." @@ -2761,11 +2736,11 @@ msgstr "Chuyển đổi ..." #: editor/editor_node.cpp msgid "MeshLibrary..." -msgstr "" +msgstr "MeshLibrary..." #: editor/editor_node.cpp msgid "TileSet..." -msgstr "" +msgstr "TileSet..." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -2788,7 +2763,7 @@ msgstr "Dự Án" #: editor/editor_node.cpp msgid "Project Settings..." -msgstr "Cài đặt Dự Án" +msgstr "Cài đặt Dự Án..." #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -2796,21 +2771,19 @@ msgstr "Theo dõi phiên bản" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" -msgstr "" +msgstr "Cài đặt trình điều khiển phiên bản" #: editor/editor_node.cpp msgid "Shut Down Version Control" -msgstr "" +msgstr "Tắt trình điều khiển phiên bản" #: editor/editor_node.cpp -#, fuzzy msgid "Export..." -msgstr "Xuất ra" +msgstr "Xuất..." #: editor/editor_node.cpp -#, fuzzy msgid "Install Android Build Template..." -msgstr "Cài đặt mẫu xây dựng Android" +msgstr "Cài đặt mẫu xây dựng Android..." #: editor/editor_node.cpp msgid "Open Project Data Folder" @@ -2870,13 +2843,15 @@ msgstr "" #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "" +msgstr "Các khối va chạm thấy được" #: 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 "" +"Khi bật tùy chọn này, các khối va chạm và nút chiếu tia (2D và 3D) sẽ được " +"hiển thị trong dự án đang chạy." #: editor/editor_node.cpp msgid "Visible Navigation" @@ -2887,10 +2862,12 @@ msgid "" "When this option is enabled, navigation meshes and polygons will be visible " "in the running project." msgstr "" +"Khi bật tùy chọn này, các lưới/đa giác điều hướng sẽ hiển thị trong dự án " +"đang chạy." #: editor/editor_node.cpp msgid "Synchronize Scene Changes" -msgstr "" +msgstr "Đồng bộ hóa các thay đổi lên Cảnh" #: editor/editor_node.cpp msgid "" @@ -2902,7 +2879,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Synchronize Script Changes" -msgstr "" +msgstr "Đồng bộ hóa thay đổi trong Tệp lệnh" #: editor/editor_node.cpp msgid "" @@ -2917,9 +2894,8 @@ msgid "Editor" msgstr "Editor (trình biên tập)" #: editor/editor_node.cpp -#, fuzzy msgid "Editor Settings..." -msgstr "Cài đặt Trình biên tập" +msgstr "Cài đặt Trình biên tập..." #: editor/editor_node.cpp msgid "Editor Layout" @@ -2927,12 +2903,12 @@ msgstr "Cài đặt Bố cục" #: editor/editor_node.cpp msgid "Take Screenshot" -msgstr "" +msgstr "Chụp màn hình" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Mở thư mục dữ liệu Trình biên tập" +msgstr "" +"Ảnh chụp màn hình được lưu ở thư mục Dữ liệu/Cài đặt của trình biên tập." #: editor/editor_node.cpp msgid "Toggle Fullscreen" @@ -2949,16 +2925,15 @@ msgstr "Mở thư mục dữ liệu Trình biên tập" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "" +msgstr "Mở thư mục dữ liệu Trình biên tập" #: editor/editor_node.cpp msgid "Open Editor Settings Folder" -msgstr "" +msgstr "Mở thư mục Thiết lập Trình biên tập" #: editor/editor_node.cpp -#, fuzzy msgid "Manage Editor Features..." -msgstr "Quản lý tính năng Trình biên tập" +msgstr "Quản lý tính năng Trình biên tập..." #: editor/editor_node.cpp msgid "Manage Export Templates..." @@ -2983,7 +2958,7 @@ msgstr "Báo lỗi" #: editor/editor_node.cpp msgid "Send Docs Feedback" -msgstr "" +msgstr "Gửi ý kiến phản hồi về hướng dẫn" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3040,7 +3015,7 @@ msgstr "Lưu & Khởi động lại" #: editor/editor_node.cpp msgid "Spins when the editor window redraws." -msgstr "" +msgstr "Xoay khi cửa sổ trình biên soạn được vẽ lại." #: editor/editor_node.cpp msgid "Update Continuously" @@ -3052,11 +3027,11 @@ msgstr "Cập nhật khi có thay đổi" #: editor/editor_node.cpp msgid "Hide Update Spinner" -msgstr "" +msgstr "Ẩn cái xoay xoay cập nhật" #: editor/editor_node.cpp msgid "FileSystem" -msgstr "" +msgstr "Hệ thống tệp tin" #: editor/editor_node.cpp msgid "Inspector" @@ -3125,7 +3100,7 @@ msgstr "Xuất thư viện ra" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "" +msgstr "Hợp nhất với Hiện có" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3171,7 +3146,7 @@ msgstr "Mở Trình biên tập 3D" #: editor/editor_node.cpp msgid "Open Script Editor" -msgstr "Mở Trình biên tập Mã lệnh" +msgstr "Mở Trình biên soạn Mã lệnh" #: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" @@ -3179,11 +3154,11 @@ msgstr "Mở Thư viện Nguyên liệu" #: editor/editor_node.cpp msgid "Open the next Editor" -msgstr "" +msgstr "Mở Trình biên soạn tiếp theo" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "" +msgstr "Mở Trình biên soạn trước đó" #: editor/editor_node.h msgid "Warning!" @@ -3191,15 +3166,15 @@ msgstr "Cảnh báo!" #: editor/editor_path.cpp msgid "No sub-resources found." -msgstr "" +msgstr "Không tìm thấy tài nguyên phụ." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" -msgstr "" +msgstr "Tạo bản xem trước lưới" #: editor/editor_plugin.cpp msgid "Thumbnail..." -msgstr "" +msgstr "Ảnh thu nhỏ..." #: editor/editor_plugin_settings.cpp msgid "Main Script:" @@ -3207,11 +3182,11 @@ msgstr "Mã lệnh chính:" #: editor/editor_plugin_settings.cpp msgid "Edit Plugin" -msgstr "" +msgstr "Chỉnh phần mềm bổ trợ" #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" -msgstr "" +msgstr "Các phần mềm bổ trợ đã cài:" #: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp msgid "Update" @@ -3240,23 +3215,24 @@ msgstr "Đo đạc:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "" +msgstr "Thời gian khung hình (giây)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" msgstr "Thời gian trung bình (giây)" #: editor/editor_profiler.cpp +#, fuzzy msgid "Frame %" -msgstr "" +msgstr "Khung hình %" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "" +msgstr "Khung hình Vật lý %" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "Bao gồm" #: editor/editor_profiler.cpp msgid "Self" @@ -3264,28 +3240,28 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Frame #:" -msgstr "" +msgstr "Khung hình #:" #: editor/editor_profiler.cpp msgid "Time" -msgstr "" +msgstr "Thời gian" #: editor/editor_profiler.cpp msgid "Calls" msgstr "" #: editor/editor_properties.cpp -#, fuzzy msgid "Edit Text:" -msgstr "Lưu Theme" +msgstr "Sửa văn bản:" #: editor/editor_properties.cpp editor/script_create_dialog.cpp +#, fuzzy msgid "On" -msgstr "" +msgstr "Bật" #: editor/editor_properties.cpp msgid "Layer" -msgstr "" +msgstr "Lớp" #: editor/editor_properties.cpp msgid "Bit %d, value %d" @@ -3297,24 +3273,26 @@ msgstr "[Rỗng]" #: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp msgid "Assign..." -msgstr "" +msgstr "Gán..." #: editor/editor_properties.cpp -#, fuzzy msgid "Invalid RID" -msgstr "Đường dẫn sai." +msgstr "Số RID không hợp lệ" #: editor/editor_properties.cpp msgid "" "The selected resource (%s) does not match any type expected for this " "property (%s)." msgstr "" +"Kiểu của tài nguyên đã chọn (%s) không dùng được cho thuộc tính này (%s)." #: 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 "" +"Không thể tạo ViewportTexture trên các tài nguyên được lưu dưới dạng tệp.\n" +"Tài nguyên phải thuộc về một cảnh." #: editor/editor_properties.cpp msgid "" @@ -3326,7 +3304,7 @@ msgstr "" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Pick a Viewport" -msgstr "" +msgstr "Chọn cổng xem" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "New Script" @@ -3361,11 +3339,11 @@ msgstr "Dán" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Convert To %s" -msgstr "" +msgstr "Chuyển thành %s" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Selected node is not a Viewport!" -msgstr "" +msgstr "Nút được chọn không phải Cổng xem!" #: editor/editor_properties_array_dict.cpp msgid "Size: " @@ -3405,27 +3383,27 @@ msgstr "Ghi logic của bạn trong hàm _run()." #: editor/editor_run_script.cpp msgid "There is an edited scene already." -msgstr "" +msgstr "Đã có một cảnh được chỉnh sửa." #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "" +msgstr "Không thể tạo tệp lệnh:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" -msgstr "" +msgstr "Bạn quên từ khóa 'tool' à?" #: editor/editor_run_script.cpp msgid "Couldn't run script:" -msgstr "" +msgstr "Không thể chạy tệp lệnh:" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" -msgstr "" +msgstr "Bạn quên phương thức '_run' à?" #: editor/editor_spin_slider.cpp msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes." -msgstr "" +msgstr "Giữ Ctrl để làm tròn về số nguyên. Giữ Shift để sửa tỉ mỉ hơn." #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -3474,8 +3452,9 @@ msgid "(Current)" msgstr "(Hiện tại)" #: editor/export_template_manager.cpp +#, fuzzy msgid "Retrieving mirrors, please wait..." -msgstr "" +msgstr "Đang tìm các trang mirror, đợi xíu..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -3503,21 +3482,24 @@ msgstr "Trích xuất các Mẫu xuất bản" #: editor/export_template_manager.cpp msgid "Importing:" -msgstr "" +msgstr "Đang Nhập:" #: editor/export_template_manager.cpp msgid "Error getting the list of mirrors." -msgstr "" +msgstr "Có lỗi khi lấy các trang mirror." #: editor/export_template_manager.cpp +#, fuzzy msgid "Error parsing JSON of mirror list. Please report this issue!" -msgstr "" +msgstr "Có lỗi khi phân tích JSON của danh sách trang mirror. Hãy báo cáo lỗi!" #: editor/export_template_manager.cpp msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"Không tìm thấy liên kết để tải phiên bản này. Chỉ có thể tải trực tiếp các " +"bản chính thức." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3565,13 +3547,12 @@ msgstr "" "Các lưu trữ mẫu xuất bản có vấn đề có thể được tìm thấy tại '%s'." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting URL:" -msgstr "Lỗi khi yêu cầu đường dẫn: " +msgstr "Lỗi khi yêu cầu đường dẫn:" #: editor/export_template_manager.cpp msgid "Connecting to Mirror..." -msgstr "" +msgstr "Đang kết nối tới trang Mirror..." #: editor/export_template_manager.cpp msgid "Disconnected" @@ -3617,7 +3598,7 @@ msgstr "Lỗi SSL Handshake" #: editor/export_template_manager.cpp msgid "Uncompressing Android Build Sources" -msgstr "" +msgstr "Giải nén nguồn xây dựng Android" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -3645,25 +3626,32 @@ msgid "Godot Export Templates" msgstr "Các mẫu xuất bản Godot" #: editor/export_template_manager.cpp +#, fuzzy msgid "Export Template Manager" -msgstr "" +msgstr "Trình quản lý Mẫu Xuất" #: editor/export_template_manager.cpp msgid "Download Templates" msgstr "Tải Xuống Các Mẫu Xuất Bản" #: editor/export_template_manager.cpp +#, fuzzy msgid "Select mirror from list: (Shift+Click: Open in Browser)" -msgstr "" +msgstr "Chọn trang mirror từ danh sách: (Shift+Nhấp: Mở trong trình duyệt)" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Favorites" -msgstr "Ưa thích:" +msgstr "Ưa thích" #: editor/filesystem_dock.cpp msgid "Status: Import of file failed. Please fix file and reimport manually." msgstr "" +"Trạng thái: Nhập tệp thất bại. Hãy sửa tệp rồi nhập lại theo cách thủ công." + +#: 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." @@ -3710,6 +3698,11 @@ msgid "" "\n" "Do you wish to overwrite them?" msgstr "" +"Các tệp hoặc thư mục sau xung đột với các mục ở vị trí đích '%s':\n" +"\n" +"%s\n" +"\n" +"Bạn có muốn ghi đè không?" #: editor/filesystem_dock.cpp msgid "Renaming file:" @@ -3765,9 +3758,8 @@ msgid "Move To..." msgstr "Di chuyển đến..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Scene..." -msgstr "Tạo Cảnh Mới" +msgstr "Tạo Cảnh Mới..." #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "New Script..." @@ -3965,7 +3957,7 @@ msgstr "Các nút trong Nhóm" #: editor/groups_editor.cpp msgid "Empty groups will be automatically removed." -msgstr "" +msgstr "Các nhóm trống sẽ tự động bị xóa." #: editor/groups_editor.cpp #, fuzzy @@ -4019,39 +4011,42 @@ msgstr "" #: editor/import/resource_importer_scene.cpp #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Import Scene" -msgstr "" +msgstr "Nhập cảnh" #: editor/import/resource_importer_scene.cpp msgid "Importing Scene..." -msgstr "" +msgstr "Đang nhập cảnh ..." #: editor/import/resource_importer_scene.cpp msgid "Generating Lightmaps" msgstr "" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Generating for Mesh: " -msgstr "" +msgstr "Tạo cho lưới: " #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Running Custom Script..." -msgstr "" +msgstr "Chạy Tập lệnh Tự chọn ..." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" -msgstr "" +msgstr "Không thể tải tệp lệnh sau nhập:" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" -msgstr "" +msgstr "Tập lệnh sau nhập không hợp lệ/hỏng (hãy xem bảng điều khiển):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" -msgstr "" +msgstr "Lỗi khi chạy tập lệnh sau nhập:" #: editor/import/resource_importer_scene.cpp msgid "Did you return a Node-derived object in the `post_import()` method?" msgstr "" +"Bạn có trả về một vật kế thừa Nút trong phương thức 'post_import' không đấy?" #: editor/import/resource_importer_scene.cpp msgid "Saving..." @@ -4063,9 +4058,8 @@ msgid "Select Importer" msgstr "Chế độ chọn" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Importer:" -msgstr "Nhập vào" +msgstr "Công cụ nhập:" #: editor/import_defaults_editor.cpp #, fuzzy @@ -4073,9 +4067,12 @@ msgid "Reset to Defaults" msgstr "Nạp mặc định" #: editor/import_dock.cpp -#, fuzzy +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" -msgstr " Tệp tin" +msgstr "%d Tệp" #: editor/import_dock.cpp msgid "Set as Default for '%s'" @@ -4090,9 +4087,8 @@ msgid "Import As:" msgstr "Nhập vào với:" #: editor/import_dock.cpp -#, fuzzy msgid "Preset" -msgstr "Cài sẵn ..." +msgstr "Cài sẵn" #: editor/import_dock.cpp msgid "Reimport" @@ -4105,16 +4101,18 @@ msgstr "Lưu các cảnh, nhập vào lại và khởi động lại" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." -msgstr "" +msgstr "Sửa kiểu của tệp đã nhập yêu cầu khởi động lại trình biên soạn." #: editor/import_dock.cpp msgid "" "WARNING: Assets exist that use this resource, they may stop loading properly." msgstr "" +"CẢNH BÁO: Có tài nguyên khác sử dụng tài nguyên này, chúng có thể gặp trục " +"trặc khi nạp đấy." #: editor/inspector_dock.cpp msgid "Failed to load resource." -msgstr "" +msgstr "Nạp tài nguyên thất bại." #: editor/inspector_dock.cpp msgid "Expand All Properties" @@ -4147,19 +4145,21 @@ msgstr "" #: editor/inspector_dock.cpp msgid "Make Sub-Resources Unique" -msgstr "" +msgstr "Biến tài nguyên phụ thành độc nhất" #: editor/inspector_dock.cpp msgid "Open in Help" msgstr "Mở trong Trợ giúp" #: editor/inspector_dock.cpp +#, fuzzy msgid "Create a new resource in memory and edit it." -msgstr "" +msgstr "Tạo tài nguyên mới trong bộ nhớ rồi chỉnh sửa." #: editor/inspector_dock.cpp +#, fuzzy msgid "Load an existing resource from disk and edit it." -msgstr "" +msgstr "Tải tài nguyên có sẵn trong đĩa rồi chỉnh sửa." #: editor/inspector_dock.cpp msgid "Save the currently edited resource." @@ -4167,15 +4167,15 @@ msgstr "Lưu tài nguyên đã chỉnh sửa hiện tại." #: editor/inspector_dock.cpp msgid "Go to the previous edited object in history." -msgstr "" +msgstr "Đi tới đối tượng mới chỉnh sửa trước đó trong lịch sử." #: editor/inspector_dock.cpp msgid "Go to the next edited object in history." -msgstr "" +msgstr "Đi đến đối tượng được chỉnh sửa liền sau trong lịch sử." #: editor/inspector_dock.cpp msgid "History of recently edited objects." -msgstr "" +msgstr "Lịch sử các đối tượng được chỉnh sửa gần đây." #: editor/inspector_dock.cpp msgid "Object properties." @@ -4199,7 +4199,7 @@ msgstr "Chọn nút duy nhất để chỉnh sửa tính hiệu và nhóm của #: editor/plugin_config_dialog.cpp msgid "Edit a Plugin" -msgstr "" +msgstr "Chỉnh phần mềm bổ trợ" #: editor/plugin_config_dialog.cpp #, fuzzy @@ -4208,7 +4208,7 @@ msgstr "Tạo & Sửa" #: editor/plugin_config_dialog.cpp msgid "Plugin Name:" -msgstr "" +msgstr "Tên phần mềm bổ trợ:" #: editor/plugin_config_dialog.cpp msgid "Subfolder:" @@ -4266,7 +4266,7 @@ msgstr "Sửa Polygon (Gỡ điểm)" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Remove Polygon And Point" -msgstr "" +msgstr "Xóa đa giác và điểm" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4316,7 +4316,7 @@ msgstr "Thêm điểm Hoạt ảnh" #: editor/plugins/animation_blend_space_1d_editor.cpp msgid "Remove BlendSpace1D Point" -msgstr "" +msgstr "Xóa điểm BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp msgid "Move BlendSpace1D Node Point" @@ -4343,8 +4343,9 @@ msgstr "" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp +#, fuzzy msgid "Enable snap and show grid." -msgstr "Kích hoạt Snap và hiện Grid." +msgstr "Bật Dính và hiện lưới." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4355,7 +4356,7 @@ msgstr "Điểm" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Open Editor" -msgstr "" +msgstr "Mở Trình biên soạn" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4384,7 +4385,7 @@ msgstr "Đổi Thời gian Chuyển Animation" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Remove BlendSpace2D Point" -msgstr "" +msgstr "Xóa điểm BlendSpace2D" #: editor/plugins/animation_blend_space_2d_editor.cpp #, fuzzy @@ -4406,11 +4407,11 @@ msgstr "Bật tắt Ưa thích" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Create triangles by connecting points." -msgstr "" +msgstr "Nối các điểm để tạo tam giác." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Erase points and triangles." -msgstr "" +msgstr "Xóa tam giác và các điểm." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Generate blend triangles automatically (instead of manually)" @@ -4496,19 +4497,16 @@ msgstr "" "Trính phát hoạt ảnh không có đường dẫn nút Gốc, không thể truy xuất tên." #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Anim Clips" -msgstr "Âm thanh:" +msgstr "Các đoạn hoạt ảnh" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Audio Clips" -msgstr "Âm thanh:" +msgstr "Các đoạn âm thanh" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Functions" -msgstr "Hàm:" +msgstr "Hàm" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp @@ -4646,7 +4644,7 @@ msgstr "Chỉnh sửa Chuyển tiếp ..." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Open in Inspector" -msgstr "" +msgstr "Mở trong Trình kiểm tra" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." @@ -4741,9 +4739,8 @@ msgid "Move Node" msgstr "Di chuyển Nút" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition exists!" -msgstr "Chuyển tiếp: " +msgstr "Chuyển tiếp đã tồn tại!" #: editor/plugins/animation_state_machine_editor.cpp msgid "Add Transition" @@ -5015,12 +5012,11 @@ msgstr "Không thể gỡ bỏ:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Write error." -msgstr "" +msgstr "Ghi bị lỗi." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Request failed, too many redirects" -msgstr "Yêu cầu thất bại, gửi lại quá nhiều" +msgstr "Yêu cầu thất bại, chuyển hướng quá nhiều" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -5028,14 +5024,12 @@ msgid "Redirect loop." msgstr "Chuyển hướng vòng lặp." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Request failed, timeout" -msgstr "Yêu cầu thất bại, trả lại code:" +msgstr "Yêu cầu thất bại, quá thời gian chờ" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Timeout." -msgstr "Thời gian:" +msgstr "Quá giờ." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." @@ -5051,7 +5045,7 @@ msgstr "Nhận được:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed SHA-256 hash check" -msgstr "" +msgstr "Kiểm tra băm SHA-256 thất bại" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5078,9 +5072,8 @@ msgid "Idle" msgstr "Chạy không" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "Cài đặt" +msgstr "Cài đặt..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -5096,7 +5089,7 @@ msgstr "Tải xuống nguyên liệu này đã được tiến hành!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Recently Updated" -msgstr "" +msgstr "Cập nhật gần đây" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Least Recently Updated" @@ -5104,11 +5097,11 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Name (A-Z)" -msgstr "" +msgstr "Tên (A-Z)" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Name (Z-A)" -msgstr "" +msgstr "Tên (Z-A)" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -5142,16 +5135,15 @@ msgstr "Tất cả" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Không tìm thấy kết quả cho \"%s\"." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Import..." -msgstr "Nhập vào" +msgstr "Nhập..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Plugins..." -msgstr "" +msgstr "Các phần mềm bổ trợ..." #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Sort:" @@ -5163,12 +5155,11 @@ msgstr "Danh mục:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Site:" -msgstr "" +msgstr "Trang:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Support" -msgstr "Hỗ trợ ..." +msgstr "Hỗ trợ" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Official" @@ -5225,7 +5216,7 @@ msgstr "" #: editor/plugins/baked_lightmap_editor_plugin.cpp #, fuzzy msgid "Select lightmap bake file:" -msgstr "Chọn file template" +msgstr "Chọn tệp bake lightmap:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5233,20 +5224,21 @@ msgid "Preview" msgstr "Xem thử" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Configure Snap" -msgstr "Cấu hình Snap" +msgstr "Cài đặt Dính" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Offset:" -msgstr "" +msgstr "Độ lệch lưới:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Step:" -msgstr "" +msgstr "Bước lưới:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Primary Line Every:" -msgstr "" +msgstr "Đường kẻ chính Mỗi:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5259,7 +5251,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Step:" -msgstr "" +msgstr "Bước xoay:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5268,34 +5260,31 @@ msgstr "Tỷ lệ:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" -msgstr "" +msgstr "Di chuyển đường căn dọc" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" -msgstr "Tạo Folder" +msgstr "Tạo đường căn dọc" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" -msgstr "Xoá Variable" +msgstr "Xoá đường căn dọc" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Horizontal Guide" -msgstr "" +msgstr "Di chuyển đường căn ngang" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Horizontal Guide" -msgstr "Tạo đường Guide ngang" +msgstr "Tạo đường căn ngang" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" -msgstr "Hủy key không đúng chuẩn" +msgstr "Xóa đường căn ngang" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Horizontal and Vertical Guides" -msgstr "" +msgstr "Tạo đường căn ngang và dọc" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" @@ -5322,7 +5311,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Resize Control \"%s\" to (%d, %d)" -msgstr "" +msgstr "Chỉnh kích cỡ Nút Điều khiển \"%s\" thành (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5366,23 +5355,24 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Top Left" -msgstr "" +msgstr "Góc trên trái" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Top Right" -msgstr "" +msgstr "Góc trên phải" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Bottom Right" -msgstr "" +msgstr "Góc dưới phải" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Bottom Left" -msgstr "" +msgstr "Góc dưới trái" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Center Left" -msgstr "" +msgstr "Trung tâm Bên trái" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Top" @@ -5428,12 +5418,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Full Rect" -msgstr "" +msgstr "Rộng hết cỡ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Keep Ratio" -msgstr "Tỉ lệ Scale:" +msgstr "Giữ Tỉ lệ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -5486,9 +5475,8 @@ msgid "Paste Pose" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Guides" -msgstr "Xoá khung xương" +msgstr "Xóa hết đường căn" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Custom Bone(s) from Node(s)" @@ -5511,6 +5499,8 @@ msgid "" "Warning: Children of a container get their position and size determined only " "by their parent." msgstr "" +"Cảnh báo: Nút Container đã xác định kích cỡ và vị trí cho các nút con của nó " +"rồi." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -5536,8 +5526,9 @@ msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Alt+RMB: Depth list selection" -msgstr "" +msgstr "Alt+chuột phải: Chọn theo thứ tự trên dưới" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5552,7 +5543,7 @@ msgstr "Chế độ Xoay" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Mode" -msgstr "Chế độ Tỉ lệ" +msgstr "Chế độ căn Tỉ lệ" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5569,7 +5560,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan Mode" -msgstr "" +msgstr "Chế độ Xoay" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5578,95 +5569,96 @@ msgstr "Chế độ Tỉ lệ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle smart snapping." -msgstr "" +msgstr "Bật tắt Dính thông minh." #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Use Smart Snap" -msgstr "Sử dụng Snap" +msgstr "Sử dụng Dính thông minh" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Toggle grid snapping." -msgstr "" +msgstr "Bật tắt Dính lưới." #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Use Grid Snap" -msgstr "Sử dụng Snap" +msgstr "Sử dụng Dính lưới" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" -msgstr "" +msgstr "Tùy chọn Dính" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" -msgstr "" +msgstr "Dùng Dính ở chế độ Xoay" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Scale Snap" -msgstr "Sử dụng Snap" +msgstr "Dính theo bước tỉ lệ" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Snap Relative" -msgstr "" +msgstr "Dính tương đối" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" -msgstr "" +msgstr "Dính điểm ảnh" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart Snapping" -msgstr "" +msgstr "Dính thông minh" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Configure Snap..." -msgstr "" +msgstr "Cài đặt Dính..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Parent" -msgstr "" +msgstr "Dính về nút Mẹ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Node Anchor" -msgstr "Snap đến neo của Nút" +msgstr "Dính nút vào điểm neo" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Node Sides" -msgstr "Snap sang hai bên nút" +msgstr "Dính vào các cạnh của Nút" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Node Center" -msgstr "Snap đến chính giữa nút" +msgstr "Dính vào tâm Nút" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Other Nodes" -msgstr "Snap đế các nút khác" +msgstr "Dính vào các Nút khác" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Guides" -msgstr "" +msgstr "Dính vào Đường căn" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock the selected object in place (can't be moved)." -msgstr "" +msgstr "Khóa vị trí vật (không cho dịch chuyển)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Unlock the selected object (can be moved)." -msgstr "" +msgstr "Thôi khóa vị trí vật (cho phép di chuyển)." #: 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 "Hãy chắc rằng nút con của vật ở trạng thái Không thể chọn." #: 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 "Khôi phục khả năng được chọn nút con của vật." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton Options" @@ -5674,7 +5666,7 @@ msgstr "Cài đặt Khung xương" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Bones" -msgstr "" +msgstr "Hiển thị Xương" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make Custom Bone(s) from Node(s)" @@ -5695,8 +5687,9 @@ msgid "Always Show Grid" msgstr "Hiện lưới" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Show Helpers" -msgstr "" +msgstr "Hiển thị trợ giúp" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Rulers" @@ -5704,19 +5697,20 @@ msgstr "Hiện thước" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Guides" -msgstr "" +msgstr "Hiện đường căn" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Show Origin" -msgstr "" +msgstr "Hiện điểm gốc" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Viewport" -msgstr "" +msgstr "Hiện Cổng xem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Group And Lock Icons" -msgstr "" +msgstr "Hiện biểu tượng Nhóm và Khóa" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -5724,7 +5718,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "" +msgstr "Lựa chọn khung hình" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" @@ -5745,7 +5739,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Insert keys (based on mask)." -msgstr "Chèn Key Anim" +msgstr "Chèn Khóa (dựa trên mask)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5770,8 +5764,9 @@ msgid "Insert Key (Existing Tracks)" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Copy Pose" -msgstr "" +msgstr "Sao chép Tư thế" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Pose" @@ -5779,11 +5774,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "" +msgstr "Gấp đôi bước lưới" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "" +msgstr "Chia đôi bước lưới" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan View" @@ -5809,7 +5804,7 @@ msgstr "Tạo Nút" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Error instancing scene from %s" -msgstr "" +msgstr "Lỗi khởi tạo cảnh từ %s" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Default Type" @@ -5837,7 +5832,7 @@ msgstr "Sửa Poly (Xoá điểm)" #: editor/plugins/collision_shape_2d_editor_plugin.cpp msgid "Set Handle" -msgstr "" +msgstr "Đặt tay nắm" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5861,7 +5856,7 @@ msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Particles" -msgstr "" +msgstr "Hạt" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5876,12 +5871,12 @@ msgstr "" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Solid Pixels" -msgstr "" +msgstr "Điểm ảnh rắn" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Border Pixels" -msgstr "" +msgstr "Điểm ảnh viền" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5922,12 +5917,13 @@ msgid "Flat 1" msgstr "" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp +#, fuzzy msgid "Ease In" -msgstr "" +msgstr "Trườn vào" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease Out" -msgstr "" +msgstr "Trườn ra" #: editor/plugins/curve_editor_plugin.cpp msgid "Smoothstep" @@ -5935,11 +5931,11 @@ msgstr "" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Point" -msgstr "" +msgstr "Sửa điểm uốn" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Tangent" -msgstr "" +msgstr "Sửa tiếp tuyến điểm uốn" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Curve Preset" @@ -5965,11 +5961,11 @@ msgstr "Tịnh tuyến" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Preset" -msgstr "" +msgstr "Nạp cài đặt trước" #: editor/plugins/curve_editor_plugin.cpp msgid "Remove Curve Point" -msgstr "" +msgstr "Xóa điểm uốn" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" @@ -5977,7 +5973,7 @@ msgstr "" #: editor/plugins/curve_editor_plugin.cpp msgid "Hold Shift to edit tangents individually" -msgstr "" +msgstr "Giữ Shift để sửa từng tiếp tuyến một" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -5993,12 +5989,13 @@ msgid "Gradient Edited" msgstr "" #: editor/plugins/item_list_editor_plugin.cpp +#, fuzzy msgid "Item %d" -msgstr "" +msgstr "Mục %d" #: editor/plugins/item_list_editor_plugin.cpp msgid "Items" -msgstr "" +msgstr "Mục" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item List Editor" @@ -6010,7 +6007,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh is empty!" -msgstr "" +msgstr "Lưới trống!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Couldn't create a Trimesh collision shape." @@ -6022,7 +6019,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "This doesn't work on scene root!" -msgstr "" +msgstr "Không thể áp dụng lên Cảnh gốc!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Shape" @@ -6057,7 +6054,7 @@ msgstr "Tạo hình dạng lồi" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Navigation Mesh" -msgstr "" +msgstr "Tạo lưới điều hướng" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Contained Mesh is not of type ArrayMesh." @@ -6069,7 +6066,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "No mesh to debug." -msgstr "" +msgstr "Không có lưới để gỡ lỗi." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Model has no UV in this layer" @@ -6077,7 +6074,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "MeshInstance lacks a Mesh!" -msgstr "" +msgstr "MeshInstance thiếu lưới!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh has not surface to create outlines from!" @@ -6089,15 +6086,15 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Could not create outline!" -msgstr "" +msgstr "Không thể tạo đường viền!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline" -msgstr "" +msgstr "Tạo đường viền" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh" -msgstr "" +msgstr "Lưới" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" @@ -6109,6 +6106,8 @@ msgid "" "automatically.\n" "This is the most accurate (but slowest) option for collision detection." msgstr "" +"Tạo một StaticBody rồi tự động gắn một khối va chạm hình đa giác.\n" +"Đây là tùy chọn phát hiện va chạm chính xác (nhưng chậm) nhất." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Collision Sibling" @@ -6119,6 +6118,8 @@ msgid "" "Creates a polygon-based collision shape.\n" "This is the most accurate (but slowest) option for collision detection." msgstr "" +"Tạo một khối va chạm đa giác.\n" +"Đây là cách phát hiện va chạm chính xác (nhưng chậm) nhất." #: editor/plugins/mesh_instance_editor_plugin.cpp #, fuzzy @@ -6130,6 +6131,8 @@ msgid "" "Creates a single convex collision shape.\n" "This is the fastest (but least accurate) option for collision detection." msgstr "" +"Tạo một khối va chạm lồi.\n" +"Đây là cách phát hiện va chạm nhanh (nhưng ẩu) nhất." #: editor/plugins/mesh_instance_editor_plugin.cpp #, fuzzy @@ -6141,10 +6144,12 @@ msgid "" "Creates a polygon-based collision shape.\n" "This is a performance middle-ground between the two above options." msgstr "" +"Tạo một khối va chạm đa giác.\n" +"Đây là tùy chọn có hiệu suất cân bằng so với hai tùy chọn trên." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." -msgstr "" +msgstr "Tạo lưới viền..." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6168,25 +6173,29 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh" -msgstr "" +msgstr "Tạo lưới viền" #: editor/plugins/mesh_instance_editor_plugin.cpp +#, fuzzy msgid "Outline Size:" -msgstr "" +msgstr "Kích cỡ viền:" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "UV Channel Debug" msgstr "" #: editor/plugins/mesh_library_editor_plugin.cpp +#, fuzzy msgid "Remove item %d?" -msgstr "" +msgstr "Xóa mục %d?" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "" "Update from existing scene?:\n" "%s" msgstr "" +"Cập nhật từ cảnh hiện có?:\n" +"%s" #: editor/plugins/mesh_library_editor_plugin.cpp #, fuzzy @@ -6196,19 +6205,19 @@ msgstr "Xuất Mesh Library" #: editor/plugins/mesh_library_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Add Item" -msgstr "" +msgstr "Thêm mục" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Remove Selected Item" -msgstr "" +msgstr "Xóa mục đã chọn" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Import from Scene" -msgstr "" +msgstr "Nhập từ Cảnh" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" -msgstr "" +msgstr "Cập nhật từ Cảnh" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." @@ -6221,15 +6230,15 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (invalid path)." -msgstr "" +msgstr "Nguồn lưới không hợp lệ (đường dẫn không hợp lệ)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (not a MeshInstance)." -msgstr "" +msgstr "Nguồn lưới không hợp lệ (không phải MeshInstance)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (contains no Mesh resource)." -msgstr "" +msgstr "Nguồn lưới không hợp lệ (không chứa tài nguyên Lưới)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No surface source specified." @@ -6521,9 +6530,8 @@ msgid "Split Segment (in curve)" msgstr "" #: editor/plugins/physical_bone_plugin.cpp -#, fuzzy msgid "Move Joint" -msgstr "Di chuyển đến..." +msgstr "Di chuyển Khớp" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" @@ -6602,9 +6610,8 @@ msgid "UV" msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Points" -msgstr "Di chuyển đến..." +msgstr "Các Điểm" #: editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6613,12 +6620,11 @@ msgstr "Tạo" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Bones" -msgstr "" +msgstr "Xương" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Move Points" -msgstr "Di chuyển đến..." +msgstr "Di chuyển các điểm" #: editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6627,7 +6633,7 @@ msgstr "Kéo: Xoay" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift: Move All" -msgstr "" +msgstr "Shift: Di chuyển tất" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift+Command: Scale" @@ -6635,7 +6641,7 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Ctrl: Rotate" -msgstr "" +msgstr "Ctrl: Xoay" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift+Ctrl: Scale" @@ -6643,15 +6649,15 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Move Polygon" -msgstr "" +msgstr "Di chuyển đa g" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Rotate Polygon" -msgstr "" +msgstr "Xoay đa giác" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Scale Polygon" -msgstr "" +msgstr "Thu phóng đa giác" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create a custom polygon. Enables custom polygon rendering." @@ -6673,7 +6679,7 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Radius:" -msgstr "" +msgstr "Bán kính:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Copy Polygon to UV" @@ -6690,19 +6696,19 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Settings" -msgstr "" +msgstr "Thiết lập lưới" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Snap" -msgstr "" +msgstr "Dính" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" -msgstr "" +msgstr "Bật Dính" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" -msgstr "" +msgstr "Lưới" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" @@ -6710,44 +6716,44 @@ msgstr "Hiện lưới" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Configure Grid:" -msgstr "" +msgstr "Cài đặt Lưới:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset X:" -msgstr "" +msgstr "Độ lệch X của Lưới:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset Y:" -msgstr "" +msgstr "Độ lệch Y của Lưới:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step X:" -msgstr "" +msgstr "Bước Lưới trục X:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step Y:" -msgstr "" +msgstr "Bước Lưới trục Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Sync Bones to Polygon" -msgstr "" +msgstr "Đồng bộ Xương với Đa giác" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" -msgstr "" +msgstr "LỖI: Không thể nạp tài nguyên!" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Add Resource" -msgstr "" +msgstr "Thêm tài nguyên" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Rename Resource" -msgstr "" +msgstr "Đổi tên tài nguyên" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Resource" -msgstr "" +msgstr "Xóa tài nguyên" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Resource clipboard is empty!" @@ -6755,7 +6761,7 @@ msgstr "" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Paste Resource" -msgstr "" +msgstr "Dán tài nguyên" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_editor.cpp @@ -6767,16 +6773,16 @@ msgstr "" #: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Type:" -msgstr "" +msgstr "Kiểu:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp msgid "Open in Editor" -msgstr "" +msgstr "Mở trong Trình biên soạn" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Load Resource" -msgstr "" +msgstr "Nạp tài nguyên" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ResourcePreloader" @@ -6784,11 +6790,11 @@ msgstr "" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" -msgstr "" +msgstr "AnimationTree chưa đặt đường dẫn đến AnimationPlayer nào" #: editor/plugins/root_motion_editor_plugin.cpp msgid "Path to AnimationPlayer is invalid" -msgstr "" +msgstr "Đường dẫn tới AnimationPlayer không hợp lệ" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Files" @@ -6796,7 +6802,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Close and save changes?" -msgstr "" +msgstr "Đóng và lưu thay đổi?" #: editor/plugins/script_editor_plugin.cpp msgid "Error writing TextFile:" @@ -6808,29 +6814,24 @@ msgid "Could not load file at:" msgstr "Không viết được file:" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error saving file!" -msgstr "Lỗi tải font." +msgstr "Lỗi lưu tệp!" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error while saving theme." -msgstr "Lỗi khi lưu scene." +msgstr "Lỗi khi lưu Tông màu." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Saving" -msgstr "Lỗi di chuyển:" +msgstr "Lỗi Khi Lưu" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error importing theme." -msgstr "Lỗi khi lưu scene." +msgstr "Lỗi khi nhập Tông màu." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Importing" -msgstr "Lỗi di chuyển:" +msgstr "Lỗi Khi Nhập" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -6866,28 +6867,28 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Import Theme" -msgstr "" +msgstr "Nhập Tông màu" #: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" -msgstr "" +msgstr "Lỗi khi lưu Tông màu" #: editor/plugins/script_editor_plugin.cpp msgid "Error saving" -msgstr "" +msgstr "Lỗi khi lưu" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As..." -msgstr "" +msgstr "Lưu Tông màu thành..." #: editor/plugins/script_editor_plugin.cpp msgid "%s Class Reference" -msgstr "" +msgstr "Tham khảo Lớp %s" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find Next" -msgstr "Tìm tiếp theo" +msgstr "Tìm tiếp" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -6910,7 +6911,7 @@ msgstr "Lọc các nút" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" -msgstr "" +msgstr "Sắp xếp" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -6926,20 +6927,19 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Next script" -msgstr "" +msgstr "Tệp lệnh tiếp theo" #: editor/plugins/script_editor_plugin.cpp msgid "Previous script" -msgstr "" +msgstr "Tệp lệnh trước đó" #: editor/plugins/script_editor_plugin.cpp msgid "File" -msgstr "" +msgstr "Tệp" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open..." -msgstr "Mở" +msgstr "Mở..." #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -6948,7 +6948,7 @@ msgstr "Tạo Script" #: editor/plugins/script_editor_plugin.cpp msgid "Save All" -msgstr "" +msgstr "Lưu tất cả" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" @@ -6956,7 +6956,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Copy Script Path" -msgstr "" +msgstr "Sao chép đường dẫn tệp lệnh" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -6970,19 +6970,19 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Theme" -msgstr "" +msgstr "Tông màu" #: editor/plugins/script_editor_plugin.cpp msgid "Import Theme..." -msgstr "" +msgstr "Nhập Tông màu..." #: editor/plugins/script_editor_plugin.cpp msgid "Reload Theme" -msgstr "" +msgstr "Tải lại Tông màu" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme" -msgstr "Lưu Theme" +msgstr "Lưu Tông màu" #: editor/plugins/script_editor_plugin.cpp msgid "Close All" @@ -7031,11 +7031,11 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Open Godot online documentation." -msgstr "" +msgstr "Mở tài liệu Godot trực tuyến." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." -msgstr "" +msgstr "Tìm tài liệu tham khảo." #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." @@ -7092,9 +7092,8 @@ msgid "[Ignore]" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Line" -msgstr "Dòng:" +msgstr "Dòng" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7144,9 +7143,8 @@ msgid "Bookmarks" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Breakpoints" -msgstr "Tạo các điểm." +msgstr "Điểm dừng" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp @@ -7249,14 +7247,12 @@ msgid "Remove All Bookmarks" msgstr "" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Function..." -msgstr "Xoá Function" +msgstr "Đi tới Hàm..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Line..." -msgstr "Đến Dòng" +msgstr "Đến Dòng..." #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -7386,9 +7382,8 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size" -msgstr "Kích thước: " +msgstr "Kích cỡ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" @@ -7467,8 +7462,9 @@ msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +#, fuzzy msgid "No parent to instance a child at." -msgstr "" +msgstr "Không có nút mẹ để khởi tạo nút con." #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "This operation requires a single selected node." @@ -7480,7 +7476,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" -msgstr "" +msgstr "Khóa xoay ở chế độ xem" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Normal" @@ -7508,19 +7504,21 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" -msgstr "" +msgstr "Xem thông tin" #: editor/plugins/spatial_editor_plugin.cpp msgid "View FPS" -msgstr "" +msgstr "Xem tốc độ khung hình" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Half Resolution" -msgstr "" +msgstr "Nửa độ phân giải" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Audio Listener" -msgstr "" +msgstr "Trình nghe âm thanh" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -7533,7 +7531,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Not available when using the GLES2 renderer." -msgstr "" +msgstr "Không khả dụng khi sử dụng trình kết xuất GLES2." #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" @@ -7569,13 +7567,15 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Rotation Locked" -msgstr "" +msgstr "Đã khóa xoay ở chế độ xem" #: 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 "" +"Lưu ý: Tốc độ khung hình được hiển thị là của trình biên soạn.\n" +"Đừng lấy đó làm mốc để đánh giá hiệu suất." #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" @@ -7591,51 +7591,57 @@ msgid "" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Snap Nodes To Floor" -msgstr "Snap các nút đến Floor" +msgstr "Dính các nút lên Sàn" #: 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 +#, fuzzy msgid "" "Drag: Rotate\n" "Alt+Drag: Move\n" "Alt+RMB: Depth list selection" msgstr "" +"Kéo: Xoay\n" +"Alt+Kéo: Di chuyển\n" +"Alt+Chuột phải: Chọn theo tầng" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Use Local Space" -msgstr "" +msgstr "Sử dụng Không gian Cục bộ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" -msgstr "Sử dụng Snap" +msgstr "Sử dụng Dính" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" -msgstr "" +msgstr "Góc nhìn đáy" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View" -msgstr "" +msgstr "Góc nhìn đỉnh" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View" -msgstr "" +msgstr "Góc nhìn lưng" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View" -msgstr "" +msgstr "Góc nhìn trực diện" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View" -msgstr "" +msgstr "Góc nhìn trái" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View" -msgstr "" +msgstr "Góc nhìn phải" #: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" @@ -7643,7 +7649,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" -msgstr "" +msgstr "Chèn khóa Hoạt ảnh" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Origin" @@ -7659,24 +7665,27 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Transform" -msgstr "" +msgstr "Biến đổi" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Snap Object to Floor" -msgstr "" +msgstr "Dính vật với Sàn" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Transform Dialog..." -msgstr "" +msgstr "Hộp thoại Biến đổi ..." #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" -msgstr "" +msgstr "1 Cổng xem" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports" -msgstr "" +msgstr "2 Cổng xem" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports (Alt)" @@ -7684,7 +7693,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports" -msgstr "" +msgstr "3 Cổng xem" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports (Alt)" @@ -7692,7 +7701,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "4 Viewports" -msgstr "" +msgstr "4 Cổng xem" #: editor/plugins/spatial_editor_plugin.cpp msgid "Gizmos" @@ -7704,7 +7713,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Grid" -msgstr "" +msgstr "Xem Lưới" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -7714,7 +7723,7 @@ msgstr "Đang kết nối..." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" -msgstr "" +msgstr "Thiết lập Dính" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" @@ -7722,15 +7731,15 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "" +msgstr "Dính theo Bước xoay (độ):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "" +msgstr "Thu Phóng Dính (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" -msgstr "" +msgstr "Cài đặt Cổng xem" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" @@ -7754,11 +7763,11 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate (deg.):" -msgstr "" +msgstr "Xoay (theo độ):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale (ratio):" -msgstr "" +msgstr "Thu phóng (theo tỉ lệ):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Type" @@ -7766,11 +7775,12 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Pre" -msgstr "" +msgstr "Trước" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Post" -msgstr "" +msgstr "Sau" #: editor/plugins/spatial_editor_plugin.cpp msgid "Nameless gizmo" @@ -7793,7 +7803,7 @@ msgstr "Tạo" #: editor/plugins/sprite_editor_plugin.cpp msgid "Polygon2D Preview" -msgstr "" +msgstr "Xem trước Polygon2D" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -7816,8 +7826,9 @@ msgid "LightOccluder2D Preview" msgstr "Tạo Folder" #: editor/plugins/sprite_editor_plugin.cpp +#, fuzzy msgid "Sprite is empty!" -msgstr "" +msgstr "Sprite trống!" #: editor/plugins/sprite_editor_plugin.cpp msgid "Can't convert a sprite using animation frames to mesh." @@ -7829,7 +7840,7 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Convert to Mesh2D" -msgstr "" +msgstr "Chuyển thành Mesh2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." @@ -7863,11 +7874,11 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " -msgstr "" +msgstr "Đơn giản hóa: " #: editor/plugins/sprite_editor_plugin.cpp msgid "Shrink (Pixels): " -msgstr "" +msgstr "Thu nhỏ (Điểm ảnh): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " @@ -7879,7 +7890,7 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Settings:" -msgstr "" +msgstr "Cài đặt:" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -7888,15 +7899,15 @@ msgstr "Xoá lựa chọn" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" -msgstr "" +msgstr "Thêm %d Khung hình" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" -msgstr "" +msgstr "Thêm Khung hình" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Unable to load images" -msgstr "" +msgstr "Không tải được hình ảnh" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" @@ -7912,15 +7923,15 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Empty" -msgstr "" +msgstr "Thêm Rỗng" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation FPS" -msgstr "" +msgstr "Thay đổi tốc độ hoạt ảnh" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" -msgstr "" +msgstr "(trống)" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -7928,9 +7939,8 @@ msgid "Move Frame" msgstr "Di chuyển Nút" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Animations:" -msgstr "Các Công cụ Animation" +msgstr "Các hoạt ảnh:" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -7939,11 +7949,11 @@ msgstr "Tạo Animation mới" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" -msgstr "" +msgstr "Tốc độ:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" -msgstr "" +msgstr "Lặp" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -7961,19 +7971,19 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" -msgstr "" +msgstr "Chèn Rỗng (Trước)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (After)" -msgstr "" +msgstr "Chèn Rỗng (Sau)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Move (Before)" -msgstr "" +msgstr "Di chuyển (Trước)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Move (After)" -msgstr "" +msgstr "Di chuyển (Sau)" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -7982,15 +7992,15 @@ msgstr "Chọn Points" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Horizontal:" -msgstr "" +msgstr "Ngang:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Vertical:" -msgstr "" +msgstr "Dọc:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Select/Clear All Frames" -msgstr "" +msgstr "Chọn/Xóa Tất cả Khung hình" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -7999,7 +8009,7 @@ msgstr "Tạo từ Scene" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" -msgstr "" +msgstr "SpriteFrames" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Region Rect" @@ -8007,11 +8017,11 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Margin" -msgstr "" +msgstr "Đặt Lề" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" -msgstr "" +msgstr "Chế độ Dính:" #: editor/plugins/texture_region_editor_plugin.cpp #: scene/resources/visual_shader.cpp @@ -8020,11 +8030,11 @@ msgstr "Không có" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" -msgstr "" +msgstr "Dính Điểm ảnh" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "" +msgstr "Dính lưới" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" @@ -8036,7 +8046,7 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Step:" -msgstr "" +msgstr "Bước:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Sep.:" @@ -8044,7 +8054,7 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "TextureRegion" -msgstr "" +msgstr "TextureRegion" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All Items" @@ -8052,24 +8062,23 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All" -msgstr "" +msgstr "Thêm Tất cả" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Items" -msgstr "" +msgstr "Xóa tất cả các mục" #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp msgid "Remove All" -msgstr "" +msgstr "Xoá tất cả" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Theme" -msgstr "Lưu Theme" +msgstr "Chỉnh Tông màu" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." -msgstr "" +msgstr "Menu chỉnh Tông màu." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" @@ -8081,7 +8090,7 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Template" -msgstr "" +msgstr "Tạo Mẫu Trống" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" @@ -8089,7 +8098,7 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Create From Current Editor Theme" -msgstr "" +msgstr "Tạo từ Tông màu Trình biên soạn hiện tại" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8103,7 +8112,7 @@ msgstr "Tắt" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" -msgstr "" +msgstr "Mục" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8112,11 +8121,11 @@ msgstr "Tắt" #: editor/plugins/theme_editor_plugin.cpp msgid "Check Item" -msgstr "" +msgstr "Đánh dấu mục" #: editor/plugins/theme_editor_plugin.cpp msgid "Checked Item" -msgstr "" +msgstr "Mục đã đánh dấu" #: editor/plugins/theme_editor_plugin.cpp msgid "Radio Item" @@ -8132,23 +8141,23 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Submenu" -msgstr "" +msgstr "Menu phụ" #: editor/plugins/theme_editor_plugin.cpp msgid "Subitem 1" -msgstr "" +msgstr "Mục phụ 1" #: editor/plugins/theme_editor_plugin.cpp msgid "Subitem 2" -msgstr "" +msgstr "Mục phụ 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" -msgstr "" +msgstr "Có" #: editor/plugins/theme_editor_plugin.cpp msgid "Many" -msgstr "" +msgstr "Nhiều" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8174,7 +8183,7 @@ msgstr "Chỉnh Thời gian Chuyển Animation" #: editor/plugins/theme_editor_plugin.cpp msgid "Subtree" -msgstr "" +msgstr "Cây con" #: editor/plugins/theme_editor_plugin.cpp msgid "Has,Many,Options" @@ -8182,12 +8191,12 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Data Type:" -msgstr "" +msgstr "Kiểu Dữ liệu:" #: editor/plugins/theme_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp msgid "Icon" -msgstr "" +msgstr "Biểu tượng" #: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp msgid "Style" @@ -8199,20 +8208,19 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Color" -msgstr "" +msgstr "Màu" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme File" -msgstr "Mở" +msgstr "Tệp Tông màu" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" -msgstr "" +msgstr "Xóa Lựa chọn" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Fix Invalid Tiles" -msgstr "" +msgstr "Sửa các ô không hợp lệ" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -8222,11 +8230,11 @@ msgstr "Nhân đôi lựa chọn" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" -msgstr "" +msgstr "Tô TileMap" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Line Draw" -msgstr "" +msgstr "Vẽ đường" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rectangle Paint" @@ -8238,7 +8246,7 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase TileMap" -msgstr "" +msgstr "Xóa TileMap" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -8247,7 +8255,7 @@ msgstr "Tìm tiếp theo" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" -msgstr "" +msgstr "Chuyển vị" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" @@ -8260,15 +8268,16 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy msgid "Filter tiles" -msgstr "Lọc tệp tin ..." +msgstr "Lọc ô" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Give a TileSet resource to this TileMap to use its tiles." msgstr "" +"Hãy cung cấp tài nguyên TileSet cho TileMap này để sử dụng các ô của nó." #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" -msgstr "" +msgstr "Tô ô" #: editor/plugins/tile_map_editor_plugin.cpp msgid "" @@ -8284,23 +8293,23 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" -msgstr "" +msgstr "Chọn ô" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate Left" -msgstr "" +msgstr "Xoay Trái" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate Right" -msgstr "" +msgstr "Xoay Phải" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Horizontally" -msgstr "" +msgstr "Lật Ngang" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Vertically" -msgstr "" +msgstr "Lật Dọc" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -8308,14 +8317,12 @@ msgid "Clear Transform" msgstr "Đổi Transform Animation" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Add Texture(s) to TileSet." -msgstr "Chèn Texture(s) vào TileSet" +msgstr "Thêm Họa tiết vào TileSet." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove selected Texture from TileSet." -msgstr "Xóa Texture hiện tại từ TileSet" +msgstr "Xóa Họa tiết hiện tại khỏi TileSet." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" @@ -8341,7 +8348,7 @@ msgstr "Mới %s" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Next Coordinate" -msgstr "" +msgstr "Tọa độ tiếp theo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the next shape, subtile, or Tile." @@ -8372,7 +8379,7 @@ msgstr "Tạo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Navigation" -msgstr "" +msgstr "Điều hướng" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Bitmask" @@ -8402,7 +8409,7 @@ msgstr "Tạo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Navigation Mode" -msgstr "Chế độ Navigation" +msgstr "Chế độ di chuyển" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Bitmask Mode" @@ -8426,9 +8433,8 @@ msgid "Copy bitmask." msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Paste bitmask." -msgstr "Dán Animation" +msgstr "Dán bitmask." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Erase bitmask." @@ -8444,9 +8450,8 @@ msgid "New Rectangle" msgstr "Tạo Cảnh Mới" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create a new polygon." -msgstr "Tạo" +msgstr "Tạo đa giác mới." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8464,11 +8469,11 @@ msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." -msgstr "" +msgstr "Bật Dính và hiện lưới (có thể cài đặt thông qua Trình kiểm tra)." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" -msgstr "" +msgstr "Hiển thị tên ô (Giữ phím Alt)" #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -8476,21 +8481,20 @@ msgid "" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove selected texture? This will remove all tiles which use it." -msgstr "Xóa Texture hiện tại từ TileSet" +msgstr "Xóa Họa tiết đã chọn? Các ô dùng họa tiết này cũng bốc hơi luôn đó." #: editor/plugins/tile_set_editor_plugin.cpp msgid "You haven't selected a texture to remove." -msgstr "" +msgstr "Bạn chưa chọn họa tiết để xóa." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene? This will overwrite all current tiles." -msgstr "" +msgstr "Tạo từ Cảnh? Việc này sẽ ghi đè lên tất cả các ô hiện tại." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" -msgstr "" +msgstr "Hợp nhất từ cảnh?" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8499,7 +8503,7 @@ msgstr "Xóa Template" #: editor/plugins/tile_set_editor_plugin.cpp msgid "%s file(s) were not added because was already on the list." -msgstr "" +msgstr "%s tệp không được thêm vào vì đã có trong danh sách." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -8519,9 +8523,8 @@ msgid "" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete polygon." -msgstr "Tạo" +msgstr "Xóa đa giác." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -8593,8 +8596,9 @@ msgid "Clear Tile Bitmask" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp +#, fuzzy msgid "Make Polygon Concave" -msgstr "" +msgstr "Biến thành đa giác lõm" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8608,7 +8612,7 @@ msgstr "Xóa Template" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Collision Polygon" -msgstr "" +msgstr "Xóa khối va chạm đa giác" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Occlusion Polygon" @@ -8621,11 +8625,12 @@ msgstr "Xóa Animation" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Priority" -msgstr "" +msgstr "Chỉnh độ ưu tiên của ô" #: editor/plugins/tile_set_editor_plugin.cpp +#, fuzzy msgid "Edit Tile Z Index" -msgstr "" +msgstr "Sửa chiều Z của ô" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8649,7 +8654,7 @@ msgstr "Tạo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "This property can't be changed." -msgstr "" +msgstr "Không thể thay đổi thuộc tính này." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8658,11 +8663,11 @@ msgstr "Xuất Tile Set" #: editor/plugins/version_control_editor_plugin.cpp msgid "No VCS addons are available." -msgstr "" +msgstr "Không có phần mềm kiểm soát phiên bản khả dụng." #: editor/plugins/version_control_editor_plugin.cpp msgid "Error" -msgstr "" +msgstr "Lỗi" #: editor/plugins/version_control_editor_plugin.cpp msgid "No files added to stage" @@ -8679,11 +8684,11 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" -msgstr "" +msgstr "Phần mềm kiểm soát phiên bản" #: editor/plugins/version_control_editor_plugin.cpp msgid "Initialize" -msgstr "" +msgstr "Khởi tạo" #: editor/plugins/version_control_editor_plugin.cpp msgid "Staging area" @@ -8734,8 +8739,9 @@ msgstr "Đổi" #: editor/plugins/version_control_editor_plugin.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp +#, fuzzy msgid "Status" -msgstr "" +msgstr "Trạng thái" #: editor/plugins/version_control_editor_plugin.cpp msgid "View file diffs before committing them to the latest version" @@ -8751,7 +8757,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(Chỉ dành cho GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8759,17 +8765,16 @@ msgid "Add Output" msgstr "Thêm Input" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar" -msgstr "Tỷ lệ:" +msgstr "Tỷ lệ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector" -msgstr "" +msgstr "Vector" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean" -msgstr "" +msgstr "Boolean" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sampler" @@ -8782,7 +8787,7 @@ msgstr "Thêm Input" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" -msgstr "" +msgstr "Thêm cổng đầu ra" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8796,11 +8801,11 @@ msgstr "Đổi dạng mặc định" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change input port name" -msgstr "" +msgstr "Đổi tên cổng đầu vào" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change output port name" -msgstr "" +msgstr "Đổi tên cổng đầu ra" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8827,7 +8832,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Input Default Port" -msgstr "" +msgstr "Đặt cổng đầu vào mặc định" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add Node to Visual Shader" @@ -8862,11 +8867,11 @@ msgstr "Đối số đã thay đổi" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" -msgstr "" +msgstr "Đỉnh" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Fragment" -msgstr "" +msgstr "Mảnh" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Light" @@ -8896,16 +8901,15 @@ msgstr "Tạo Function" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts HSV vector to RGB equivalent." -msgstr "" +msgstr "Chuyển đổi vector HSV sang RGB tương đương." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts RGB vector to HSV equivalent." -msgstr "" +msgstr "Chuyển đổi vector RGB sang HSV tương đương." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sepia function." -msgstr "Đổi tên Hàm" +msgstr "Hàm Sepia." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Burn operator." @@ -8956,19 +8960,19 @@ msgstr "Đổi Transform Animation" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "" +msgstr "Trả về kết quả boolean của phép so sánh %s giữa hai tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "Bằng (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "Lớn hơn (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "Lớn hơn hoặc Bằng (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8981,24 +8985,28 @@ msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." msgstr "" +"Trả về kết quả boolean của phép so sánh giữa Vô cùng (INF) và một tham số vô " +"hướng." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." msgstr "" +"Trả về kết quả boolean so sánh giữa NaN (Không phải số) và một tham số vô " +"hướng." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "Nhỏ hơn (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "Nhỏ hơn hoặc Bằng (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "Không bằng (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9012,17 +9020,19 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the comparison between two parameters." -msgstr "" +msgstr "Trả về kết quả boolean so sánh giữa hai tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"Trả về kết quả boolean của phép so sánh giữa INF (hoặc NaN) và một tham số " +"vô hướng." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." -msgstr "" +msgstr "Hằng số Boolean." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean uniform." @@ -9034,7 +9044,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Input parameter." -msgstr "" +msgstr "Tham số đầu vào." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader modes." @@ -9071,43 +9081,43 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "E constant (2.718282). Represents the base of the natural logarithm." -msgstr "" +msgstr "Hằng số E (2,718282). Cơ số của logarit tự nhiên." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Epsilon constant (0.00001). Smallest possible scalar number." -msgstr "" +msgstr "Hằng số Epsilon (0,00001). Số vô hướng nhỏ nhất có thể." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Phi constant (1.618034). Golden ratio." -msgstr "" +msgstr "Hằng số Phi (1.618034). Tỷ lệ vàng." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/4 constant (0.785398) or 45 degrees." -msgstr "" +msgstr "Hằng số Pi/4 (0,785398) hay còn là 45 độ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/2 constant (1.570796) or 90 degrees." -msgstr "" +msgstr "Hằng số Pi/2 (1.570796) hay còn là 90 độ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi constant (3.141593) or 180 degrees." -msgstr "" +msgstr "Hằng số Pi (3,141593) hay còn là 180 độ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Tau constant (6.283185) or 360 degrees." -msgstr "" +msgstr "Hằng số Tau (6,283185) hay còn là 360 độ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sqrt2 constant (1.414214). Square root of 2." -msgstr "" +msgstr "Hằng số Sqrt2 (1,414214). Căn bậc hai của 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the absolute value of the parameter." -msgstr "" +msgstr "Trả về giá trị tuyệt đối của tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-cosine of the parameter." -msgstr "" +msgstr "Trả về arc-cosine của tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic cosine of the parameter." @@ -9115,7 +9125,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." -msgstr "" +msgstr "Trả về arc-sin của tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic sine of the parameter." @@ -9123,11 +9133,11 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." -msgstr "" +msgstr "Trả về arc-tan của tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameters." -msgstr "" +msgstr "Trả về arc-tan của các tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic tangent of the parameter." @@ -9136,7 +9146,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Finds the nearest integer that is greater than or equal to the parameter." -msgstr "" +msgstr "Tìm số nguyên gần nhất lớn hơn hoặc bằng tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." @@ -9144,7 +9154,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the cosine of the parameter." -msgstr "" +msgstr "Trả về cosine của tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic cosine of the parameter." @@ -9152,23 +9162,23 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." -msgstr "" +msgstr "Đổi radian về độ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-e Exponential." -msgstr "" +msgstr "Lũy thừa cơ số e." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 Exponential." -msgstr "" +msgstr "Lũy thừa cơ số 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer less than or equal to the parameter." -msgstr "" +msgstr "Tìm số nguyên gần nhất nhỏ hơn hoặc bằng tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Computes the fractional part of the argument." -msgstr "" +msgstr "Tính phần phân số của tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." @@ -9176,19 +9186,19 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Natural logarithm." -msgstr "" +msgstr "Logarit tự nhiên." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 logarithm." -msgstr "" +msgstr "Logarit cơ số 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the greater of two values." -msgstr "" +msgstr "Trả về giá trị lớn hơn trong hai giá trị." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the lesser of two values." -msgstr "" +msgstr "Trả về giá trị nhỏ hơn trong hai giá trị." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." @@ -9196,7 +9206,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the opposite value of the parameter." -msgstr "" +msgstr "Trả về giá trị đối của tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - scalar" @@ -9205,11 +9215,11 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the value of the first parameter raised to the power of the second." -msgstr "" +msgstr "Trả về lũy thừa cơ số tham số đầu tiên có số mũ tham số thứ hai." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in degrees to radians." -msgstr "" +msgstr "Đổi từ độ về radian." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / scalar" @@ -9217,23 +9227,23 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer to the parameter." -msgstr "" +msgstr "Tìm số nguyên gần tham số nhất." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest even integer to the parameter." -msgstr "" +msgstr "Tìm số nguyên chẵn gần tham số nhất." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." -msgstr "" +msgstr "Kẹp giá trị trong khoảng từ 0.0 đến 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." -msgstr "" +msgstr "Lấy tính âm/dương của tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the sine of the parameter." -msgstr "" +msgstr "Trả về sin của tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic sine of the parameter." @@ -9241,7 +9251,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." -msgstr "" +msgstr "Trả về căn bậc hai của tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9261,7 +9271,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." -msgstr "" +msgstr "Trả về tan của tham số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic tangent of the parameter." @@ -9272,16 +9282,18 @@ msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Adds scalar to scalar." -msgstr "" +msgstr "Cộng hai số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides scalar by scalar." -msgstr "" +msgstr "Chia hai số." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Multiplies scalar by scalar." -msgstr "" +msgstr "Nhân hai số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two scalars." @@ -9289,11 +9301,11 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts scalar from scalar." -msgstr "" +msgstr "Trừ hai số." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar constant." -msgstr "" +msgstr "Hằng số vô hướng." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9323,7 +9335,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Transform function." -msgstr "Tạo" +msgstr "Hàm biến hóa." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9375,9 +9387,8 @@ msgid "Transform uniform." msgstr "Tạo" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector function." -msgstr "Xoá Function" +msgstr "Hàm Vector." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector operator." @@ -9744,9 +9755,8 @@ msgid "Export All" msgstr "Xuất Tile Set" #: editor/project_export.cpp editor/project_manager.cpp -#, fuzzy msgid "ZIP File" -msgstr " Tệp tin" +msgstr "Tệp ZIP" #: editor/project_export.cpp msgid "Godot Game Pack" @@ -10051,11 +10061,8 @@ msgid "Projects" msgstr "Dự án" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "" -"Đang quét các tệp tin,\n" -"Chờ một chút ..." +msgstr "Đang tải, đợi xíu..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10131,9 +10138,8 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "An action with the name '%s' already exists." -msgstr "LỖI: Tên animation trùng lặp!" +msgstr "Hành động với tên '%s' đã tồn tại." #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -10451,15 +10457,15 @@ msgstr "" #: editor/property_editor.cpp msgid "File..." -msgstr "" +msgstr "Tệp tin..." #: editor/property_editor.cpp msgid "Dir..." -msgstr "" +msgstr "Thư mục..." #: editor/property_editor.cpp msgid "Assign" -msgstr "" +msgstr "Gán" #: editor/property_editor.cpp msgid "Select Node" @@ -10467,7 +10473,7 @@ msgstr "Chọn nút" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" -msgstr "" +msgstr "Lỗi tải tệp: Không phải tài nguyên!" #: editor/property_editor.cpp msgid "Pick a Node" @@ -10475,11 +10481,11 @@ msgstr "Lấy một nút" #: editor/property_editor.cpp msgid "Bit %d, val %d." -msgstr "" +msgstr "Bit %d, giá trị %d." #: editor/property_selector.cpp msgid "Select Property" -msgstr "" +msgstr "Chọn Thuộc tính" #: editor/property_selector.cpp msgid "Select Virtual Method" @@ -10487,7 +10493,7 @@ msgstr "" #: editor/property_selector.cpp msgid "Select Method" -msgstr "" +msgstr "Chọn Phương thức" #: editor/rename_dialog.cpp editor/scene_tree_dock.cpp #, fuzzy @@ -10495,30 +10501,28 @@ msgid "Batch Rename" msgstr "Đổi tên" #: editor/rename_dialog.cpp -#, fuzzy msgid "Replace:" -msgstr "Thay thế: " +msgstr "Thay thế:" #: editor/rename_dialog.cpp msgid "Prefix:" -msgstr "" +msgstr "Tiền tố:" #: editor/rename_dialog.cpp msgid "Suffix:" -msgstr "" +msgstr "Hậu tố:" #: editor/rename_dialog.cpp -#, fuzzy msgid "Use Regular Expressions" -msgstr "Phiên bản hiện tại:" +msgstr "Dùng Regular Expression" #: editor/rename_dialog.cpp msgid "Advanced Options" -msgstr "" +msgstr "Tùy chọn Nâng cao" #: editor/rename_dialog.cpp msgid "Substitute" -msgstr "" +msgstr "Thay thế" #: editor/rename_dialog.cpp msgid "Node name" @@ -10534,7 +10538,7 @@ msgstr "Loại nút" #: editor/rename_dialog.cpp msgid "Current scene name" -msgstr "" +msgstr "Tên Cảnh hiện tại" #: editor/rename_dialog.cpp msgid "Root node name" @@ -10551,18 +10555,16 @@ msgid "Per-level Counter" msgstr "" #: editor/rename_dialog.cpp -#, fuzzy msgid "If set, the counter restarts for each group of child nodes." -msgstr "Nếu đặt bộ đếm khởi động lại cho từng nhóm nút con" +msgstr "Nếu được đặt, bộ đếm sẽ khởi động lại với từng nhóm nút con." #: editor/rename_dialog.cpp msgid "Initial value for the counter" -msgstr "" +msgstr "Giá trị đếm ban đầu" #: editor/rename_dialog.cpp -#, fuzzy msgid "Step" -msgstr "Bước (s):" +msgstr "Bước" #: editor/rename_dialog.cpp msgid "Amount by which counter is incremented for each node" @@ -10570,21 +10572,23 @@ msgstr "Giá trị mà bộ đếm tăng lên cho mỗi nút" #: editor/rename_dialog.cpp msgid "Padding" -msgstr "" +msgstr "Đệm" #: editor/rename_dialog.cpp msgid "" "Minimum number of digits for the counter.\n" "Missing digits are padded with leading zeros." msgstr "" +"Số chữ số tối thiểu cho bộ đếm.\n" +"Đệm thêm 0 ở đầu nếu thiếu chữ số." #: editor/rename_dialog.cpp msgid "Post-Process" -msgstr "" +msgstr "Hậu xử lý" #: editor/rename_dialog.cpp msgid "Keep" -msgstr "" +msgstr "Giữ" #: editor/rename_dialog.cpp msgid "PascalCase to snake_case" @@ -10600,11 +10604,11 @@ msgstr "" #: editor/rename_dialog.cpp msgid "To Lowercase" -msgstr "" +msgstr "Hoa thành Thường" #: editor/rename_dialog.cpp msgid "To Uppercase" -msgstr "" +msgstr "Thường thành Hoa" #: editor/rename_dialog.cpp #, fuzzy @@ -10617,9 +10621,8 @@ msgid "Regular Expression Error:" msgstr "Phiên bản hiện tại:" #: editor/rename_dialog.cpp -#, fuzzy msgid "At character %s" -msgstr "Ký tự hợp lệ:" +msgstr "Tại kí tự %s" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent Node" @@ -10643,19 +10646,19 @@ msgstr "" #: editor/run_settings_dialog.cpp msgid "Current Scene" -msgstr "" +msgstr "Cảnh Hiện tại" #: editor/run_settings_dialog.cpp msgid "Main Scene" -msgstr "" +msgstr "Cảnh chính" #: editor/run_settings_dialog.cpp msgid "Main Scene Arguments:" -msgstr "" +msgstr "Tham số Cảnh chính:" #: editor/run_settings_dialog.cpp msgid "Scene Run Settings" -msgstr "" +msgstr "Cài đặt chạy Cảnh" #: editor/scene_tree_dock.cpp msgid "No parent to instance the scenes at." @@ -10663,7 +10666,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Error loading scene from %s" -msgstr "" +msgstr "Lỗi tải cảnh từ %s" #: editor/scene_tree_dock.cpp msgid "" @@ -10675,7 +10678,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Instance Scene(s)" -msgstr "" +msgstr "Khởi tạo Cảnh" #: editor/scene_tree_dock.cpp msgid "Replace with Branch Scene" @@ -10683,12 +10686,11 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Instance Child Scene" -msgstr "" +msgstr "Khởi tạo Cảnh con" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "Không thể hoạt động trên các nút từ ngoại cảnh!" +msgstr "Không thể dán Nút Gốc vào cùng một Cảnh." #: editor/scene_tree_dock.cpp #, fuzzy @@ -10701,8 +10703,9 @@ msgid "Detach Script" msgstr "Đính kèm Script" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "This operation can't be done on the tree root." -msgstr "" +msgstr "Thao tác này không thể áp dụng lên gốc của cây." #: editor/scene_tree_dock.cpp msgid "Move Node In Parent" @@ -10728,7 +10731,7 @@ msgstr "Nút phải thuộc cảnh đã chỉnh sửa để trở thành gốc." #: editor/scene_tree_dock.cpp msgid "Instantiated scenes can't become root" -msgstr "" +msgstr "Cảnh khởi tạo không thể thành gốc" #: editor/scene_tree_dock.cpp msgid "Make node as Root" @@ -10761,11 +10764,11 @@ msgstr "Không thể thực hiện với nút gốc." #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." -msgstr "" +msgstr "Không thể thực hiện thao tác này trên Cảnh được khởi tạo." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." -msgstr "" +msgstr "Lưu Cảnh Mới Thành..." #: editor/scene_tree_dock.cpp msgid "" @@ -10797,11 +10800,11 @@ msgstr "Tạo Nút Gốc:" #: editor/scene_tree_dock.cpp msgid "2D Scene" -msgstr "2D Scene" +msgstr "Cảnh 2D" #: editor/scene_tree_dock.cpp msgid "3D Scene" -msgstr "3D Scene" +msgstr "Cảnh 3D" #: editor/scene_tree_dock.cpp msgid "User Interface" @@ -10837,10 +10840,12 @@ msgid "Change type of node(s)" msgstr "Đổi loại của các nút" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "" "Couldn't save new scene. Likely dependencies (instances) couldn't be " "satisfied." msgstr "" +"Không thể lưu cảnh mới. Có khi là do không thỏa mãn được các phần phụ thuộc." #: editor/scene_tree_dock.cpp msgid "Error saving scene." @@ -10848,19 +10853,20 @@ msgstr "Lỗi khi lưu scene." #: editor/scene_tree_dock.cpp msgid "Error duplicating scene to save it." -msgstr "" +msgstr "Lỗi khi nhân bản cảnh để lưu." #: editor/scene_tree_dock.cpp msgid "Sub-Resources" -msgstr "" +msgstr "Tài nguyên phụ" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" -msgstr "" +msgstr "Xóa Kế thừa" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Editable Children" -msgstr "" +msgstr "Các Con có thể sửa" #: editor/scene_tree_dock.cpp msgid "Load As Placeholder" @@ -10868,7 +10874,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Open Documentation" -msgstr "" +msgstr "Mở Hướng dẫn" #: editor/scene_tree_dock.cpp msgid "" @@ -10888,7 +10894,7 @@ msgstr "Thu gọn Tất cả" #: editor/scene_tree_dock.cpp msgid "Change Type" -msgstr "" +msgstr "Đổi Kiểu" #: editor/scene_tree_dock.cpp msgid "Reparent to New Node" @@ -10896,23 +10902,24 @@ msgstr "Reparent đến nút mới" #: editor/scene_tree_dock.cpp msgid "Make Scene Root" -msgstr "" +msgstr "Biến Cảnh thành Gốc" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" -msgstr "" +msgstr "Hợp nhất từ Cảnh" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Save Branch as Scene" -msgstr "" +msgstr "Lưu Nhánh thành Cảnh" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Copy Node Path" msgstr "Sao chép đường dẫn nút" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Delete (No Confirm)" -msgstr "" +msgstr "Xóa (Không hỏi lại)" #: editor/scene_tree_dock.cpp msgid "Add/Create a New Node." @@ -10994,9 +11001,8 @@ msgstr "" "Nhấp để hiện khung nhóm." #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open Script:" -msgstr "Tạo Script" +msgstr "Mở Tệp lệnh:" #: editor/scene_tree_editor.cpp msgid "" @@ -11071,7 +11077,7 @@ msgstr "Tệp không tồn tại." #: editor/script_create_dialog.cpp #, fuzzy msgid "Invalid extension." -msgstr "Phải sử dụng extension có hiệu lực" +msgstr "Tên đuôi không hợp lệ." #: editor/script_create_dialog.cpp msgid "Wrong extension chosen." @@ -11117,9 +11123,8 @@ msgid "Invalid path." msgstr "Đường dẫn sai." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid class name." -msgstr "Kích thước font không hợp lệ." +msgstr "Tên Lớp không hợp lệ." #: editor/script_create_dialog.cpp msgid "Invalid inherited parent name or path." @@ -11158,18 +11163,16 @@ msgid "" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "Lớp:" +msgstr "Tên Lớp:" #: editor/script_create_dialog.cpp msgid "Template:" msgstr "Bản mẫu:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Tạo Script" +msgstr "Tệp lệnh có sẵn:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -11184,24 +11187,20 @@ msgid "Bytes:" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Warning:" -msgstr "Cảnh báo" +msgstr "Cảnh báo:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Error:" -msgstr "Lỗi!" +msgstr "Lỗi:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Error" -msgstr "Lỗi!" +msgstr "Lỗi C++" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Error:" -msgstr "Lỗi!" +msgstr "Lỗi C++:" #: editor/script_editor_debugger.cpp #, fuzzy @@ -11209,9 +11208,8 @@ msgid "C++ Source" msgstr "Sao chép Tài nguyên" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Source:" -msgstr "Quét nguồn" +msgstr "Nguồn:" #: editor/script_editor_debugger.cpp msgid "C++ Source:" @@ -11226,9 +11224,8 @@ msgid "Errors" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Child process connected." -msgstr "Các Nút đã ngắt Kết nối" +msgstr "Đã kết nối tiến trình con." #: editor/script_editor_debugger.cpp msgid "Copy Error" @@ -11239,9 +11236,8 @@ msgid "Video RAM" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Skip Breakpoints" -msgstr "Tạo các điểm." +msgstr "Lờ đi điểm dừng" #: editor/script_editor_debugger.cpp msgid "Inspect Previous Instance" @@ -11516,8 +11512,9 @@ msgid "Invalid instance dictionary format (invalid script at @path)" msgstr "" #: modules/gdscript/gdscript_functions.cpp +#, fuzzy msgid "Invalid instance dictionary (invalid subclasses)" -msgstr "" +msgstr "Từ điển không hợp lệ (Lớp con không hợp lệ)" #: modules/gdscript/gdscript_functions.cpp msgid "Object can't provide a length." @@ -11679,9 +11676,8 @@ msgid "Indirect lighting" msgstr "" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" -msgstr "Phiên bản hiện tại:" +msgstr "Hậu xử lí" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Plotting lightmaps" @@ -11689,7 +11685,7 @@ msgstr "" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" -msgstr "" +msgstr "Tên Lớp không được trùng với từ khóa" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -11701,15 +11697,15 @@ msgstr "" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." -msgstr "" +msgstr "Xóa lưới điều hướng." #: modules/recast/navigation_mesh_generator.cpp msgid "Setting up Configuration..." -msgstr "" +msgstr "Thiết lập cấu hình ..." #: modules/recast/navigation_mesh_generator.cpp msgid "Calculating grid size..." -msgstr "" +msgstr "Tính kích thước lưới ..." #: modules/recast/navigation_mesh_generator.cpp msgid "Creating heightfield..." @@ -11729,11 +11725,11 @@ msgstr "" #: modules/recast/navigation_mesh_generator.cpp msgid "Partitioning..." -msgstr "" +msgstr "Phân vùng ..." #: modules/recast/navigation_mesh_generator.cpp msgid "Creating contours..." -msgstr "" +msgstr "Tạo đường viền ..." #: modules/recast/navigation_mesh_generator.cpp msgid "Creating polymesh..." @@ -11745,7 +11741,7 @@ msgstr "" #: modules/recast/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" -msgstr "" +msgstr "Thiết lập trình tạo lưới điều hướng:" #: modules/recast/navigation_mesh_generator.cpp msgid "Parsing Geometry..." @@ -11753,7 +11749,7 @@ msgstr "" #: modules/recast/navigation_mesh_generator.cpp msgid "Done!" -msgstr "" +msgstr "Xong!" #: modules/visual_script/visual_script.cpp msgid "" @@ -11780,45 +11776,44 @@ msgstr "" #: modules/visual_script/visual_script.cpp msgid "Node returned an invalid sequence output: " -msgstr "Nút trả về đầu ra là chuỗi không hợp lệ: " +msgstr "Nút trả về chuỗi không hợp lệ: " #: modules/visual_script/visual_script.cpp msgid "Found sequence bit but not the node in the stack, report bug!" -msgstr "Tìm ra chuỗi bit nhưng không phải nút trong ngăn xếp, báo cáo lỗi!" +msgstr "" +"Tìm thấy chuỗi bit nhưng không phải là nút trong ngăn xếp, báo cáo lỗi!" #: modules/visual_script/visual_script.cpp msgid "Stack overflow with stack depth: " -msgstr "" +msgstr "Tràn ngăn xếp ở ngăn xếp tầng: " #: modules/visual_script/visual_script_editor.cpp msgid "Change Signal Arguments" -msgstr "" +msgstr "Thay đổi đối số tín hiệu" #: modules/visual_script/visual_script_editor.cpp msgid "Change Argument Type" -msgstr "" +msgstr "Thay đổi loại đối số" #: modules/visual_script/visual_script_editor.cpp msgid "Change Argument name" -msgstr "" +msgstr "Thay đổi tên đối số" #: modules/visual_script/visual_script_editor.cpp msgid "Set Variable Default Value" -msgstr "" +msgstr "Đặt giá trị mặc định cho biến" #: modules/visual_script/visual_script_editor.cpp msgid "Set Variable Type" -msgstr "" +msgstr "Đặt loại biến" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" -msgstr "Thêm Input" +msgstr "Thêm cổng vào" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" -msgstr "Thêm Input" +msgstr "Thêm cổng ra" #: modules/visual_script/visual_script_editor.cpp msgid "Override an existing built-in function." @@ -11826,24 +11821,23 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Create a new function." -msgstr "Tạo một hàm mới." +msgstr "Tạo hàm mới." #: modules/visual_script/visual_script_editor.cpp msgid "Variables:" -msgstr "" +msgstr "Biến:" #: modules/visual_script/visual_script_editor.cpp msgid "Create a new variable." -msgstr "Tạo một biến mới." +msgstr "Tạo biến mới." #: modules/visual_script/visual_script_editor.cpp msgid "Signals:" msgstr "Tín hiệu:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create a new signal." -msgstr "Tạo" +msgstr "Tạo tín hiệu mới." #: modules/visual_script/visual_script_editor.cpp msgid "Name is not a valid identifier:" @@ -11851,7 +11845,7 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Name already in use by another func/var/signal:" -msgstr "" +msgstr "Tên đã được sử dụng bởi func/var/singal khác:" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Function" @@ -11870,9 +11864,8 @@ msgid "Add Function" msgstr "Thêm Hàm" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" -msgstr "Xoá Function" +msgstr "Xoá cổng vào" #: modules/visual_script/visual_script_editor.cpp msgid "Add Variable" @@ -11883,22 +11876,20 @@ msgid "Add Signal" msgstr "Thêm Tín hiệu" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" -msgstr "Xoá Function" +msgstr "Xóa cổng vào" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" -msgstr "Xóa Template" +msgstr "Xóa cổng ra" #: modules/visual_script/visual_script_editor.cpp msgid "Change Expression" -msgstr "" +msgstr "Thay đổi biểu thức" #: modules/visual_script/visual_script_editor.cpp msgid "Remove VisualScript Nodes" -msgstr "Gỡ bỏ các nút VisualScript" +msgstr "Xóa các nút VisualScript" #: modules/visual_script/visual_script_editor.cpp msgid "Duplicate VisualScript Nodes" @@ -11914,11 +11905,11 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a simple reference to the node." -msgstr "Giữ %s và thả để tham chiếu đơn giản đế nút." +msgstr "Giữ %s để thả một tham chiếu đơn giản lên nút." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." -msgstr "Giữ Ctrl và thả để tham chiếu đơn giản đến nút." +msgstr "Giữ Ctrl để thả một tài liệu tham khảo đơn giản đến nút." #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a Variable Setter." @@ -11930,11 +11921,11 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Add Preload Node" -msgstr "Thêm nút Preload" +msgstr "Thêm nút tải trước" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" -msgstr "Thêm các nút từ cây" +msgstr "Thêm nút từ cây" #: modules/visual_script/visual_script_editor.cpp msgid "" @@ -11952,7 +11943,7 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Change Base Type" -msgstr "" +msgstr "Thay đổi loại cơ sở" #: modules/visual_script/visual_script_editor.cpp msgid "Move Node(s)" @@ -11964,7 +11955,7 @@ msgstr "Gỡ bỏ nút VisualScript" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Nodes" -msgstr "Kết nối các nút" +msgstr "Kết nối nút" #: modules/visual_script/visual_script_editor.cpp msgid "Disconnect Nodes" @@ -11980,15 +11971,15 @@ msgstr "Kết nối trình tự nút" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" -msgstr "" +msgstr "Tệp lệnh đã có hàm '%s'" #: modules/visual_script/visual_script_editor.cpp msgid "Change Input Value" -msgstr "" +msgstr "Thay đổi giá trị đầu vào" #: modules/visual_script/visual_script_editor.cpp msgid "Resize Comment" -msgstr "" +msgstr "Thay đổi kích thước Nhận xét" #: modules/visual_script/visual_script_editor.cpp msgid "Can't copy the function node." @@ -11996,7 +11987,7 @@ msgstr "Không thể sao chép nút chức năng." #: modules/visual_script/visual_script_editor.cpp msgid "Clipboard is empty!" -msgstr "" +msgstr "Clipboard trống!" #: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" @@ -12019,17 +12010,16 @@ msgid "Try to only have one sequence input in selection." msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "Đổi tên Hàm" +msgstr "Tạo Hàm" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" -msgstr "Xoá Function" +msgstr "Xoá Hàm" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Variable" -msgstr "Xoá Variable" +msgstr "Xoá Biến" #: modules/visual_script/visual_script_editor.cpp msgid "Editing Variable:" @@ -12052,27 +12042,24 @@ msgid "Members:" msgstr "Những Thành viên:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Base Type:" -msgstr "Đổi %s Loại" +msgstr "Đổi Kiểu Gốc:" #: modules/visual_script/visual_script_editor.cpp msgid "Add Nodes..." msgstr "Thêm các nút..." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Function..." -msgstr "Thêm Hàm" +msgstr "Thêm Hàm..." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "Hàm:" +msgstr "ten_ham" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." -msgstr "" +msgstr "Chọn hoặc tạo một hàm để chỉnh đồ thị." #: modules/visual_script/visual_script_editor.cpp msgid "Delete Selected" @@ -12084,21 +12071,19 @@ msgstr "Tìm loại Node" #: modules/visual_script/visual_script_editor.cpp msgid "Copy Nodes" -msgstr "Sao chép các nút" +msgstr "Sao chép nút" #: modules/visual_script/visual_script_editor.cpp msgid "Cut Nodes" msgstr "Cắt các nút" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "Đổi tên Hàm" +msgstr "Tạo Hàm" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "Làm mới" +msgstr "Làm mới đồ thị" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" @@ -12106,19 +12091,19 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " -msgstr "" +msgstr "Kiểu đầu vào không lặp được: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" -msgstr "" +msgstr "Trỏ lặp không còn hợp lệ" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid: " -msgstr "" +msgstr "Trỏ lặp không còn hợp lệ: " #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name." -msgstr "" +msgstr "Tên thuộc tính chỉ mục không hợp lệ." #: modules/visual_script/visual_script_func_nodes.cpp msgid "Base object is not a Node!" @@ -12126,37 +12111,41 @@ msgstr "Đối tượng cơ sở không phải một nút!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Path does not lead Node!" -msgstr "Path không chỉ đến Node!" +msgstr "Đường dẫn không chỉ đến Nút!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." -msgstr "" +msgstr "Tên thuộc tính chỉ mục '%s' ở nút '%s' không hợp lệ." #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " -msgstr "" +msgstr ": Tham số có loại không hợp lệ: " #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid arguments: " -msgstr "" +msgstr ": Tham số không hợp lệ: " #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " -msgstr "" +msgstr "Không tìm thấy VariableGet trong tệp lệnh: " #: modules/visual_script/visual_script_nodes.cpp +#, fuzzy msgid "VariableSet not found in script: " -msgstr "" +msgstr "Không tìm thấy VariableSet trong tệp lệnh: " #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." -msgstr "" +msgstr "Nút tùy chọn không có phương thức _step(), không thể xử lí đồ thị." #: modules/visual_script/visual_script_nodes.cpp +#, fuzzy msgid "" "Invalid return value from _step(), must be integer (seq out), or string " "(error)." msgstr "" +"_step() trả giá trị không hợp lệ, phải là số nguyên (seq out), hoặc xâu " +"(lỗi)." #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -12164,15 +12153,15 @@ msgstr "Tìm VisualScript" #: modules/visual_script/visual_script_property_selector.cpp msgid "Get %s" -msgstr "" +msgstr "Lấy %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Set %s" -msgstr "" +msgstr "Gán %s" #: platform/android/export/export.cpp msgid "Package name is missing." -msgstr "" +msgstr "Thiếu tên gói." #: platform/android/export/export.cpp msgid "Package segments must be of non-zero length." @@ -12180,11 +12169,11 @@ msgstr "" #: platform/android/export/export.cpp msgid "The character '%s' is not allowed in Android application package names." -msgstr "" +msgstr "Không được phép cho kí tự '%s' vào tên gói phần mềm Android." #: platform/android/export/export.cpp msgid "A digit cannot be the first character in a package segment." -msgstr "" +msgstr "Không thể có chữ số làm kí tự đầu tiên trong một phần của gói." #: platform/android/export/export.cpp msgid "The character '%s' cannot be the first character in a package segment." @@ -12192,15 +12181,15 @@ msgstr "" #: platform/android/export/export.cpp msgid "The package must have at least one '.' separator." -msgstr "" +msgstr "Kí tự phân cách '.' phải xuất hiện ít nhất một lần trong tên gói." #: platform/android/export/export.cpp msgid "Select device from the list" -msgstr "" +msgstr "Chọn thiết bị trong danh sách" #: platform/android/export/export.cpp msgid "Unable to find the 'apksigner' tool." -msgstr "" +msgstr "Không tìm thấy công cụ 'apksigner'." #: platform/android/export/export.cpp msgid "" @@ -12228,11 +12217,11 @@ msgstr "" #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" -msgstr "" +msgstr "Thiếu thư mục 'platform-tools'!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "" +msgstr "Không tìm thấy lệnh adb trong bộ Android SDK platform-tools." #: platform/android/export/export.cpp msgid "Please check in the Android SDK directory specified in Editor Settings." @@ -12240,26 +12229,27 @@ msgstr "" #: platform/android/export/export.cpp msgid "Missing 'build-tools' directory!" -msgstr "" +msgstr "Thiếu thư mục 'build-tools'!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "" +msgstr "Không tìm thấy lệnh apksigner của bộ Android SDK build-tools." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." -msgstr "" +msgstr "Khóa công khai của bộ APK mở rộng không hợp lệ." #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid package name:" -msgstr "Kích thước font không hợp lệ." +msgstr "Tên gói không hợp lệ:" #: platform/android/export/export.cpp msgid "" "Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " "project setting (changed in Godot 3.2.2).\n" msgstr "" +"Cài đặt dự án chứa module không hợp lệ \"GodotPaymentV3\" ở mục \"android/" +"modules\" (đã thay đổi từ Godot 3.2.2).\n" #: platform/android/export/export.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." @@ -12269,12 +12259,14 @@ msgstr "" msgid "" "\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR" "\"." -msgstr "" +msgstr "\"Bậc tự do\" chỉ dùng được khi \"Xr Mode\" là \"Oculus Mobile VR\"." #: platform/android/export/export.cpp msgid "" "\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"." msgstr "" +"\"Theo dõi chuyển động tay\" chỉ dùng được khi \"Xr Mode\" là \"Oculus " +"Mobile VR\"." #: platform/android/export/export.cpp msgid "" @@ -12284,10 +12276,11 @@ msgstr "" #: platform/android/export/export.cpp msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." msgstr "" +"\"Xuất AAB\" chỉ dùng được khi \"Sử dụng Bản dựng tùy chỉnh\" được bật." #: platform/android/export/export.cpp msgid "Invalid filename! Android App Bundle requires the *.aab extension." -msgstr "" +msgstr "Tên tệp không hợp lệ! Android App Bundle cần đuôi *.aab ở cuối." #: platform/android/export/export.cpp msgid "APK Expansion not compatible with Android App Bundle." @@ -12295,7 +12288,7 @@ msgstr "" #: platform/android/export/export.cpp msgid "Invalid filename! Android APK requires the *.apk extension." -msgstr "" +msgstr "Tên tệp không hợp lệ! Android APK cần đuôi *.apk ở cuối." #: platform/android/export/export.cpp msgid "" @@ -12326,8 +12319,8 @@ msgid "" "Building of Android project failed, check output for the error.\n" "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"Xây dựng dự án Android không thành công, kiểm tra lỗi đầu ra.\n" -"Hoặc truy cập 'docs.godotengine.org' xem tài liệu xây dựng Android." +"Xây dựng dự án Android thất bại, hãy kiểm tra đầu ra để biết lỗi.\n" +"Hoặc truy cập 'docs.godotengine.org' để xem cách xây dựng Android." #: platform/android/export/export.cpp msgid "Moving output" @@ -12362,7 +12355,7 @@ msgstr "" #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "Dừng Máy chủ HTTP" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -12378,11 +12371,11 @@ msgstr "Không viết được file:" #: platform/javascript/export/export.cpp msgid "Could not open template for export:" -msgstr "" +msgstr "Không thể mở bản mẫu để xuất:" #: platform/javascript/export/export.cpp msgid "Invalid export template:" -msgstr "" +msgstr "Bản xuất mẫu không hợp lệ:" #: platform/javascript/export/export.cpp msgid "Could not read custom HTML shell:" @@ -12422,49 +12415,52 @@ msgid "Invalid publisher GUID." msgstr "Kích thước font không hợp lệ." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid background color." -msgstr "Kích thước font không hợp lệ." +msgstr "Màu nền không hợp lệ." #: platform/uwp/export/export.cpp msgid "Invalid Store Logo image dimensions (should be 50x50)." -msgstr "" +msgstr "Kích thước ảnh Logo Store không hợp lệ (phải là 50x50)." #: platform/uwp/export/export.cpp msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." -msgstr "" +msgstr "Kích thước ảnh logo vuông 44x44 không hợp lệ (phải là 44x44)." #: platform/uwp/export/export.cpp msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." -msgstr "" +msgstr "Kích thước ảnh logo vuông 71x71 không hợp lệ (phải là 71x71)." #: platform/uwp/export/export.cpp msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." -msgstr "" +msgstr "Kích thước ảnh logo vuông 150x150 không hợp lệ (phải là 150x150)." #: platform/uwp/export/export.cpp msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." -msgstr "" +msgstr "Kích thước ảnh logo vuông 310x310 không hợp lệ (phải là 310x310)." #: platform/uwp/export/export.cpp msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." -msgstr "" +msgstr "Kích thước ảnh logo 310x150 không hợp lệ (phải là 310x150)." #: platform/uwp/export/export.cpp msgid "Invalid splash screen image dimensions (should be 620x300)." -msgstr "" +msgstr "Ảnh mở màn có kích thước không hợp lệ (phải là 620x300)." #: 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 "" +"Tài nguyên SpriteFrames phải được tạo hoặc đặt trong thuộc tính \"Khung hình" +"\" thì AnimatedSprite mới hiển thị các khung hình được." #: 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 "" +"Chỉ cho phép một CanvasModulate (không ẩn) ứng với một Cảnh (hoặc một tập " +"Cảnh đã được tạo). Cái đầu tiên sẽ chạy, những cái sau sẽ bị lờ đi." #: scene/2d/collision_object_2d.cpp msgid "" @@ -12472,6 +12468,10 @@ msgid "" "Consider adding a CollisionShape2D or CollisionPolygon2D as a child to " "define its shape." msgstr "" +"Nút này không có hình thù, nên không thể va chạm hoặc tương tác với các vật " +"khác.\n" +"Hãy thêm nút con CollisionShape2D hoặc CollisionPolygon2D để định dạng cho " +"nút này." #: scene/2d/collision_polygon_2d.cpp msgid "" @@ -12479,18 +12479,21 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" +"CollisionPolygon2D nhằm mục đích tạo khối va chạm cho những nút kế thừa từ " +"CollisionObject2D. Vậy nên hãy cho nút ấy làm con của Area2D, StaticBody2D, " +"RigidBody2D, KinematicBody2D, ... để tạo khối va chạm." #: scene/2d/collision_polygon_2d.cpp msgid "An empty CollisionPolygon2D has no effect on collision." -msgstr "" +msgstr "ColiisionPolygon2D rỗng sẽ không phản ứng gì khi có va chạm." #: scene/2d/collision_polygon_2d.cpp msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." -msgstr "" +msgstr "Đa giác không hợp lệ. Cần ít nhất 3 điểm trong chế độ dựng \"Solids\"." #: scene/2d/collision_polygon_2d.cpp msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." -msgstr "" +msgstr "Đa giác không hợp lệ. Cần ít nhất 2 điểm trong chế độ dựng 'Segments'." #: scene/2d/collision_shape_2d.cpp msgid "" @@ -12498,44 +12501,52 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" +"CollisionShape2D nhằm mục đích tạo khối va chạm cho những nút kế thừa từ " +"CollisionObject2D. Vậy nên hãy cho nút ấy làm con của Area2D, StaticBody2D, " +"RigidBody2D, KinematicBody2D, ... để tạo khối va chạm." #: scene/2d/collision_shape_2d.cpp msgid "" "A shape must be provided for CollisionShape2D to function. Please create a " "shape resource for it!" msgstr "" +"CollisionShape2D cần một khối hình mới hoạt động được. Hãy tạo một tài " +"nguyên khối hình cho nó!" #: 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 "" +"Khối hình đa giác không được nhằm để dùng hoặc chỉnh sửa thông qua nút " +"CollisionShape2D. Hãy chuyển qua dùng nút CollisionPolygon2D." #: scene/2d/cpu_particles_2d.cpp msgid "" "CPUParticles2D animation requires the usage of a CanvasItemMaterial with " "\"Particles Animation\" enabled." msgstr "" +"Hoạt ảnh CPUParticles2D cần CanvasItemMaterial bật \"Particles Animation\"." #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be PhysicsBody2Ds" -msgstr "" +msgstr "Nút A và Nút B phải là PhysicsBody2D" #: scene/2d/joints_2d.cpp msgid "Node A must be a PhysicsBody2D" -msgstr "" +msgstr "Nút A phải là PhysicsBody2D" #: scene/2d/joints_2d.cpp msgid "Node B must be a PhysicsBody2D" -msgstr "" +msgstr "Nút B phải là PhysicsBody2D" #: scene/2d/joints_2d.cpp msgid "Joint is not connected to two PhysicsBody2Ds" -msgstr "" +msgstr "Khớp nối chưa kết nối tới hai PhysicsBody2D" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be different PhysicsBody2Ds" -msgstr "" +msgstr "Nút A và Nút B phải là 2 PhysicsBody2D khác nhau" #: scene/2d/light_2d.cpp msgid "" @@ -12568,6 +12579,7 @@ msgstr "" msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" +"Nút ParallaxLayer chỉ hoạt động khi là con của một nút ParallaxBackground." #: scene/2d/particles_2d.cpp msgid "" @@ -12587,10 +12599,11 @@ msgid "" "Particles2D animation requires the usage of a CanvasItemMaterial with " "\"Particles Animation\" enabled." msgstr "" +"Hoạt ảnh Particles2D cần CanvasItemMaterial bật \"Particles Animation\"." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." -msgstr "" +msgstr "PathFollow2D chỉ hoạt động khi được đặt làm con của một nút Path2D." #: scene/2d/physics_body_2d.cpp msgid "" @@ -12602,6 +12615,8 @@ msgstr "" #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." msgstr "" +"Thuộc tính Đường dẫn phải chỉ đến một nút Node2D hợp lệ thì mới hoạt động " +"được." #: scene/2d/skeleton_2d.cpp msgid "This Bone2D chain should end at a Skeleton2D node." @@ -12610,11 +12625,12 @@ msgstr "" #: scene/2d/skeleton_2d.cpp msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node." msgstr "" +"Bone2D chỉ hoạt động khi là con một nút Skeleton2D hoặc một Bone2D khác ." #: scene/2d/skeleton_2d.cpp msgid "" "This bone lacks a proper REST pose. Go to the Skeleton2D node and set one." -msgstr "" +msgstr "Thanh xương này thiếu dáng NGHỈ. Hãy đặt một dáng tại nút Skeleton2D." #: scene/2d/tile_map.cpp msgid "" @@ -12913,7 +12929,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." -msgstr "Chọn một màu từ cửa sổ biên tập" +msgstr "Chọn một màu từ cửa sổ biên tập." #: scene/gui/color_picker.cpp msgid "HSV" @@ -13014,7 +13030,7 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." -msgstr "nguồn vô hiệu cho xem trước" +msgstr "Nguồn vô hiệu cho xem trước." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index deca89e9ea..a1c1bd4aea 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -81,7 +81,7 @@ msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2021-03-16 10:40+0000\n" +"PO-Revision-Date: 2021-03-21 12:25+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" @@ -790,7 +790,7 @@ msgstr "标准" #: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" -msgstr "开启/关闭脚本面板" +msgstr "切换脚本面板" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -3660,6 +3660,11 @@ 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 "无法移动或重命名根资源。" @@ -4057,6 +4062,10 @@ msgid "Reset to Defaults" msgstr "重置为默认值" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d 个文件" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 2009ba8f20..030f678592 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -3764,6 +3764,11 @@ 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 #, fuzzy msgid "Cannot move/rename resources root." msgstr "不能移動/重新命名 resources root." @@ -4189,6 +4194,10 @@ msgid "Reset to Defaults" msgstr "預設" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp #, fuzzy msgid "%d Files" msgstr "檔案" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 62ef5a616c..2c60984b36 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -3610,6 +3610,11 @@ 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 "無法移動或重新命名根資源。" @@ -4007,6 +4012,10 @@ msgid "Reset to Defaults" msgstr "重設為預設" #: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp msgid "%d Files" msgstr "%d 個檔案" |