diff options
Diffstat (limited to 'editor')
387 files changed, 34610 insertions, 11770 deletions
diff --git a/editor/action_map_editor.cpp b/editor/action_map_editor.cpp index 71c76f57cf..3eab494761 100644 --- a/editor/action_map_editor.cpp +++ b/editor/action_map_editor.cpp @@ -29,10 +29,11 @@ /*************************************************************************/ #include "action_map_editor.h" + #include "core/input/input_map.h" #include "core/os/keyboard.h" #include "editor/editor_scale.h" -#include "scene/gui/center_container.h" +#include "scene/gui/separator.h" ///////////////////////////////////////// @@ -561,8 +562,6 @@ void InputEventConfigurationDialog::_notification(int p_what) { _update_input_list(); } break; - default: - break; } } @@ -1013,8 +1012,6 @@ void ActionMapEditor::_notification(int p_what) { case NOTIFICATION_THEME_CHANGED: { action_list_search->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); } break; - default: - break; } } diff --git a/editor/action_map_editor.h b/editor/action_map_editor.h index e61d1a334a..de24d3ee1f 100644 --- a/editor/action_map_editor.h +++ b/editor/action_map_editor.h @@ -31,8 +31,14 @@ #ifndef ACTION_MAP_EDITOR_H #define ACTION_MAP_EDITOR_H -#include "editor/editor_data.h" -#include <scene/gui/color_rect.h> +#include "scene/gui/check_box.h" +#include "scene/gui/check_button.h" +#include "scene/gui/color_rect.h" +#include "scene/gui/dialogs.h" +#include "scene/gui/label.h" +#include "scene/gui/option_button.h" +#include "scene/gui/tab_container.h" +#include "scene/gui/tree.h" // Confirmation Dialog used when configuring an input event. // Separate from ActionMapEditor for code cleanliness and separation of responsibilities. diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index da376c588e..c8c8c7d891 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -31,10 +31,12 @@ #include "animation_bezier_editor.h" #include "editor/editor_node.h" -#include "editor_scale.h" +#include "editor/editor_scale.h" #include "scene/gui/view_panner.h" #include "scene/resources/text_line.h" +#include <limits.h> + float AnimationBezierTrackEdit::_bezier_h_to_pixel(float p_h) { float h = p_h; h = (h - v_scroll) / v_zoom; @@ -55,15 +57,16 @@ static _FORCE_INLINE_ Vector2 _bezier_interp(real_t t, const Vector2 &start, con void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) { float scale = timeline->get_zoom_scale(); + int limit = timeline->get_name_limit(); - int right_limit = get_size().width - timeline->get_buttons_width(); + int right_limit = get_size().width; //selection may have altered the order of keys Map<float, int> key_order; for (int i = 0; i < animation->track_get_key_count(p_track); i++) { float ofs = animation->track_get_key_time(p_track, i); - if (moving_selection && track == p_track && selection.has(i)) { + if (moving_selection && selection.has(IntPair(p_track, i))) { ofs += moving_selection_offset.x; } @@ -82,11 +85,11 @@ void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) { float offset = animation->track_get_key_time(p_track, i); float height = animation->bezier_track_get_key_value(p_track, i); Vector2 out_handle = animation->bezier_track_get_key_out_handle(p_track, i); - if (track == p_track && moving_handle != 0 && moving_handle_key == i) { + if (p_track == moving_handle_track && moving_handle != 0 && moving_handle_key == i) { out_handle = moving_handle_right; } - if (moving_selection && track == p_track && selection.has(i)) { + if (moving_selection && selection.has(IntPair(p_track, i))) { offset += moving_selection_offset.x; height += moving_selection_offset.y; } @@ -96,11 +99,11 @@ void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) { float offset_n = animation->track_get_key_time(p_track, i_n); float height_n = animation->bezier_track_get_key_value(p_track, i_n); Vector2 in_handle = animation->bezier_track_get_key_in_handle(p_track, i_n); - if (track == p_track && moving_handle != 0 && moving_handle_key == i_n) { + if (p_track == moving_handle_track && moving_handle != 0 && moving_handle_key == i_n) { in_handle = moving_handle_left; } - if (moving_selection && track == p_track && selection.has(i_n)) { + if (moving_selection && selection.has(IntPair(p_track, i_n))) { offset_n += moving_selection_offset.x; height_n += moving_selection_offset.y; } @@ -217,286 +220,423 @@ void AnimationBezierTrackEdit::_draw_line_clipped(const Vector2 &p_from, const V } void AnimationBezierTrackEdit::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); - } - if (p_what == NOTIFICATION_THEME_CHANGED || p_what == NOTIFICATION_ENTER_TREE) { - close_button->set_icon(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); - - bezier_icon = get_theme_icon(SNAME("KeyBezierPoint"), SNAME("EditorIcons")); - bezier_handle_icon = get_theme_icon(SNAME("KeyBezierHandle"), SNAME("EditorIcons")); - selected_icon = get_theme_icon(SNAME("KeyBezierSelected"), SNAME("EditorIcons")); - } - if (p_what == NOTIFICATION_RESIZED) { - int right_limit = get_size().width - timeline->get_buttons_width(); - int hsep = get_theme_constant(SNAME("hseparation"), SNAME("ItemList")); - int vsep = get_theme_constant(SNAME("vseparation"), SNAME("ItemList")); + switch (p_what) { + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); + } break; - right_column->set_position(Vector2(right_limit + hsep, vsep)); - right_column->set_size(Vector2(timeline->get_buttons_width() - hsep * 2, get_size().y - vsep * 2)); - } - if (p_what == NOTIFICATION_DRAW) { - if (animation.is_null()) { - return; + case NOTIFICATION_ENTER_TREE: { + panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); + [[fallthrough]]; } + case NOTIFICATION_THEME_CHANGED: { + bezier_icon = get_theme_icon(SNAME("KeyBezierPoint"), SNAME("EditorIcons")); + bezier_handle_icon = get_theme_icon(SNAME("KeyBezierHandle"), SNAME("EditorIcons")); + selected_icon = get_theme_icon(SNAME("KeyBezierSelected"), SNAME("EditorIcons")); + } break; - int limit = timeline->get_name_limit(); + case NOTIFICATION_DRAW: { + if (animation.is_null()) { + return; + } - if (has_focus()) { - Color accent = get_theme_color(SNAME("accent_color"), SNAME("Editor")); - accent.a *= 0.7; - draw_rect(Rect2(Point2(), get_size()), accent, false, Math::round(EDSCALE)); - } + int limit = timeline->get_name_limit(); - Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); - int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); - Color color = get_theme_color(SNAME("font_color"), SNAME("Label")); - int hsep = get_theme_constant(SNAME("hseparation"), SNAME("ItemList")); - int vsep = get_theme_constant(SNAME("vseparation"), SNAME("ItemList")); - Color linecolor = color; - linecolor.a = 0.2; + if (has_focus()) { + Color accent = get_theme_color(SNAME("accent_color"), SNAME("Editor")); + accent.a *= 0.7; + draw_rect(Rect2(Point2(), get_size()), accent, false, Math::round(EDSCALE)); + } - draw_line(Point2(limit, 0), Point2(limit, get_size().height), linecolor, Math::round(EDSCALE)); + Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); + int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); + Color color = get_theme_color(SNAME("font_color"), SNAME("Label")); + int hsep = get_theme_constant(SNAME("hseparation"), SNAME("ItemList")); + int vsep = get_theme_constant(SNAME("vseparation"), SNAME("ItemList")); + Color linecolor = color; + linecolor.a = 0.2; - int right_limit = get_size().width - timeline->get_buttons_width(); + draw_line(Point2(limit, 0), Point2(limit, get_size().height), linecolor, Math::round(EDSCALE)); - draw_line(Point2(right_limit, 0), Point2(right_limit, get_size().height), linecolor, Math::round(EDSCALE)); + int right_limit = get_size().width; - String base_path = animation->track_get_path(track); - int end = base_path.find(":"); - if (end != -1) { - base_path = base_path.substr(0, end + 1); - } + int vofs = vsep; + int margin = 0; - // NAMES AND ICON - int vofs = vsep; - int margin = 0; + Map<int, Color> subtrack_colors; + Color selected_track_color; + subtracks.clear(); + subtrack_icons.clear(); - { - NodePath path = animation->track_get_path(track); + Map<String, Vector<int>> track_indices; + int track_count = animation->get_track_count(); + for (int i = 0; i < track_count; ++i) { + if (animation->track_get_type(i) != Animation::TrackType::TYPE_BEZIER) { + continue; + } - Node *node = nullptr; + String base_path = animation->track_get_path(i); + if (is_filtered) { + if (root && root->has_node(base_path)) { + Node *node = root->get_node(base_path); + if (!node) { + continue; // No node, no filter. + } + if (!EditorNode::get_singleton()->get_editor_selection()->is_selected(node)) { + continue; // Skip track due to not selected. + } + } + } - if (root && root->has_node(path)) { - node = root->get_node(path); + int end = base_path.find(":"); + if (end != -1) { + base_path = base_path.substr(0, end + 1); + } + Vector<int> indices = track_indices.has(base_path) ? track_indices[base_path] : Vector<int>(); + indices.push_back(i); + track_indices[base_path] = indices; } - String text; + for (const KeyValue<String, Vector<int>> &E : track_indices) { + String base_path = E.key; - if (node) { - int ofs = 0; + Vector<int> tracks = E.value; - Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(node, "Node"); + // NAMES AND ICON + { + NodePath path = animation->track_get_path(tracks[0]); - text = node->get_name(); - ofs += hsep; - ofs += icon->get_width(); + Node *node = nullptr; - TextLine text_buf = TextLine(text, font, font_size); - text_buf.set_width(limit - ofs - hsep); + if (root && root->has_node(path)) { + node = root->get_node(path); + } - int h = MAX(text_buf.get_size().y, icon->get_height()); + String text; - draw_texture(icon, Point2(ofs, vofs + int(h - icon->get_height()) / 2)); + if (node) { + int ofs = 0; - margin = icon->get_width(); + Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(node, "Node"); - Vector2 string_pos = Point2(ofs, vofs + (h - text_buf.get_size().y) / 2 + text_buf.get_line_ascent()); - string_pos = string_pos.floor(); - text_buf.draw(get_canvas_item(), string_pos, color); + text = node->get_name(); + ofs += hsep; - vofs += h + vsep; - } - } + TextLine text_buf = TextLine(text, font, font_size); + text_buf.set_width(limit - ofs - icon->get_width() - hsep); - // RELATED TRACKS TITLES + int h = MAX(text_buf.get_size().y, icon->get_height()); - Map<int, Color> subtrack_colors; - subtracks.clear(); + draw_texture(icon, Point2(ofs, vofs + int(h - icon->get_height()) / 2)); + ofs += icon->get_width(); - for (int i = 0; i < animation->get_track_count(); i++) { - if (animation->track_get_type(i) != Animation::TYPE_BEZIER) { - continue; - } - String path = animation->track_get_path(i); - if (!path.begins_with(base_path)) { - continue; //another node - } - path = path.replace_first(base_path, ""); - - Color cc = color; - TextLine text_buf = TextLine(path, font, font_size); - text_buf.set_width(limit - margin - hsep); - - Rect2 rect = Rect2(margin, vofs, limit - margin - hsep, text_buf.get_size().y + vsep); - if (i != track) { - cc.a *= 0.7; - uint32_t hash = path.hash(); - hash = ((hash >> 16) ^ hash) * 0x45d9f3b; - hash = ((hash >> 16) ^ hash) * 0x45d9f3b; - hash = (hash >> 16) ^ hash; - float h = (hash % 65535) / 65536.0; - Color subcolor; - subcolor.set_hsv(h, 0.2, 0.8); - subcolor.a = 0.5; - draw_rect(Rect2(0, vofs + text_buf.get_size().y * 0.1, margin - hsep, text_buf.get_size().y * 0.8), subcolor); - subtrack_colors[i] = subcolor; - - subtracks[i] = rect; - } else { - Color ac = get_theme_color(SNAME("accent_color"), SNAME("Editor")); - ac.a = 0.5; - draw_rect(rect, ac); - } + margin = icon->get_width(); - Vector2 string_pos = Point2(margin, vofs + text_buf.get_line_ascent()); - text_buf.draw(get_canvas_item(), string_pos, cc); + Vector2 string_pos = Point2(ofs, vofs); + string_pos = string_pos.floor(); + text_buf.draw(get_canvas_item(), string_pos, color); - vofs += text_buf.get_size().y + vsep; - } + vofs += h + vsep; + } + } - Color accent = get_theme_color(SNAME("accent_color"), SNAME("Editor")); + Ref<Texture2D> remove = get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")); + float remove_hpos = limit - hsep - remove->get_width(); - { //guides - float min_left_scale = font->get_height(font_size) + vsep; + Ref<Texture2D> lock = get_theme_icon(SNAME("Lock"), SNAME("EditorIcons")); + Ref<Texture2D> unlock = get_theme_icon(SNAME("Unlock"), SNAME("EditorIcons")); + float lock_hpos = remove_hpos - hsep - lock->get_width(); - float scale = (min_left_scale * 2) * v_zoom; - float step = Math::pow(10.0, Math::round(Math::log(scale / 5.0) / Math::log(10.0))) * 5.0; - scale = Math::snapped(scale, step); + Ref<Texture2D> visible = get_theme_icon(SNAME("GuiVisibilityVisible"), SNAME("EditorIcons")); + Ref<Texture2D> hidden = get_theme_icon(SNAME("GuiVisibilityHidden"), SNAME("EditorIcons")); + float visibility_hpos = lock_hpos - hsep - visible->get_width(); - while (scale / v_zoom < min_left_scale * 2) { - scale += step; - } + Ref<Texture2D> solo = get_theme_icon(SNAME("AudioBusSolo"), SNAME("EditorIcons")); + float solo_hpos = visibility_hpos - hsep - solo->get_width(); - bool first = true; - int prev_iv = 0; - for (int i = font->get_height(font_size); i < get_size().height; i++) { - float ofs = get_size().height / 2 - i; - ofs *= v_zoom; - ofs += v_scroll; + float buttons_width = remove->get_width() + lock->get_width() + visible->get_width() + solo->get_width() + hsep * 3; - int iv = int(ofs / scale); - if (ofs < 0) { - iv -= 1; - } - if (!first && iv != prev_iv) { - Color lc = linecolor; - lc.a *= 0.5; - draw_line(Point2(limit, i), Point2(right_limit, i), lc, Math::round(EDSCALE)); - Color c = color; - c.a *= 0.5; - draw_string(font, Point2(limit + 8, i - 2), TS->format_number(rtos(Math::snapped((iv + 1) * scale, step))), HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, c); - } + for (int i = 0; i < tracks.size(); ++i) { + // RELATED TRACKS TITLES - first = false; - prev_iv = iv; - } - } + int current_track = tracks[i]; + + String path = animation->track_get_path(current_track); + path = path.replace_first(base_path, ""); + + Color cc = color; + TextLine text_buf = TextLine(path, font, font_size); + text_buf.set_width(limit - margin - buttons_width); + + Rect2 rect = Rect2(margin, vofs, solo_hpos - hsep - solo->get_width(), text_buf.get_size().y + vsep); + + cc.a *= 0.7; + float h; + if (path.ends_with(":x")) { + h = 0; + } else if (path.ends_with(":y")) { + h = 0.33f; + } else if (path.ends_with(":z")) { + h = 0.66f; + } else { + uint32_t hash = path.hash(); + hash = ((hash >> 16) ^ hash) * 0x45d9f3b; + hash = ((hash >> 16) ^ hash) * 0x45d9f3b; + hash = (hash >> 16) ^ hash; + h = (hash % 65535) / 65536.0; + } + + if (current_track != selected_track) { + Color track_color; + if (locked_tracks.has(current_track)) { + track_color.set_hsv(h, 0, 0.4); + } else { + track_color.set_hsv(h, 0.2, 0.8); + } + track_color.a = 0.5; + draw_rect(Rect2(0, vofs, margin - hsep, text_buf.get_size().y * 0.8), track_color); + subtrack_colors[current_track] = track_color; - { //draw OTHER curves + subtracks[current_track] = rect; + } else { + Color ac = get_theme_color(SNAME("accent_color"), SNAME("Editor")); + ac.a = 0.5; + draw_rect(rect, ac); + if (locked_tracks.has(selected_track)) { + selected_track_color.set_hsv(h, 0.0, 0.4); + } else { + selected_track_color.set_hsv(h, 0.8, 0.8); + } + } - float scale = timeline->get_zoom_scale(); - Ref<Texture2D> point = get_theme_icon(SNAME("KeyValue"), SNAME("EditorIcons")); - for (const KeyValue<int, Color> &E : subtrack_colors) { - _draw_track(E.key, E.value); + Vector2 string_pos = Point2(margin, vofs); + text_buf.draw(get_canvas_item(), string_pos, cc); - for (int i = 0; i < animation->track_get_key_count(E.key); i++) { - float offset = animation->track_get_key_time(E.key, i); - float value = animation->bezier_track_get_key_value(E.key, i); + float icon_start_height = vofs + rect.size.y / 2; + Rect2 remove_rect = Rect2(remove_hpos, icon_start_height - remove->get_height() / 2, remove->get_width(), remove->get_height()); + draw_texture(remove, remove_rect.position); - Vector2 pos((offset - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value)); + Rect2 lock_rect = Rect2(lock_hpos, icon_start_height - lock->get_height() / 2, lock->get_width(), lock->get_height()); + if (locked_tracks.has(current_track)) { + draw_texture(lock, lock_rect.position); + } else { + draw_texture(unlock, lock_rect.position); + } - if (pos.x >= limit && pos.x <= right_limit) { - draw_texture(point, pos - point->get_size() / 2, E.value); + Rect2 visible_rect = Rect2(visibility_hpos, icon_start_height - visible->get_height() / 2, visible->get_width(), visible->get_height()); + if (hidden_tracks.has(current_track)) { + draw_texture(hidden, visible_rect.position); + } else { + draw_texture(visible, visible_rect.position); } + + Rect2 solo_rect = Rect2(solo_hpos, icon_start_height - solo->get_height() / 2, solo->get_width(), solo->get_height()); + draw_texture(solo, solo_rect.position); + + Map<int, Rect2> track_icons; + track_icons[REMOVE_ICON] = remove_rect; + track_icons[LOCK_ICON] = lock_rect; + track_icons[VISIBILITY_ICON] = visible_rect; + track_icons[SOLO_ICON] = solo_rect; + + subtrack_icons[current_track] = track_icons; + + vofs += text_buf.get_size().y + vsep; } } - //draw edited curve - const Color highlight = get_theme_color(SNAME("highlight_color"), SNAME("Editor")); - _draw_track(track, highlight); - } + Color accent = get_theme_color(SNAME("accent_color"), SNAME("Editor")); - //draw editor handles - { - edit_points.clear(); + { //guides + float min_left_scale = font->get_height(font_size) + vsep; - float scale = timeline->get_zoom_scale(); - for (int i = 0; i < animation->track_get_key_count(track); i++) { - float offset = animation->track_get_key_time(track, i); - float value = animation->bezier_track_get_key_value(track, i); + float scale = (min_left_scale * 2) * v_zoom; + float step = Math::pow(10.0, Math::round(Math::log(scale / 5.0) / Math::log(10.0))) * 5.0; + scale = Math::snapped(scale, step); - if (moving_selection && selection.has(i)) { - offset += moving_selection_offset.x; - value += moving_selection_offset.y; + while (scale / v_zoom < min_left_scale * 2) { + scale += step; } - Vector2 pos((offset - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value)); + bool first = true; + int prev_iv = 0; + for (int i = font->get_height(font_size); i < get_size().height; i++) { + float ofs = get_size().height / 2 - i; + ofs *= v_zoom; + ofs += v_scroll; + + int iv = int(ofs / scale); + if (ofs < 0) { + iv -= 1; + } + if (!first && iv != prev_iv) { + Color lc = linecolor; + lc.a *= 0.5; + draw_line(Point2(limit, i), Point2(right_limit, i), lc, Math::round(EDSCALE)); + Color c = color; + c.a *= 0.5; + draw_string(font, Point2(limit + 8, i - 2), TS->format_number(rtos(Math::snapped((iv + 1) * scale, step))), HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, c); + } - Vector2 in_vec = animation->bezier_track_get_key_in_handle(track, i); - if (moving_handle != 0 && moving_handle_key == i) { - in_vec = moving_handle_left; + first = false; + prev_iv = iv; } - Vector2 pos_in(((offset + in_vec.x) - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value + in_vec.y)); + } - Vector2 out_vec = animation->bezier_track_get_key_out_handle(track, i); + { //draw OTHER curves - if (moving_handle != 0 && moving_handle_key == i) { - out_vec = moving_handle_right; - } + float scale = timeline->get_zoom_scale(); + Ref<Texture2D> point = get_theme_icon(SNAME("KeyValue"), SNAME("EditorIcons")); + for (const KeyValue<int, Color> &E : subtrack_colors) { + if (hidden_tracks.has(E.key)) { + continue; + } + _draw_track(E.key, E.value); - Vector2 pos_out(((offset + out_vec.x) - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value + out_vec.y)); + for (int i = 0; i < animation->track_get_key_count(E.key); i++) { + float offset = animation->track_get_key_time(E.key, i); + float value = animation->bezier_track_get_key_value(E.key, i); - _draw_line_clipped(pos, pos_in, accent, limit, right_limit); - _draw_line_clipped(pos, pos_out, accent, limit, right_limit); + Vector2 pos((offset - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value)); - EditPoint ep; - if (pos.x >= limit && pos.x <= right_limit) { - ep.point_rect.position = (pos - bezier_icon->get_size() / 2).floor(); - ep.point_rect.size = bezier_icon->get_size(); - if (selection.has(i)) { - draw_texture(selected_icon, ep.point_rect.position); - draw_string(font, ep.point_rect.position + Vector2(8, -font->get_height(font_size) - 8), TTR("Time:") + " " + TS->format_number(rtos(Math::snapped(offset, 0.001))), HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, accent); - draw_string(font, ep.point_rect.position + Vector2(8, -8), TTR("Value:") + " " + TS->format_number(rtos(Math::snapped(value, 0.001))), HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, accent); - } else { - draw_texture(bezier_icon, ep.point_rect.position); + if (pos.x >= limit && pos.x <= right_limit) { + draw_texture(point, pos - point->get_size() / 2, E.value); + } } - ep.point_rect = ep.point_rect.grow(ep.point_rect.size.width * 0.5); - } - if (pos_in.x >= limit && pos_in.x <= right_limit) { - ep.in_rect.position = (pos_in - bezier_handle_icon->get_size() / 2).floor(); - ep.in_rect.size = bezier_handle_icon->get_size(); - draw_texture(bezier_handle_icon, ep.in_rect.position); - ep.in_rect = ep.in_rect.grow(ep.in_rect.size.width * 0.5); } - if (pos_out.x >= limit && pos_out.x <= right_limit) { - ep.out_rect.position = (pos_out - bezier_handle_icon->get_size() / 2).floor(); - ep.out_rect.size = bezier_handle_icon->get_size(); - draw_texture(bezier_handle_icon, ep.out_rect.position); - ep.out_rect = ep.out_rect.grow(ep.out_rect.size.width * 0.5); + + if (track_count > 0 && !hidden_tracks.has(selected_track)) { + //draw edited curve + _draw_track(selected_track, selected_track_color); } - edit_points.push_back(ep); } - } - if (box_selecting) { - Vector2 bs_from = box_selection_from; - Vector2 bs_to = box_selection_to; - if (bs_from.x > bs_to.x) { - SWAP(bs_from.x, bs_to.x); + //draw editor handles + { + edit_points.clear(); + float scale = timeline->get_zoom_scale(); + + for (int i = 0; i < track_count; ++i) { + if (animation->track_get_type(i) != Animation::TrackType::TYPE_BEZIER || hidden_tracks.has(i)) { + continue; + } + + if (hidden_tracks.has(i) || locked_tracks.has(i)) { + continue; + } + + int key_count = animation->track_get_key_count(i); + String path = animation->track_get_path(i); + + if (is_filtered) { + if (root && root->has_node(path)) { + Node *node = root->get_node(path); + if (!node) { + continue; // No node, no filter. + } + if (!EditorNode::get_singleton()->get_editor_selection()->is_selected(node)) { + continue; // Skip track due to not selected. + } + } + } + + for (int j = 0; j < key_count; ++j) { + float offset = animation->track_get_key_time(i, j); + float value = animation->bezier_track_get_key_value(i, j); + + if (moving_selection && selection.has(IntPair(i, j))) { + offset += moving_selection_offset.x; + value += moving_selection_offset.y; + } + + Vector2 pos((offset - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value)); + + Vector2 in_vec = animation->bezier_track_get_key_in_handle(i, j); + if (moving_handle != 0 && moving_handle_track == i && moving_handle_key == j) { + in_vec = moving_handle_left; + } + Vector2 pos_in(((offset + in_vec.x) - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value + in_vec.y)); + + Vector2 out_vec = animation->bezier_track_get_key_out_handle(i, j); + + if (moving_handle != 0 && moving_handle_track == i && moving_handle_key == j) { + out_vec = moving_handle_right; + } + + Vector2 pos_out(((offset + out_vec.x) - timeline->get_value()) * scale + limit, _bezier_h_to_pixel(value + out_vec.y)); + + if (i == selected_track || selection.has(IntPair(i, j))) { + _draw_line_clipped(pos, pos_in, accent, limit, right_limit); + _draw_line_clipped(pos, pos_out, accent, limit, right_limit); + } + + EditPoint ep; + ep.track = i; + ep.key = j; + if (pos.x >= limit && pos.x <= right_limit) { + ep.point_rect.position = (pos - bezier_icon->get_size() / 2).floor(); + ep.point_rect.size = bezier_icon->get_size(); + if (selection.has(IntPair(i, j))) { + draw_texture(selected_icon, ep.point_rect.position); + draw_string(font, ep.point_rect.position + Vector2(8, -font->get_height(font_size) - 8), TTR("Time:") + " " + TS->format_number(rtos(Math::snapped(offset, 0.001))), HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, accent); + draw_string(font, ep.point_rect.position + Vector2(8, -8), TTR("Value:") + " " + TS->format_number(rtos(Math::snapped(value, 0.001))), HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, accent); + } else { + Color track_color = Color(1, 1, 1, 1); + if (i != selected_track) { + track_color = subtrack_colors[i]; + } + draw_texture(bezier_icon, ep.point_rect.position, track_color); + } + ep.point_rect = ep.point_rect.grow(ep.point_rect.size.width * 0.5); + } + if (i == selected_track || selection.has(IntPair(i, j))) { + if (pos_in.x >= limit && pos_in.x <= right_limit) { + ep.in_rect.position = (pos_in - bezier_handle_icon->get_size() / 2).floor(); + ep.in_rect.size = bezier_handle_icon->get_size(); + draw_texture(bezier_handle_icon, ep.in_rect.position); + ep.in_rect = ep.in_rect.grow(ep.in_rect.size.width * 0.5); + } + if (pos_out.x >= limit && pos_out.x <= right_limit) { + ep.out_rect.position = (pos_out - bezier_handle_icon->get_size() / 2).floor(); + ep.out_rect.size = bezier_handle_icon->get_size(); + draw_texture(bezier_handle_icon, ep.out_rect.position); + ep.out_rect = ep.out_rect.grow(ep.out_rect.size.width * 0.5); + } + } + if (!locked_tracks.has(i)) { + edit_points.push_back(ep); + } + } + } + + for (int i = 0; i < edit_points.size(); ++i) { + if (edit_points[i].track == selected_track) { + EditPoint ep = edit_points[i]; + edit_points.remove_at(i); + edit_points.insert(0, ep); + } + } } - if (bs_from.y > bs_to.y) { - SWAP(bs_from.y, bs_to.y); + + if (box_selecting) { + Vector2 bs_from = box_selection_from; + Vector2 bs_to = box_selection_to; + if (bs_from.x > bs_to.x) { + SWAP(bs_from.x, bs_to.x); + } + if (bs_from.y > bs_to.y) { + SWAP(bs_from.y, bs_to.y); + } + draw_rect( + Rect2(bs_from, bs_to - bs_from), + get_theme_color(SNAME("box_selection_fill_color"), SNAME("Editor"))); + draw_rect( + Rect2(bs_from, bs_to - bs_from), + get_theme_color(SNAME("box_selection_stroke_color"), SNAME("Editor")), + false, + Math::round(EDSCALE)); } - draw_rect( - Rect2(bs_from, bs_to - bs_from), - get_theme_color(SNAME("box_selection_fill_color"), SNAME("Editor"))); - draw_rect( - Rect2(bs_from, bs_to - bs_from), - get_theme_color(SNAME("box_selection_stroke_color"), SNAME("Editor")), - false, - Math::round(EDSCALE)); - } + } break; } } @@ -506,15 +646,7 @@ Ref<Animation> AnimationBezierTrackEdit::get_animation() const { void AnimationBezierTrackEdit::set_animation_and_track(const Ref<Animation> &p_animation, int p_track) { animation = p_animation; - track = p_track; - if (is_connected("select_key", Callable(editor, "_key_selected"))) { - disconnect("select_key", Callable(editor, "_key_selected")); - } - if (is_connected("deselect_key", Callable(editor, "_key_deselected"))) { - disconnect("deselect_key", Callable(editor, "_key_deselected")); - } - connect("select_key", Callable(editor, "_key_selected"), varray(p_track), CONNECT_DEFERRED); - connect("deselect_key", Callable(editor, "_key_deselected"), varray(p_track), CONNECT_DEFERRED); + selected_track = p_track; update(); } @@ -529,11 +661,14 @@ void AnimationBezierTrackEdit::set_undo_redo(UndoRedo *p_undo_redo) { void AnimationBezierTrackEdit::set_timeline(AnimationTimelineEdit *p_timeline) { timeline = p_timeline; timeline->connect("zoom_changed", callable_mp(this, &AnimationBezierTrackEdit::_zoom_changed)); + timeline->connect("name_limit_changed", callable_mp(this, &AnimationBezierTrackEdit::_zoom_changed)); } void AnimationBezierTrackEdit::set_editor(AnimationTrackEditor *p_editor) { editor = p_editor; connect("clear_selection", Callable(editor, "_clear_selection"), varray(false)); + connect("select_key", Callable(editor, "_key_selected"), varray(), CONNECT_DEFERRED); + connect("deselect_key", Callable(editor, "_key_deselected"), varray(), CONNECT_DEFERRED); } void AnimationBezierTrackEdit::_play_position_draw() { @@ -544,9 +679,11 @@ void AnimationBezierTrackEdit::_play_position_draw() { float scale = timeline->get_zoom_scale(); int h = get_size().height; - int px = (-timeline->get_value() + play_position_pos) * scale + timeline->get_name_limit(); + int limit = timeline->get_name_limit(); - if (px >= timeline->get_name_limit() && px < (get_size().width - timeline->get_buttons_width())) { + int px = (-timeline->get_value() + play_position_pos) * scale + limit; + + if (px >= limit && px < (get_size().width)) { Color color = get_theme_color(SNAME("accent_color"), SNAME("Editor")); play_position->draw_line(Point2(px, 0), Point2(px, h), color, Math::round(2 * EDSCALE)); } @@ -565,11 +702,84 @@ void AnimationBezierTrackEdit::set_root(Node *p_root) { root = p_root; } +void AnimationBezierTrackEdit::set_filtered(bool p_filtered) { + is_filtered = p_filtered; + if (animation == nullptr) { + return; + } + String base_path = animation->track_get_path(selected_track); + if (is_filtered) { + if (root && root->has_node(base_path)) { + Node *node = root->get_node(base_path); + if (!node || !EditorNode::get_singleton()->get_editor_selection()->is_selected(node)) { + for (int i = 0; i < animation->get_track_count(); ++i) { + if (animation->track_get_type(i) != Animation::TrackType::TYPE_BEZIER) { + continue; + } + + base_path = animation->track_get_path(i); + if (root && root->has_node(base_path)) { + node = root->get_node(base_path); + if (!node) { + continue; // No node, no filter. + } + if (!EditorNode::get_singleton()->get_editor_selection()->is_selected(node)) { + continue; // Skip track due to not selected. + } + + set_animation_and_track(animation, i); + break; + } + } + } + } + } + update(); +} + void AnimationBezierTrackEdit::_zoom_changed() { update(); play_position->update(); } +void AnimationBezierTrackEdit::_update_locked_tracks_after(int p_track) { + if (locked_tracks.has(p_track)) { + locked_tracks.erase(p_track); + } + + Vector<int> updated_locked_tracks; + for (Set<int>::Element *E = locked_tracks.front(); E; E = E->next()) { + updated_locked_tracks.push_back(E->get()); + } + locked_tracks.clear(); + for (int i = 0; i < updated_locked_tracks.size(); ++i) { + if (updated_locked_tracks[i] > p_track) { + locked_tracks.insert(updated_locked_tracks[i] - 1); + } else { + locked_tracks.insert(updated_locked_tracks[i]); + } + } +} + +void AnimationBezierTrackEdit::_update_hidden_tracks_after(int p_track) { + if (hidden_tracks.has(p_track)) { + hidden_tracks.erase(p_track); + } + + Vector<int> updated_hidden_tracks; + for (Set<int>::Element *E = hidden_tracks.front(); E; E = E->next()) { + updated_hidden_tracks.push_back(E->get()); + } + hidden_tracks.clear(); + for (int i = 0; i < updated_hidden_tracks.size(); ++i) { + if (updated_hidden_tracks[i] > p_track) { + hidden_tracks.insert(updated_hidden_tracks[i] - 1); + } else { + hidden_tracks.insert(updated_hidden_tracks[i]); + } + } +} + String AnimationBezierTrackEdit::get_tooltip(const Point2 &p_pos) const { return Control::get_tooltip(p_pos); } @@ -583,10 +793,10 @@ void AnimationBezierTrackEdit::_clear_selection() { void AnimationBezierTrackEdit::_change_selected_keys_handle_mode(Animation::HandleMode p_mode) { undo_redo->create_action(TTR("Update Selected Key Handles")); double ratio = timeline->get_zoom_scale() * v_zoom; - for (Set<int>::Element *E = selection.back(); E; E = E->prev()) { - const int key_index = E->get(); - undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_handle_mode", track, key_index, animation->bezier_track_get_key_handle_mode(track, key_index), ratio); - undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_handle_mode", track, key_index, p_mode, ratio); + for (SelectionSet::Element *E = selection.back(); E; E = E->prev()) { + const IntPair track_key_pair = E->get(); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_handle_mode", track_key_pair.first, track_key_pair.second, animation->bezier_track_get_key_handle_mode(track_key_pair.first, track_key_pair.second), ratio); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_handle_mode", track_key_pair.first, track_key_pair.second, p_mode, ratio); } undo_redo->commit_action(); } @@ -606,8 +816,8 @@ void AnimationBezierTrackEdit::_select_at_anim(const Ref<Animation> &p_anim, int int idx = animation->track_find_key(p_track, p_pos, true); ERR_FAIL_COND(idx < 0); - selection.insert(idx); - emit_signal(SNAME("select_key"), idx, true); + selection.insert(IntPair(p_track, idx)); + emit_signal(SNAME("select_key"), p_track, idx, true); update(); } @@ -631,14 +841,100 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } } + Ref<InputEventKey> key_press = p_event; + + if (key_press.is_valid() && key_press->is_pressed()) { + if (ED_GET_SHORTCUT("animation_bezier_editor/focus")->matches_event(p_event)) { + SelectionSet focused_keys; + if (selection.is_empty()) { + for (int i = 0; i < edit_points.size(); ++i) { + IntPair key_pair = IntPair(edit_points[i].track, edit_points[i].key); + focused_keys.insert(key_pair); + } + } else { + for (SelectionSet::Element *E = selection.front(); E; E = E->next()) { + focused_keys.insert(E->get()); + if (E->get().second > 0) { + IntPair previous_key = IntPair(E->get().first, E->get().second - 1); + focused_keys.insert(previous_key); + } + if (E->get().second < animation->track_get_key_count(E->get().first) - 1) { + IntPair next_key = IntPair(E->get().first, E->get().second + 1); + focused_keys.insert(next_key); + } + } + } + if (focused_keys.is_empty()) { + accept_event(); + return; + } + + float minimum_time = INFINITY; + float maximum_time = -INFINITY; + float minimum_value = INFINITY; + float maximum_value = -INFINITY; + + for (SelectionSet::Element *E = focused_keys.front(); E; E = E->next()) { + IntPair key_pair = E->get(); + + float time = animation->track_get_key_time(key_pair.first, key_pair.second); + float value = animation->bezier_track_get_key_value(key_pair.first, key_pair.second); + + minimum_time = MIN(time, minimum_time); + maximum_time = MAX(time, maximum_time); + minimum_value = MIN(value, minimum_value); + maximum_value = MAX(value, maximum_value); + } + + float width = get_size().width - timeline->get_name_limit() - timeline->get_buttons_width(); + float padding = width * 0.1; + float desired_scale = (width - padding / 2) / (maximum_time - minimum_time); + minimum_time = MAX(0, minimum_time - (padding / 2) / desired_scale); + + float zv = Math::pow(100 / desired_scale, 0.125f); + if (zv < 1) { + zv = Math::pow(desired_scale / 100, 0.125f) - 1; + zv = 1 - zv; + } + float zoom_value = timeline->get_zoom()->get_max() - zv; + + timeline->get_zoom()->set_value(zoom_value); + timeline->call_deferred("set_value", minimum_time); + + v_scroll = (maximum_value + minimum_value) / 2.0; + v_zoom = (maximum_value - minimum_value) / ((get_size().height - timeline->get_size().height) * 0.9); + + update(); + accept_event(); + return; + } else if (ED_GET_SHORTCUT("animation_bezier_editor/select_all_keys")->matches_event(p_event)) { + for (int i = 0; i < edit_points.size(); ++i) { + selection.insert(IntPair(edit_points[i].track, edit_points[i].key)); + } + + update(); + accept_event(); + return; + } else if (ED_GET_SHORTCUT("animation_bezier_editor/deselect_all_keys")->matches_event(p_event)) { + selection.clear(); + + update(); + accept_event(); + return; + } + } + Ref<InputEventMouseButton> mb = p_event; + int limit = timeline->get_name_limit(); if (mb.is_valid() && mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) { menu_insert_key = mb->get_position(); - if (menu_insert_key.x >= timeline->get_name_limit() && menu_insert_key.x <= get_size().width - timeline->get_buttons_width()) { + if (menu_insert_key.x >= limit && menu_insert_key.x <= get_size().width) { Vector2 popup_pos = get_screen_position() + mb->get_position(); menu->clear(); - menu->add_icon_item(bezier_icon, TTR("Insert Key Here"), MENU_KEY_INSERT); + if (!locked_tracks.has(selected_track) || locked_tracks.has(selected_track)) { + menu->add_icon_item(bezier_icon, TTR("Insert Key Here"), MENU_KEY_INSERT); + } if (selection.size()) { menu->add_separator(); menu->add_icon_item(get_theme_icon(SNAME("Duplicate"), SNAME("EditorIcons")), TTR("Duplicate Selected Key(s)"), MENU_KEY_DUPLICATE); @@ -649,50 +945,163 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { menu->add_icon_item(get_theme_icon(SNAME("BezierHandlesBalanced"), SNAME("EditorIcons")), TTR("Make Handles Balanced"), MENU_KEY_SET_HANDLE_BALANCED); } - menu->set_as_minsize(); - menu->set_position(popup_pos); - menu->popup(); + if (menu->get_item_count()) { + menu->set_as_minsize(); + menu->set_position(popup_pos); + menu->popup(); + } } } if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { for (const KeyValue<int, Rect2> &E : subtracks) { if (E.value.has_point(mb->get_position())) { - set_animation_and_track(animation, E.key); - _clear_selection(); + if (!locked_tracks.has(E.key) && !hidden_tracks.has(E.key)) { + set_animation_and_track(animation, E.key); + _clear_selection(); + } return; } } + for (const KeyValue<int, Map<int, Rect2>> &E : subtrack_icons) { + int track = E.key; + Map<int, Rect2> track_icons = E.value; + for (const KeyValue<int, Rect2> &I : track_icons) { + if (I.value.has_point(mb->get_position())) { + if (I.key == REMOVE_ICON) { + undo_redo->create_action("Remove Bezier Track"); + + undo_redo->add_do_method(this, "_update_locked_tracks_after", track); + undo_redo->add_do_method(this, "_update_hidden_tracks_after", track); + + undo_redo->add_do_method(animation.ptr(), "remove_track", track); + + undo_redo->add_undo_method(animation.ptr(), "add_track", Animation::TrackType::TYPE_BEZIER, track); + undo_redo->add_undo_method(animation.ptr(), "track_set_path", track, animation->track_get_path(track)); + + for (int i = 0; i < animation->track_get_key_count(track); ++i) { + undo_redo->add_undo_method( + animation.ptr(), + "bezier_track_insert_key", + track, animation->track_get_key_time(track, i), + animation->bezier_track_get_key_value(track, i), + animation->bezier_track_get_key_in_handle(track, i), + animation->bezier_track_get_key_out_handle(track, i), + animation->bezier_track_get_key_handle_mode(track, i)); + } + + undo_redo->commit_action(); + + selected_track = CLAMP(selected_track, 0, animation->get_track_count() - 1); + return; + } else if (I.key == LOCK_ICON) { + if (locked_tracks.has(track)) { + locked_tracks.erase(track); + } else { + locked_tracks.insert(track); + if (selected_track == track) { + for (int i = 0; i < animation->get_track_count(); ++i) { + if (!locked_tracks.has(i) && animation->track_get_type(i) == Animation::TrackType::TYPE_BEZIER) { + set_animation_and_track(animation, i); + break; + } + } + } + } + update(); + return; + } else if (I.key == VISIBILITY_ICON) { + if (hidden_tracks.has(track)) { + hidden_tracks.erase(track); + } else { + hidden_tracks.insert(track); + if (selected_track == track) { + for (int i = 0; i < animation->get_track_count(); ++i) { + if (!hidden_tracks.has(i) && animation->track_get_type(i) == Animation::TrackType::TYPE_BEZIER) { + set_animation_and_track(animation, i); + break; + } + } + } + } + + Vector<int> visible_tracks; + for (int i = 0; i < animation->get_track_count(); ++i) { + if (!hidden_tracks.has(i) && animation->track_get_type(i) == Animation::TrackType::TYPE_BEZIER) { + visible_tracks.push_back(i); + } + } + + if (visible_tracks.size() == 1) { + solo_track = visible_tracks[0]; + } else { + solo_track = -1; + } + + update(); + return; + } else if (I.key == SOLO_ICON) { + if (solo_track == track) { + solo_track = -1; + + hidden_tracks.clear(); + } else { + if (hidden_tracks.has(track)) { + hidden_tracks.erase(track); + } + for (int i = 0; i < animation->get_track_count(); ++i) { + if (animation->track_get_type(i) == Animation::TrackType::TYPE_BEZIER) { + if (i != track && !hidden_tracks.has(i)) { + hidden_tracks.insert(i); + } + } + } + + set_animation_and_track(animation, track); + solo_track = track; + } + update(); + return; + } + return; + } + } + } + for (int i = 0; i < edit_points.size(); i++) { //first check point //command makes it ignore the main point, so control point editors can be force-edited //path 2D editing in the 3D and 2D editors works the same way if (!mb->is_command_pressed()) { if (edit_points[i].point_rect.has_point(mb->get_position())) { + IntPair pair = IntPair(edit_points[i].track, edit_points[i].key); if (mb->is_shift_pressed()) { //add to selection - if (selection.has(i)) { - selection.erase(i); + if (selection.has(pair)) { + selection.erase(pair); } else { - selection.insert(i); + selection.insert(pair); } update(); - select_single_attempt = -1; - } else if (selection.has(i)) { + select_single_attempt = IntPair(-1, -1); + } else if (selection.has(pair)) { moving_selection_attempt = true; moving_selection = false; - moving_selection_from_key = i; + moving_selection_from_key = pair.second; + moving_selection_from_track = pair.first; moving_selection_offset = Vector2(); - select_single_attempt = i; + select_single_attempt = pair; update(); } else { moving_selection_attempt = true; moving_selection = true; - moving_selection_from_key = i; + moving_selection_from_key = pair.second; + moving_selection_from_track = pair.first; moving_selection_offset = Vector2(); + set_animation_and_track(animation, pair.first); selection.clear(); - selection.insert(i); + selection.insert(pair); update(); } return; @@ -701,26 +1110,27 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { if (edit_points[i].in_rect.has_point(mb->get_position())) { moving_handle = -1; - moving_handle_key = i; - moving_handle_left = animation->bezier_track_get_key_in_handle(track, i); - moving_handle_right = animation->bezier_track_get_key_out_handle(track, i); + moving_handle_key = edit_points[i].key; + moving_handle_track = edit_points[i].track; + moving_handle_left = animation->bezier_track_get_key_in_handle(edit_points[i].track, edit_points[i].key); + moving_handle_right = animation->bezier_track_get_key_out_handle(edit_points[i].track, edit_points[i].key); update(); return; } if (edit_points[i].out_rect.has_point(mb->get_position())) { moving_handle = 1; - moving_handle_key = i; - moving_handle_left = animation->bezier_track_get_key_in_handle(track, i); - moving_handle_right = animation->bezier_track_get_key_out_handle(track, i); + moving_handle_key = edit_points[i].key; + moving_handle_track = edit_points[i].track; + moving_handle_left = animation->bezier_track_get_key_in_handle(edit_points[i].track, edit_points[i].key); + moving_handle_right = animation->bezier_track_get_key_out_handle(edit_points[i].track, edit_points[i].key); update(); return; - ; } } //insert new point - if (mb->is_command_pressed() && mb->get_position().x >= timeline->get_name_limit() && mb->get_position().x < get_size().width - timeline->get_buttons_width()) { + if (mb->get_position().x >= limit && mb->get_position().x < get_size().width && mb->is_command_pressed()) { Array new_point; new_point.resize(6); @@ -733,34 +1143,35 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { new_point[4] = 0; new_point[5] = 0; - float time = ((mb->get_position().x - timeline->get_name_limit()) / timeline->get_zoom_scale()) + timeline->get_value(); - while (animation->track_find_key(track, time, true) != -1) { + float time = ((mb->get_position().x - limit) / timeline->get_zoom_scale()) + timeline->get_value(); + while (animation->track_find_key(selected_track, time, true) != -1) { time += 0.001; } undo_redo->create_action(TTR("Add Bezier Point")); - undo_redo->add_do_method(animation.ptr(), "track_insert_key", track, time, new_point); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", track, time); + undo_redo->add_do_method(animation.ptr(), "track_insert_key", selected_track, time, new_point); + undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", selected_track, time); undo_redo->commit_action(); //then attempt to move - int index = animation->track_find_key(track, time, true); + int index = animation->track_find_key(selected_track, time, true); ERR_FAIL_COND(index == -1); _clear_selection(); - selection.insert(index); + selection.insert(IntPair(selected_track, index)); moving_selection_attempt = true; moving_selection = false; moving_selection_from_key = index; + moving_selection_from_track = selected_track; moving_selection_offset = Vector2(); - select_single_attempt = -1; + select_single_attempt = IntPair(-1, -1); update(); return; } //box select - if (mb->get_position().x >= timeline->get_name_limit() && mb->get_position().x < get_size().width - timeline->get_buttons_width()) { + if (mb->get_position().x >= limit && mb->get_position().x < get_size().width) { box_selecting_attempt = true; box_selecting = false; box_selecting_add = false; @@ -786,14 +1197,44 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } Rect2 selection_rect(bs_from, bs_to - bs_from); + bool track_set = false; for (int i = 0; i < edit_points.size(); i++) { if (edit_points[i].point_rect.intersects(selection_rect)) { - selection.insert(i); + selection.insert(IntPair(edit_points[i].track, edit_points[i].key)); + if (!track_set) { + track_set = true; + set_animation_and_track(animation, edit_points[i].track); + } } } } else { _clear_selection(); //clicked and nothing happened, so clear the selection + + //select by clicking on curve + int track_count = animation->get_track_count(); + + float animation_length = animation->get_length(); + animation->set_length(real_t(INT_MAX)); //bezier_track_interpolate doesn't find keys if they exist beyond anim length + + float time = ((mb->get_position().x - limit) / timeline->get_zoom_scale()) + timeline->get_value(); + + for (int i = 0; i < track_count; ++i) { + if (animation->track_get_type(i) != Animation::TrackType::TYPE_BEZIER || hidden_tracks.has(i) || locked_tracks.has(i)) { + continue; + } + + float track_h = animation->bezier_track_interpolate(i, time); + float track_height = _bezier_h_to_pixel(track_h); + + if (abs(mb->get_position().y - track_height) < 10) { + set_animation_and_track(animation, i); + break; + } + } + + animation->set_length(animation_length); } + box_selecting_attempt = false; box_selecting = false; update(); @@ -801,10 +1242,10 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { if (moving_handle != 0 && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { undo_redo->create_action(TTR("Move Bezier Points")); - undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", track, moving_handle_key, moving_handle_left); - undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", track, moving_handle_key, moving_handle_right); - undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_in_handle", track, moving_handle_key, animation->bezier_track_get_key_in_handle(track, moving_handle_key)); - undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_out_handle", track, moving_handle_key, animation->bezier_track_get_key_out_handle(track, moving_handle_key)); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", selected_track, moving_handle_key, moving_handle_left); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", selected_track, moving_handle_key, moving_handle_right); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_in_handle", selected_track, moving_handle_key, animation->bezier_track_get_key_in_handle(selected_track, moving_handle_key)); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_out_handle", selected_track, moving_handle_key, animation->bezier_track_get_key_out_handle(selected_track, moving_handle_key)); undo_redo->commit_action(); moving_handle = 0; @@ -819,60 +1260,52 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { List<AnimMoveRestore> to_restore; // 1-remove the keys - for (Set<int>::Element *E = selection.back(); E; E = E->prev()) { - undo_redo->add_do_method(animation.ptr(), "track_remove_key", track, E->get()); + for (SelectionSet::Element *E = selection.back(); E; E = E->prev()) { + undo_redo->add_do_method(animation.ptr(), "track_remove_key", E->get().first, E->get().second); } // 2- remove overlapped keys - for (Set<int>::Element *E = selection.back(); E; E = E->prev()) { - float newtime = editor->snap_time(animation->track_get_key_time(track, E->get()) + moving_selection_offset.x); + for (SelectionSet::Element *E = selection.back(); E; E = E->prev()) { + float newtime = editor->snap_time(animation->track_get_key_time(E->get().first, E->get().second) + moving_selection_offset.x); - int idx = animation->track_find_key(track, newtime, true); + int idx = animation->track_find_key(E->get().first, newtime, true); if (idx == -1) { continue; } - if (selection.has(idx)) { + if (selection.has(IntPair(E->get().first, idx))) { continue; //already in selection, don't save } - undo_redo->add_do_method(animation.ptr(), "track_remove_key_at_time", track, newtime); + undo_redo->add_do_method(animation.ptr(), "track_remove_key_at_time", E->get().first, newtime); AnimMoveRestore amr; - amr.key = animation->track_get_key_value(track, idx); - amr.track = track; + amr.key = animation->track_get_key_value(E->get().first, idx); + amr.track = E->get().first; amr.time = newtime; to_restore.push_back(amr); } // 3-move the keys (re insert them) - for (Set<int>::Element *E = selection.back(); E; E = E->prev()) { - float newpos = editor->snap_time(animation->track_get_key_time(track, E->get()) + moving_selection_offset.x); - /* - if (newpos<0) - continue; //no add at the beginning - */ - Array key = animation->track_get_key_value(track, E->get()); + for (SelectionSet::Element *E = selection.back(); E; E = E->prev()) { + float newpos = editor->snap_time(animation->track_get_key_time(E->get().first, E->get().second) + moving_selection_offset.x); + Array key = animation->track_get_key_value(E->get().first, E->get().second); float h = key[0]; h += moving_selection_offset.y; key[0] = h; - undo_redo->add_do_method(animation.ptr(), "track_insert_key", track, newpos, key, 1); + undo_redo->add_do_method(animation.ptr(), "track_insert_key", E->get().first, newpos, key, 1); } // 4-(undo) remove inserted keys - for (Set<int>::Element *E = selection.back(); E; E = E->prev()) { - float newpos = editor->snap_time(animation->track_get_key_time(track, E->get()) + moving_selection_offset.x); - /* - if (newpos<0) - continue; //no remove what no inserted - */ - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", track, newpos); + for (SelectionSet::Element *E = selection.back(); E; E = E->prev()) { + float newpos = editor->snap_time(animation->track_get_key_time(E->get().first, E->get().second) + moving_selection_offset.x); + undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", E->get().first, newpos); } // 5-(undo) reinsert keys - for (Set<int>::Element *E = selection.back(); E; E = E->prev()) { - float oldpos = animation->track_get_key_time(track, E->get()); - undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, oldpos, animation->track_get_key_value(track, E->get()), 1); + for (SelectionSet::Element *E = selection.back(); E; E = E->prev()) { + float oldpos = animation->track_get_key_time(E->get().first, E->get().second); + undo_redo->add_undo_method(animation.ptr(), "track_insert_key", E->get().first, oldpos, animation->track_get_key_value(E->get().first, E->get().second), 1); } // 6-(undo) reinsert overlapped keys @@ -885,20 +1318,21 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { // 7-reselect - for (Set<int>::Element *E = selection.back(); E; E = E->prev()) { - float oldpos = animation->track_get_key_time(track, E->get()); + for (SelectionSet::Element *E = selection.back(); E; E = E->prev()) { + float oldpos = animation->track_get_key_time(E->get().first, E->get().second); float newpos = editor->snap_time(oldpos + moving_selection_offset.x); - undo_redo->add_do_method(this, "_select_at_anim", animation, track, newpos); - undo_redo->add_undo_method(this, "_select_at_anim", animation, track, oldpos); + undo_redo->add_do_method(this, "_select_at_anim", animation, E->get().first, newpos); + undo_redo->add_undo_method(this, "_select_at_anim", animation, E->get().first, oldpos); } undo_redo->commit_action(); moving_selection = false; - } else if (select_single_attempt != -1) { + } else if (select_single_attempt != IntPair(-1, -1)) { selection.clear(); selection.insert(select_single_attempt); + set_animation_and_track(animation, select_single_attempt.first); } moving_selection_attempt = false; @@ -909,13 +1343,13 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { if (moving_selection_attempt && mm.is_valid()) { if (!moving_selection) { moving_selection = true; - select_single_attempt = -1; + select_single_attempt = IntPair(-1, -1); } float y = (get_size().height / 2 - mm->get_position().y) * v_zoom + v_scroll; - float x = editor->snap_time(((mm->get_position().x - timeline->get_name_limit()) / timeline->get_zoom_scale()) + timeline->get_value()); + float x = editor->snap_time(((mm->get_position().x - limit) / timeline->get_zoom_scale()) + timeline->get_value()); - moving_selection_offset = Vector2(x - animation->track_get_key_time(track, moving_selection_from_key), y - animation->bezier_track_get_key_value(track, moving_selection_from_key)); + moving_selection_offset = Vector2(x - animation->track_get_key_time(moving_selection_from_track, moving_selection_from_key), y - animation->bezier_track_get_key_value(moving_selection_from_track, moving_selection_from_key)); update(); } @@ -938,17 +1372,17 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { float y = (get_size().height / 2 - mm->get_position().y) * v_zoom + v_scroll; float x = editor->snap_time((mm->get_position().x - timeline->get_name_limit()) / timeline->get_zoom_scale()) + timeline->get_value(); - Vector2 key_pos = Vector2(animation->track_get_key_time(track, moving_handle_key), animation->bezier_track_get_key_value(track, moving_handle_key)); + Vector2 key_pos = Vector2(animation->track_get_key_time(selected_track, moving_handle_key), animation->bezier_track_get_key_value(selected_track, moving_handle_key)); Vector2 moving_handle_value = Vector2(x, y) - key_pos; - moving_handle_left = animation->bezier_track_get_key_in_handle(track, moving_handle_key); - moving_handle_right = animation->bezier_track_get_key_out_handle(track, moving_handle_key); + moving_handle_left = animation->bezier_track_get_key_in_handle(moving_handle_track, moving_handle_key); + moving_handle_right = animation->bezier_track_get_key_out_handle(moving_handle_track, moving_handle_key); if (moving_handle == -1) { moving_handle_left = moving_handle_value; - if (animation->bezier_track_get_key_handle_mode(track, moving_handle_key) == Animation::HANDLE_MODE_BALANCED) { + if (animation->bezier_track_get_key_handle_mode(moving_handle_track, moving_handle_key) == Animation::HANDLE_MODE_BALANCED) { double ratio = timeline->get_zoom_scale() * v_zoom; Transform2D xform; xform.set_scale(Vector2(1.0, 1.0 / ratio)); @@ -961,7 +1395,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } else if (moving_handle == 1) { moving_handle_right = moving_handle_value; - if (animation->bezier_track_get_key_handle_mode(track, moving_handle_key) == Animation::HANDLE_MODE_BALANCED) { + if (animation->bezier_track_get_key_handle_mode(moving_handle_track, moving_handle_key) == Animation::HANDLE_MODE_BALANCED) { double ratio = timeline->get_zoom_scale() * v_zoom; Transform2D xform; xform.set_scale(Vector2(1.0, 1.0 / ratio)); @@ -980,12 +1414,12 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { undo_redo->create_action(TTR("Move Bezier Points")); if (moving_handle == -1) { double ratio = timeline->get_zoom_scale() * v_zoom; - undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", track, moving_handle_key, moving_handle_left, ratio); - undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_in_handle", track, moving_handle_key, animation->bezier_track_get_key_in_handle(track, moving_handle_key), ratio); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", moving_handle_track, moving_handle_key, moving_handle_left, ratio); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_in_handle", moving_handle_track, moving_handle_key, animation->bezier_track_get_key_in_handle(moving_handle_track, moving_handle_key), ratio); } else if (moving_handle == 1) { double ratio = timeline->get_zoom_scale() * v_zoom; - undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", track, moving_handle_key, moving_handle_right, ratio); - undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_out_handle", track, moving_handle_key, animation->bezier_track_get_key_out_handle(track, moving_handle_key), ratio); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", moving_handle_track, moving_handle_key, moving_handle_right, ratio); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_out_handle", moving_handle_track, moving_handle_key, animation->bezier_track_get_key_out_handle(moving_handle_track, moving_handle_key), ratio); } undo_redo->commit_action(); @@ -1028,27 +1462,32 @@ void AnimationBezierTrackEdit::_zoom_callback(Vector2 p_scroll_vec, Vector2 p_or void AnimationBezierTrackEdit::_menu_selected(int p_index) { switch (p_index) { case MENU_KEY_INSERT: { - Array new_point; - new_point.resize(6); + if (animation->get_track_count() > 0) { + Array new_point; + new_point.resize(6); - float h = (get_size().height / 2 - menu_insert_key.y) * v_zoom + v_scroll; + float h = (get_size().height / 2 - menu_insert_key.y) * v_zoom + v_scroll; - new_point[0] = h; - new_point[1] = -0.25; - new_point[2] = 0; - new_point[3] = 0.25; - new_point[4] = 0; - new_point[5] = Animation::HANDLE_MODE_BALANCED; + new_point[0] = h; + new_point[1] = -0.25; + new_point[2] = 0; + new_point[3] = 0.25; + new_point[4] = 0; + new_point[5] = Animation::HANDLE_MODE_BALANCED; - float time = ((menu_insert_key.x - timeline->get_name_limit()) / timeline->get_zoom_scale()) + timeline->get_value(); - while (animation->track_find_key(track, time, true) != -1) { - time += 0.001; - } + int limit = timeline->get_name_limit(); - undo_redo->create_action(TTR("Add Bezier Point")); - undo_redo->add_do_method(animation.ptr(), "track_insert_key", track, time, new_point); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", track, time); - undo_redo->commit_action(); + float time = ((menu_insert_key.x - limit) / timeline->get_zoom_scale()) + timeline->get_value(); + + while (animation->track_find_key(selected_track, time, true) != -1) { + time += 0.001; + } + + undo_redo->create_action(TTR("Add Bezier Point")); + undo_redo->add_do_method(animation.ptr(), "track_insert_key", selected_track, time, new_point); + undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", selected_track, time); + undo_redo->commit_action(); + } } break; case MENU_KEY_DUPLICATE: { @@ -1072,8 +1511,8 @@ void AnimationBezierTrackEdit::duplicate_selection() { } float top_time = 1e10; - for (Set<int>::Element *E = selection.back(); E; E = E->prev()) { - float t = animation->track_get_key_time(track, E->get()); + for (SelectionSet::Element *E = selection.back(); E; E = E->prev()) { + float t = animation->track_get_key_time(E->get().first, E->get().second); if (t < top_time) { top_time = t; } @@ -1083,21 +1522,21 @@ void AnimationBezierTrackEdit::duplicate_selection() { List<Pair<int, float>> new_selection_values; - for (Set<int>::Element *E = selection.back(); E; E = E->prev()) { - float t = animation->track_get_key_time(track, E->get()); + for (SelectionSet::Element *E = selection.back(); E; E = E->prev()) { + float t = animation->track_get_key_time(E->get().first, E->get().second); float dst_time = t + (timeline->get_play_position() - top_time); - int existing_idx = animation->track_find_key(track, dst_time, true); + int existing_idx = animation->track_find_key(E->get().first, dst_time, true); - undo_redo->add_do_method(animation.ptr(), "track_insert_key", track, dst_time, animation->track_get_key_value(track, E->get()), animation->track_get_key_transition(track, E->get())); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", track, dst_time); + undo_redo->add_do_method(animation.ptr(), "track_insert_key", E->get().first, dst_time, animation->track_get_key_value(E->get().first, E->get().second), animation->track_get_key_transition(E->get().first, E->get().second)); + undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", E->get().first, dst_time); Pair<int, float> p; - p.first = track; + p.first = E->get().first; p.second = dst_time; new_selection_values.push_back(p); if (existing_idx != -1) { - undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, dst_time, animation->track_get_key_value(track, existing_idx), animation->track_get_key_transition(track, existing_idx)); + undo_redo->add_undo_method(animation.ptr(), "track_insert_key", E->get().first, dst_time, animation->track_get_key_value(E->get().first, existing_idx), animation->track_get_key_transition(E->get().first, existing_idx)); } } @@ -1116,7 +1555,7 @@ void AnimationBezierTrackEdit::duplicate_selection() { continue; } - selection.insert(existing_idx); + selection.insert(IntPair(track, existing_idx)); } update(); @@ -1126,9 +1565,9 @@ void AnimationBezierTrackEdit::delete_selection() { if (selection.size()) { undo_redo->create_action(TTR("Anim Delete Keys")); - for (Set<int>::Element *E = selection.back(); E; E = E->prev()) { - undo_redo->add_do_method(animation.ptr(), "track_remove_key", track, E->get()); - undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, animation->track_get_key_time(track, E->get()), animation->track_get_key_value(track, E->get()), 1); + for (SelectionSet::Element *E = selection.back(); E; E = E->prev()) { + undo_redo->add_do_method(animation.ptr(), "track_remove_key", E->get().first, E->get().second); + undo_redo->add_undo_method(animation.ptr(), "track_insert_key", E->get().first, animation->track_get_key_time(E->get().first, E->get().second), animation->track_get_key_value(E->get().first, E->get().second), 1); } undo_redo->add_do_method(this, "_clear_selection_for_anim", animation); undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); @@ -1142,12 +1581,14 @@ void AnimationBezierTrackEdit::_bind_methods() { ClassDB::bind_method("_clear_selection", &AnimationBezierTrackEdit::_clear_selection); ClassDB::bind_method("_clear_selection_for_anim", &AnimationBezierTrackEdit::_clear_selection_for_anim); ClassDB::bind_method("_select_at_anim", &AnimationBezierTrackEdit::_select_at_anim); + ClassDB::bind_method("_update_hidden_tracks_after", &AnimationBezierTrackEdit::_update_hidden_tracks_after); + ClassDB::bind_method("_update_locked_tracks_after", &AnimationBezierTrackEdit::_update_locked_tracks_after); ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag"))); ADD_SIGNAL(MethodInfo("remove_request", PropertyInfo(Variant::INT, "track"))); ADD_SIGNAL(MethodInfo("insert_key", PropertyInfo(Variant::FLOAT, "ofs"))); - ADD_SIGNAL(MethodInfo("select_key", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::BOOL, "single"))); - ADD_SIGNAL(MethodInfo("deselect_key", PropertyInfo(Variant::INT, "index"))); + ADD_SIGNAL(MethodInfo("select_key", PropertyInfo(Variant::INT, "track"), PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::BOOL, "single"))); + ADD_SIGNAL(MethodInfo("deselect_key", PropertyInfo(Variant::INT, "track"), PropertyInfo(Variant::INT, "index"))); ADD_SIGNAL(MethodInfo("clear_selection")); ADD_SIGNAL(MethodInfo("close_request")); @@ -1170,14 +1611,9 @@ AnimationBezierTrackEdit::AnimationBezierTrackEdit() { set_clip_contents(true); - close_button = memnew(Button); - close_button->connect("pressed", Callable(this, SNAME("emit_signal")), varray(SNAME("close_request"))); - close_button->set_text(TTR("Close")); - - right_column = memnew(VBoxContainer); - right_column->add_child(close_button); - right_column->add_spacer(); - add_child(right_column); + ED_SHORTCUT("animation_bezier_editor/focus", TTR("Focus"), Key::F); + ED_SHORTCUT("animation_bezier_editor/select_all_keys", TTR("Select All Keys"), KeyModifierMask::CMD | Key::A); + ED_SHORTCUT("animation_bezier_editor/deselect_all_keys", TTR("Deselect All Keys"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::A); menu = memnew(PopupMenu); add_child(menu); diff --git a/editor/animation_bezier_editor.h b/editor/animation_bezier_editor.h index cf719a0355..fa6fc405f2 100644 --- a/editor/animation_bezier_editor.h +++ b/editor/animation_bezier_editor.h @@ -46,9 +46,6 @@ class AnimationBezierTrackEdit : public Control { MENU_KEY_SET_HANDLE_BALANCED, }; - VBoxContainer *right_column; - Button *close_button; - AnimationTimelineEdit *timeline = nullptr; UndoRedo *undo_redo = nullptr; Node *root = nullptr; @@ -56,7 +53,7 @@ class AnimationBezierTrackEdit : public Control { float play_position_pos = 0; Ref<Animation> animation; - int track; + int selected_track; Vector<Rect2> view_rects; @@ -66,6 +63,19 @@ class AnimationBezierTrackEdit : public Control { Map<int, Rect2> subtracks; + enum { + REMOVE_ICON, + LOCK_ICON, + SOLO_ICON, + VISIBILITY_ICON + }; + + Map<int, Map<int, Rect2>> subtrack_icons; + Set<int> locked_tracks; + Set<int> hidden_tracks; + int solo_track = -1; + bool is_filtered = false; + float v_scroll = 0; float v_zoom = 1; @@ -73,6 +83,9 @@ class AnimationBezierTrackEdit : public Control { void _zoom_changed(); + void _update_locked_tracks_after(int p_track); + void _update_hidden_tracks_after(int p_track); + virtual void gui_input(const Ref<InputEvent> &p_event) override; void _menu_selected(int p_index); @@ -80,10 +93,13 @@ class AnimationBezierTrackEdit : public Control { Vector2 insert_at_pos; + typedef Pair<int, int> IntPair; + bool moving_selection_attempt = false; - int select_single_attempt = -1; + IntPair select_single_attempt; bool moving_selection = false; int moving_selection_from_key; + int moving_selection_from_track; Vector2 moving_selection_offset; @@ -95,6 +111,7 @@ class AnimationBezierTrackEdit : public Control { int moving_handle = 0; //0 no move -1 or +1 out int moving_handle_key = 0; + int moving_handle_track = 0; Vector2 moving_handle_left; Vector2 moving_handle_right; int moving_handle_mode; // value from Animation::HandleMode @@ -119,11 +136,25 @@ class AnimationBezierTrackEdit : public Control { Rect2 point_rect; Rect2 in_rect; Rect2 out_rect; + int track; + int key; }; Vector<EditPoint> edit_points; - Set<int> selection; + struct SelectionCompare { + bool operator()(const IntPair &lh, const IntPair &rh) { + if (lh.first == rh.first) { + return lh.second < rh.second; + } else { + return lh.first < rh.first; + } + } + }; + + typedef Set<IntPair, SelectionCompare> SelectionSet; + + SelectionSet selection; Ref<ViewPanner> panner; void _scroll_callback(Vector2 p_scroll_vec, bool p_alt); @@ -151,6 +182,7 @@ public: void set_timeline(AnimationTimelineEdit *p_timeline); void set_editor(AnimationTrackEditor *p_editor); void set_root(Node *p_root); + void set_filtered(bool p_filtered); void set_play_position(float p_pos); void update_play_position(); diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index dbbdd85706..53f585d06b 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -33,9 +33,9 @@ #include "animation_track_editor_plugins.h" #include "core/input/input.h" #include "editor/animation_bezier_editor.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" #include "editor/plugins/animation_player_editor_plugin.h" -#include "editor_node.h" -#include "editor_scale.h" #include "scene/animation/animation_player.h" #include "scene/gui/view_panner.h" #include "scene/main/window.h" @@ -570,7 +570,7 @@ public: p_list->push_back(PropertyInfo(Variant::VECTOR3, "position")); } break; case Animation::TYPE_ROTATION_3D: { - p_list->push_back(PropertyInfo(Variant::VECTOR3, "rotation")); + p_list->push_back(PropertyInfo(Variant::QUATERNION, "rotation")); } break; case Animation::TYPE_SCALE_3D: { p_list->push_back(PropertyInfo(Variant::VECTOR3, "scale")); @@ -1458,198 +1458,201 @@ int AnimationTimelineEdit::get_name_limit() const { } void AnimationTimelineEdit::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); - } - - if (p_what == NOTIFICATION_ENTER_TREE) { - add_track->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); - loop->set_icon(get_theme_icon(SNAME("Loop"), SNAME("EditorIcons"))); - time_icon->set_texture(get_theme_icon(SNAME("Time"), SNAME("EditorIcons"))); - - add_track->get_popup()->clear(); - add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyValue"), SNAME("EditorIcons")), TTR("Property Track")); - add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyXPosition"), SNAME("EditorIcons")), TTR("3D Position Track")); - add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyXRotation"), SNAME("EditorIcons")), TTR("3D Rotation Track")); - add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyXScale"), SNAME("EditorIcons")), TTR("3D Scale Track")); - add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyBlendShape"), SNAME("EditorIcons")), TTR("Blend Shape Track")); - add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyCall"), SNAME("EditorIcons")), TTR("Call Method Track")); - add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyBezier"), SNAME("EditorIcons")), TTR("Bezier Curve Track")); - add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyAudio"), SNAME("EditorIcons")), TTR("Audio Playback Track")); - add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyAnimation"), SNAME("EditorIcons")), TTR("Animation Playback Track")); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); + add_track->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + loop->set_icon(get_theme_icon(SNAME("Loop"), SNAME("EditorIcons"))); + time_icon->set_texture(get_theme_icon(SNAME("Time"), SNAME("EditorIcons"))); + + add_track->get_popup()->clear(); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyValue"), SNAME("EditorIcons")), TTR("Property Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyXPosition"), SNAME("EditorIcons")), TTR("3D Position Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyXRotation"), SNAME("EditorIcons")), TTR("3D Rotation Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyXScale"), SNAME("EditorIcons")), TTR("3D Scale Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyBlendShape"), SNAME("EditorIcons")), TTR("Blend Shape Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyCall"), SNAME("EditorIcons")), TTR("Call Method Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyBezier"), SNAME("EditorIcons")), TTR("Bezier Curve Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyAudio"), SNAME("EditorIcons")), TTR("Audio Playback Track")); + add_track->get_popup()->add_icon_item(get_theme_icon(SNAME("KeyAnimation"), SNAME("EditorIcons")), TTR("Animation Playback Track")); + } break; - if (p_what == NOTIFICATION_RESIZED) { - len_hb->set_position(Vector2(get_size().width - get_buttons_width(), 0)); - len_hb->set_size(Size2(get_buttons_width(), get_size().height)); - } + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); + } break; - if (p_what == NOTIFICATION_DRAW) { - int key_range = get_size().width - get_buttons_width() - get_name_limit(); + case NOTIFICATION_RESIZED: { + len_hb->set_position(Vector2(get_size().width - get_buttons_width(), 0)); + len_hb->set_size(Size2(get_buttons_width(), get_size().height)); + } break; - if (!animation.is_valid()) { - return; - } + case NOTIFICATION_DRAW: { + int key_range = get_size().width - get_buttons_width() - get_name_limit(); - Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); - int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); - Color color = get_theme_color(SNAME("font_color"), SNAME("Label")); + if (!animation.is_valid()) { + return; + } - int zoomw = key_range; - float scale = get_zoom_scale(); - int h = get_size().height; + Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); + int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); + Color color = get_theme_color(SNAME("font_color"), SNAME("Label")); - float l = animation->get_length(); - if (l <= 0) { - l = 0.001; // Avoid crashor. - } + int zoomw = key_range; + float scale = get_zoom_scale(); + int h = get_size().height; - Ref<Texture2D> hsize_icon = get_theme_icon(SNAME("Hsize"), SNAME("EditorIcons")); - hsize_rect = Rect2(get_name_limit() - hsize_icon->get_width() - 2 * EDSCALE, (get_size().height - hsize_icon->get_height()) / 2, hsize_icon->get_width(), hsize_icon->get_height()); - draw_texture(hsize_icon, hsize_rect.position); + float l = animation->get_length(); + if (l <= 0) { + l = 0.001; // Avoid crashor. + } - { - float time_min = 0; - float time_max = animation->get_length(); - for (int i = 0; i < animation->get_track_count(); i++) { - if (animation->track_get_key_count(i) > 0) { - float beg = animation->track_get_key_time(i, 0); + Ref<Texture2D> hsize_icon = get_theme_icon(SNAME("Hsize"), SNAME("EditorIcons")); + hsize_rect = Rect2(get_name_limit() - hsize_icon->get_width() - 2 * EDSCALE, (get_size().height - hsize_icon->get_height()) / 2, hsize_icon->get_width(), hsize_icon->get_height()); + draw_texture(hsize_icon, hsize_rect.position); - if (beg < time_min) { - time_min = beg; - } + { + float time_min = 0; + float time_max = animation->get_length(); + for (int i = 0; i < animation->get_track_count(); i++) { + if (animation->track_get_key_count(i) > 0) { + float beg = animation->track_get_key_time(i, 0); + + if (beg < time_min) { + time_min = beg; + } - float end = animation->track_get_key_time(i, animation->track_get_key_count(i) - 1); + float end = animation->track_get_key_time(i, animation->track_get_key_count(i) - 1); - if (end > time_max) { - time_max = end; + if (end > time_max) { + time_max = end; + } } } - } - float extra = (zoomw / scale) * 0.5; + float extra = (zoomw / scale) * 0.5; - time_max += extra; - set_min(time_min); - set_max(time_max); + time_max += extra; + set_min(time_min); + set_max(time_max); - if (zoomw / scale < (time_max - time_min)) { - hscroll->show(); + if (zoomw / scale < (time_max - time_min)) { + hscroll->show(); - } else { - hscroll->hide(); + } else { + hscroll->hide(); + } } - } - set_page(zoomw / scale); + set_page(zoomw / scale); - int end_px = (l - get_value()) * scale; - int begin_px = -get_value() * scale; - Color notimecol = get_theme_color(SNAME("dark_color_2"), SNAME("Editor")); - Color timecolor = color; - timecolor.a = 0.2; - Color linecolor = color; - linecolor.a = 0.2; + int end_px = (l - get_value()) * scale; + int begin_px = -get_value() * scale; + Color notimecol = get_theme_color(SNAME("dark_color_2"), SNAME("Editor")); + Color timecolor = color; + timecolor.a = 0.2; + Color linecolor = color; + linecolor.a = 0.2; - { - draw_rect(Rect2(Point2(get_name_limit(), 0), Point2(zoomw - 1, h)), notimecol); + { + draw_rect(Rect2(Point2(get_name_limit(), 0), Point2(zoomw - 1, h)), notimecol); - if (begin_px < zoomw && end_px > 0) { - if (begin_px < 0) { - begin_px = 0; - } - if (end_px > zoomw) { - end_px = zoomw; - } + if (begin_px < zoomw && end_px > 0) { + if (begin_px < 0) { + begin_px = 0; + } + if (end_px > zoomw) { + end_px = zoomw; + } - draw_rect(Rect2(Point2(get_name_limit() + begin_px, 0), Point2(end_px - begin_px - 1, h)), timecolor); + draw_rect(Rect2(Point2(get_name_limit() + begin_px, 0), Point2(end_px - begin_px - 1, h)), timecolor); + } } - } - Color color_time_sec = color; - Color color_time_dec = color; - color_time_dec.a *= 0.5; + Color color_time_sec = color; + Color color_time_dec = color; + color_time_dec.a *= 0.5; #define SC_ADJ 100 - int min = 30; - int dec = 1; - int step = 1; - int decimals = 2; - bool step_found = false; - - const int period_width = font->get_char_size('.', 0, font_size).width; - int max_digit_width = font->get_char_size('0', 0, font_size).width; - for (int i = 1; i <= 9; i++) { - const int digit_width = font->get_char_size('0' + i, 0, font_size).width; - max_digit_width = MAX(digit_width, max_digit_width); - } - const int max_sc = int(Math::ceil(zoomw / scale)); - const int max_sc_width = String::num(max_sc).length() * max_digit_width; - - while (!step_found) { - min = max_sc_width; - if (decimals > 0) { - min += period_width + max_digit_width * decimals; + int min = 30; + int dec = 1; + int step = 1; + int decimals = 2; + bool step_found = false; + + const float period_width = font->get_char_size('.', 0, font_size).width; + float max_digit_width = font->get_char_size('0', 0, font_size).width; + for (int i = 1; i <= 9; i++) { + const float digit_width = font->get_char_size('0' + i, 0, font_size).width; + max_digit_width = MAX(digit_width, max_digit_width); } + const int max_sc = int(Math::ceil(zoomw / scale)); + const int max_sc_width = String::num(max_sc).length() * max_digit_width; - static const int _multp[3] = { 1, 2, 5 }; - for (int i = 0; i < 3; i++) { - step = (_multp[i] * dec); - if (step * scale / SC_ADJ > min) { - step_found = true; + while (!step_found) { + min = max_sc_width; + if (decimals > 0) { + min += period_width + max_digit_width * decimals; + } + + static const int _multp[3] = { 1, 2, 5 }; + for (int i = 0; i < 3; i++) { + step = (_multp[i] * dec); + if (step * scale / SC_ADJ > min) { + step_found = true; + break; + } + } + if (step_found) { break; } + dec *= 10; + decimals--; + if (decimals < 0) { + decimals = 0; + } } - if (step_found) { - break; - } - dec *= 10; - decimals--; - if (decimals < 0) { - decimals = 0; - } - } - if (use_fps) { - float step_size = animation->get_step(); - if (step_size > 0) { - int prev_frame_ofs = -10000000; + if (use_fps) { + float step_size = animation->get_step(); + if (step_size > 0) { + int prev_frame_ofs = -10000000; - for (int i = 0; i < zoomw; i++) { - float pos = get_value() + double(i) / scale; - float prev = get_value() + (double(i) - 1.0) / scale; + for (int i = 0; i < zoomw; i++) { + float pos = get_value() + double(i) / scale; + float prev = get_value() + (double(i) - 1.0) / scale; - int frame = pos / step_size; - int prev_frame = prev / step_size; + int frame = pos / step_size; + int prev_frame = prev / step_size; - bool sub = Math::floor(prev) == Math::floor(pos); + bool sub = Math::floor(prev) == Math::floor(pos); - if (frame != prev_frame && i >= prev_frame_ofs) { - draw_line(Point2(get_name_limit() + i, 0), Point2(get_name_limit() + i, h), linecolor, Math::round(EDSCALE)); + if (frame != prev_frame && i >= prev_frame_ofs) { + draw_line(Point2(get_name_limit() + i, 0), Point2(get_name_limit() + i, h), linecolor, Math::round(EDSCALE)); - draw_string(font, Point2(get_name_limit() + i + 3 * EDSCALE, (h - font->get_height(font_size)) / 2 + font->get_ascent(font_size)).floor(), itos(frame), HORIZONTAL_ALIGNMENT_LEFT, zoomw - i, font_size, sub ? color_time_dec : color_time_sec); - prev_frame_ofs = i + font->get_string_size(itos(frame), font_size).x + 5 * EDSCALE; + draw_string(font, Point2(get_name_limit() + i + 3 * EDSCALE, (h - font->get_height(font_size)) / 2 + font->get_ascent(font_size)).floor(), itos(frame), HORIZONTAL_ALIGNMENT_LEFT, zoomw - i, font_size, sub ? color_time_dec : color_time_sec); + prev_frame_ofs = i + font->get_string_size(itos(frame), font_size).x + 5 * EDSCALE; + } } } - } - } else { - for (int i = 0; i < zoomw; i++) { - float pos = get_value() + double(i) / scale; - float prev = get_value() + (double(i) - 1.0) / scale; - - int sc = int(Math::floor(pos * SC_ADJ)); - int prev_sc = int(Math::floor(prev * SC_ADJ)); - bool sub = (sc % SC_ADJ); - - if ((sc / step) != (prev_sc / step) || (prev_sc < 0 && sc >= 0)) { - int scd = sc < 0 ? prev_sc : sc; - draw_line(Point2(get_name_limit() + i, 0), Point2(get_name_limit() + i, h), linecolor, Math::round(EDSCALE)); - draw_string(font, Point2(get_name_limit() + i + 3, (h - font->get_height(font_size)) / 2 + font->get_ascent(font_size)).floor(), String::num((scd - (scd % step)) / double(SC_ADJ), decimals), HORIZONTAL_ALIGNMENT_LEFT, zoomw - i, font_size, sub ? color_time_dec : color_time_sec); + } else { + for (int i = 0; i < zoomw; i++) { + float pos = get_value() + double(i) / scale; + float prev = get_value() + (double(i) - 1.0) / scale; + + int sc = int(Math::floor(pos * SC_ADJ)); + int prev_sc = int(Math::floor(prev * SC_ADJ)); + bool sub = (sc % SC_ADJ); + + if ((sc / step) != (prev_sc / step) || (prev_sc < 0 && sc >= 0)) { + int scd = sc < 0 ? prev_sc : sc; + draw_line(Point2(get_name_limit() + i, 0), Point2(get_name_limit() + i, h), linecolor, Math::round(EDSCALE)); + draw_string(font, Point2(get_name_limit() + i + 3, (h - font->get_height(font_size)) / 2 + font->get_ascent(font_size)).floor(), String::num((scd - (scd % step)) / double(SC_ADJ), decimals), HORIZONTAL_ALIGNMENT_LEFT, zoomw - i, font_size, sub ? color_time_dec : color_time_sec); + } } } - } - draw_line(Vector2(0, get_size().height), get_size(), linecolor, Math::round(EDSCALE)); + draw_line(Vector2(0, get_size().height), get_size(), linecolor, Math::round(EDSCALE)); + } break; } } @@ -1723,15 +1726,15 @@ void AnimationTimelineEdit::update_values() { switch (animation->get_loop_mode()) { case Animation::LoopMode::LOOP_NONE: { - loop->set_icon(get_theme_icon("Loop", "EditorIcons")); + loop->set_icon(get_theme_icon(SNAME("Loop"), SNAME("EditorIcons"))); loop->set_pressed(false); } break; case Animation::LoopMode::LOOP_LINEAR: { - loop->set_icon(get_theme_icon("Loop", "EditorIcons")); + loop->set_icon(get_theme_icon(SNAME("Loop"), SNAME("EditorIcons"))); loop->set_pressed(true); } break; case Animation::LoopMode::LOOP_PINGPONG: { - loop->set_icon(get_theme_icon("PingPongLoop", "EditorIcons")); + loop->set_icon(get_theme_icon(SNAME("PingPongLoop"), SNAME("EditorIcons"))); loop->set_pressed(true); } break; default: @@ -1844,11 +1847,14 @@ void AnimationTimelineEdit::_pan_callback(Vector2 p_scroll_vec) { } void AnimationTimelineEdit::_zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt) { - if (p_scroll_vec.y < 0) { - get_zoom()->set_value(get_zoom()->get_value() * 1.05); + double new_zoom_value; + double current_zoom_value = get_zoom()->get_value(); + if (current_zoom_value <= 0.1) { + new_zoom_value = MAX(0.01, current_zoom_value - 0.01 * SIGN(p_scroll_vec.y)); } else { - get_zoom()->set_value(get_zoom()->get_value() / 1.05); + new_zoom_value = p_scroll_vec.y > 0 ? MAX(0.01, current_zoom_value / 1.05) : current_zoom_value * 1.05; } + get_zoom()->set_value(new_zoom_value); } void AnimationTimelineEdit::set_use_fps(bool p_use_fps) { @@ -1939,306 +1945,305 @@ AnimationTimelineEdit::AnimationTimelineEdit() { //////////////////////////////////// void AnimationTrackEdit::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - if (animation.is_null()) { - return; - } - ERR_FAIL_INDEX(track, animation->get_track_count()); + switch (p_what) { + case NOTIFICATION_DRAW: { + if (animation.is_null()) { + return; + } + ERR_FAIL_INDEX(track, animation->get_track_count()); - int limit = timeline->get_name_limit(); + int limit = timeline->get_name_limit(); - if (has_focus()) { - Color accent = get_theme_color(SNAME("accent_color"), SNAME("Editor")); - accent.a *= 0.7; - // Offside so the horizontal sides aren't cutoff. - draw_rect(Rect2(Point2(1 * EDSCALE, 0), get_size() - Size2(1 * EDSCALE, 0)), accent, false); - } + if (has_focus()) { + Color accent = get_theme_color(SNAME("accent_color"), SNAME("Editor")); + accent.a *= 0.7; + // Offside so the horizontal sides aren't cutoff. + draw_rect(Rect2(Point2(1 * EDSCALE, 0), get_size() - Size2(1 * EDSCALE, 0)), accent, false); + } - Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); - int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); - Color color = get_theme_color(SNAME("font_color"), SNAME("Label")); - Ref<Texture2D> type_icons[9] = { - get_theme_icon(SNAME("KeyValue"), SNAME("EditorIcons")), - get_theme_icon(SNAME("KeyTrackPosition"), SNAME("EditorIcons")), - get_theme_icon(SNAME("KeyTrackRotation"), SNAME("EditorIcons")), - get_theme_icon(SNAME("KeyTrackScale"), SNAME("EditorIcons")), - get_theme_icon(SNAME("KeyTrackBlendShape"), SNAME("EditorIcons")), - get_theme_icon(SNAME("KeyCall"), SNAME("EditorIcons")), - get_theme_icon(SNAME("KeyBezier"), SNAME("EditorIcons")), - get_theme_icon(SNAME("KeyAudio"), SNAME("EditorIcons")), - get_theme_icon(SNAME("KeyAnimation"), SNAME("EditorIcons")) - }; - int hsep = get_theme_constant(SNAME("hseparation"), SNAME("ItemList")); - Color linecolor = color; - linecolor.a = 0.2; + Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); + int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); + Color color = get_theme_color(SNAME("font_color"), SNAME("Label")); + Ref<Texture2D> type_icons[9] = { + get_theme_icon(SNAME("KeyValue"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyTrackPosition"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyTrackRotation"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyTrackScale"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyTrackBlendShape"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyCall"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyBezier"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyAudio"), SNAME("EditorIcons")), + get_theme_icon(SNAME("KeyAnimation"), SNAME("EditorIcons")) + }; + int hsep = get_theme_constant(SNAME("hseparation"), SNAME("ItemList")); + Color linecolor = color; + linecolor.a = 0.2; - // NAMES AND ICONS // + // NAMES AND ICONS // - { - Ref<Texture2D> check = animation->track_is_enabled(track) ? get_theme_icon(SNAME("checked"), SNAME("CheckBox")) : get_theme_icon(SNAME("unchecked"), SNAME("CheckBox")); + { + Ref<Texture2D> check = animation->track_is_enabled(track) ? get_theme_icon(SNAME("checked"), SNAME("CheckBox")) : get_theme_icon(SNAME("unchecked"), SNAME("CheckBox")); - int ofs = in_group ? check->get_width() : 0; // Not the best reference for margin but.. + int ofs = in_group ? check->get_width() : 0; // Not the best reference for margin but.. - check_rect = Rect2(Point2(ofs, int(get_size().height - check->get_height()) / 2), check->get_size()); - draw_texture(check, check_rect.position); - ofs += check->get_width() + hsep; + check_rect = Rect2(Point2(ofs, int(get_size().height - check->get_height()) / 2), check->get_size()); + draw_texture(check, check_rect.position); + ofs += check->get_width() + hsep; - Ref<Texture2D> type_icon = type_icons[animation->track_get_type(track)]; - draw_texture(type_icon, Point2(ofs, int(get_size().height - type_icon->get_height()) / 2)); - ofs += type_icon->get_width() + hsep; + Ref<Texture2D> type_icon = type_icons[animation->track_get_type(track)]; + draw_texture(type_icon, Point2(ofs, int(get_size().height - type_icon->get_height()) / 2)); + ofs += type_icon->get_width() + hsep; - NodePath path = animation->track_get_path(track); - Node *node = nullptr; - if (root && root->has_node(path)) { - node = root->get_node(path); - } + NodePath path = animation->track_get_path(track); + Node *node = nullptr; + if (root && root->has_node(path)) { + node = root->get_node(path); + } - String text; - Color text_color = color; - if (node && EditorNode::get_singleton()->get_editor_selection()->is_selected(node)) { - text_color = get_theme_color(SNAME("accent_color"), SNAME("Editor")); - } + String text; + Color text_color = color; + if (node && EditorNode::get_singleton()->get_editor_selection()->is_selected(node)) { + text_color = get_theme_color(SNAME("accent_color"), SNAME("Editor")); + } + + if (in_group) { + if (animation->track_get_type(track) == Animation::TYPE_METHOD) { + text = TTR("Functions:"); + } else if (animation->track_get_type(track) == Animation::TYPE_AUDIO) { + text = TTR("Audio Clips:"); + } else if (animation->track_get_type(track) == Animation::TYPE_ANIMATION) { + text = TTR("Anim Clips:"); + } else { + text += path.get_concatenated_subnames(); + } + text_color.a *= 0.7; + } else if (node) { + Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(node, "Node"); + + draw_texture(icon, Point2(ofs, int(get_size().height - icon->get_height()) / 2)); + icon_cache = icon; + + text = String() + node->get_name() + ":" + path.get_concatenated_subnames(); + ofs += hsep; + ofs += icon->get_width(); - if (in_group) { - if (animation->track_get_type(track) == Animation::TYPE_METHOD) { - text = TTR("Functions:"); - } else if (animation->track_get_type(track) == Animation::TYPE_AUDIO) { - text = TTR("Audio Clips:"); - } else if (animation->track_get_type(track) == Animation::TYPE_ANIMATION) { - text = TTR("Anim Clips:"); } else { - text += path.get_concatenated_subnames(); + icon_cache = type_icon; + + text = path; } - text_color.a *= 0.7; - } else if (node) { - Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(node, "Node"); - draw_texture(icon, Point2(ofs, int(get_size().height - icon->get_height()) / 2)); - icon_cache = icon; + path_cache = text; - text = String() + node->get_name() + ":" + path.get_concatenated_subnames(); - ofs += hsep; - ofs += icon->get_width(); + path_rect = Rect2(ofs, 0, limit - ofs - hsep, get_size().height); - } else { - icon_cache = type_icon; + Vector2 string_pos = Point2(ofs, (get_size().height - font->get_height(font_size)) / 2 + font->get_ascent(font_size)); + string_pos = string_pos.floor(); + draw_string(font, string_pos, text, HORIZONTAL_ALIGNMENT_LEFT, limit - ofs - hsep, font_size, text_color); - text = path; + draw_line(Point2(limit, 0), Point2(limit, get_size().height), linecolor, Math::round(EDSCALE)); } - path_cache = text; + // KEYFRAMES // - path_rect = Rect2(ofs, 0, limit - ofs - hsep, get_size().height); + draw_bg(limit, get_size().width - timeline->get_buttons_width()); - Vector2 string_pos = Point2(ofs, (get_size().height - font->get_height(font_size)) / 2 + font->get_ascent(font_size)); - string_pos = string_pos.floor(); - draw_string(font, string_pos, text, HORIZONTAL_ALIGNMENT_LEFT, limit - ofs - hsep, font_size, text_color); + { + float scale = timeline->get_zoom_scale(); + int limit_end = get_size().width - timeline->get_buttons_width(); - draw_line(Point2(limit, 0), Point2(limit, get_size().height), linecolor, Math::round(EDSCALE)); - } + for (int i = 0; i < animation->track_get_key_count(track); i++) { + float offset = animation->track_get_key_time(track, i) - timeline->get_value(); + if (editor->is_key_selected(track, i) && editor->is_moving_selection()) { + offset = editor->snap_time(offset + editor->get_moving_selection_offset(), true); + } + offset = offset * scale + limit; + if (i < animation->track_get_key_count(track) - 1) { + float offset_n = animation->track_get_key_time(track, i + 1) - timeline->get_value(); + if (editor->is_key_selected(track, i + 1) && editor->is_moving_selection()) { + offset_n = editor->snap_time(offset_n + editor->get_moving_selection_offset()); + } + offset_n = offset_n * scale + limit; - // KEYFRAMES // + draw_key_link(i, scale, int(offset), int(offset_n), limit, limit_end); + } - draw_bg(limit, get_size().width - timeline->get_buttons_width()); + draw_key(i, scale, int(offset), editor->is_key_selected(track, i), limit, limit_end); + } + } - { - float scale = timeline->get_zoom_scale(); - int limit_end = get_size().width - timeline->get_buttons_width(); + draw_fg(limit, get_size().width - timeline->get_buttons_width()); - for (int i = 0; i < animation->track_get_key_count(track); i++) { - float offset = animation->track_get_key_time(track, i) - timeline->get_value(); - if (editor->is_key_selected(track, i) && editor->is_moving_selection()) { - offset = editor->snap_time(offset + editor->get_moving_selection_offset(), true); - } - offset = offset * scale + limit; - if (i < animation->track_get_key_count(track) - 1) { - float offset_n = animation->track_get_key_time(track, i + 1) - timeline->get_value(); - if (editor->is_key_selected(track, i + 1) && editor->is_moving_selection()) { - offset_n = editor->snap_time(offset_n + editor->get_moving_selection_offset()); - } - offset_n = offset_n * scale + limit; + // BUTTONS // - draw_key_link(i, scale, int(offset), int(offset_n), limit, limit_end); - } + { + Ref<Texture2D> wrap_icon[2] = { + get_theme_icon(SNAME("InterpWrapClamp"), SNAME("EditorIcons")), + get_theme_icon(SNAME("InterpWrapLoop"), SNAME("EditorIcons")), + }; - draw_key(i, scale, int(offset), editor->is_key_selected(track, i), limit, limit_end); - } - } + Ref<Texture2D> interp_icon[3] = { + get_theme_icon(SNAME("InterpRaw"), SNAME("EditorIcons")), + get_theme_icon(SNAME("InterpLinear"), SNAME("EditorIcons")), + get_theme_icon(SNAME("InterpCubic"), SNAME("EditorIcons")) + }; + Ref<Texture2D> cont_icon[4] = { + get_theme_icon(SNAME("TrackContinuous"), SNAME("EditorIcons")), + get_theme_icon(SNAME("TrackDiscrete"), SNAME("EditorIcons")), + get_theme_icon(SNAME("TrackTrigger"), SNAME("EditorIcons")), + get_theme_icon(SNAME("TrackCapture"), SNAME("EditorIcons")) + }; - draw_fg(limit, get_size().width - timeline->get_buttons_width()); + int ofs = get_size().width - timeline->get_buttons_width(); - // BUTTONS // + Ref<Texture2D> down_icon = get_theme_icon(SNAME("select_arrow"), SNAME("Tree")); - { - Ref<Texture2D> wrap_icon[2] = { - get_theme_icon(SNAME("InterpWrapClamp"), SNAME("EditorIcons")), - get_theme_icon(SNAME("InterpWrapLoop"), SNAME("EditorIcons")), - }; + draw_line(Point2(ofs, 0), Point2(ofs, get_size().height), linecolor, Math::round(EDSCALE)); - Ref<Texture2D> interp_icon[3] = { - get_theme_icon(SNAME("InterpRaw"), SNAME("EditorIcons")), - get_theme_icon(SNAME("InterpLinear"), SNAME("EditorIcons")), - get_theme_icon(SNAME("InterpCubic"), SNAME("EditorIcons")) - }; - Ref<Texture2D> cont_icon[4] = { - get_theme_icon(SNAME("TrackContinuous"), SNAME("EditorIcons")), - get_theme_icon(SNAME("TrackDiscrete"), SNAME("EditorIcons")), - get_theme_icon(SNAME("TrackTrigger"), SNAME("EditorIcons")), - get_theme_icon(SNAME("TrackCapture"), SNAME("EditorIcons")) - }; + ofs += hsep; + { + // Callmode. - int ofs = get_size().width - timeline->get_buttons_width(); + Animation::UpdateMode update_mode; - Ref<Texture2D> down_icon = get_theme_icon(SNAME("select_arrow"), SNAME("Tree")); + if (animation->track_get_type(track) == Animation::TYPE_VALUE) { + update_mode = animation->value_track_get_update_mode(track); + } else { + update_mode = Animation::UPDATE_CONTINUOUS; + } - draw_line(Point2(ofs, 0), Point2(ofs, get_size().height), linecolor, Math::round(EDSCALE)); + Ref<Texture2D> update_icon = cont_icon[update_mode]; - ofs += hsep; - { - // Callmode. + update_mode_rect.position.x = ofs; + update_mode_rect.position.y = int(get_size().height - update_icon->get_height()) / 2; + update_mode_rect.size = update_icon->get_size(); - Animation::UpdateMode update_mode; + if (!animation->track_is_compressed(track) && animation->track_get_type(track) == Animation::TYPE_VALUE) { + draw_texture(update_icon, update_mode_rect.position); + } + // Make it easier to click. + update_mode_rect.position.y = 0; + update_mode_rect.size.y = get_size().height; - if (animation->track_get_type(track) == Animation::TYPE_VALUE) { - update_mode = animation->value_track_get_update_mode(track); - } else { - update_mode = Animation::UPDATE_CONTINUOUS; - } + ofs += update_icon->get_width() + hsep / 2; + update_mode_rect.size.x += hsep / 2; - Ref<Texture2D> update_icon = cont_icon[update_mode]; + if (animation->track_get_type(track) == Animation::TYPE_VALUE) { + draw_texture(down_icon, Vector2(ofs, int(get_size().height - down_icon->get_height()) / 2)); + update_mode_rect.size.x += down_icon->get_width(); + } else if (animation->track_get_type(track) == Animation::TYPE_BEZIER) { + Ref<Texture2D> bezier_icon = get_theme_icon(SNAME("EditBezier"), SNAME("EditorIcons")); + update_mode_rect.size.x += down_icon->get_width(); - update_mode_rect.position.x = ofs; - update_mode_rect.position.y = int(get_size().height - update_icon->get_height()) / 2; - update_mode_rect.size = update_icon->get_size(); + update_mode_rect = Rect2(); + } else { + update_mode_rect = Rect2(); + } - if (!animation->track_is_compressed(track) && animation->track_get_type(track) == Animation::TYPE_VALUE) { - draw_texture(update_icon, update_mode_rect.position); - } - // Make it easier to click. - update_mode_rect.position.y = 0; - update_mode_rect.size.y = get_size().height; - - ofs += update_icon->get_width() + hsep; - update_mode_rect.size.x += hsep; - - if (animation->track_get_type(track) == Animation::TYPE_VALUE) { - draw_texture(down_icon, Vector2(ofs, int(get_size().height - down_icon->get_height()) / 2)); - update_mode_rect.size.x += down_icon->get_width(); - bezier_edit_rect = Rect2(); - } else if (animation->track_get_type(track) == Animation::TYPE_BEZIER) { - Ref<Texture2D> bezier_icon = get_theme_icon(SNAME("EditBezier"), SNAME("EditorIcons")); - update_mode_rect.size.x += down_icon->get_width(); - bezier_edit_rect.position = update_mode_rect.position + (update_mode_rect.size - bezier_icon->get_size()) / 2; - bezier_edit_rect.size = bezier_icon->get_size(); - draw_texture(bezier_icon, bezier_edit_rect.position); - update_mode_rect = Rect2(); - } else { - update_mode_rect = Rect2(); - bezier_edit_rect = Rect2(); + ofs += down_icon->get_width(); + draw_line(Point2(ofs + hsep * 0.5, 0), Point2(ofs + hsep * 0.5, get_size().height), linecolor, Math::round(EDSCALE)); + ofs += hsep; } - ofs += down_icon->get_width(); - draw_line(Point2(ofs + hsep * 0.5, 0), Point2(ofs + hsep * 0.5, get_size().height), linecolor, Math::round(EDSCALE)); - ofs += hsep; - } + { + // Interp. - { - // Interp. + Animation::InterpolationType interp_mode = animation->track_get_interpolation_type(track); - Animation::InterpolationType interp_mode = animation->track_get_interpolation_type(track); + Ref<Texture2D> icon = interp_icon[interp_mode]; - Ref<Texture2D> icon = interp_icon[interp_mode]; + interp_mode_rect.position.x = ofs; + interp_mode_rect.position.y = int(get_size().height - icon->get_height()) / 2; + interp_mode_rect.size = icon->get_size(); - interp_mode_rect.position.x = ofs; - interp_mode_rect.position.y = int(get_size().height - icon->get_height()) / 2; - interp_mode_rect.size = icon->get_size(); + if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { + draw_texture(icon, interp_mode_rect.position); + } + // Make it easier to click. + interp_mode_rect.position.y = 0; + interp_mode_rect.size.y = get_size().height; - if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { - draw_texture(icon, interp_mode_rect.position); - } - // Make it easier to click. - interp_mode_rect.position.y = 0; - interp_mode_rect.size.y = get_size().height; + ofs += icon->get_width() + hsep / 2; + interp_mode_rect.size.x += hsep / 2; - ofs += icon->get_width() + hsep; - interp_mode_rect.size.x += hsep; + if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { + draw_texture(down_icon, Vector2(ofs, int(get_size().height - down_icon->get_height()) / 2)); + interp_mode_rect.size.x += down_icon->get_width(); + } else { + interp_mode_rect = Rect2(); + } - if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { - draw_texture(down_icon, Vector2(ofs, int(get_size().height - down_icon->get_height()) / 2)); - interp_mode_rect.size.x += down_icon->get_width(); - } else { - interp_mode_rect = Rect2(); + ofs += down_icon->get_width(); + draw_line(Point2(ofs + hsep * 0.5, 0), Point2(ofs + hsep * 0.5, get_size().height), linecolor, Math::round(EDSCALE)); + ofs += hsep; } - ofs += down_icon->get_width(); - draw_line(Point2(ofs + hsep * 0.5, 0), Point2(ofs + hsep * 0.5, get_size().height), linecolor, Math::round(EDSCALE)); - ofs += hsep; - } + { + // Loop. - { - // Loop. + bool loop_wrap = animation->track_get_interpolation_loop_wrap(track); - bool loop_wrap = animation->track_get_interpolation_loop_wrap(track); + Ref<Texture2D> icon = wrap_icon[loop_wrap ? 1 : 0]; - Ref<Texture2D> icon = wrap_icon[loop_wrap ? 1 : 0]; + loop_wrap_rect.position.x = ofs; + loop_wrap_rect.position.y = int(get_size().height - icon->get_height()) / 2; + loop_wrap_rect.size = icon->get_size(); - loop_wrap_rect.position.x = ofs; - loop_wrap_rect.position.y = int(get_size().height - icon->get_height()) / 2; - loop_wrap_rect.size = icon->get_size(); + if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { + draw_texture(icon, loop_wrap_rect.position); + } - if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { - draw_texture(icon, loop_wrap_rect.position); - } + loop_wrap_rect.position.y = 0; + loop_wrap_rect.size.y = get_size().height; - loop_wrap_rect.position.y = 0; - loop_wrap_rect.size.y = get_size().height; + ofs += icon->get_width() + hsep / 2; + loop_wrap_rect.size.x += hsep / 2; - ofs += icon->get_width() + hsep; - loop_wrap_rect.size.x += hsep; + if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { + draw_texture(down_icon, Vector2(ofs, int(get_size().height - down_icon->get_height()) / 2)); + loop_wrap_rect.size.x += down_icon->get_width(); + } else { + loop_wrap_rect = Rect2(); + } - if (!animation->track_is_compressed(track) && (animation->track_get_type(track) == Animation::TYPE_VALUE || animation->track_get_type(track) == Animation::TYPE_BLEND_SHAPE || animation->track_get_type(track) == Animation::TYPE_POSITION_3D || animation->track_get_type(track) == Animation::TYPE_SCALE_3D || animation->track_get_type(track) == Animation::TYPE_ROTATION_3D)) { - draw_texture(down_icon, Vector2(ofs, int(get_size().height - down_icon->get_height()) / 2)); - loop_wrap_rect.size.x += down_icon->get_width(); - } else { - loop_wrap_rect = Rect2(); + ofs += down_icon->get_width(); + draw_line(Point2(ofs + hsep * 0.5, 0), Point2(ofs + hsep * 0.5, get_size().height), linecolor, Math::round(EDSCALE)); + ofs += hsep; } - ofs += down_icon->get_width(); - draw_line(Point2(ofs + hsep * 0.5, 0), Point2(ofs + hsep * 0.5, get_size().height), linecolor, Math::round(EDSCALE)); - ofs += hsep; - } - - { - // Erase. + { + // Erase. - Ref<Texture2D> icon = get_theme_icon(animation->track_is_compressed(track) ? SNAME("Lock") : SNAME("Remove"), SNAME("EditorIcons")); + Ref<Texture2D> icon = get_theme_icon(animation->track_is_compressed(track) ? SNAME("Lock") : SNAME("Remove"), SNAME("EditorIcons")); - remove_rect.position.x = ofs + ((get_size().width - ofs) - icon->get_width()) / 2; - remove_rect.position.y = int(get_size().height - icon->get_height()) / 2; - remove_rect.size = icon->get_size(); + remove_rect.position.x = ofs + ((get_size().width - ofs) - icon->get_width()); + remove_rect.position.y = int(get_size().height - icon->get_height()) / 2; + remove_rect.size = icon->get_size(); - draw_texture(icon, remove_rect.position); + draw_texture(icon, remove_rect.position); + } } - } - if (in_group) { - draw_line(Vector2(timeline->get_name_limit(), get_size().height), get_size(), linecolor, Math::round(EDSCALE)); - } else { - draw_line(Vector2(0, get_size().height), get_size(), linecolor, Math::round(EDSCALE)); - } - - if (dropping_at != 0) { - Color drop_color = get_theme_color(SNAME("accent_color"), SNAME("Editor")); - if (dropping_at < 0) { - draw_line(Vector2(0, 0), Vector2(get_size().width, 0), drop_color, Math::round(EDSCALE)); + if (in_group) { + draw_line(Vector2(timeline->get_name_limit(), get_size().height), get_size(), linecolor, Math::round(EDSCALE)); } else { - draw_line(Vector2(0, get_size().height), get_size(), drop_color, Math::round(EDSCALE)); + draw_line(Vector2(0, get_size().height), get_size(), linecolor, Math::round(EDSCALE)); } - } - } - if (p_what == NOTIFICATION_MOUSE_EXIT || p_what == NOTIFICATION_DRAG_END) { - cancel_drop(); + if (dropping_at != 0) { + Color drop_color = get_theme_color(SNAME("accent_color"), SNAME("Editor")); + if (dropping_at < 0) { + draw_line(Vector2(0, 0), Vector2(get_size().width, 0), drop_color, Math::round(EDSCALE)); + } else { + draw_line(Vector2(0, get_size().height), get_size(), drop_color, Math::round(EDSCALE)); + } + } + } break; + + case NOTIFICATION_MOUSE_EXIT: + case NOTIFICATION_DRAG_END: { + cancel_drop(); + } break; } } @@ -2792,11 +2797,6 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) { return; } - if (bezier_edit_rect.has_point(pos)) { - emit_signal(SNAME("bezier_edit")); - accept_event(); - } - // Check keyframes. if (!animation->track_is_compressed(track)) { // Selecting compressed keyframes for editing is not possible. @@ -3211,40 +3211,42 @@ AnimationTrackEdit *AnimationTrackEditPlugin::create_animation_track_edit(Object /////////////////////////////////////// void AnimationTrackEditGroup::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); - int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); - int separation = get_theme_constant(SNAME("hseparation"), SNAME("ItemList")); - Color color = get_theme_color(SNAME("font_color"), SNAME("Label")); - - if (root && root->has_node(node)) { - Node *n = root->get_node(node); - if (n && EditorNode::get_singleton()->get_editor_selection()->is_selected(n)) { - color = get_theme_color(SNAME("accent_color"), SNAME("Editor")); + switch (p_what) { + case NOTIFICATION_DRAW: { + Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); + int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); + int separation = get_theme_constant(SNAME("hseparation"), SNAME("ItemList")); + Color color = get_theme_color(SNAME("font_color"), SNAME("Label")); + + if (root && root->has_node(node)) { + Node *n = root->get_node(node); + if (n && EditorNode::get_singleton()->get_editor_selection()->is_selected(n)) { + color = get_theme_color(SNAME("accent_color"), SNAME("Editor")); + } } - } - Color bgcol = get_theme_color(SNAME("dark_color_2"), SNAME("Editor")); - bgcol.a *= 0.6; - draw_rect(Rect2(Point2(), get_size()), bgcol); - Color linecolor = color; - linecolor.a = 0.2; + Color bgcol = get_theme_color(SNAME("dark_color_2"), SNAME("Editor")); + bgcol.a *= 0.6; + draw_rect(Rect2(Point2(), get_size()), bgcol); + Color linecolor = color; + linecolor.a = 0.2; - draw_line(Point2(), Point2(get_size().width, 0), linecolor, Math::round(EDSCALE)); - draw_line(Point2(timeline->get_name_limit(), 0), Point2(timeline->get_name_limit(), get_size().height), linecolor, Math::round(EDSCALE)); - draw_line(Point2(get_size().width - timeline->get_buttons_width(), 0), Point2(get_size().width - timeline->get_buttons_width(), get_size().height), linecolor, Math::round(EDSCALE)); + draw_line(Point2(), Point2(get_size().width, 0), linecolor, Math::round(EDSCALE)); + draw_line(Point2(timeline->get_name_limit(), 0), Point2(timeline->get_name_limit(), get_size().height), linecolor, Math::round(EDSCALE)); + draw_line(Point2(get_size().width - timeline->get_buttons_width(), 0), Point2(get_size().width - timeline->get_buttons_width(), get_size().height), linecolor, Math::round(EDSCALE)); - int ofs = 0; - draw_texture(icon, Point2(ofs, int(get_size().height - icon->get_height()) / 2)); - ofs += separation + icon->get_width(); - draw_string(font, Point2(ofs, int(get_size().height - font->get_height(font_size)) / 2 + font->get_ascent(font_size)), node_name, HORIZONTAL_ALIGNMENT_LEFT, timeline->get_name_limit() - ofs, font_size, color); + int ofs = 0; + draw_texture(icon, Point2(ofs, int(get_size().height - icon->get_height()) / 2)); + ofs += separation + icon->get_width(); + draw_string(font, Point2(ofs, int(get_size().height - font->get_height(font_size)) / 2 + font->get_ascent(font_size)), node_name, HORIZONTAL_ALIGNMENT_LEFT, timeline->get_name_limit() - ofs, font_size, color); - int px = (-timeline->get_value() + timeline->get_play_position()) * timeline->get_zoom_scale() + timeline->get_name_limit(); + int px = (-timeline->get_value() + timeline->get_play_position()) * timeline->get_zoom_scale() + timeline->get_name_limit(); - if (px >= timeline->get_name_limit() && px < (get_size().width - timeline->get_buttons_width())) { - Color accent = get_theme_color(SNAME("accent_color"), SNAME("Editor")); - draw_line(Point2(px, 0), Point2(px, get_size().height), accent, Math::round(2 * EDSCALE)); - } + if (px >= timeline->get_name_limit() && px < (get_size().width - timeline->get_buttons_width())) { + Color accent = get_theme_color(SNAME("accent_color"), SNAME("Editor")); + draw_line(Point2(px, 0), Point2(px, get_size().height), accent, Math::round(2 * EDSCALE)); + } + } break; } } @@ -3289,7 +3291,7 @@ AnimationTrackEditGroup::AnimationTrackEditGroup() { ////////////////////////////////////// void AnimationTrackEditor::add_track_edit_plugin(const Ref<AnimationTrackEditPlugin> &p_plugin) { - if (track_edit_plugins.find(p_plugin) != -1) { + if (track_edit_plugins.has(p_plugin)) { return; } track_edit_plugins.push_back(p_plugin); @@ -3326,10 +3328,21 @@ void AnimationTrackEditor::set_animation(const Ref<Animation> &p_anim) { snap->set_disabled(false); snap_mode->set_disabled(false); + bezier_edit_icon->set_disabled(true); + imported_anim_warning->hide(); + bool import_warning_done = false; + bool bezier_done = false; for (int i = 0; i < animation->get_track_count(); i++) { if (animation->track_is_imported(i)) { imported_anim_warning->show(); + import_warning_done = true; + } + if (animation->track_get_type(i) == Animation::TrackType::TYPE_BEZIER) { + bezier_edit_icon->set_disabled(false); + bezier_done = true; + } + if (import_warning_done && bezier_done) { break; } } @@ -3343,6 +3356,7 @@ void AnimationTrackEditor::set_animation(const Ref<Animation> &p_anim) { step->set_read_only(true); snap->set_disabled(true); snap_mode->set_disabled(true); + bezier_edit_icon->set_disabled(true); } } @@ -3481,7 +3495,7 @@ void AnimationTrackEditor::_track_remove_request(int p_track) { void AnimationTrackEditor::_track_grab_focus(int p_track) { // Don't steal focus if not working with the track editor. - if (Object::cast_to<AnimationTrackEdit>(get_focus_owner())) { + if (Object::cast_to<AnimationTrackEdit>(get_viewport()->gui_get_focus_owner())) { track_edits[p_track]->grab_focus(); } } @@ -4167,13 +4181,15 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD } break; case Animation::TYPE_BEZIER: { Array array; - array.resize(5); + array.resize(6); array[0] = p_id.value; array[1] = -0.25; array[2] = 0; array[3] = 0.25; array[4] = 0; + array[5] = Animation::HANDLE_MODE_BALANCED; value = array; + bezier_edit_icon->set_disabled(false); } break; case Animation::TYPE_ANIMATION: { @@ -4399,7 +4415,6 @@ void AnimationTrackEditor::_update_tracks() { track_edit->connect("insert_key", callable_mp(this, &AnimationTrackEditor::_insert_key_from_track), varray(i), CONNECT_DEFERRED); track_edit->connect("select_key", callable_mp(this, &AnimationTrackEditor::_key_selected), varray(i), CONNECT_DEFERRED); track_edit->connect("deselect_key", callable_mp(this, &AnimationTrackEditor::_key_deselected), varray(i), CONNECT_DEFERRED); - track_edit->connect("bezier_edit", callable_mp(this, &AnimationTrackEditor::_bezier_edit), varray(i), CONNECT_DEFERRED); track_edit->connect("move_selection_begin", callable_mp(this, &AnimationTrackEditor::_move_selection_begin)); track_edit->connect("move_selection", callable_mp(this, &AnimationTrackEditor::_move_selection)); track_edit->connect("move_selection_commit", callable_mp(this, &AnimationTrackEditor::_move_selection_commit)); @@ -4509,26 +4524,33 @@ MenuButton *AnimationTrackEditor::get_edit_menu() { } void AnimationTrackEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); - } + switch (p_what) { + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); + } break; - if (p_what == NOTIFICATION_THEME_CHANGED || p_what == NOTIFICATION_ENTER_TREE) { - zoom_icon->set_texture(get_theme_icon(SNAME("Zoom"), SNAME("EditorIcons"))); - snap->set_icon(get_theme_icon(SNAME("Snap"), SNAME("EditorIcons"))); - view_group->set_icon(get_theme_icon(view_group->is_pressed() ? "AnimationTrackList" : "AnimationTrackGroup", "EditorIcons")); - selected_filter->set_icon(get_theme_icon(SNAME("AnimationFilter"), SNAME("EditorIcons"))); - imported_anim_warning->set_icon(get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons"))); - main_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - edit->get_popup()->set_item_icon(edit->get_popup()->get_item_index(EDIT_APPLY_RESET), get_theme_icon(SNAME("Reload"), SNAME("EditorIcons"))); - } + case NOTIFICATION_ENTER_TREE: { + panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); + [[fallthrough]]; + } + case NOTIFICATION_THEME_CHANGED: { + zoom_icon->set_texture(get_theme_icon(SNAME("Zoom"), SNAME("EditorIcons"))); + bezier_edit_icon->set_icon(get_theme_icon(SNAME("EditBezier"), SNAME("EditorIcons"))); + snap->set_icon(get_theme_icon(SNAME("Snap"), SNAME("EditorIcons"))); + view_group->set_icon(get_theme_icon(view_group->is_pressed() ? SNAME("AnimationTrackList") : SNAME("AnimationTrackGroup"), SNAME("EditorIcons"))); + selected_filter->set_icon(get_theme_icon(SNAME("AnimationFilter"), SNAME("EditorIcons"))); + imported_anim_warning->set_icon(get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons"))); + main_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + edit->get_popup()->set_item_icon(edit->get_popup()->get_item_index(EDIT_APPLY_RESET), get_theme_icon(SNAME("Reload"), SNAME("EditorIcons"))); + } break; - if (p_what == NOTIFICATION_READY) { - EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", callable_mp(this, &AnimationTrackEditor::_selection_changed)); - } + case NOTIFICATION_READY: { + EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", callable_mp(this, &AnimationTrackEditor::_selection_changed)); + } break; - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - update_keying(); + case NOTIFICATION_VISIBILITY_CHANGED: { + update_keying(); + } break; } } @@ -4630,6 +4652,7 @@ void AnimationTrackEditor::_new_track_node_selected(NodePath p_path) { adding_track_path = path_to; prop_selector->set_type_filter(filter); prop_selector->select_property_from_instance(node); + bezier_edit_icon->set_disabled(false); } break; case Animation::TYPE_AUDIO: { if (!node->is_class("AudioStreamPlayer") && !node->is_class("AudioStreamPlayer2D") && !node->is_class("AudioStreamPlayer3D")) { @@ -5294,6 +5317,20 @@ void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) { } } +void AnimationTrackEditor::_toggle_bezier_edit() { + if (bezier_edit->is_visible()) { + _cancel_bezier_edit(); + } else { + int track_count = animation->get_track_count(); + for (int i = 0; i < track_count; ++i) { + if (animation->track_get_type(i) == Animation::TrackType::TYPE_BEZIER) { + _bezier_edit(i); + return; + } + } + } +} + void AnimationTrackEditor::_scroll_callback(Vector2 p_scroll_vec, bool p_alt) { if (p_alt) { if (p_scroll_vec.x < 0 || p_scroll_vec.y < 0) { @@ -5312,16 +5349,20 @@ void AnimationTrackEditor::_pan_callback(Vector2 p_scroll_vec) { } void AnimationTrackEditor::_zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt) { - if (p_scroll_vec.y < 0) { - timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() * 1.05); + double new_zoom_value; + double current_zoom_value = timeline->get_zoom()->get_value(); + if (current_zoom_value <= 0.1) { + new_zoom_value = MAX(0.01, current_zoom_value - 0.01 * SIGN(p_scroll_vec.y)); } else { - timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05); + new_zoom_value = p_scroll_vec.y > 0 ? MAX(0.01, current_zoom_value / 1.05) : current_zoom_value * 1.05; } + timeline->get_zoom()->set_value(new_zoom_value); } void AnimationTrackEditor::_cancel_bezier_edit() { bezier_edit->hide(); scroll->show(); + bezier_edit_icon->set_pressed(false); } void AnimationTrackEditor::_bezier_edit(int p_for_track) { @@ -5493,8 +5534,8 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) { String text; Ref<Texture2D> icon = get_theme_icon(SNAME("Node"), SNAME("EditorIcons")); if (node) { - if (has_theme_icon(node->get_class(), "EditorIcons")) { - icon = get_theme_icon(node->get_class(), "EditorIcons"); + if (has_theme_icon(node->get_class(), SNAME("EditorIcons"))) { + icon = get_theme_icon(node->get_class(), SNAME("EditorIcons")); } text = node->get_name(); @@ -5907,7 +5948,8 @@ void AnimationTrackEditor::_cleanup_animation(Ref<Animation> p_animation) { void AnimationTrackEditor::_view_group_toggle() { _update_tracks(); - view_group->set_icon(get_theme_icon(view_group->is_pressed() ? "AnimationTrackList" : "AnimationTrackGroup", "EditorIcons")); + view_group->set_icon(get_theme_icon(view_group->is_pressed() ? SNAME("AnimationTrackList") : SNAME("AnimationTrackGroup"), SNAME("EditorIcons"))); + bezier_edit->set_filtered(selected_filter->is_pressed()); } bool AnimationTrackEditor::is_grouping_tracks() { @@ -6153,6 +6195,15 @@ AnimationTrackEditor::AnimationTrackEditor() { bottom_hb->add_spacer(); + bezier_edit_icon = memnew(Button); + bezier_edit_icon->set_flat(true); + bezier_edit_icon->set_disabled(true); + bezier_edit_icon->set_toggle_mode(true); + bezier_edit_icon->connect("pressed", callable_mp(this, &AnimationTrackEditor::_toggle_bezier_edit)); + bezier_edit_icon->set_tooltip(TTR("Toggle between the bezier curve editor and track editor.")); + + bottom_hb->add_child(bezier_edit_icon); + selected_filter = memnew(Button); selected_filter->set_flat(true); selected_filter->connect("pressed", callable_mp(this, &AnimationTrackEditor::_view_group_toggle)); // Same function works the same. diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index 50c5c692c0..d0029ff80f 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -37,7 +37,6 @@ #include "editor/property_selector.h" #include "scene/gui/control.h" -#include "scene/gui/file_dialog.h" #include "scene/gui/menu_button.h" #include "scene/gui/scroll_bar.h" #include "scene/gui/slider.h" @@ -164,7 +163,6 @@ class AnimationTrackEdit : public Control { Rect2 interp_mode_rect; Rect2 loop_wrap_rect; Rect2 remove_rect; - Rect2 bezier_edit_rect; Ref<Texture2D> type_icon; Ref<Texture2D> selected_icon; @@ -300,6 +298,7 @@ class AnimationTrackEditor : public VBoxContainer { EditorSpinSlider *step; TextureRect *zoom_icon; Button *snap; + Button *bezier_edit_icon; OptionButton *snap_mode; Button *imported_anim_warning; @@ -431,6 +430,7 @@ class AnimationTrackEditor : public VBoxContainer { Vector<Ref<AnimationTrackEditPlugin>> track_edit_plugins; + void _toggle_bezier_edit(); void _cancel_bezier_edit(); void _bezier_edit(int p_for_track); diff --git a/editor/animation_track_editor_plugins.cpp b/editor/animation_track_editor_plugins.cpp index 058e59dea3..e87678a51b 100644 --- a/editor/animation_track_editor_plugins.cpp +++ b/editor/animation_track_editor_plugins.cpp @@ -31,8 +31,8 @@ #include "animation_track_editor_plugins.h" #include "editor/audio_stream_preview.h" -#include "editor_resource_preview.h" -#include "editor_scale.h" +#include "editor/editor_resource_preview.h" +#include "editor/editor_scale.h" #include "scene/2d/animated_sprite_2d.h" #include "scene/2d/sprite_2d.h" #include "scene/3d/sprite_3d.h" diff --git a/editor/array_property_edit.cpp b/editor/array_property_edit.cpp index d9c6b72241..58527ee4d1 100644 --- a/editor/array_property_edit.cpp +++ b/editor/array_property_edit.cpp @@ -31,7 +31,7 @@ #include "array_property_edit.h" #include "core/io/marshalls.h" -#include "editor_node.h" +#include "editor/editor_node.h" #define ITEMS_PER_PAGE 100 @@ -121,7 +121,7 @@ bool ArrayPropertyEdit::_set(const StringName &p_name, const Variant &p_value) { } } else if (pn.begins_with("indices")) { - if (pn.find("_") != -1) { + if (pn.contains("_")) { //type int idx = pn.get_slicec('/', 1).get_slicec('_', 0).to_int(); @@ -178,7 +178,7 @@ bool ArrayPropertyEdit::_get(const StringName &p_name, Variant &r_ret) const { return true; } } else if (pn.begins_with("indices")) { - if (pn.find("_") != -1) { + if (pn.contains("_")) { //type int idx = pn.get_slicec('/', 1).get_slicec('_', 0).to_int(); bool valid; diff --git a/editor/audio_stream_preview.cpp b/editor/audio_stream_preview.cpp index 81a6f78415..f8bf12227a 100644 --- a/editor/audio_stream_preview.cpp +++ b/editor/audio_stream_preview.cpp @@ -214,25 +214,27 @@ void AudioStreamPreviewGenerator::_bind_methods() { AudioStreamPreviewGenerator *AudioStreamPreviewGenerator::singleton = nullptr; void AudioStreamPreviewGenerator::_notification(int p_what) { - if (p_what == NOTIFICATION_PROCESS) { - List<ObjectID> to_erase; - for (KeyValue<ObjectID, Preview> &E : previews) { - if (!E.value.generating.is_set()) { - if (E.value.thread) { - E.value.thread->wait_to_finish(); - memdelete(E.value.thread); - E.value.thread = nullptr; - } - if (!ObjectDB::get_instance(E.key)) { //no longer in use, get rid of preview - to_erase.push_back(E.key); + switch (p_what) { + case NOTIFICATION_PROCESS: { + List<ObjectID> to_erase; + for (KeyValue<ObjectID, Preview> &E : previews) { + if (!E.value.generating.is_set()) { + if (E.value.thread) { + E.value.thread->wait_to_finish(); + memdelete(E.value.thread); + E.value.thread = nullptr; + } + if (!ObjectDB::get_instance(E.key)) { //no longer in use, get rid of preview + to_erase.push_back(E.key); + } } } - } - while (to_erase.front()) { - previews.erase(to_erase.front()->get()); - to_erase.pop_front(); - } + while (to_erase.front()) { + previews.erase(to_erase.front()->get()); + to_erase.pop_front(); + } + } break; } } diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 0a269d960e..22d3155159 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -31,14 +31,11 @@ #include "code_editor.h" #include "core/input/input.h" -#include "core/object/message_queue.h" #include "core/os/keyboard.h" #include "core/string/string_builder.h" #include "editor/editor_scale.h" -#include "editor_node.h" -#include "editor_settings.h" -#include "scene/gui/margin_container.h" -#include "scene/gui/separator.h" +#include "editor/editor_settings.h" +#include "editor/plugins/script_editor_plugin.h" #include "scene/resources/font.h" void GotoLineDialog::popup_find_line(CodeEdit *p_edit) { @@ -88,29 +85,31 @@ GotoLineDialog::GotoLineDialog() { } void FindReplaceBar::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - find_prev->set_icon(get_theme_icon(SNAME("MoveUp"), SNAME("EditorIcons"))); - find_next->set_icon(get_theme_icon(SNAME("MoveDown"), SNAME("EditorIcons"))); - hide_button->set_normal_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); - hide_button->set_hover_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); - hide_button->set_pressed_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); - hide_button->set_custom_minimum_size(hide_button->get_normal_texture()->get_size()); - } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - set_process_unhandled_input(is_visible_in_tree()); - } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - find_prev->set_icon(get_theme_icon(SNAME("MoveUp"), SNAME("EditorIcons"))); - find_next->set_icon(get_theme_icon(SNAME("MoveDown"), SNAME("EditorIcons"))); - hide_button->set_normal_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); - hide_button->set_hover_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); - hide_button->set_pressed_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); - hide_button->set_custom_minimum_size(hide_button->get_normal_texture()->get_size()); - } else if (p_what == NOTIFICATION_THEME_CHANGED) { - matches_label->add_theme_color_override("font_color", results_count > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); - } else if (p_what == NOTIFICATION_PREDELETE) { - if (base_text_editor) { - base_text_editor->remove_find_replace_bar(); - base_text_editor = nullptr; - } + switch (p_what) { + case NOTIFICATION_READY: + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + find_prev->set_icon(get_theme_icon(SNAME("MoveUp"), SNAME("EditorIcons"))); + find_next->set_icon(get_theme_icon(SNAME("MoveDown"), SNAME("EditorIcons"))); + hide_button->set_normal_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); + hide_button->set_hover_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); + hide_button->set_pressed_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); + hide_button->set_custom_minimum_size(hide_button->get_normal_texture()->get_size()); + } break; + + case NOTIFICATION_VISIBILITY_CHANGED: { + set_process_unhandled_input(is_visible_in_tree()); + } break; + + case NOTIFICATION_THEME_CHANGED: { + matches_label->add_theme_color_override("font_color", results_count > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); + } break; + + case NOTIFICATION_PREDELETE: { + if (base_text_editor) { + base_text_editor->remove_find_replace_bar(); + base_text_editor = nullptr; + } + } break; } } @@ -122,7 +121,7 @@ void FindReplaceBar::unhandled_input(const Ref<InputEvent> &p_event) { return; } - Control *focus_owner = get_focus_owner(); + Control *focus_owner = get_viewport()->gui_get_focus_owner(); if (text_editor->has_focus() || (focus_owner && vbc_lineedit->is_ancestor_of(focus_owner))) { bool accepted = true; @@ -724,7 +723,7 @@ void CodeTextEditor::input(const Ref<InputEvent> &event) { } if (!text_editor->has_focus()) { - if ((find_replace_bar != nullptr && find_replace_bar->is_visible()) && (find_replace_bar->has_focus() || find_replace_bar->is_ancestor_of(get_focus_owner()))) { + if ((find_replace_bar != nullptr && find_replace_bar->is_visible()) && (find_replace_bar->has_focus() || find_replace_bar->is_ancestor_of(get_viewport()->gui_get_focus_owner()))) { if (ED_IS_SHORTCUT("script_text_editor/find_next", key_event)) { find_replace_bar->search_next(); accept_event(); @@ -884,8 +883,8 @@ Ref<Texture2D> CodeTextEditor::_get_completion_icon(const ScriptCodeCompletionOp Ref<Texture2D> tex; switch (p_option.kind) { case ScriptCodeCompletionOption::KIND_CLASS: { - if (has_theme_icon(p_option.display, "EditorIcons")) { - tex = get_theme_icon(p_option.display, "EditorIcons"); + if (has_theme_icon(p_option.display, SNAME("EditorIcons"))) { + tex = get_theme_icon(p_option.display, SNAME("EditorIcons")); } else { tex = get_theme_icon(SNAME("Object"), SNAME("EditorIcons")); } @@ -1661,44 +1660,47 @@ void CodeTextEditor::_error_pressed(const Ref<InputEvent> &p_event) { } } -void CodeTextEditor::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: { - error_button->set_icon(get_theme_icon(SNAME("StatusError"), SNAME("EditorIcons"))); - error_button->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); - error_button->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); - error_button->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); +void CodeTextEditor::_update_status_bar_theme() { + error_button->set_icon(get_theme_icon(SNAME("StatusError"), SNAME("EditorIcons"))); + error_button->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + error_button->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); + error_button->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); - warning_button->set_icon(get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons"))); - warning_button->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); - warning_button->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); - warning_button->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); + warning_button->set_icon(get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons"))); + warning_button->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + warning_button->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); + warning_button->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); - line_and_col_txt->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); - line_and_col_txt->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); + line_and_col_txt->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); + line_and_col_txt->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); +} - if (p_what == NOTIFICATION_ENTER_TREE) { - break; - } +void CodeTextEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + _update_status_bar_theme(); + } break; + + case NOTIFICATION_THEME_CHANGED: { + _update_status_bar_theme(); if (toggle_scripts_button->is_visible()) { update_toggle_scripts_button(); } _update_text_editor_theme(); } break; + case NOTIFICATION_VISIBILITY_CHANGED: { if (toggle_scripts_button->is_visible()) { update_toggle_scripts_button(); } set_process_input(is_visible_in_tree()); } break; + case NOTIFICATION_PREDELETE: { if (find_replace_bar) { find_replace_bar->set_text_edit(nullptr); } } break; - default: - break; } } diff --git a/editor/code_editor.h b/editor/code_editor.h index a385ae2287..24316bf8b0 100644 --- a/editor/code_editor.h +++ b/editor/code_editor.h @@ -31,11 +31,12 @@ #ifndef CODE_EDITOR_H #define CODE_EDITOR_H -#include "editor/editor_plugin.h" +#include "scene/gui/box_container.h" +#include "scene/gui/button.h" #include "scene/gui/check_box.h" -#include "scene/gui/check_button.h" #include "scene/gui/code_edit.h" #include "scene/gui/dialogs.h" +#include "scene/gui/label.h" #include "scene/gui/line_edit.h" #include "scene/main/timer.h" @@ -188,6 +189,8 @@ class CodeTextEditor : public VBoxContainer { void _set_show_warnings_panel(bool p_show); void _error_pressed(const Ref<InputEvent> &p_event); + void _update_status_bar_theme(); + void _delete_line(int p_line); void _toggle_scripts_pressed(); diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index 5bea793da8..df2a66f182 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -30,15 +30,12 @@ #include "connections_dialog.h" -#include "core/string/print_string.h" #include "editor/doc_tools.h" -#include "editor_node.h" -#include "editor_scale.h" -#include "editor_settings.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" +#include "editor/scene_tree_dock.h" #include "plugins/script_editor_plugin.h" -#include "scene/gui/label.h" -#include "scene/gui/popup_menu.h" -#include "scene/gui/spin_box.h" static Node *_find_first_script(Node *p_root, Node *p_node) { if (p_node != p_root && p_node->get_owner() != p_root) { @@ -280,8 +277,10 @@ void ConnectDialog::_update_ok_enabled() { } void ConnectDialog::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - bind_editor->edit(cdbinds); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + bind_editor->edit(cdbinds); + } break; } } @@ -310,7 +309,7 @@ void ConnectDialog::set_dst_node(Node *p_node) { StringName ConnectDialog::get_dst_method_name() const { String txt = dst_method->get_text(); - if (txt.find("(") != -1) { + if (txt.contains("(")) { txt = txt.left(txt.find("(")).strip_edges(); } return txt; @@ -540,13 +539,27 @@ ConnectDialog::~ConnectDialog() { // Originally copied and adapted from EditorProperty, try to keep style in sync. Control *ConnectionsDockTree::make_custom_tooltip(const String &p_text) const { EditorHelpBit *help_bit = memnew(EditorHelpBit); - help_bit->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TooltipPanel"))); help_bit->get_rich_text()->set_fixed_size_to_width(360 * EDSCALE); - String text = TTR("Signal:") + " [u][b]" + p_text.get_slice("::", 0) + "[/b][/u]"; - text += p_text.get_slice("::", 1).strip_edges() + "\n"; - text += p_text.get_slice("::", 2).strip_edges(); - help_bit->call_deferred(SNAME("set_text"), text); // Hack so it uses proper theme once inside scene. + // p_text is expected to be something like this: + // "gui_input::(event: InputEvent)::<Signal description>" + // with the latter being possibly empty. + PackedStringArray slices = p_text.split("::", false); + if (slices.size() < 2) { + // Shouldn't happen here, but just in case pass the text along. + help_bit->set_text(p_text); + return help_bit; + } + + String text = TTR("Signal:") + " [u][b]" + slices[0] + "[/b][/u]"; + text += slices[1].strip_edges() + "\n"; + if (slices.size() > 2) { + text += slices[2].strip_edges(); + } else { + text += "[i]" + TTR("No description.") + "[/i]"; + } + help_bit->set_text(text); + return help_bit; } @@ -625,7 +638,7 @@ void ConnectionsDock::_make_or_edit_connection() { it = nullptr; if (add_script_function) { - editor->emit_signal(SNAME("script_add_function_request"), target, cd.method, script_function_args); + EditorNode::get_singleton()->emit_signal(SNAME("script_add_function_request"), target, cd.method, script_function_args); hide(); } @@ -750,7 +763,7 @@ void ConnectionsDock::_open_connection_dialog(TreeItem &p_item) { String node_name = selected_node->get_name(); for (int i = 0; i < node_name.length(); i++) { // TODO: Regex filter may be cleaner. char32_t c = node_name[i]; - if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_')) { + if (!is_ascii_identifier_char(c)) { if (c == ' ') { // Replace spaces with underlines. c = '_'; @@ -837,7 +850,7 @@ void ConnectionsDock::_go_to_script(TreeItem &p_item) { } if (script.is_valid() && ScriptEditor::get_singleton()->script_goto_method(script, cd.method)) { - editor->call("_editor_select", EditorNode::EDITOR_SCRIPT); + EditorNode::get_singleton()->call("_editor_select", EditorNode::EDITOR_SCRIPT); } } @@ -927,6 +940,7 @@ void ConnectionsDock::_notification(int p_what) { case NOTIFICATION_THEME_CHANGED: { search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); } break; + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { update_tree(); } break; @@ -974,8 +988,8 @@ void ConnectionsDock::update_tree() { name = scr->get_class(); } - if (has_theme_icon(scr->get_class(), "EditorIcons")) { - icon = get_theme_icon(scr->get_class(), "EditorIcons"); + if (has_theme_icon(scr->get_class(), SNAME("EditorIcons"))) { + icon = get_theme_icon(scr->get_class(), SNAME("EditorIcons")); } } } else { @@ -1132,8 +1146,7 @@ void ConnectionsDock::update_tree() { connect_button->set_disabled(true); } -ConnectionsDock::ConnectionsDock(EditorNode *p_editor) { - editor = p_editor; +ConnectionsDock::ConnectionsDock() { set_name(TTR("Signals")); VBoxContainer *vbc = this; diff --git a/editor/connections_dialog.h b/editor/connections_dialog.h index 8bad2d9b5b..a075ff0c55 100644 --- a/editor/connections_dialog.h +++ b/editor/connections_dialog.h @@ -35,16 +35,19 @@ #include "editor/editor_inspector.h" #include "editor/scene_tree_editor.h" #include "scene/gui/button.h" +#include "scene/gui/check_box.h" #include "scene/gui/check_button.h" #include "scene/gui/dialogs.h" +#include "scene/gui/label.h" #include "scene/gui/line_edit.h" #include "scene/gui/menu_button.h" +#include "scene/gui/option_button.h" #include "scene/gui/popup.h" +#include "scene/gui/popup_menu.h" +#include "scene/gui/spin_box.h" #include "scene/gui/tree.h" -class PopupMenu; class ConnectDialogBinds; -class SpinBox; class ConnectDialog : public ConfirmationDialog { GDCLASS(ConnectDialog, ConfirmationDialog); @@ -182,7 +185,6 @@ class ConnectionsDock : public VBoxContainer { Node *selected_node; ConnectionsDockTree *tree; - EditorNode *editor; ConfirmationDialog *disconnect_all_dialog; ConnectDialog *connect_dialog; @@ -224,7 +226,7 @@ public: void set_node(Node *p_node); void update_tree(); - ConnectionsDock(EditorNode *p_editor = nullptr); + ConnectionsDock(); ~ConnectionsDock(); }; diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp index 3d55f45dd6..7e59fc31c4 100644 --- a/editor/create_dialog.cpp +++ b/editor/create_dialog.cpp @@ -32,10 +32,10 @@ #include "core/object/class_db.h" #include "core/os/keyboard.h" -#include "editor_feature_profile.h" -#include "editor_node.h" -#include "editor_scale.h" -#include "editor_settings.h" +#include "editor/editor_feature_profile.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode, const String &p_select_type) { _fill_type_list(); @@ -235,19 +235,19 @@ void CreateDialog::_add_type(const String &p_type, const TypeCategory p_type_cat } } else { if (ScriptServer::is_global_class(p_type)) { - inherits = EditorNode::get_editor_data().script_class_get_base(p_type); - if (inherits.is_empty()) { - Ref<Script> script = EditorNode::get_editor_data().script_class_load_script(p_type); - ERR_FAIL_COND(script.is_null()); + Ref<Script> script = EditorNode::get_editor_data().script_class_load_script(p_type); + ERR_FAIL_COND(script.is_null()); - Ref<Script> base = script->get_base_script(); - if (base.is_null()) { - String extends; - script->get_language()->get_global_class_name(script->get_path(), &extends); + Ref<Script> base = script->get_base_script(); + if (base.is_null()) { + String extends; + script->get_language()->get_global_class_name(script->get_path(), &extends); - inherits = extends; - inherited_type = TypeCategory::CPP_TYPE; - } else { + inherits = extends; + inherited_type = TypeCategory::CPP_TYPE; + } else { + inherits = script->get_language()->get_global_class_name(base->get_path()); + if (inherits.is_empty()) { inherits = base->get_path(); inherited_type = TypeCategory::PATH_TYPE; } @@ -429,9 +429,11 @@ void CreateDialog::_notification(int p_what) { connect("confirmed", callable_mp(this, &CreateDialog::_confirmed)); _update_theme(); } break; + case NOTIFICATION_EXIT_TREE: { disconnect("confirmed", callable_mp(this, &CreateDialog::_confirmed)); } break; + case NOTIFICATION_VISIBILITY_CHANGED: { if (is_visible()) { search_box->call_deferred(SNAME("grab_focus")); // still not visible @@ -440,20 +442,21 @@ void CreateDialog::_notification(int p_what) { EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "create_new_node", Rect2(get_position(), get_size())); } } break; + case NOTIFICATION_THEME_CHANGED: { _update_theme(); } break; } } -void CreateDialog::select_type(const String &p_type) { +void CreateDialog::select_type(const String &p_type, bool p_center_on_item) { if (!search_options_types.has(p_type)) { return; } TreeItem *to_select = search_options_types[p_type]; to_select->select(0); - search_options->scroll_to_item(to_select); + search_options->scroll_to_item(to_select, p_center_on_item); if (EditorHelp::get_doc_data()->class_list.has(p_type) && !DTR(EditorHelp::get_doc_data()->class_list[p_type].brief_description).is_empty()) { // Display both class name and description, since the help bit may be displayed @@ -467,7 +470,7 @@ void CreateDialog::select_type(const String &p_type) { } favorite->set_disabled(false); - favorite->set_pressed(favorite_list.find(p_type) != -1); + favorite->set_pressed(favorite_list.has(p_type)); get_ok_button()->set_disabled(false); } @@ -503,24 +506,14 @@ Variant CreateDialog::instance_selected() { } else { obj = ClassDB::instantiate(selected->get_text(0)); } - - // Check if any Object-type property should be instantiated. - List<PropertyInfo> pinfo; - ((Object *)obj)->get_property_list(&pinfo); - - for (const PropertyInfo &pi : pinfo) { - if (pi.type == Variant::OBJECT && pi.usage & PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT) { - Object *prop = ClassDB::instantiate(pi.class_name); - ((Object *)obj)->set(pi.name, prop); - } - } + EditorNode::get_editor_data().instantiate_object_properties(obj); return obj; } void CreateDialog::_item_selected() { String name = get_selected_type(); - select_type(name); + select_type(name, false); } void CreateDialog::_hide_requested() { @@ -539,12 +532,12 @@ void CreateDialog::_favorite_toggled() { String name = item->get_text(0); - if (favorite_list.find(name) == -1) { - favorite_list.push_back(name); - favorite->set_pressed(true); - } else { + if (favorite_list.has(name)) { favorite_list.erase(name); favorite->set_pressed(false); + } else { + favorite_list.push_back(name); + favorite->set_pressed(true); } _save_and_update_favorite_list(); diff --git a/editor/create_dialog.h b/editor/create_dialog.h index f905160df3..fe7c89c059 100644 --- a/editor/create_dialog.h +++ b/editor/create_dialog.h @@ -31,7 +31,7 @@ #ifndef CREATE_DIALOG_H #define CREATE_DIALOG_H -#include "editor_help.h" +#include "editor/editor_help.h" #include "scene/gui/button.h" #include "scene/gui/dialogs.h" #include "scene/gui/item_list.h" @@ -79,7 +79,7 @@ class CreateDialog : public ConfirmationDialog { void _sbox_input(const Ref<InputEvent> &p_ie); void _text_changed(const String &p_newtext); - void select_type(const String &p_type); + void select_type(const String &p_type, bool p_center_on_item = true); void _item_selected(); void _hide_requested(); diff --git a/editor/debugger/debug_adapter/debug_adapter_parser.cpp b/editor/debugger/debug_adapter/debug_adapter_parser.cpp index ff4051fc67..e7baeeeded 100644 --- a/editor/debugger/debug_adapter/debug_adapter_parser.cpp +++ b/editor/debugger/debug_adapter/debug_adapter_parser.cpp @@ -34,6 +34,7 @@ #include "editor/debugger/script_editor_debugger.h" #include "editor/editor_node.h" #include "editor/editor_run_native.h" +#include "editor/plugins/script_editor_plugin.h" void DebugAdapterParser::_bind_methods() { // Requests diff --git a/editor/debugger/debug_adapter/debug_adapter_server.cpp b/editor/debugger/debug_adapter/debug_adapter_server.cpp index ffbbf66015..e9fc7ec913 100644 --- a/editor/debugger/debug_adapter/debug_adapter_server.cpp +++ b/editor/debugger/debug_adapter/debug_adapter_server.cpp @@ -42,12 +42,14 @@ DebugAdapterServer::DebugAdapterServer() { void DebugAdapterServer::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_ENTER_TREE: { start(); - break; - case NOTIFICATION_EXIT_TREE: + } break; + + case NOTIFICATION_EXIT_TREE: { stop(); - break; + } break; + case NOTIFICATION_INTERNAL_PROCESS: { // The main loop can be run again during request processing, which modifies internal state of the protocol. // Thus, "polling" is needed to prevent it from parsing other requests while the current one isn't finished. @@ -57,6 +59,7 @@ void DebugAdapterServer::_notification(int p_what) { polling = false; } } break; + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { protocol._request_timeout = EditorSettings::get_singleton()->get("network/debug_adapter/request_timeout"); protocol._sync_breakpoints = EditorSettings::get_singleton()->get("network/debug_adapter/sync_breakpoints"); diff --git a/editor/debugger/editor_debugger_inspector.cpp b/editor/debugger/editor_debugger_inspector.cpp index 38bdbe2870..c111190ca3 100644 --- a/editor/debugger/editor_debugger_inspector.cpp +++ b/editor/debugger/editor_debugger_inspector.cpp @@ -107,14 +107,13 @@ void EditorDebuggerInspector::_bind_methods() { void EditorDebuggerInspector::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_POSTINITIALIZE: + case NOTIFICATION_POSTINITIALIZE: { connect("object_id_selected", callable_mp(this, &EditorDebuggerInspector::_object_selected)); - break; - case NOTIFICATION_ENTER_TREE: + } break; + + case NOTIFICATION_ENTER_TREE: { edit(variables); - break; - default: - break; + } break; } } @@ -155,7 +154,7 @@ ObjectID EditorDebuggerInspector::add_object(const Array &p_arr) { if (pinfo.type == Variant::OBJECT) { if (var.get_type() == Variant::STRING) { String path = var; - if (path.find("::") != -1) { + if (path.contains("::")) { // built-in resource String base_path = path.get_slice("::", 0); RES dependency = ResourceLoader::load(base_path); diff --git a/editor/debugger/editor_debugger_node.cpp b/editor/debugger/editor_debugger_node.cpp index 79853b6809..7c9a984b6a 100644 --- a/editor/debugger/editor_debugger_node.cpp +++ b/editor/debugger/editor_debugger_node.cpp @@ -36,6 +36,7 @@ #include "editor/editor_node.h" #include "editor/plugins/editor_debugger_plugin.h" #include "editor/plugins/script_editor_plugin.h" +#include "editor/scene_tree_dock.h" #include "scene/gui/menu_button.h" #include "scene/gui/tab_container.h" @@ -88,7 +89,7 @@ EditorDebuggerNode::EditorDebuggerNode() { } ScriptEditorDebugger *EditorDebuggerNode::_add_debugger() { - ScriptEditorDebugger *node = memnew(ScriptEditorDebugger(EditorNode::get_singleton())); + ScriptEditorDebugger *node = memnew(ScriptEditorDebugger); int id = tabs->get_tab_count(); node->connect("stop_requested", callable_mp(this, &EditorDebuggerNode::_debugger_wants_stop), varray(id)); @@ -239,112 +240,113 @@ void EditorDebuggerNode::_notification(int p_what) { tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); } } break; + case NOTIFICATION_READY: { _update_debug_options(); } break; - default: - break; - } - - if (p_what != NOTIFICATION_PROCESS || !server.is_valid()) { - return; - } - - if (!server.is_valid() || !server->is_active()) { - stop(); - return; - } - server->poll(); - - // Errors and warnings - int error_count = 0; - int warning_count = 0; - _for_all(tabs, [&](ScriptEditorDebugger *dbg) { - error_count += dbg->get_error_count(); - warning_count += dbg->get_warning_count(); - }); - if (error_count != last_error_count || warning_count != last_warning_count) { - _for_all(tabs, [&](ScriptEditorDebugger *dbg) { - dbg->update_tabs(); - }); - - if (error_count == 0 && warning_count == 0) { - debugger_button->set_text(TTR("Debugger")); - debugger_button->remove_theme_color_override("font_color"); - debugger_button->set_icon(Ref<Texture2D>()); - } else { - debugger_button->set_text(TTR("Debugger") + " (" + itos(error_count + warning_count) + ")"); - if (error_count >= 1 && warning_count >= 1) { - debugger_button->set_icon(get_theme_icon(SNAME("ErrorWarning"), SNAME("EditorIcons"))); - // Use error color to represent the highest level of severity reported. - debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); - } else if (error_count >= 1) { - debugger_button->set_icon(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); - debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); - } else { - debugger_button->set_icon(get_theme_icon(SNAME("Warning"), SNAME("EditorIcons"))); - debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + case NOTIFICATION_PROCESS: { + if (!server.is_valid()) { + return; } - } - last_error_count = error_count; - last_warning_count = warning_count; - } - // Remote scene tree update - remote_scene_tree_timeout -= get_process_delta_time(); - if (remote_scene_tree_timeout < 0) { - remote_scene_tree_timeout = EditorSettings::get_singleton()->get("debugger/remote_scene_tree_refresh_interval"); - if (remote_scene_tree->is_visible_in_tree()) { - get_current_debugger()->request_remote_tree(); - } - } - - // Remote inspector update - inspect_edited_object_timeout -= get_process_delta_time(); - if (inspect_edited_object_timeout < 0) { - inspect_edited_object_timeout = EditorSettings::get_singleton()->get("debugger/remote_inspect_refresh_interval"); - if (EditorDebuggerRemoteObject *obj = get_inspected_remote_object()) { - get_current_debugger()->request_remote_object(obj->remote_object_id); - } - } - - // Take connections. - if (server->is_connection_available()) { - ScriptEditorDebugger *debugger = nullptr; - _for_all(tabs, [&](ScriptEditorDebugger *dbg) { - if (debugger || dbg->is_session_active()) { + if (!server->is_active()) { + stop(); return; } - debugger = dbg; - }); - if (debugger == nullptr) { - if (tabs->get_tab_count() <= 4) { // Max 4 debugging sessions active. - debugger = _add_debugger(); - } else { - // We already have too many sessions, disconnecting new clients to prevent them from hanging. - server->take_connection()->close(); - return; // Can't add, stop here. + server->poll(); + + // Errors and warnings + int error_count = 0; + int warning_count = 0; + _for_all(tabs, [&](ScriptEditorDebugger *dbg) { + error_count += dbg->get_error_count(); + warning_count += dbg->get_warning_count(); + }); + + if (error_count != last_error_count || warning_count != last_warning_count) { + _for_all(tabs, [&](ScriptEditorDebugger *dbg) { + dbg->update_tabs(); + }); + + if (error_count == 0 && warning_count == 0) { + debugger_button->set_text(TTR("Debugger")); + debugger_button->remove_theme_color_override("font_color"); + debugger_button->set_icon(Ref<Texture2D>()); + } else { + debugger_button->set_text(TTR("Debugger") + " (" + itos(error_count + warning_count) + ")"); + if (error_count >= 1 && warning_count >= 1) { + debugger_button->set_icon(get_theme_icon(SNAME("ErrorWarning"), SNAME("EditorIcons"))); + // Use error color to represent the highest level of severity reported. + debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + } else if (error_count >= 1) { + debugger_button->set_icon(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); + debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + } else { + debugger_button->set_icon(get_theme_icon(SNAME("Warning"), SNAME("EditorIcons"))); + debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + } + } + last_error_count = error_count; + last_warning_count = warning_count; } - } - EditorNode::get_singleton()->get_pause_button()->set_disabled(false); - // Switch to remote tree view if so desired. - auto_switch_remote_scene_tree = (bool)EditorSettings::get_singleton()->get("debugger/auto_switch_to_remote_scene_tree"); - if (auto_switch_remote_scene_tree) { - SceneTreeDock::get_singleton()->show_remote_tree(); - } - // Good to go. - SceneTreeDock::get_singleton()->show_tab_buttons(); - debugger->set_editor_remote_tree(remote_scene_tree); - debugger->start(server->take_connection()); - // Send breakpoints. - for (const KeyValue<Breakpoint, bool> &E : breakpoints) { - const Breakpoint &bp = E.key; - debugger->set_breakpoint(bp.source, bp.line, E.value); - } // Will arrive too late, how does the regular run work? + // Remote scene tree update + remote_scene_tree_timeout -= get_process_delta_time(); + if (remote_scene_tree_timeout < 0) { + remote_scene_tree_timeout = EditorSettings::get_singleton()->get("debugger/remote_scene_tree_refresh_interval"); + if (remote_scene_tree->is_visible_in_tree()) { + get_current_debugger()->request_remote_tree(); + } + } + + // Remote inspector update + inspect_edited_object_timeout -= get_process_delta_time(); + if (inspect_edited_object_timeout < 0) { + inspect_edited_object_timeout = EditorSettings::get_singleton()->get("debugger/remote_inspect_refresh_interval"); + if (EditorDebuggerRemoteObject *obj = get_inspected_remote_object()) { + get_current_debugger()->request_remote_object(obj->remote_object_id); + } + } - debugger->update_live_edit_root(); + // Take connections. + if (server->is_connection_available()) { + ScriptEditorDebugger *debugger = nullptr; + _for_all(tabs, [&](ScriptEditorDebugger *dbg) { + if (debugger || dbg->is_session_active()) { + return; + } + debugger = dbg; + }); + if (debugger == nullptr) { + if (tabs->get_tab_count() <= 4) { // Max 4 debugging sessions active. + debugger = _add_debugger(); + } else { + // We already have too many sessions, disconnecting new clients to prevent them from hanging. + server->take_connection()->close(); + return; // Can't add, stop here. + } + } + + EditorNode::get_singleton()->get_pause_button()->set_disabled(false); + // Switch to remote tree view if so desired. + auto_switch_remote_scene_tree = (bool)EditorSettings::get_singleton()->get("debugger/auto_switch_to_remote_scene_tree"); + if (auto_switch_remote_scene_tree) { + SceneTreeDock::get_singleton()->show_remote_tree(); + } + // Good to go. + SceneTreeDock::get_singleton()->show_tab_buttons(); + debugger->set_editor_remote_tree(remote_scene_tree); + debugger->start(server->take_connection()); + // Send breakpoints. + for (const KeyValue<Breakpoint, bool> &E : breakpoints) { + const Breakpoint &bp = E.key; + debugger->set_breakpoint(bp.source, bp.line, E.value); + } // Will arrive too late, how does the regular run work? + + debugger->update_live_edit_root(); + } + } break; } } @@ -500,7 +502,7 @@ void EditorDebuggerNode::set_breakpoint(const String &p_path, int p_line, bool p dbg->set_breakpoint(p_path, p_line, p_enabled); }); - emit_signal("breakpoint_toggled", p_path, p_line, p_enabled); + emit_signal(SNAME("breakpoint_toggled"), p_path, p_line, p_enabled); } void EditorDebuggerNode::set_breakpoints(const String &p_path, Array p_lines) { @@ -683,7 +685,7 @@ EditorDebuggerNode::CameraOverride EditorDebuggerNode::get_camera_override() { void EditorDebuggerNode::add_debugger_plugin(const Ref<Script> &p_script) { ERR_FAIL_COND_MSG(debugger_plugins.has(p_script), "Debugger plugin already exists."); ERR_FAIL_COND_MSG(p_script.is_null(), "Debugger plugin script is null"); - ERR_FAIL_COND_MSG(String(p_script->get_instance_base_type()) == "", "Debugger plugin script has error."); + ERR_FAIL_COND_MSG(p_script->get_instance_base_type() == StringName(), "Debugger plugin script has error."); ERR_FAIL_COND_MSG(String(p_script->get_instance_base_type()) != "EditorDebuggerPlugin", "Base type of debugger plugin is not 'EditorDebuggerPlugin'."); ERR_FAIL_COND_MSG(!p_script->is_tool(), "Debugger plugin script is not in tool mode."); debugger_plugins.insert(p_script); diff --git a/editor/debugger/editor_debugger_tree.cpp b/editor/debugger/editor_debugger_tree.cpp index 41f4db541d..3a65d015d5 100644 --- a/editor/debugger/editor_debugger_tree.cpp +++ b/editor/debugger/editor_debugger_tree.cpp @@ -30,7 +30,9 @@ #include "editor_debugger_tree.h" +#include "editor/editor_file_dialog.h" #include "editor/editor_node.h" +#include "editor/scene_tree_dock.h" #include "scene/debugger/scene_debugger.h" #include "scene/resources/packed_scene.h" #include "servers/display_server.h" @@ -51,10 +53,12 @@ EditorDebuggerTree::EditorDebuggerTree() { } void EditorDebuggerTree::_notification(int p_what) { - if (p_what == NOTIFICATION_POSTINITIALIZE) { - connect("cell_selected", callable_mp(this, &EditorDebuggerTree::_scene_tree_selected)); - connect("item_collapsed", callable_mp(this, &EditorDebuggerTree::_scene_tree_folded)); - connect("item_rmb_selected", callable_mp(this, &EditorDebuggerTree::_scene_tree_rmb_selected)); + switch (p_what) { + case NOTIFICATION_POSTINITIALIZE: { + connect("cell_selected", callable_mp(this, &EditorDebuggerTree::_scene_tree_selected)); + connect("item_collapsed", callable_mp(this, &EditorDebuggerTree::_scene_tree_folded)); + connect("item_rmb_selected", callable_mp(this, &EditorDebuggerTree::_scene_tree_rmb_selected)); + } break; } } diff --git a/editor/debugger/editor_network_profiler.cpp b/editor/debugger/editor_network_profiler.cpp index 698e950f57..8c18eba71d 100644 --- a/editor/debugger/editor_network_profiler.cpp +++ b/editor/debugger/editor_network_profiler.cpp @@ -39,15 +39,18 @@ void EditorNetworkProfiler::_bind_methods() { } void EditorNetworkProfiler::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - activate->set_icon(get_theme_icon(SNAME("Play"), SNAME("EditorIcons"))); - clear_button->set_icon(get_theme_icon(SNAME("Clear"), SNAME("EditorIcons"))); - incoming_bandwidth_text->set_right_icon(get_theme_icon(SNAME("ArrowDown"), SNAME("EditorIcons"))); - outgoing_bandwidth_text->set_right_icon(get_theme_icon(SNAME("ArrowUp"), SNAME("EditorIcons"))); - - // This needs to be done here to set the faded color when the profiler is first opened - incoming_bandwidth_text->add_theme_color_override("font_uneditable_color", get_theme_color(SNAME("font_color"), SNAME("Editor")) * Color(1, 1, 1, 0.5)); - outgoing_bandwidth_text->add_theme_color_override("font_uneditable_color", get_theme_color(SNAME("font_color"), SNAME("Editor")) * Color(1, 1, 1, 0.5)); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + activate->set_icon(get_theme_icon(SNAME("Play"), SNAME("EditorIcons"))); + clear_button->set_icon(get_theme_icon(SNAME("Clear"), SNAME("EditorIcons"))); + incoming_bandwidth_text->set_right_icon(get_theme_icon(SNAME("ArrowDown"), SNAME("EditorIcons"))); + outgoing_bandwidth_text->set_right_icon(get_theme_icon(SNAME("ArrowUp"), SNAME("EditorIcons"))); + + // This needs to be done here to set the faded color when the profiler is first opened + incoming_bandwidth_text->add_theme_color_override("font_uneditable_color", get_theme_color(SNAME("font_color"), SNAME("Editor")) * Color(1, 1, 1, 0.5)); + outgoing_bandwidth_text->add_theme_color_override("font_uneditable_color", get_theme_color(SNAME("font_color"), SNAME("Editor")) * Color(1, 1, 1, 0.5)); + } break; } } @@ -56,7 +59,7 @@ void EditorNetworkProfiler::_update_frame() { TreeItem *root = counters_display->create_item(); - for (const KeyValue<ObjectID, DebuggerMarshalls::MultiplayerNodeInfo> &E : nodes_data) { + for (const KeyValue<ObjectID, SceneDebugger::RPCNodeInfo> &E : nodes_data) { TreeItem *node = counters_display->create_item(root); for (int j = 0; j < counters_display->get_columns(); ++j) { @@ -65,9 +68,7 @@ void EditorNetworkProfiler::_update_frame() { node->set_text(0, E.value.node_path); node->set_text(1, E.value.incoming_rpc == 0 ? "-" : itos(E.value.incoming_rpc)); - node->set_text(2, E.value.incoming_rset == 0 ? "-" : itos(E.value.incoming_rset)); - node->set_text(3, E.value.outgoing_rpc == 0 ? "-" : itos(E.value.outgoing_rpc)); - node->set_text(4, E.value.outgoing_rset == 0 ? "-" : itos(E.value.outgoing_rset)); + node->set_text(2, E.value.outgoing_rpc == 0 ? "-" : itos(E.value.outgoing_rpc)); } } @@ -91,14 +92,12 @@ void EditorNetworkProfiler::_clear_pressed() { } } -void EditorNetworkProfiler::add_node_frame_data(const DebuggerMarshalls::MultiplayerNodeInfo p_frame) { +void EditorNetworkProfiler::add_node_frame_data(const SceneDebugger::RPCNodeInfo p_frame) { if (!nodes_data.has(p_frame.node)) { nodes_data.insert(p_frame.node, p_frame); } else { nodes_data[p_frame.node].incoming_rpc += p_frame.incoming_rpc; - nodes_data[p_frame.node].incoming_rset += p_frame.incoming_rset; nodes_data[p_frame.node].outgoing_rpc += p_frame.outgoing_rpc; - nodes_data[p_frame.node].outgoing_rset += p_frame.outgoing_rset; } if (frame_delay->is_stopped()) { @@ -174,7 +173,7 @@ EditorNetworkProfiler::EditorNetworkProfiler() { counters_display->set_v_size_flags(SIZE_EXPAND_FILL); counters_display->set_hide_folding(true); counters_display->set_hide_root(true); - counters_display->set_columns(5); + counters_display->set_columns(3); counters_display->set_column_titles_visible(true); counters_display->set_column_title(0, TTR("Node")); counters_display->set_column_expand(0, true); @@ -184,18 +183,10 @@ EditorNetworkProfiler::EditorNetworkProfiler() { counters_display->set_column_expand(1, false); counters_display->set_column_clip_content(1, true); counters_display->set_column_custom_minimum_width(1, 120 * EDSCALE); - counters_display->set_column_title(2, TTR("Incoming RSET")); + counters_display->set_column_title(2, TTR("Outgoing RPC")); counters_display->set_column_expand(2, false); counters_display->set_column_clip_content(2, true); counters_display->set_column_custom_minimum_width(2, 120 * EDSCALE); - counters_display->set_column_title(3, TTR("Outgoing RPC")); - counters_display->set_column_expand(3, false); - counters_display->set_column_clip_content(3, true); - counters_display->set_column_custom_minimum_width(3, 120 * EDSCALE); - counters_display->set_column_title(4, TTR("Outgoing RSET")); - counters_display->set_column_expand(4, false); - counters_display->set_column_clip_content(4, true); - counters_display->set_column_custom_minimum_width(4, 120 * EDSCALE); add_child(counters_display); frame_delay = memnew(Timer); diff --git a/editor/debugger/editor_network_profiler.h b/editor/debugger/editor_network_profiler.h index 320dd2a826..3e95eb0de6 100644 --- a/editor/debugger/editor_network_profiler.h +++ b/editor/debugger/editor_network_profiler.h @@ -31,7 +31,7 @@ #ifndef EDITORNETWORKPROFILER_H #define EDITORNETWORKPROFILER_H -#include "core/debugger/debugger_marshalls.h" +#include "scene/debugger/scene_debugger.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" #include "scene/gui/label.h" @@ -50,7 +50,7 @@ private: Timer *frame_delay; - Map<ObjectID, DebuggerMarshalls::MultiplayerNodeInfo> nodes_data; + Map<ObjectID, SceneDebugger::RPCNodeInfo> nodes_data; void _update_frame(); @@ -62,7 +62,7 @@ protected: static void _bind_methods(); public: - void add_node_frame_data(const DebuggerMarshalls::MultiplayerNodeInfo p_frame); + void add_node_frame_data(const SceneDebugger::RPCNodeInfo p_frame); void set_bandwidth(int p_incoming, int p_outgoing); bool is_profiling(); diff --git a/editor/debugger/editor_profiler.cpp b/editor/debugger/editor_profiler.cpp index da1d6a54f2..4b263e5152 100644 --- a/editor/debugger/editor_profiler.cpp +++ b/editor/debugger/editor_profiler.cpp @@ -393,9 +393,13 @@ void EditorProfiler::_clear_pressed() { } void EditorProfiler::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_LAYOUT_DIRECTION_CHANGED || p_what == NOTIFICATION_TRANSLATION_CHANGED) { - activate->set_icon(get_theme_icon(SNAME("Play"), SNAME("EditorIcons"))); - clear_button->set_icon(get_theme_icon(SNAME("Clear"), SNAME("EditorIcons"))); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_LAYOUT_DIRECTION_CHANGED: + case NOTIFICATION_TRANSLATION_CHANGED: { + activate->set_icon(get_theme_icon(SNAME("Play"), SNAME("EditorIcons"))); + clear_button->set_icon(get_theme_icon(SNAME("Clear"), SNAME("EditorIcons"))); + } break; } } diff --git a/editor/debugger/editor_visual_profiler.cpp b/editor/debugger/editor_visual_profiler.cpp index 3cb5d3513d..2a1b0029d4 100644 --- a/editor/debugger/editor_visual_profiler.cpp +++ b/editor/debugger/editor_visual_profiler.cpp @@ -41,7 +41,6 @@ void EditorVisualProfiler::add_frame_metric(const Metric &p_metric) { } frame_metrics.write[last_metric] = p_metric; - // _make_metric_ptrs(frame_metrics.write[last_metric]); List<String> stack; for (int i = 0; i < frame_metrics[last_metric].areas.size(); i++) { @@ -423,13 +422,17 @@ void EditorVisualProfiler::_clear_pressed() { } void EditorVisualProfiler::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_LAYOUT_DIRECTION_CHANGED || p_what == NOTIFICATION_TRANSLATION_CHANGED) { - if (is_layout_rtl()) { - activate->set_icon(get_theme_icon(SNAME("PlayBackwards"), SNAME("EditorIcons"))); - } else { - activate->set_icon(get_theme_icon(SNAME("Play"), SNAME("EditorIcons"))); - } - clear_button->set_icon(get_theme_icon(SNAME("Clear"), SNAME("EditorIcons"))); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_LAYOUT_DIRECTION_CHANGED: + case NOTIFICATION_TRANSLATION_CHANGED: { + if (is_layout_rtl()) { + activate->set_icon(get_theme_icon(SNAME("PlayBackwards"), SNAME("EditorIcons"))); + } else { + activate->set_icon(get_theme_icon(SNAME("Play"), SNAME("EditorIcons"))); + } + clear_button->set_icon(get_theme_icon(SNAME("Clear"), SNAME("EditorIcons"))); + } break; } } @@ -478,19 +481,6 @@ void EditorVisualProfiler::_graph_tex_draw() { graph->draw_string(font, Vector2(font->get_string_size("X", font_size).x, font->get_ascent(font_size) + 2), "CPU:", HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, Color(1, 1, 1, 0.8)); graph->draw_string(font, Vector2(font->get_string_size("X", font_size).x + graph->get_size().width / 2, font->get_ascent(font_size) + 2), "GPU:", HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, Color(1, 1, 1, 0.8)); - - /* - if (hover_metric != -1 && frame_metrics[hover_metric].valid) { - int max_frames = frame_metrics.size(); - int frame = frame_metrics[hover_metric].frame_number - (frame_metrics[last_metric].frame_number - max_frames + 1); - if (frame < 0) - frame = 0; - - int cur_x = frame * graph->get_size().x / max_frames; - - graph->draw_line(Vector2(cur_x, 0), Vector2(cur_x, graph->get_size().y), Color(1, 1, 1, 0.4)); - } -*/ } void EditorVisualProfiler::_graph_tex_mouse_exit() { diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index ee844fff64..645d7608f3 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -36,12 +36,12 @@ #include "core/io/marshalls.h" #include "core/string/ustring.h" #include "core/version.h" -#include "core/version_hash.gen.h" #include "editor/debugger/debug_adapter/debug_adapter_protocol.h" #include "editor/debugger/editor_network_profiler.h" #include "editor/debugger/editor_performance_profiler.h" #include "editor/debugger/editor_profiler.h" #include "editor/debugger/editor_visual_profiler.h" +#include "editor/editor_file_dialog.h" #include "editor/editor_log.h" #include "editor/editor_node.h" #include "editor/editor_scale.h" @@ -64,6 +64,7 @@ #include "scene/gui/texture_button.h" #include "scene/gui/tree.h" #include "scene/resources/packed_scene.h" +#include "servers/debugger/servers_debugger.h" #include "servers/display_server.h" using CameraOverride = EditorDebuggerNode::CameraOverride; @@ -128,6 +129,7 @@ void ScriptEditorDebugger::debug_continue() { _clear_execution(); _put_msg("continue", Array()); + _put_msg("servers:foreground", Array()); } void ScriptEditorDebugger::update_tabs() { @@ -278,7 +280,7 @@ void ScriptEditorDebugger::_remote_object_property_updated(ObjectID p_id, const } void ScriptEditorDebugger::_video_mem_request() { - _put_msg("core:memory", Array()); + _put_msg("servers:memory", Array()); } void ScriptEditorDebugger::_video_mem_export() { @@ -344,15 +346,15 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da if (id.is_valid()) { emit_signal(SNAME("remote_object_updated"), id); } - } else if (p_msg == "memory:usage") { + } else if (p_msg == "servers:memory_usage") { vmem_tree->clear(); TreeItem *root = vmem_tree->create_item(); - DebuggerMarshalls::ResourceUsage usage; + ServersDebugger::ResourceUsage usage; usage.deserialize(p_data); uint64_t total = 0; - for (const DebuggerMarshalls::ResourceInfo &E : usage.infos) { + for (const ServersDebugger::ResourceInfo &E : usage.infos) { TreeItem *it = vmem_tree->create_item(root); String type = E.type; int bytes = E.vram; @@ -445,7 +447,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da performance_profiler->add_profile_frame(frame_data); } else if (p_msg == "visual:profile_frame") { - DebuggerMarshalls::VisualProfilerFrame frame; + ServersDebugger::VisualProfilerFrame frame; frame.deserialize(p_data); EditorVisualProfiler::Metric metric; @@ -497,7 +499,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da TreeItem *error = error_tree->create_item(r); error->set_collapsed(true); - error->set_icon(0, get_theme_icon(oe.warning ? "Warning" : "Error", "EditorIcons")); + error->set_icon(0, get_theme_icon(oe.warning ? SNAME("Warning") : SNAME("Error"), SNAME("EditorIcons"))); error->set_text(0, time); error->set_text_alignment(0, HORIZONTAL_ALIGNMENT_LEFT); @@ -592,13 +594,13 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da } else if (p_msg == "servers:function_signature") { // Cache a profiler signature. - DebuggerMarshalls::ScriptFunctionSignature sig; + ServersDebugger::ScriptFunctionSignature sig; sig.deserialize(p_data); profiler_signature[sig.id] = sig.name; } else if (p_msg == "servers:profile_frame" || p_msg == "servers:profile_total") { EditorProfiler::Metric metric; - DebuggerMarshalls::ServersProfilerFrame frame; + ServersDebugger::ServersProfilerFrame frame; frame.deserialize(p_data); metric.valid = true; metric.frame_number = frame.frame_number; @@ -642,7 +644,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da } for (int i = 0; i < frame.servers.size(); i++) { - const DebuggerMarshalls::ServerInfo &srv = frame.servers[i]; + const ServersDebugger::ServerInfo &srv = frame.servers[i]; EditorProfiler::Metric::Category c; const String name = srv.name; c.name = name.capitalize(); @@ -709,14 +711,14 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da profiler->add_frame_metric(metric, true); } - } else if (p_msg == "network:profile_frame") { - DebuggerMarshalls::NetworkProfilerFrame frame; + } else if (p_msg == "multiplayer:rpc") { + SceneDebugger::RPCProfilerFrame frame; frame.deserialize(p_data); for (int i = 0; i < frame.infos.size(); i++) { network_profiler->add_node_frame_data(frame.infos[i]); } - } else if (p_msg == "network:bandwidth") { + } else if (p_msg == "multiplayer:bandwidth") { ERR_FAIL_COND(p_data.size() < 2); network_profiler->set_bandwidth(p_data[0], p_data[1]); @@ -794,16 +796,14 @@ void ScriptEditorDebugger::_notification(int p_what) { search->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); reason->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); - } break; + case NOTIFICATION_PROCESS: { if (is_session_active()) { peer->poll(); if (camera_override == CameraOverride::OVERRIDE_2D) { - CanvasItemEditor *editor = CanvasItemEditor::get_singleton(); - - Dictionary state = editor->get_state(); + Dictionary state = CanvasItemEditor::get_singleton()->get_state(); float zoom = state["zoom"]; Point2 offset = state["ofs"]; Transform2D transform; @@ -833,6 +833,9 @@ void ScriptEditorDebugger::_notification(int p_what) { msg.push_back(cam->get_far()); _put_msg("scene:override_camera_3D:transform", msg); } + if (breaked) { + _put_msg("servers:draw", Array()); + } } const uint64_t until = OS::get_singleton()->get_ticks_msec() + 20; @@ -854,9 +857,10 @@ void ScriptEditorDebugger::_notification(int p_what) { break; }; } break; + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { if (tabs->has_theme_stylebox_override("panel")) { - tabs->add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); + tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); } copy->set_icon(get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons"))); @@ -888,12 +892,12 @@ void ScriptEditorDebugger::_clear_execution() { void ScriptEditorDebugger::_set_breakpoint(const String &p_file, const int &p_line, const bool &p_enabled) { Ref<Script> script = ResourceLoader::load(p_file); - emit_signal("set_breakpoint", script, p_line - 1, p_enabled); + emit_signal(SNAME("set_breakpoint"), script, p_line - 1, p_enabled); script.unref(); } void ScriptEditorDebugger::_clear_breakpoints() { - emit_signal("clear_breakpoints"); + emit_signal(SNAME("clear_breakpoints")); } void ScriptEditorDebugger::_breakpoint_tree_clicked() { @@ -971,7 +975,8 @@ void ScriptEditorDebugger::_profiler_activate(bool p_enable, int p_type) { data.push_back(p_enable); switch (p_type) { case PROFILER_NETWORK: - _put_msg("profiler:network", data); + _put_msg("profiler:multiplayer", data); + _put_msg("profiler:rpc", data); break; case PROFILER_VISUAL: _put_msg("profiler:visual", data); @@ -1060,7 +1065,7 @@ int ScriptEditorDebugger::_get_res_path_cache(const String &p_path) { } void ScriptEditorDebugger::_method_changed(Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE) { - if (!p_base || !live_debug || !is_session_active() || !editor->get_edited_scene()) { + if (!p_base || !live_debug || !is_session_active() || !EditorNode::get_singleton()->get_edited_scene()) { return; } @@ -1076,7 +1081,7 @@ void ScriptEditorDebugger::_method_changed(Object *p_base, const StringName &p_n } if (node) { - NodePath path = editor->get_edited_scene()->get_path_to(node); + NodePath path = EditorNode::get_singleton()->get_edited_scene()->get_path_to(node); int pathid = _get_node_path_cache(path); Array msg; @@ -1111,14 +1116,14 @@ void ScriptEditorDebugger::_method_changed(Object *p_base, const StringName &p_n } void ScriptEditorDebugger::_property_changed(Object *p_base, const StringName &p_property, const Variant &p_value) { - if (!p_base || !live_debug || !editor->get_edited_scene()) { + if (!p_base || !live_debug || !EditorNode::get_singleton()->get_edited_scene()) { return; } Node *node = Object::cast_to<Node>(p_base); if (node) { - NodePath path = editor->get_edited_scene()->get_path_to(node); + NodePath path = EditorNode::get_singleton()->get_edited_scene()->get_path_to(node); int pathid = _get_node_path_cache(path); if (p_value.is_ref_counted()) { @@ -1236,25 +1241,25 @@ void ScriptEditorDebugger::_live_edit_set() { NodePath np = path; - editor->get_editor_data().set_edited_scene_live_edit_root(np); + EditorNode::get_singleton()->get_editor_data().set_edited_scene_live_edit_root(np); update_live_edit_root(); } void ScriptEditorDebugger::_live_edit_clear() { NodePath np = NodePath("/root"); - editor->get_editor_data().set_edited_scene_live_edit_root(np); + EditorNode::get_singleton()->get_editor_data().set_edited_scene_live_edit_root(np); update_live_edit_root(); } void ScriptEditorDebugger::update_live_edit_root() { - NodePath np = editor->get_editor_data().get_edited_scene_live_edit_root(); + NodePath np = EditorNode::get_singleton()->get_editor_data().get_edited_scene_live_edit_root(); Array msg; msg.push_back(np); - if (editor->get_edited_scene()) { - msg.push_back(editor->get_edited_scene()->get_scene_file_path()); + if (EditorNode::get_singleton()->get_edited_scene()) { + msg.push_back(EditorNode::get_singleton()->get_edited_scene()->get_scene_file_path()); } else { msg.push_back(""); } @@ -1543,19 +1548,10 @@ void ScriptEditorDebugger::_item_menu_id_pressed(int p_option) { const int line_number = file_line_number[1].to_int(); // Construct a GitHub repository URL and open it in the user's default web browser. - if (String(VERSION_HASH).length() >= 1) { - // Git commit hash information available; use it for greater accuracy, including for development versions. - OS::get_singleton()->shell_open(vformat("https://github.com/godotengine/godot/blob/%s/%s#L%d", - VERSION_HASH, - file, - line_number)); - } else { - // Git commit hash information unavailable; fall back to tagged releases. - OS::get_singleton()->shell_open(vformat("https://github.com/godotengine/godot/blob/%s-stable/%s#L%d", - VERSION_NUMBER, - file, - line_number)); - } + // If the commit hash is available, use it for greater accuracy. Otherwise fall back to tagged release. + String git_ref = String(VERSION_HASH).is_empty() ? String(VERSION_NUMBER) + "-stable" : String(VERSION_HASH); + OS::get_singleton()->shell_open(vformat("https://github.com/godotengine/godot/blob/%s/%s#L%d", + git_ref, file, line_number)); } break; case ACTION_DELETE_BREAKPOINT: { const TreeItem *selected = breakpoints_tree->get_selected(); @@ -1660,12 +1656,10 @@ bool ScriptEditorDebugger::has_capture(const StringName &p_name) { return captures.has(p_name); } -ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { - editor = p_editor; - +ScriptEditorDebugger::ScriptEditorDebugger() { tabs = memnew(TabContainer); tabs->set_tab_alignment(TabContainer::ALIGNMENT_LEFT); - tabs->add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); + tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); tabs->connect("tab_changed", callable_mp(this, &ScriptEditorDebugger::_tab_changed)); add_child(tabs); diff --git a/editor/debugger/script_editor_debugger.h b/editor/debugger/script_editor_debugger.h index c061e7c61e..e4d3a2fa09 100644 --- a/editor/debugger/script_editor_debugger.h +++ b/editor/debugger/script_editor_debugger.h @@ -35,12 +35,10 @@ #include "editor/debugger/editor_debugger_inspector.h" #include "editor/debugger/editor_debugger_node.h" #include "editor/debugger/editor_debugger_server.h" -#include "editor/editor_file_dialog.h" #include "scene/gui/button.h" #include "scene/gui/margin_container.h" class Tree; -class EditorNode; class LineEdit; class TabContainer; class RichTextLabel; @@ -50,6 +48,7 @@ class TreeItem; class HSplitContainer; class ItemList; class EditorProfiler; +class EditorFileDialog; class EditorVisualProfiler; class EditorNetworkProfiler; class EditorPerformanceProfiler; @@ -155,8 +154,6 @@ private: EditorNetworkProfiler *network_profiler; EditorPerformanceProfiler *performance_profiler; - EditorNode *editor; - OS::ProcessID remote_pid = 0; bool breaked = false; bool can_debug = false; @@ -298,7 +295,7 @@ public: void unregister_message_capture(const StringName &p_name); bool has_capture(const StringName &p_name); - ScriptEditorDebugger(EditorNode *p_editor = nullptr); + ScriptEditorDebugger(); ~ScriptEditorDebugger(); }; diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp index 9879671e7b..1802bdec93 100644 --- a/editor/dependency_editor.cpp +++ b/editor/dependency_editor.cpp @@ -30,10 +30,13 @@ #include "dependency_editor.h" +#include "core/config/project_settings.h" #include "core/io/file_access.h" #include "core/io/resource_loader.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_file_system.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" #include "scene/gui/margin_container.h" void DependencyEditor::_searched(const String &p_path) { @@ -171,7 +174,7 @@ void DependencyEditor::_update_list() { String path; String type; - if (n.find("::") != -1) { + if (n.contains("::")) { path = n.get_slice("::", 0); type = n.get_slice("::", 1); } else { @@ -284,7 +287,7 @@ void DependencyEditorOwners::_select_file(int p_idx) { String fpath = owners->get_item_text(p_idx); if (ResourceLoader::get_resource_type(fpath) == "PackedScene") { - editor->open_request(fpath); + EditorNode::get_singleton()->open_request(fpath); hide(); emit_signal(SNAME("confirmed")); } @@ -342,9 +345,7 @@ void DependencyEditorOwners::show(const String &p_path) { set_title(TTR("Owners Of:") + " " + p_path.get_file()); } -DependencyEditorOwners::DependencyEditorOwners(EditorNode *p_editor) { - editor = p_editor; - +DependencyEditorOwners::DependencyEditorOwners() { file_options = memnew(PopupMenu); add_child(file_options); file_options->connect("id_pressed", callable_mp(this, &DependencyEditorOwners::_file_option)); diff --git a/editor/dependency_editor.h b/editor/dependency_editor.h index d50b0849b7..84642edd79 100644 --- a/editor/dependency_editor.h +++ b/editor/dependency_editor.h @@ -31,14 +31,13 @@ #ifndef DEPENDENCY_EDITOR_H #define DEPENDENCY_EDITOR_H -#include "editor_file_dialog.h" #include "scene/gui/dialogs.h" +#include "scene/gui/item_list.h" #include "scene/gui/tab_container.h" #include "scene/gui/tree.h" class EditorFileDialog; class EditorFileSystemDirectory; -class EditorNode; class DependencyEditor : public AcceptDialog { GDCLASS(DependencyEditor, AcceptDialog); @@ -74,7 +73,6 @@ class DependencyEditorOwners : public AcceptDialog { ItemList *owners; PopupMenu *file_options; - EditorNode *editor; String editing; void _fill_owners(EditorFileSystemDirectory *efsd); @@ -91,7 +89,7 @@ private: public: void show(const String &p_path); - DependencyEditorOwners(EditorNode *p_editor); + DependencyEditorOwners(); }; class DependencyRemoveDialog : public ConfirmationDialog { diff --git a/editor/dictionary_property_edit.cpp b/editor/dictionary_property_edit.cpp index 30082f2e1a..630265e268 100644 --- a/editor/dictionary_property_edit.cpp +++ b/editor/dictionary_property_edit.cpp @@ -29,7 +29,7 @@ /*************************************************************************/ #include "dictionary_property_edit.h" -#include "editor_node.h" +#include "editor/editor_node.h" void DictionaryPropertyEdit::_notif_change() { notify_property_list_changed(); diff --git a/editor/doc_tools.cpp b/editor/doc_tools.cpp index 6acf654b04..a9d18e9dcc 100644 --- a/editor/doc_tools.cpp +++ b/editor/doc_tools.cpp @@ -534,11 +534,11 @@ void DocTools::generate(bool p_basic_types) { Vector<Error> errs = ClassDB::get_method_error_return_values(name, E.name); if (errs.size()) { - if (errs.find(OK) == -1) { + if (!errs.has(OK)) { errs.insert(0, OK); } for (int i = 0; i < errs.size(); i++) { - if (method.errors_returned.find(errs[i]) == -1) { + if (!method.errors_returned.has(errs[i])) { method.errors_returned.push_back(errs[i]); } } @@ -1356,7 +1356,12 @@ Error DocTools::save_classes(const String &p_default_path, const Map<String, Str header += " inherits=\"" + c.inherits + "\""; } header += String(" version=\"") + VERSION_BRANCH + "\""; - header += ">"; + // Reference the XML schema so editors can provide error checking. + // Modules are nested deep, so change the path to reference the same schema everywhere. + const String schema_path = save_path.find("modules/") != -1 ? "../../../doc/class.xsd" : "../class.xsd"; + header += vformat( + R"( xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="%s">)", + schema_path); _write_string(f, 0, header); _write_string(f, 1, "<brief_description>"); @@ -1370,7 +1375,7 @@ Error DocTools::save_classes(const String &p_default_path, const Map<String, Str _write_string(f, 1, "<tutorials>"); for (int i = 0; i < c.tutorials.size(); i++) { DocData::TutorialDoc tutorial = c.tutorials.get(i); - String title_attribute = (!tutorial.title.is_empty()) ? " title=\"" + tutorial.title.xml_escape() + "\"" : ""; + String title_attribute = (!tutorial.title.is_empty()) ? " title=\"" + _translate_doc_string(tutorial.title).xml_escape() + "\"" : ""; _write_string(f, 2, "<link" + title_attribute + ">" + tutorial.link.xml_escape() + "</link>"); } _write_string(f, 1, "</tutorials>"); @@ -1463,7 +1468,8 @@ Error DocTools::save_classes(const String &p_default_path, const Map<String, Str Error DocTools::load_compressed(const uint8_t *p_data, int p_compressed_size, int p_uncompressed_size) { Vector<uint8_t> data; data.resize(p_uncompressed_size); - Compression::decompress(data.ptrw(), p_uncompressed_size, p_data, p_compressed_size, Compression::MODE_DEFLATE); + int ret = Compression::decompress(data.ptrw(), p_uncompressed_size, p_data, p_compressed_size, Compression::MODE_DEFLATE); + ERR_FAIL_COND_V_MSG(ret == -1, ERR_FILE_CORRUPT, "Compressed file is corrupt."); class_list.clear(); Ref<XMLParser> parser = memnew(XMLParser); diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp index 54377971c6..4ba30eaa0e 100644 --- a/editor/editor_about.cpp +++ b/editor/editor_about.cpp @@ -29,13 +29,11 @@ /*************************************************************************/ #include "editor_about.h" -#include "editor_node.h" #include "core/authors.gen.h" #include "core/donors.gen.h" #include "core/license.gen.h" #include "core/version.h" -#include "core/version_hash.gen.h" // The metadata key used to store and retrieve the version text to copy to the clipboard. static const String META_TEXT_TO_COPY = "text_to_copy"; diff --git a/editor/editor_about.h b/editor/editor_about.h index e57b211ed4..5a3b1e1987 100644 --- a/editor/editor_about.h +++ b/editor/editor_about.h @@ -31,7 +31,6 @@ #ifndef EDITOR_ABOUT_H #define EDITOR_ABOUT_H -#include "scene/gui/control.h" #include "scene/gui/dialogs.h" #include "scene/gui/item_list.h" #include "scene/gui/link_button.h" @@ -43,7 +42,7 @@ #include "scene/gui/texture_rect.h" #include "scene/gui/tree.h" -#include "editor_scale.h" +#include "editor/editor_scale.h" /** * NOTE: Do not assume the EditorNode singleton to be available in this class' methods. diff --git a/editor/editor_asset_installer.cpp b/editor/editor_asset_installer.cpp index 76c0811166..3835399c99 100644 --- a/editor/editor_asset_installer.cpp +++ b/editor/editor_asset_installer.cpp @@ -33,8 +33,9 @@ #include "core/io/dir_access.h" #include "core/io/file_access.h" #include "core/io/zip_io.h" -#include "editor_node.h" -#include "progress_dialog.h" +#include "editor/editor_file_system.h" +#include "editor/editor_node.h" +#include "editor/progress_dialog.h" void EditorAssetInstaller::_item_edited() { if (updating) { diff --git a/editor/editor_atlas_packer.cpp b/editor/editor_atlas_packer.cpp index b6ec5d1bad..9c6bcd769a 100644 --- a/editor/editor_atlas_packer.cpp +++ b/editor/editor_atlas_packer.cpp @@ -30,56 +30,9 @@ #include "editor_atlas_packer.h" -void EditorAtlasPacker::_plot_triangle(Ref<BitMap> p_bitmap, Vector2i *vertices) { - int width = p_bitmap->get_size().width; - int height = p_bitmap->get_size().height; - int x[3]; - int y[3]; - - for (int j = 0; j < 3; j++) { - x[j] = vertices[j].x; - y[j] = vertices[j].y; - } - - // sort the points vertically - if (y[1] > y[2]) { - SWAP(x[1], x[2]); - SWAP(y[1], y[2]); - } - if (y[0] > y[1]) { - SWAP(x[0], x[1]); - SWAP(y[0], y[1]); - } - if (y[1] > y[2]) { - SWAP(x[1], x[2]); - SWAP(y[1], y[2]); - } - - double dx_far = double(x[2] - x[0]) / (y[2] - y[0] + 1); - double dx_upper = double(x[1] - x[0]) / (y[1] - y[0] + 1); - double dx_low = double(x[2] - x[1]) / (y[2] - y[1] + 1); - double xf = x[0]; - double xt = x[0] + dx_upper; // if y[0] == y[1], special case - for (int yi = y[0]; yi <= (y[2] > height - 1 ? height - 1 : y[2]); yi++) { - if (yi >= 0) { - for (int xi = (xf > 0 ? int(xf) : 0); xi <= (xt < width ? xt : width - 1); xi++) { - //pixels[int(x + y * width)] = color; - - p_bitmap->set_bit(Point2(xi, yi), true); - } - - for (int xi = (xf < width ? int(xf) : width - 1); xi >= (xt > 0 ? xt : 0); xi--) { - p_bitmap->set_bit(Point2(xi, yi), true); - } - } - xf += dx_far; - if (yi < y[1]) { - xt += dx_upper; - } else { - xt += dx_low; - } - } -} +#include "core/math/geometry_2d.h" +#include "core/math/vector2.h" +#include "core/math/vector2i.h" void EditorAtlasPacker::chart_pack(Vector<Chart> &charts, int &r_width, int &r_height, int p_atlas_max_size, int p_cell_resolution) { int divide_by = MIN(64, p_cell_resolution); @@ -119,10 +72,18 @@ void EditorAtlasPacker::chart_pack(Vector<Chart> &charts, int &r_width, int &r_h Vector2 vtx = chart.vertices[chart.faces[j].vertex[k]]; vtx -= aabb.position; vtx /= divide_by; + vtx.x = MIN(vtx.x, w - 1); + vtx.y = MIN(vtx.y, h - 1); v[k] = vtx; } - _plot_triangle(src_bitmap, v); + for (int k = 0; k < 3; k++) { + int l = k == 0 ? 2 : k - 1; + Vector<Point2i> points = Geometry2D::bresenham_line(v[k], v[l]); + for (Point2i point : points) { + src_bitmap->set_bit(point, true); + } + } } //src_bitmap->convert_to_image()->save_png("bitmap" + itos(i) + ".png"); diff --git a/editor/editor_atlas_packer.h b/editor/editor_atlas_packer.h index 133c516d80..7b7692011f 100644 --- a/editor/editor_atlas_packer.h +++ b/editor/editor_atlas_packer.h @@ -31,11 +31,12 @@ #ifndef EDITOR_ATLAS_PACKER_H #define EDITOR_ATLAS_PACKER_H -#include "core/math/vector2.h" - #include "core/templates/vector.h" #include "scene/resources/bit_map.h" +struct Vector2; +struct Vector2i; + class EditorAtlasPacker { public: struct Chart { @@ -66,8 +67,6 @@ private: } }; - static void _plot_triangle(Ref<BitMap> p_bitmap, Vector2i *vertices); - public: static void chart_pack(Vector<Chart> &charts, int &r_width, int &r_height, int p_atlas_max_size = 2048, int p_cell_resolution = 4); }; diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index 5e4e375db4..9685ff4b70 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -30,11 +30,13 @@ #include "editor_audio_buses.h" +#include "core/config/project_settings.h" #include "core/input/input.h" #include "core/io/resource_saver.h" #include "core/os/keyboard.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" #include "filesystem_dock.h" #include "scene/resources/font.h" #include "servers/audio_server.h" @@ -96,6 +98,7 @@ void EditorAudioBus::_notification(int p_what) { update_bus(); set_process(true); } break; + case NOTIFICATION_DRAW: { if (is_master) { draw_style_box(get_theme_stylebox(SNAME("disabled"), SNAME("Button")), Rect2(Vector2(), get_size())); @@ -111,6 +114,7 @@ void EditorAudioBus::_notification(int p_what) { draw_rect(Rect2(Point2(), get_size()), accent, false); } } break; + case NOTIFICATION_PROCESS: { if (cc != AudioServer::get_singleton()->get_bus_channels(get_index())) { cc = AudioServer::get_singleton()->get_bus_channels(get_index()); @@ -155,6 +159,7 @@ void EditorAudioBus::_notification(int p_what) { } } } break; + case NOTIFICATION_VISIBILITY_CHANGED: { for (int i = 0; i < CHANNELS_MAX; i++) { channel[i].peak_l = -100; @@ -950,12 +955,14 @@ void EditorAudioBusDrop::_notification(int p_what) { draw_rect(Rect2(Point2(), get_size()), accent, false); } } break; + case NOTIFICATION_MOUSE_ENTER: { if (!hovering_drop) { hovering_drop = true; update(); } } break; + case NOTIFICATION_MOUSE_EXIT: case NOTIFICATION_DRAG_END: { if (hovering_drop) { @@ -1015,15 +1022,18 @@ void EditorAudioBuses::_notification(int p_what) { case NOTIFICATION_THEME_CHANGED: { bus_scroll->add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); } break; + case NOTIFICATION_READY: { _update_buses(); } break; + case NOTIFICATION_DRAG_END: { if (drop_end) { drop_end->queue_delete(); drop_end = nullptr; } } break; + case NOTIFICATION_PROCESS: { // Check if anything was edited. bool edited = AudioServer::get_singleton()->is_edited(); @@ -1399,6 +1409,7 @@ void EditorAudioMeterNotches::_notification(int p_what) { case NOTIFICATION_THEME_CHANGED: { notch_color = get_theme_color(SNAME("font_color"), SNAME("Editor")); } break; + case NOTIFICATION_DRAW: { _draw_audio_notches(); } break; diff --git a/editor/editor_audio_buses.h b/editor/editor_audio_buses.h index f856556363..a830a2719d 100644 --- a/editor/editor_audio_buses.h +++ b/editor/editor_audio_buses.h @@ -31,8 +31,7 @@ #ifndef EDITORAUDIOBUSES_H #define EDITORAUDIOBUSES_H -#include "editor/editor_file_dialog.h" -#include "editor_plugin.h" +#include "editor/editor_plugin.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" #include "scene/gui/control.h" diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp index d74a6e12b2..281d614ea9 100644 --- a/editor/editor_autoload_settings.cpp +++ b/editor/editor_autoload_settings.cpp @@ -32,8 +32,9 @@ #include "core/config/project_settings.h" #include "core/core_constants.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" #include "project_settings_editor.h" #include "scene/main/window.h" #include "scene/resources/packed_scene.h" @@ -41,23 +42,27 @@ #define PREVIEW_LIST_MAX_SIZE 10 void EditorAutoloadSettings::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - List<String> afn; - ResourceLoader::get_recognized_extensions_for_type("Script", &afn); - ResourceLoader::get_recognized_extensions_for_type("PackedScene", &afn); - - for (const String &E : afn) { - file_dialog->add_filter("*." + E); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + List<String> afn; + ResourceLoader::get_recognized_extensions_for_type("Script", &afn); + ResourceLoader::get_recognized_extensions_for_type("PackedScene", &afn); + + for (const String &E : afn) { + file_dialog->add_filter("*." + E); + } - for (const AutoLoadInfo &info : autoload_cache) { - if (info.node && info.in_editor) { - get_tree()->get_root()->call_deferred(SNAME("add_child"), info.node); + for (const AutoLoadInfo &info : autoload_cache) { + if (info.node && info.in_editor) { + get_tree()->get_root()->call_deferred(SNAME("add_child"), info.node); + } } - } - browse_button->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); - } else if (p_what == NOTIFICATION_THEME_CHANGED) { - browse_button->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); + browse_button->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); + } break; + + case NOTIFICATION_THEME_CHANGED: { + browse_button->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); + } break; } } @@ -362,21 +367,21 @@ Node *EditorAutoloadSettings::_create_autoload(const String &p_path) { RES res = ResourceLoader::load(p_path); ERR_FAIL_COND_V_MSG(res.is_null(), nullptr, "Can't autoload: " + p_path + "."); Node *n = nullptr; - if (res->is_class("PackedScene")) { - Ref<PackedScene> ps = res; - n = ps->instantiate(); - } else if (res->is_class("Script")) { - Ref<Script> s = res; - StringName ibt = s->get_instance_base_type(); + Ref<PackedScene> scn = res; + Ref<Script> script = res; + if (scn.is_valid()) { + n = scn->instantiate(); + } else if (script.is_valid()) { + StringName ibt = script->get_instance_base_type(); bool valid_type = ClassDB::is_parent_class(ibt, "Node"); ERR_FAIL_COND_V_MSG(!valid_type, nullptr, "Script does not inherit a Node: " + p_path + "."); Object *obj = ClassDB::instantiate(ibt); - ERR_FAIL_COND_V_MSG(obj == nullptr, nullptr, "Cannot instance script for AutoLoad, expected 'Node' inheritance, got: " + String(ibt) + "."); + ERR_FAIL_COND_V_MSG(!obj, nullptr, "Cannot instance script for AutoLoad, expected 'Node' inheritance, got: " + String(ibt) + "."); n = Object::cast_to<Node>(obj); - n->set_script(s); + n->set_script(script); } ERR_FAIL_COND_V_MSG(!n, nullptr, "Path in AutoLoad not a node or script: " + p_path + "."); diff --git a/editor/editor_autoload_settings.h b/editor/editor_autoload_settings.h index 20f6bf476f..135ff48a0c 100644 --- a/editor/editor_autoload_settings.h +++ b/editor/editor_autoload_settings.h @@ -31,9 +31,11 @@ #ifndef EDITOR_AUTOLOAD_SETTINGS_H #define EDITOR_AUTOLOAD_SETTINGS_H +#include "scene/gui/box_container.h" +#include "scene/gui/button.h" #include "scene/gui/tree.h" -#include "editor_file_dialog.h" +class EditorFileDialog; class EditorAutoloadSettings : public VBoxContainer { GDCLASS(EditorAutoloadSettings, VBoxContainer); diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index 7a0a4abbff..69c7e9d52c 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -31,11 +31,11 @@ #include "editor_data.h" #include "core/config/project_settings.h" -#include "core/io/dir_access.h" #include "core/io/file_access.h" #include "core/io/resource_loader.h" -#include "editor_node.h" -#include "editor_settings.h" +#include "editor/editor_node.h" +#include "editor/editor_plugin.h" +#include "editor/plugins/script_editor_plugin.h" #include "scene/resources/packed_scene.h" void EditorHistory::cleanup_history() { @@ -520,6 +520,21 @@ void EditorData::remove_custom_type(const String &p_type) { } } +void EditorData::instantiate_object_properties(Object *p_object) { + ERR_FAIL_NULL(p_object); + // Check if any Object-type property should be instantiated. + List<PropertyInfo> pinfo; + p_object->get_property_list(&pinfo); + + for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) { + PropertyInfo pi = E->get(); + if (pi.type == Variant::OBJECT && pi.usage & PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT) { + Object *prop = ClassDB::instantiate(pi.class_name); + p_object->set(pi.name, prop); + } + } +} + int EditorData::add_edited_scene(int p_at_pos) { if (p_at_pos < 0) { p_at_pos = edited_scene.size(); @@ -574,11 +589,6 @@ void EditorData::remove_scene(int p_idx) { } bool EditorData::_find_updated_instances(Node *p_root, Node *p_node, Set<String> &checked_paths) { - /* - if (p_root!=p_node && p_node->get_owner()!=p_root && !p_root->is_editable_instance(p_node->get_owner())) - return false; - */ - Ref<SceneState> ss; if (p_node == p_root) { @@ -894,21 +904,12 @@ bool EditorData::script_class_is_parent(const String &p_class, const String &p_i return false; } - Ref<Script> script = script_class_load_script(p_class); - if (script.is_null()) { - return false; - } - - String base = script_class_get_base(p_class); - Ref<Script> base_script = script->get_base_script(); - - while (p_inherits != base) { + String base = p_class; + while (base != p_inherits) { if (ClassDB::class_exists(base)) { return ClassDB::is_parent_class(base, p_inherits); } else if (ScriptServer::is_global_class(base)) { - base = script_class_get_base(base); - } else if (base_script.is_valid()) { - return ClassDB::is_parent_class(base_script->get_instance_base_type(), p_inherits); + base = ScriptServer::get_global_class_base(base); } else { return false; } diff --git a/editor/editor_data.h b/editor/editor_data.h index ccf641ff26..0d1efc9b62 100644 --- a/editor/editor_data.h +++ b/editor/editor_data.h @@ -33,11 +33,11 @@ #include "core/object/undo_redo.h" #include "core/templates/list.h" -#include "core/templates/pair.h" -#include "editor/editor_plugin.h" -#include "editor/plugins/script_editor_plugin.h" #include "scene/resources/texture.h" +class ConfigFile; +class EditorPlugin; + class EditorHistory { enum { HISTORY_MAX = 64 @@ -59,8 +59,6 @@ class EditorHistory { Vector<History> history; int current; - //Vector<EditorPlugin*> editor_plugins; - struct PropertyData { String name; Variant value; @@ -182,6 +180,8 @@ public: void remove_custom_type(const String &p_type); const Map<String, Vector<CustomType>> &get_custom_types() const { return custom_types; } + void instantiate_object_properties(Object *p_object); + int add_edited_scene(int p_at_pos); void move_edited_scene_index(int p_idx, int p_to_idx); void remove_scene(int p_idx); diff --git a/editor/editor_dir_dialog.cpp b/editor/editor_dir_dialog.cpp index 39054b7033..f181c04004 100644 --- a/editor/editor_dir_dialog.cpp +++ b/editor/editor_dir_dialog.cpp @@ -33,8 +33,8 @@ #include "core/os/keyboard.h" #include "core/os/os.h" #include "editor/editor_file_system.h" +#include "editor/editor_scale.h" #include "editor/editor_settings.h" -#include "editor_scale.h" #include "servers/display_server.h" void EditorDirDialog::_update_dir(TreeItem *p_item, EditorFileSystemDirectory *p_dir, const String &p_select_path) { @@ -79,29 +79,31 @@ void EditorDirDialog::reload(const String &p_path) { } void EditorDirDialog::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &EditorDirDialog::reload), make_binds("")); - reload(); - - if (!tree->is_connected("item_collapsed", callable_mp(this, &EditorDirDialog::_item_collapsed))) { - tree->connect("item_collapsed", callable_mp(this, &EditorDirDialog::_item_collapsed), varray(), CONNECT_DEFERRED); - } - - if (!EditorFileSystem::get_singleton()->is_connected("filesystem_changed", callable_mp(this, &EditorDirDialog::reload))) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &EditorDirDialog::reload), make_binds("")); - } - } - - if (p_what == NOTIFICATION_EXIT_TREE) { - if (EditorFileSystem::get_singleton()->is_connected("filesystem_changed", callable_mp(this, &EditorDirDialog::reload))) { - EditorFileSystem::get_singleton()->disconnect("filesystem_changed", callable_mp(this, &EditorDirDialog::reload)); - } - } - - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (must_reload && is_visible()) { reload(); - } + + if (!tree->is_connected("item_collapsed", callable_mp(this, &EditorDirDialog::_item_collapsed))) { + tree->connect("item_collapsed", callable_mp(this, &EditorDirDialog::_item_collapsed), varray(), CONNECT_DEFERRED); + } + + if (!EditorFileSystem::get_singleton()->is_connected("filesystem_changed", callable_mp(this, &EditorDirDialog::reload))) { + EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &EditorDirDialog::reload), make_binds("")); + } + } break; + + case NOTIFICATION_EXIT_TREE: { + if (EditorFileSystem::get_singleton()->is_connected("filesystem_changed", callable_mp(this, &EditorDirDialog::reload))) { + EditorFileSystem::get_singleton()->disconnect("filesystem_changed", callable_mp(this, &EditorDirDialog::reload)); + } + } break; + + case NOTIFICATION_VISIBILITY_CHANGED: { + if (must_reload && is_visible()) { + reload(); + } + } break; } } diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index f97973ce5d..295b477080 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -44,9 +44,10 @@ #include "core/object/script_language.h" #include "core/version.h" #include "editor/editor_file_system.h" +#include "editor/editor_node.h" +#include "editor/editor_paths.h" +#include "editor/editor_settings.h" #include "editor/plugins/script_editor_plugin.h" -#include "editor_node.h" -#include "editor_settings.h" #include "scene/resources/resource_format_text.h" static int _get_pad(int p_alignment, int p_n) { @@ -404,9 +405,9 @@ Ref<ImageTexture> EditorExportPlatform::get_option_icon(int p_index) const { Ref<Theme> theme = EditorNode::get_singleton()->get_editor_theme(); ERR_FAIL_COND_V(theme.is_null(), Ref<ImageTexture>()); if (EditorNode::get_singleton()->get_main_control()->is_layout_rtl()) { - return theme->get_icon("PlayBackwards", "EditorIcons"); + return theme->get_icon(SNAME("PlayBackwards"), SNAME("EditorIcons")); } else { - return theme->get_icon("Play", "EditorIcons"); + return theme->get_icon(SNAME("Play"), SNAME("EditorIcons")); } } @@ -818,7 +819,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & int v = 0; if (i * 2 < script_key.length()) { char32_t ct = script_key[i * 2]; - if (ct >= '0' && ct <= '9') { + if (is_digit(ct)) { ct = ct - '0'; } else if (ct >= 'a' && ct <= 'f') { ct = 10 + ct - 'a'; @@ -828,7 +829,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & if (i * 2 + 1 < script_key.length()) { char32_t ct = script_key[i * 2 + 1]; - if (ct >= '0' && ct <= '9') { + if (is_digit(ct)) { ct = ct - '0'; } else if (ct >= 'a' && ct <= 'f') { ct = 10 + ct - 'a'; @@ -1215,7 +1216,7 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c int v = 0; if (i * 2 < script_key.length()) { char32_t ct = script_key[i * 2]; - if (ct >= '0' && ct <= '9') { + if (is_digit(ct)) { ct = ct - '0'; } else if (ct >= 'a' && ct <= 'f') { ct = 10 + ct - 'a'; @@ -1225,7 +1226,7 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c if (i * 2 + 1 < script_key.length()) { char32_t ct = script_key[i * 2 + 1]; - if (ct >= '0' && ct <= '9') { + if (is_digit(ct)) { ct = ct - '0'; } else if (ct >= 'a' && ct <= 'f') { ct = 10 + ct - 'a'; @@ -1525,7 +1526,7 @@ void EditorExport::remove_export_preset(int p_idx) { } void EditorExport::add_export_plugin(const Ref<EditorExportPlugin> &p_plugin) { - if (export_plugins.find(p_plugin) == -1) { + if (!export_plugins.has(p_plugin)) { export_plugins.push_back(p_plugin); } } @@ -1543,6 +1544,7 @@ void EditorExport::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: { load_config(); } break; + case NOTIFICATION_PROCESS: { update_export_presets(); } break; diff --git a/editor/editor_feature_profile.cpp b/editor/editor_feature_profile.cpp index 94262c2289..008c42b3a7 100644 --- a/editor/editor_feature_profile.cpp +++ b/editor/editor_feature_profile.cpp @@ -32,9 +32,10 @@ #include "core/io/dir_access.h" #include "core/io/json.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" #include "editor/editor_settings.h" -#include "editor_node.h" -#include "editor_scale.h" const char *EditorFeatureProfile::feature_names[FEATURE_MAX] = { TTRC("3D Editor"), @@ -308,18 +309,20 @@ EditorFeatureProfile::EditorFeatureProfile() {} ////////////////////////// void EditorFeatureProfileManager::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - current_profile = EDITOR_GET("_default_feature_profile"); - if (!current_profile.is_empty()) { - current.instantiate(); - Error err = current->load_from_file(EditorSettings::get_singleton()->get_feature_profiles_dir().plus_file(current_profile + ".profile")); - if (err != OK) { - ERR_PRINT("Error loading default feature profile: " + current_profile); - current_profile = String(); - current.unref(); + switch (p_what) { + case NOTIFICATION_READY: { + current_profile = EDITOR_GET("_default_feature_profile"); + if (!current_profile.is_empty()) { + current.instantiate(); + Error err = current->load_from_file(EditorSettings::get_singleton()->get_feature_profiles_dir().plus_file(current_profile + ".profile")); + if (err != OK) { + ERR_PRINT("Error loading default feature profile: " + current_profile); + current_profile = String(); + current.unref(); + } } - } - _update_profile_list(current_profile); + _update_profile_list(current_profile); + } break; } } @@ -462,7 +465,7 @@ void EditorFeatureProfileManager::_erase_selected_profile() { void EditorFeatureProfileManager::_create_new_profile() { String name = new_profile_name->get_text().strip_edges(); - if (!name.is_valid_filename() || name.find(".") != -1) { + if (!name.is_valid_filename() || name.contains(".")) { EditorNode::get_singleton()->show_warning(TTR("Profile must be a valid filename and must not contain '.'")); return; } @@ -592,7 +595,15 @@ void EditorFeatureProfileManager::_class_list_item_selected() { List<PropertyInfo> props; ClassDB::get_property_list(class_name, &props, true); - if (props.size() > 0) { + bool has_editor_props = false; + for (const PropertyInfo &E : props) { + if (E.usage & PROPERTY_USAGE_EDITOR) { + has_editor_props = true; + break; + } + } + + if (has_editor_props) { TreeItem *properties = property_list->create_item(root); properties->set_text(0, TTR("Class Properties:")); diff --git a/editor/editor_feature_profile.h b/editor/editor_feature_profile.h index c5f4ad60f4..7ea40502a6 100644 --- a/editor/editor_feature_profile.h +++ b/editor/editor_feature_profile.h @@ -33,8 +33,7 @@ #include "core/io/file_access.h" #include "core/object/ref_counted.h" -#include "editor/editor_file_dialog.h" -#include "editor_help.h" +#include "editor/editor_help.h" #include "scene/gui/dialogs.h" #include "scene/gui/option_button.h" #include "scene/gui/separator.h" diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index b6d8ea5bd6..e6343100df 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -30,15 +30,16 @@ #include "editor_file_dialog.h" +#include "core/config/project_settings.h" #include "core/io/file_access.h" #include "core/os/keyboard.h" #include "core/os/os.h" #include "core/string/print_string.h" #include "dependency_editor.h" -#include "editor_file_system.h" -#include "editor_resource_preview.h" -#include "editor_scale.h" -#include "editor_settings.h" +#include "editor/editor_file_system.h" +#include "editor/editor_resource_preview.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" #include "scene/gui/center_container.h" #include "scene/gui/label.h" #include "scene/gui/margin_container.h" @@ -68,80 +69,60 @@ VBoxContainer *EditorFileDialog::get_vbox() { } void EditorFileDialog::_notification(int p_what) { - if (p_what == NOTIFICATION_READY || p_what == NOTIFICATION_THEME_CHANGED || p_what == Control::NOTIFICATION_LAYOUT_DIRECTION_CHANGED || p_what == NOTIFICATION_TRANSLATION_CHANGED) { - // Update icons. - mode_thumbnails->set_icon(item_list->get_theme_icon(SNAME("FileThumbnail"), SNAME("EditorIcons"))); - mode_list->set_icon(item_list->get_theme_icon(SNAME("FileList"), SNAME("EditorIcons"))); - if (is_layout_rtl()) { - dir_prev->set_icon(item_list->get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); - dir_next->set_icon(item_list->get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); - } else { - dir_prev->set_icon(item_list->get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); - dir_next->set_icon(item_list->get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); - } - dir_up->set_icon(item_list->get_theme_icon(SNAME("ArrowUp"), SNAME("EditorIcons"))); - refresh->set_icon(item_list->get_theme_icon(SNAME("Reload"), SNAME("EditorIcons"))); - favorite->set_icon(item_list->get_theme_icon(SNAME("Favorites"), SNAME("EditorIcons"))); - show_hidden->set_icon(item_list->get_theme_icon(SNAME("GuiVisibilityVisible"), SNAME("EditorIcons"))); - - fav_up->set_icon(item_list->get_theme_icon(SNAME("MoveUp"), SNAME("EditorIcons"))); - fav_down->set_icon(item_list->get_theme_icon(SNAME("MoveDown"), SNAME("EditorIcons"))); - - } else if (p_what == NOTIFICATION_PROCESS) { - if (preview_waiting) { - preview_wheel_timeout -= get_process_delta_time(); - if (preview_wheel_timeout <= 0) { - preview_wheel_index++; - if (preview_wheel_index >= 8) { - preview_wheel_index = 0; + switch (p_what) { + case NOTIFICATION_READY: + case NOTIFICATION_THEME_CHANGED: + case Control::NOTIFICATION_LAYOUT_DIRECTION_CHANGED: + case NOTIFICATION_TRANSLATION_CHANGED: { + _update_icons(); + } break; + + case NOTIFICATION_PROCESS: { + if (preview_waiting) { + preview_wheel_timeout -= get_process_delta_time(); + if (preview_wheel_timeout <= 0) { + preview_wheel_index++; + if (preview_wheel_index >= 8) { + preview_wheel_index = 0; + } + Ref<Texture2D> frame = item_list->get_theme_icon("Progress" + itos(preview_wheel_index + 1), SNAME("EditorIcons")); + preview->set_texture(frame); + preview_wheel_timeout = 0.1; } - Ref<Texture2D> frame = item_list->get_theme_icon("Progress" + itos(preview_wheel_index + 1), SNAME("EditorIcons")); - preview->set_texture(frame); - preview_wheel_timeout = 0.1; } - } + } break; - } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - bool is_showing_hidden = EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files"); - if (show_hidden_files != is_showing_hidden) { - set_show_hidden_files(is_showing_hidden); - } - set_display_mode((DisplayMode)EditorSettings::get_singleton()->get("filesystem/file_dialog/display_mode").operator int()); - - // Update icons. - mode_thumbnails->set_icon(item_list->get_theme_icon(SNAME("FileThumbnail"), SNAME("EditorIcons"))); - mode_list->set_icon(item_list->get_theme_icon(SNAME("FileList"), SNAME("EditorIcons"))); - if (is_layout_rtl()) { - dir_prev->set_icon(item_list->get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); - dir_next->set_icon(item_list->get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); - } else { - dir_prev->set_icon(item_list->get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); - dir_next->set_icon(item_list->get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); - } - dir_up->set_icon(item_list->get_theme_icon(SNAME("ArrowUp"), SNAME("EditorIcons"))); - refresh->set_icon(item_list->get_theme_icon(SNAME("Reload"), SNAME("EditorIcons"))); - favorite->set_icon(item_list->get_theme_icon(SNAME("Favorites"), SNAME("EditorIcons"))); + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + bool is_showing_hidden = EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files"); + if (show_hidden_files != is_showing_hidden) { + set_show_hidden_files(is_showing_hidden); + } + set_display_mode((DisplayMode)EditorSettings::get_singleton()->get("filesystem/file_dialog/display_mode").operator int()); - fav_up->set_icon(item_list->get_theme_icon(SNAME("MoveUp"), SNAME("EditorIcons"))); - fav_down->set_icon(item_list->get_theme_icon(SNAME("MoveDown"), SNAME("EditorIcons"))); - // DO NOT CALL UPDATE FILE LIST HERE, ALL HUNDREDS OF HIDDEN DIALOGS WILL RESPOND, CALL INVALIDATE INSTEAD - invalidate(); - } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (!is_visible()) { - set_process_unhandled_input(false); - } - } else if (p_what == NOTIFICATION_WM_WINDOW_FOCUS_IN) { - // Check if the current directory was removed externally (much less likely to happen while editor window is focused). - String previous_dir = get_current_dir(); - while (!dir_access->dir_exists(get_current_dir())) { - _go_up(); - - // In case we can't go further up, use some fallback and break. - if (get_current_dir() == previous_dir) { - _dir_submitted(OS::get_singleton()->get_user_data_dir()); - break; + _update_icons(); + // DO NOT CALL UPDATE FILE LIST HERE, ALL HUNDREDS OF HIDDEN DIALOGS WILL RESPOND, CALL INVALIDATE INSTEAD + invalidate(); + } break; + + case NOTIFICATION_VISIBILITY_CHANGED: { + if (!is_visible()) { + set_process_unhandled_input(false); } - } + } break; + + case NOTIFICATION_WM_WINDOW_FOCUS_IN: { + // Check if the current directory was removed externally (much less likely to happen while editor window is focused). + String previous_dir = get_current_dir(); + while (!dir_access->dir_exists(get_current_dir())) { + _go_up(); + + // In case we can't go further up, use some fallback and break. + if (get_current_dir() == previous_dir) { + _dir_submitted(OS::get_singleton()->get_user_data_dir()); + break; + } + } + } break; } } @@ -311,7 +292,7 @@ void EditorFileDialog::_post_popup() { const Color folder_color = item_list->get_theme_color(SNAME("folder_icon_modulate"), SNAME("FileDialog")); recent->clear(); - bool res = access == ACCESS_RESOURCES; + bool res = (access == ACCESS_RESOURCES); Vector<String> recentd = EditorSettings::get_singleton()->get_recent_dirs(); for (int i = 0; i < recentd.size(); i++) { bool cres = recentd[i].begins_with("res://"); @@ -383,7 +364,7 @@ void EditorFileDialog::_thumbnail_done(const String &p_path, const Ref<Texture2D } void EditorFileDialog::_request_single_thumbnail(const String &p_path) { - if (!FileAccess::exists(p_path)) { + if (!FileAccess::exists(p_path) || !previews_enabled) { return; } @@ -890,7 +871,7 @@ void EditorFileDialog::update_file_list() { d["path"] = fullpath; item_list->set_item_metadata(item_list->get_item_count() - 1, d); - if (display_mode == DISPLAY_THUMBNAILS) { + if (display_mode == DISPLAY_THUMBNAILS && previews_enabled) { EditorResourcePreview::get_singleton()->queue_resource_preview(fullpath, this, "_thumbnail_result", fullpath); } @@ -1117,9 +1098,12 @@ void EditorFileDialog::_make_dir_confirm() { update_filters(); update_dir(); _push_history(); - EditorFileSystem::get_singleton()->scan_changes(); //we created a dir, so rescan changes + if (access != ACCESS_FILESYSTEM) { + EditorFileSystem::get_singleton()->scan_changes(); //we created a dir, so rescan changes + } } else { - mkdirerr->popup_centered(Size2(250, 50) * EDSCALE); + error_dialog->set_text(TTR("Could not create folder.")); + error_dialog->popup_centered(Size2(250, 50) * EDSCALE); } makedirname->set_text(""); // reset label } @@ -1145,11 +1129,28 @@ void EditorFileDialog::_delete_items() { } } if (folders.size() + files.size() > 0) { - remove_dialog->reset_size(); - remove_dialog->show(folders, files); + if (access == ACCESS_FILESYSTEM) { + global_remove_dialog->popup_centered(); + } else { + dep_remove_dialog->reset_size(); + dep_remove_dialog->show(folders, files); + } } } +void EditorFileDialog::_delete_files_global() { + // Delete files outside of the project directory without dependency checks. + for (int i = 0; i < item_list->get_item_count(); i++) { + if (!item_list->is_selected(i)) { + continue; + } + Dictionary item_meta = item_list->get_item_metadata(i); + // Only delete empty directories for safety. + dir_access->remove(item_meta["path"]); + } + update_file_list(); +} + void EditorFileDialog::_select_drive(int p_idx) { String d = drives->get_item_text(p_idx); dir_access->change_dir(d); @@ -1183,11 +1184,60 @@ void EditorFileDialog::_update_drives(bool p_select) { } } +void EditorFileDialog::_update_icons() { + // Update icons. + mode_thumbnails->set_icon(item_list->get_theme_icon(SNAME("FileThumbnail"), SNAME("EditorIcons"))); + mode_list->set_icon(item_list->get_theme_icon(SNAME("FileList"), SNAME("EditorIcons"))); + if (is_layout_rtl()) { + dir_prev->set_icon(item_list->get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); + dir_next->set_icon(item_list->get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); + } else { + dir_prev->set_icon(item_list->get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); + dir_next->set_icon(item_list->get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); + } + dir_up->set_icon(item_list->get_theme_icon(SNAME("ArrowUp"), SNAME("EditorIcons"))); + refresh->set_icon(item_list->get_theme_icon(SNAME("Reload"), SNAME("EditorIcons"))); + favorite->set_icon(item_list->get_theme_icon(SNAME("Favorites"), SNAME("EditorIcons"))); + show_hidden->set_icon(item_list->get_theme_icon(SNAME("GuiVisibilityVisible"), SNAME("EditorIcons"))); + + fav_up->set_icon(item_list->get_theme_icon(SNAME("MoveUp"), SNAME("EditorIcons"))); + fav_down->set_icon(item_list->get_theme_icon(SNAME("MoveDown"), SNAME("EditorIcons"))); +} + void EditorFileDialog::_favorite_selected(int p_idx) { - dir_access->change_dir(favorites->get_item_metadata(p_idx)); - update_dir(); - invalidate(); - _push_history(); + Error change_dir_result = dir_access->change_dir(favorites->get_item_metadata(p_idx)); + if (change_dir_result != OK) { + error_dialog->set_text(TTR("Favorited folder does not exist anymore and will be removed.")); + error_dialog->popup_centered(Size2(250, 50) * EDSCALE); + + bool res = (access == ACCESS_RESOURCES); + + Vector<String> favorited = EditorSettings::get_singleton()->get_favorites(); + String dir_to_remove = favorites->get_item_metadata(p_idx); + + bool found = false; + for (int i = 0; i < favorited.size(); i++) { + bool cres = favorited[i].begins_with("res://"); + if (cres != res) { + continue; + } + + if (favorited[i] == dir_to_remove) { + found = true; + break; + } + } + + if (found) { + favorited.erase(favorites->get_item_metadata(p_idx)); + favorites->remove_item(p_idx); + EditorSettings::get_singleton()->set_favorites(favorited); + } + } else { + update_dir(); + invalidate(); + _push_history(); + } } void EditorFileDialog::_favorite_move_up() { @@ -1233,7 +1283,7 @@ void EditorFileDialog::_favorite_move_down() { } void EditorFileDialog::_update_favorites() { - bool res = access == ACCESS_RESOURCES; + bool res = (access == ACCESS_RESOURCES); String current = get_current_dir(); Ref<Texture2D> folder_icon = item_list->get_theme_icon(SNAME("Folder"), SNAME("EditorIcons")); @@ -1282,7 +1332,7 @@ void EditorFileDialog::_update_favorites() { } void EditorFileDialog::_favorite_pressed() { - bool res = access == ACCESS_RESOURCES; + bool res = (access == ACCESS_RESOURCES); String cd = get_current_dir(); if (!cd.ends_with("/")) { @@ -1494,6 +1544,14 @@ bool EditorFileDialog::is_overwrite_warning_disabled() const { return disable_overwrite_warning; } +void EditorFileDialog::set_previews_enabled(bool p_enabled) { + previews_enabled = p_enabled; +} + +bool EditorFileDialog::are_previews_enabled() { + return previews_enabled; +} + EditorFileDialog::EditorFileDialog() { show_hidden_files = default_show_hidden_files; display_mode = default_display_mode; @@ -1727,8 +1785,13 @@ EditorFileDialog::EditorFileDialog() { add_child(confirm_save); confirm_save->connect("confirmed", callable_mp(this, &EditorFileDialog::_save_confirm_pressed)); - remove_dialog = memnew(DependencyRemoveDialog); - add_child(remove_dialog); + dep_remove_dialog = memnew(DependencyRemoveDialog); + add_child(dep_remove_dialog); + + global_remove_dialog = memnew(ConfirmationDialog); + global_remove_dialog->set_text(TTR("Remove the selected files? For safety only files and empty directories can be deleted from here. (Cannot be undone.)\nDepending on your filesystem configuration, the files will either be moved to the system trash or deleted permanently.")); + global_remove_dialog->connect("confirmed", callable_mp(this, &EditorFileDialog::_delete_files_global)); + add_child(global_remove_dialog); makedialog = memnew(ConfirmationDialog); makedialog->set_title(TTR("Create Folder")); @@ -1741,9 +1804,8 @@ EditorFileDialog::EditorFileDialog() { add_child(makedialog); makedialog->register_text_enter(makedirname); makedialog->connect("confirmed", callable_mp(this, &EditorFileDialog::_make_dir_confirm)); - mkdirerr = memnew(AcceptDialog); - mkdirerr->set_text(TTR("Could not create folder.")); - add_child(mkdirerr); + error_dialog = memnew(AcceptDialog); + add_child(error_dialog); update_filters(); update_dir(); @@ -1756,6 +1818,7 @@ EditorFileDialog::EditorFileDialog() { register_func(this); } + previews_enabled = true; preview_wheel_timeout = 0; preview_wheel_index = 0; preview_waiting = false; diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h index 6cfdf53780..65a4c9e544 100644 --- a/editor/editor_file_dialog.h +++ b/editor/editor_file_dialog.h @@ -32,6 +32,7 @@ #define EDITORFILEDIALOG_H #include "core/io/dir_access.h" +#include "editor/plugins/editor_preview_plugins.h" #include "scene/gui/box_container.h" #include "scene/gui/dialogs.h" #include "scene/gui/item_list.h" @@ -88,7 +89,7 @@ private: Button *makedir; Access access; - //Button *action; + VBoxContainer *vbox; FileMode mode; bool can_create_dir; @@ -109,10 +110,11 @@ private: HBoxContainer *file_box; LineEdit *file; OptionButton *filter; - AcceptDialog *mkdirerr; + AcceptDialog *error_dialog; DirAccess *dir_access; ConfirmationDialog *confirm_save; - DependencyRemoveDialog *remove_dialog; + DependencyRemoveDialog *dep_remove_dialog; + ConfirmationDialog *global_remove_dialog; Button *mode_thumbnails; Button *mode_list; @@ -133,9 +135,11 @@ private: Vector<String> filters; + bool previews_enabled; bool preview_waiting; int preview_wheel_index; float preview_wheel_timeout; + static bool default_show_hidden_files; static DisplayMode default_display_mode; bool show_hidden_files; @@ -179,8 +183,10 @@ private: void _make_dir_confirm(); void _delete_items(); + void _delete_files_global(); void _update_drives(bool p_select = true); + void _update_icons(); void _go_up(); void _go_back(); @@ -189,7 +195,7 @@ private: virtual void _post_popup() override; void _save_to_recent(); - //callback function is callback(String p_path,Ref<Texture2D> preview,Variant udata) preview null if could not load + // Callback function is callback(String p_path,Ref<Texture2D> preview,Variant udata) preview null if could not load. void _thumbnail_result(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata); void _thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata); @@ -202,7 +208,7 @@ private: protected: void _notification(int p_what); static void _bind_methods(); - //bind helpers + public: void popup_file_dialog(); void clear_filters(); @@ -230,17 +236,19 @@ public: void set_access(Access p_access); Access get_access() const; - void set_show_hidden_files(bool p_show); - bool is_showing_hidden_files() const; - static void set_default_show_hidden_files(bool p_show); static void set_default_display_mode(DisplayMode p_mode); + void set_show_hidden_files(bool p_show); + bool is_showing_hidden_files() const; void invalidate(); void set_disable_overwrite_warning(bool p_disable); bool is_overwrite_warning_disabled() const; + void set_previews_enabled(bool p_enabled); + bool are_previews_enabled(); + EditorFileDialog(); ~EditorFileDialog(); }; diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 5beed352a6..0c46cebec0 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -38,9 +38,9 @@ #include "core/io/resource_saver.h" #include "core/os/os.h" #include "core/variant/variant_parser.h" -#include "editor_node.h" -#include "editor_resource_preview.h" -#include "editor_settings.h" +#include "editor/editor_node.h" +#include "editor/editor_resource_preview.h" +#include "editor/editor_settings.h" EditorFileSystem *EditorFileSystem::singleton = nullptr; //the name is the version, to keep compatibility with different versions of Godot @@ -1163,6 +1163,7 @@ void EditorFileSystem::_notification(int p_what) { call_deferred(SNAME("scan")); //this should happen after every editor node entered the tree } break; + case NOTIFICATION_EXIT_TREE: { Thread &active_thread = thread.is_started() ? thread : thread_sources; if (use_threads && active_thread.is_started()) { @@ -1184,8 +1185,8 @@ void EditorFileSystem::_notification(int p_what) { } filesystem = nullptr; new_filesystem = nullptr; - } break; + case NOTIFICATION_PROCESS: { if (use_threads) { if (scanning_changes) { diff --git a/editor/editor_folding.cpp b/editor/editor_folding.cpp index 266a064807..8d6ebd1154 100644 --- a/editor/editor_folding.cpp +++ b/editor/editor_folding.cpp @@ -31,8 +31,8 @@ #include "editor_folding.h" #include "core/io/file_access.h" -#include "editor_inspector.h" -#include "editor_settings.h" +#include "editor/editor_inspector.h" +#include "editor/editor_settings.h" Vector<String> EditorFolding::_get_unfolds(const Object *p_object) { Vector<String> sections; diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index 0c9a7b2972..d80ee1d569 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -32,8 +32,8 @@ #include "builtin_fonts.gen.h" #include "core/io/dir_access.h" -#include "editor_scale.h" -#include "editor_settings.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" #include "scene/resources/default_theme/default_theme.h" #include "scene/resources/font.h" @@ -145,7 +145,7 @@ m_name->set_spacing(TextServer::SPACING_BOTTOM, -EDSCALE); \ MAKE_FALLBACKS(m_name); -Ref<FontData> load_cached_external_font(const String &p_path, TextServer::Hinting p_hinting, bool p_aa, bool p_autohint) { +Ref<FontData> load_cached_external_font(const String &p_path, TextServer::Hinting p_hinting, bool p_aa, bool p_autohint, TextServer::SubpixelPositioning p_font_subpixel_positioning) { Ref<FontData> font; font.instantiate(); @@ -155,11 +155,12 @@ Ref<FontData> load_cached_external_font(const String &p_path, TextServer::Hintin font->set_antialiased(p_aa); font->set_hinting(p_hinting); font->set_force_autohinter(p_autohint); + font->set_subpixel_positioning(p_font_subpixel_positioning); return font; } -Ref<FontData> load_cached_internal_font(const uint8_t *p_data, size_t p_size, TextServer::Hinting p_hinting, bool p_aa, bool p_autohint) { +Ref<FontData> load_cached_internal_font(const uint8_t *p_data, size_t p_size, TextServer::Hinting p_hinting, bool p_aa, bool p_autohint, TextServer::SubpixelPositioning p_font_subpixel_positioning) { Ref<FontData> font; font.instantiate(); @@ -167,6 +168,7 @@ Ref<FontData> load_cached_internal_font(const uint8_t *p_data, size_t p_size, Te font->set_antialiased(p_aa); font->set_hinting(p_hinting); font->set_force_autohinter(p_autohint); + font->set_subpixel_positioning(p_font_subpixel_positioning); return font; } @@ -178,6 +180,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { bool font_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/font_antialiased"); int font_hinting_setting = (int)EditorSettings::get_singleton()->get("interface/editor/font_hinting"); + TextServer::SubpixelPositioning font_subpixel_positioning = (TextServer::SubpixelPositioning)(int)EditorSettings::get_singleton()->get("interface/editor/font_subpixel_positioning"); TextServer::Hinting font_hinting; switch (font_hinting_setting) { @@ -208,7 +211,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { String custom_font_path = EditorSettings::get_singleton()->get("interface/editor/main_font"); Ref<FontData> CustomFont; if (custom_font_path.length() > 0 && dir->file_exists(custom_font_path)) { - CustomFont = load_cached_external_font(custom_font_path, font_hinting, font_antialiased, true); + CustomFont = load_cached_external_font(custom_font_path, font_hinting, font_antialiased, true, font_subpixel_positioning); } else { EditorSettings::get_singleton()->set_manually("interface/editor/main_font", ""); } @@ -218,7 +221,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { String custom_font_path_bold = EditorSettings::get_singleton()->get("interface/editor/main_font_bold"); Ref<FontData> CustomFontBold; if (custom_font_path_bold.length() > 0 && dir->file_exists(custom_font_path_bold)) { - CustomFontBold = load_cached_external_font(custom_font_path_bold, font_hinting, font_antialiased, true); + CustomFontBold = load_cached_external_font(custom_font_path_bold, font_hinting, font_antialiased, true, font_subpixel_positioning); } else { EditorSettings::get_singleton()->set_manually("interface/editor/main_font_bold", ""); } @@ -228,7 +231,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { String custom_font_path_source = EditorSettings::get_singleton()->get("interface/editor/code_font"); Ref<FontData> CustomFontSource; if (custom_font_path_source.length() > 0 && dir->file_exists(custom_font_path_source)) { - CustomFontSource = load_cached_external_font(custom_font_path_source, font_hinting, font_antialiased, true); + CustomFontSource = load_cached_external_font(custom_font_path_source, font_hinting, font_antialiased, true, font_subpixel_positioning); } else { EditorSettings::get_singleton()->set_manually("interface/editor/code_font", ""); } @@ -237,39 +240,39 @@ void editor_register_fonts(Ref<Theme> p_theme) { /* Noto Sans */ - Ref<FontData> DefaultFont = load_cached_internal_font(_font_NotoSans_Regular, _font_NotoSans_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> DefaultFontBold = load_cached_internal_font(_font_NotoSans_Bold, _font_NotoSans_Bold_size, font_hinting, font_antialiased, true); - Ref<FontData> FontArabic = load_cached_internal_font(_font_NotoNaskhArabicUI_Regular, _font_NotoNaskhArabicUI_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> FontArabicBold = load_cached_internal_font(_font_NotoNaskhArabicUI_Bold, _font_NotoNaskhArabicUI_Bold_size, font_hinting, font_antialiased, true); - Ref<FontData> FontBengali = load_cached_internal_font(_font_NotoSansBengaliUI_Regular, _font_NotoSansBengaliUI_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> FontBengaliBold = load_cached_internal_font(_font_NotoSansBengaliUI_Bold, _font_NotoSansBengaliUI_Bold_size, font_hinting, font_antialiased, true); - Ref<FontData> FontDevanagari = load_cached_internal_font(_font_NotoSansDevanagariUI_Regular, _font_NotoSansDevanagariUI_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> FontDevanagariBold = load_cached_internal_font(_font_NotoSansDevanagariUI_Bold, _font_NotoSansDevanagariUI_Bold_size, font_hinting, font_antialiased, true); - Ref<FontData> FontGeorgian = load_cached_internal_font(_font_NotoSansGeorgian_Regular, _font_NotoSansGeorgian_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> FontGeorgianBold = load_cached_internal_font(_font_NotoSansGeorgian_Bold, _font_NotoSansGeorgian_Bold_size, font_hinting, font_antialiased, true); - Ref<FontData> FontHebrew = load_cached_internal_font(_font_NotoSansHebrew_Regular, _font_NotoSansHebrew_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> FontHebrewBold = load_cached_internal_font(_font_NotoSansHebrew_Bold, _font_NotoSansHebrew_Bold_size, font_hinting, font_antialiased, true); - Ref<FontData> FontMalayalam = load_cached_internal_font(_font_NotoSansMalayalamUI_Regular, _font_NotoSansMalayalamUI_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> FontMalayalamBold = load_cached_internal_font(_font_NotoSansMalayalamUI_Bold, _font_NotoSansMalayalamUI_Bold_size, font_hinting, font_antialiased, true); - Ref<FontData> FontOriya = load_cached_internal_font(_font_NotoSansOriyaUI_Regular, _font_NotoSansOriyaUI_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> FontOriyaBold = load_cached_internal_font(_font_NotoSansOriyaUI_Bold, _font_NotoSansOriyaUI_Bold_size, font_hinting, font_antialiased, true); - Ref<FontData> FontSinhala = load_cached_internal_font(_font_NotoSansSinhalaUI_Regular, _font_NotoSansSinhalaUI_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> FontSinhalaBold = load_cached_internal_font(_font_NotoSansSinhalaUI_Bold, _font_NotoSansSinhalaUI_Bold_size, font_hinting, font_antialiased, true); - Ref<FontData> FontTamil = load_cached_internal_font(_font_NotoSansTamilUI_Regular, _font_NotoSansTamilUI_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> FontTamilBold = load_cached_internal_font(_font_NotoSansTamilUI_Bold, _font_NotoSansTamilUI_Bold_size, font_hinting, font_antialiased, true); - Ref<FontData> FontTelugu = load_cached_internal_font(_font_NotoSansTeluguUI_Regular, _font_NotoSansTeluguUI_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> FontTeluguBold = load_cached_internal_font(_font_NotoSansTeluguUI_Bold, _font_NotoSansTeluguUI_Bold_size, font_hinting, font_antialiased, true); - Ref<FontData> FontThai = load_cached_internal_font(_font_NotoSansThaiUI_Regular, _font_NotoSansThaiUI_Regular_size, font_hinting, font_antialiased, true); - Ref<FontData> FontThaiBold = load_cached_internal_font(_font_NotoSansThaiUI_Bold, _font_NotoSansThaiUI_Bold_size, font_hinting, font_antialiased, true); + Ref<FontData> DefaultFont = load_cached_internal_font(_font_NotoSans_Regular, _font_NotoSans_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> DefaultFontBold = load_cached_internal_font(_font_NotoSans_Bold, _font_NotoSans_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontArabic = load_cached_internal_font(_font_NotoNaskhArabicUI_Regular, _font_NotoNaskhArabicUI_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontArabicBold = load_cached_internal_font(_font_NotoNaskhArabicUI_Bold, _font_NotoNaskhArabicUI_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontBengali = load_cached_internal_font(_font_NotoSansBengaliUI_Regular, _font_NotoSansBengaliUI_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontBengaliBold = load_cached_internal_font(_font_NotoSansBengaliUI_Bold, _font_NotoSansBengaliUI_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontDevanagari = load_cached_internal_font(_font_NotoSansDevanagariUI_Regular, _font_NotoSansDevanagariUI_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontDevanagariBold = load_cached_internal_font(_font_NotoSansDevanagariUI_Bold, _font_NotoSansDevanagariUI_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontGeorgian = load_cached_internal_font(_font_NotoSansGeorgian_Regular, _font_NotoSansGeorgian_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontGeorgianBold = load_cached_internal_font(_font_NotoSansGeorgian_Bold, _font_NotoSansGeorgian_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontHebrew = load_cached_internal_font(_font_NotoSansHebrew_Regular, _font_NotoSansHebrew_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontHebrewBold = load_cached_internal_font(_font_NotoSansHebrew_Bold, _font_NotoSansHebrew_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontMalayalam = load_cached_internal_font(_font_NotoSansMalayalamUI_Regular, _font_NotoSansMalayalamUI_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontMalayalamBold = load_cached_internal_font(_font_NotoSansMalayalamUI_Bold, _font_NotoSansMalayalamUI_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontOriya = load_cached_internal_font(_font_NotoSansOriyaUI_Regular, _font_NotoSansOriyaUI_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontOriyaBold = load_cached_internal_font(_font_NotoSansOriyaUI_Bold, _font_NotoSansOriyaUI_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontSinhala = load_cached_internal_font(_font_NotoSansSinhalaUI_Regular, _font_NotoSansSinhalaUI_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontSinhalaBold = load_cached_internal_font(_font_NotoSansSinhalaUI_Bold, _font_NotoSansSinhalaUI_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontTamil = load_cached_internal_font(_font_NotoSansTamilUI_Regular, _font_NotoSansTamilUI_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontTamilBold = load_cached_internal_font(_font_NotoSansTamilUI_Bold, _font_NotoSansTamilUI_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontTelugu = load_cached_internal_font(_font_NotoSansTeluguUI_Regular, _font_NotoSansTeluguUI_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontTeluguBold = load_cached_internal_font(_font_NotoSansTeluguUI_Bold, _font_NotoSansTeluguUI_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontThai = load_cached_internal_font(_font_NotoSansThaiUI_Regular, _font_NotoSansThaiUI_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontThaiBold = load_cached_internal_font(_font_NotoSansThaiUI_Bold, _font_NotoSansThaiUI_Bold_size, font_hinting, font_antialiased, true, font_subpixel_positioning); /* Droid Sans */ - Ref<FontData> FontFallback = load_cached_internal_font(_font_DroidSansFallback, _font_DroidSansFallback_size, font_hinting, font_antialiased, true); - Ref<FontData> FontJapanese = load_cached_internal_font(_font_DroidSansJapanese, _font_DroidSansJapanese_size, font_hinting, font_antialiased, true); + Ref<FontData> FontFallback = load_cached_internal_font(_font_DroidSansFallback, _font_DroidSansFallback_size, font_hinting, font_antialiased, true, font_subpixel_positioning); + Ref<FontData> FontJapanese = load_cached_internal_font(_font_DroidSansJapanese, _font_DroidSansJapanese_size, font_hinting, font_antialiased, true, font_subpixel_positioning); /* Hack */ - Ref<FontData> dfmono = load_cached_internal_font(_font_JetBrainsMono_Regular, _font_JetBrainsMono_Regular_size, font_hinting, font_antialiased, true); + Ref<FontData> dfmono = load_cached_internal_font(_font_JetBrainsMono_Regular, _font_JetBrainsMono_Regular_size, font_hinting, font_antialiased, true, font_subpixel_positioning); Dictionary opentype_features; opentype_features["calt"] = 0; dfmono->set_opentype_feature_overrides(opentype_features); // Disable contextual alternates (coding ligatures). diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index 6421d88780..39c8509148 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -35,29 +35,29 @@ #include "core/os/keyboard.h" #include "core/version_generated.gen.h" #include "doc_data_compressed.gen.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" #include "editor/plugins/script_editor_plugin.h" -#include "editor_node.h" -#include "editor_scale.h" -#include "editor_settings.h" #define CONTRIBUTE_URL vformat("%s/community/contributing/updating_the_class_reference.html", VERSION_DOCS_URL) DocTools *EditorHelp::doc = nullptr; void EditorHelp::_update_theme() { - text_color = get_theme_color("text_color", "EditorHelp"); - title_color = get_theme_color("title_color", "EditorHelp"); - headline_color = get_theme_color("headline_color", "EditorHelp"); - comment_color = get_theme_color("comment_color", "EditorHelp"); - symbol_color = get_theme_color("symbol_color", "EditorHelp"); - value_color = get_theme_color("value_color", "EditorHelp"); - qualifier_color = get_theme_color("qualifier_color", "EditorHelp"); - type_color = get_theme_color("type_color", "EditorHelp"); - - class_desc->add_theme_color_override("selection_color", get_theme_color("selection_color", "EditorHelp")); - class_desc->add_theme_constant_override("line_separation", get_theme_constant("line_separation", "EditorHelp")); - class_desc->add_theme_constant_override("table_hseparation", get_theme_constant("table_hseparation", "EditorHelp")); - class_desc->add_theme_constant_override("table_vseparation", get_theme_constant("table_vseparation", "EditorHelp")); + text_color = get_theme_color(SNAME("text_color"), SNAME("EditorHelp")); + title_color = get_theme_color(SNAME("title_color"), SNAME("EditorHelp")); + headline_color = get_theme_color(SNAME("headline_color"), SNAME("EditorHelp")); + comment_color = get_theme_color(SNAME("comment_color"), SNAME("EditorHelp")); + symbol_color = get_theme_color(SNAME("symbol_color"), SNAME("EditorHelp")); + value_color = get_theme_color(SNAME("value_color"), SNAME("EditorHelp")); + qualifier_color = get_theme_color(SNAME("qualifier_color"), SNAME("EditorHelp")); + type_color = get_theme_color(SNAME("type_color"), SNAME("EditorHelp")); + + class_desc->add_theme_color_override("selection_color", get_theme_color(SNAME("selection_color"), SNAME("EditorHelp"))); + class_desc->add_theme_constant_override("line_separation", get_theme_constant(SNAME("line_separation"), SNAME("EditorHelp"))); + class_desc->add_theme_constant_override("table_hseparation", get_theme_constant(SNAME("table_hseparation"), SNAME("EditorHelp"))); + class_desc->add_theme_constant_override("table_vseparation", get_theme_constant(SNAME("table_vseparation"), SNAME("EditorHelp"))); doc_font = get_theme_font(SNAME("doc"), SNAME("EditorFonts")); doc_bold_font = get_theme_font(SNAME("doc_bold"), SNAME("EditorFonts")); @@ -81,7 +81,7 @@ void EditorHelp::_class_desc_select(const String &p_select) { if (p_select.begins_with("$")) { //enum String select = p_select.substr(1, p_select.length()); String class_name; - if (select.find(".") != -1) { + if (select.contains(".")) { class_name = select.get_slice(".", 0); select = select.get_slice(".", 1); } else { @@ -123,7 +123,7 @@ void EditorHelp::_class_desc_select(const String &p_select) { return; } - if (link.find(".") != -1) { + if (link.contains(".")) { emit_signal(SNAME("go_to_help"), topic + ":" + link.get_slice(".", 0) + ":" + link.get_slice(".", 1)); } else { if (table->has(link)) { @@ -185,7 +185,7 @@ void EditorHelp::_add_type(const String &p_type, const String &p_enum) { if (t.is_empty()) { t = "void"; } - bool can_ref = (t != "void" && t.find("*") == -1) || !p_enum.is_empty(); + bool can_ref = (t != "void" && !t.contains("*")) || !p_enum.is_empty(); if (!p_enum.is_empty()) { if (p_enum.get_slice_count(".") > 1) { @@ -240,7 +240,7 @@ String EditorHelp::_fix_constant(const String &p_constant) const { void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview) { method_line[p_method.name] = class_desc->get_line_count() - 2; //gets overridden if description - const bool is_vararg = p_method.qualifiers.find("vararg") != -1; + const bool is_vararg = p_method.qualifiers.contains("vararg"); if (p_overview) { class_desc->push_cell(); @@ -364,7 +364,7 @@ void EditorHelp::_update_method_list(const Vector<DocData::MethodDoc> p_methods, for (int i = 0; i < p_methods.size(); i++) { const String &q = p_methods[i].qualifiers; - if ((pass == 0 && q.find("virtual") != -1) || (pass == 1 && q.find("virtual") == -1)) { + if ((pass == 0 && q.contains("virtual")) || (pass == 1 && !q.contains("virtual"))) { m.push_back(p_methods[i]); } } @@ -429,7 +429,7 @@ void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc, for (int i = 0; i < p_methods.size(); i++) { const String &q = p_methods[i].qualifiers; - if ((pass == 0 && q.find("virtual") != -1) || (pass == 1 && q.find("virtual") == -1)) { + if ((pass == 0 && q.contains("virtual")) || (pass == 1 && !q.contains("virtual"))) { methods_filtered.push_back(p_methods[i]); } } @@ -477,9 +477,9 @@ void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc, class_desc->add_text(" "); class_desc->push_color(comment_color); if (p_classdoc.is_script_doc) { - class_desc->append_text(TTR("There is currently no description for this " + p_method_type + ".")); + class_desc->append_text(vformat(TTR("There is currently no description for this %s."), p_method_type)); } else { - class_desc->append_text(TTR("There is currently no description for this " + p_method_type + ". Please help us by [color=$color][url=$url]contributing one[/url][/color]!").replace("$url", CONTRIBUTE_URL).replace("$color", link_color_text)); + class_desc->append_text(vformat(TTR("There is currently no description for this %s. Please help us by [color=$color][url=$url]contributing one[/url][/color]!"), p_method_type).replace("$url", CONTRIBUTE_URL).replace("$color", link_color_text)); } class_desc->pop(); } @@ -820,7 +820,7 @@ void EditorHelp::_update_doc() { } } // Ignore undocumented non virtual private. - if (cd.methods[i].name.begins_with("_") && cd.methods[i].description.is_empty() && cd.methods[i].qualifiers.find("virtual") == -1) { + if (cd.methods[i].name.begins_with("_") && cd.methods[i].description.is_empty() && !cd.methods[i].qualifiers.contains("virtual")) { continue; } methods.push_back(cd.methods[i]); @@ -1770,17 +1770,17 @@ void EditorHelp::_notification(int p_what) { _wait_for_thread(); _update_doc(); } break; + case NOTIFICATION_THEME_CHANGED: { if (is_inside_tree()) { _class_desc_resized(true); } update_toggle_scripts_button(); } break; - case NOTIFICATION_VISIBILITY_CHANGED: + + case NOTIFICATION_VISIBILITY_CHANGED: { update_toggle_scripts_button(); - break; - default: - break; + } break; } } @@ -1910,6 +1910,8 @@ DocTools *EditorHelp::get_doc_data() { return doc; } +//// EditorHelpBit /// + void EditorHelpBit::_go_to_help(String p_what) { EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT); ScriptEditor::get_singleton()->goto_help(p_what); @@ -1921,7 +1923,7 @@ void EditorHelpBit::_meta_clicked(String p_select) { String select = p_select.substr(1, p_select.length()); String class_name; - if (select.find(".") != -1) { + if (select.contains(".")) { class_name = select.get_slice(".", 0); } else { class_name = "@Global"; @@ -1934,7 +1936,7 @@ void EditorHelpBit::_meta_clicked(String p_select) { } else if (p_select.begins_with("@")) { String m = p_select.substr(1, p_select.length()); - if (m.find(".") != -1) { + if (m.contains(".")) { _go_to_help("class_method:" + m.get_slice(".", 0) + ":" + m.get_slice(".", 0)); //must go somewhere else } } @@ -1950,12 +1952,9 @@ void EditorHelpBit::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { rich_text->add_theme_color_override("selection_color", get_theme_color(SNAME("selection_color"), SNAME("EditorHelp"))); - } break; - - case NOTIFICATION_READY: { rich_text->clear(); _add_text_to_rt(text, rich_text); - + rich_text->reset_size(); // Force recalculating size after parsing bbcode. } break; } } @@ -1971,9 +1970,12 @@ EditorHelpBit::EditorHelpBit() { add_child(rich_text); rich_text->connect("meta_clicked", callable_mp(this, &EditorHelpBit::_meta_clicked)); rich_text->set_override_selected_font_color(false); - set_custom_minimum_size(Size2(0, 70 * EDSCALE)); + rich_text->set_fit_content_height(true); + set_custom_minimum_size(Size2(0, 50 * EDSCALE)); } +//// FindBar /// + FindBar::FindBar() { search_text = memnew(LineEdit); add_child(search_text); @@ -2005,7 +2007,7 @@ FindBar::FindBar() { hide_button = memnew(TextureButton); add_child(hide_button); hide_button->set_focus_mode(FOCUS_NONE); - hide_button->set_expand(true); + hide_button->set_ignore_texture_size(true); hide_button->set_stretch_mode(TextureButton::STRETCH_KEEP_CENTERED); hide_button->connect("pressed", callable_mp(this, &FindBar::_hide_bar)); } @@ -2039,6 +2041,7 @@ void FindBar::_notification(int p_what) { hide_button->set_custom_minimum_size(hide_button->get_normal_texture()->get_size()); matches_label->add_theme_color_override("font_color", results_count > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); } break; + case NOTIFICATION_VISIBILITY_CHANGED: { set_process_unhandled_input(is_visible_in_tree()); } break; @@ -2126,7 +2129,7 @@ void FindBar::unhandled_input(const Ref<InputEvent> &p_event) { Ref<InputEventKey> k = p_event; if (k.is_valid()) { - if (k->is_pressed() && (rich_text_label->has_focus() || is_ancestor_of(get_focus_owner()))) { + if (k->is_pressed() && (rich_text_label->has_focus() || is_ancestor_of(get_viewport()->gui_get_focus_owner()))) { bool accepted = true; switch (k->get_keycode()) { diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp index 19da6686a5..dd4969cdd2 100644 --- a/editor/editor_help_search.cpp +++ b/editor/editor_help_search.cpp @@ -31,9 +31,9 @@ #include "editor_help_search.h" #include "core/os/keyboard.h" -#include "editor_feature_profile.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_feature_profile.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" void EditorHelpSearch::_update_icons() { search_box->set_right_icon(results_tree->get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); @@ -111,9 +111,11 @@ void EditorHelpSearch::_notification(int p_what) { EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "search_help", Rect2(get_position(), get_size())); } } break; + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { _update_icons(); } break; + case NOTIFICATION_ENTER_TREE: { connect("confirmed", callable_mp(this, &EditorHelpSearch::_confirmed)); _update_icons(); @@ -529,8 +531,8 @@ TreeItem *EditorHelpSearch::Runner::_create_class_hierarchy(const ClassMatch &p_ TreeItem *EditorHelpSearch::Runner::_create_class_item(TreeItem *p_parent, const DocData::ClassDoc *p_doc, bool p_gray) { Ref<Texture2D> icon = empty_icon; - if (ui_service->has_theme_icon(p_doc->name, "EditorIcons")) { - icon = ui_service->get_theme_icon(p_doc->name, "EditorIcons"); + if (ui_service->has_theme_icon(p_doc->name, SNAME("EditorIcons"))) { + icon = ui_service->get_theme_icon(p_doc->name, SNAME("EditorIcons")); } else if (ClassDB::class_exists(p_doc->name) && ClassDB::is_parent_class(p_doc->name, "Object")) { icon = ui_service->get_theme_icon(SNAME("Object"), SNAME("EditorIcons")); } @@ -610,11 +612,6 @@ TreeItem *EditorHelpSearch::Runner::_create_member_item(TreeItem *p_parent, cons text = p_text; } else { icon = ui_service->get_theme_icon(p_icon, SNAME("EditorIcons")); - /*// In flat mode, show the class icon. -if (ui_service->has_icon(p_class_name, "EditorIcons")) -icon = ui_service->get_icon(p_class_name, "EditorIcons"); -else if (ClassDB::is_parent_class(p_class_name, "Object")) -icon = ui_service->get_icon("Object", "EditorIcons");*/ text = p_class_name + "." + p_text; } diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index d19032da8b..675ef808e1 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -34,10 +34,10 @@ #include "core/os/keyboard.h" #include "dictionary_property_edit.h" #include "editor/doc_tools.h" -#include "editor_feature_profile.h" -#include "editor_node.h" -#include "editor_scale.h" -#include "editor_settings.h" +#include "editor/editor_feature_profile.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" #include "multi_node_edit.h" #include "scene/property_utils.h" #include "scene/resources/packed_scene.h" @@ -103,22 +103,96 @@ void EditorProperty::emit_changed(const StringName &p_property, const Variant &p } void EditorProperty::_notification(int p_what) { - if (p_what == NOTIFICATION_SORT_CHILDREN) { - Size2 size = get_size(); - Rect2 rect; - Rect2 bottom_rect; + switch (p_what) { + case NOTIFICATION_SORT_CHILDREN: { + Size2 size = get_size(); + Rect2 rect; + Rect2 bottom_rect; + + right_child_rect = Rect2(); + bottom_child_rect = Rect2(); + + { + int child_room = size.width * (1.0 - split_ratio); + Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Tree")); + int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Tree")); + int height = font->get_height(font_size); + bool no_children = true; + + //compute room needed + for (int i = 0; i < get_child_count(); i++) { + Control *c = Object::cast_to<Control>(get_child(i)); + if (!c) { + continue; + } + if (c->is_set_as_top_level()) { + continue; + } + if (c == bottom_editor) { + continue; + } - right_child_rect = Rect2(); - bottom_child_rect = Rect2(); + Size2 minsize = c->get_combined_minimum_size(); + child_room = MAX(child_room, minsize.width); + height = MAX(height, minsize.height); + no_children = false; + } - { - int child_room = size.width * (1.0 - split_ratio); - Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Tree")); - int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Tree")); - int height = font->get_height(font_size); - bool no_children = true; + if (no_children) { + text_size = size.width; + rect = Rect2(size.width - 1, 0, 1, height); + } else { + text_size = MAX(0, size.width - (child_room + 4 * EDSCALE)); + if (is_layout_rtl()) { + rect = Rect2(1, 0, child_room, height); + } else { + rect = Rect2(size.width - child_room, 0, child_room, height); + } + } + + if (bottom_editor) { + int m = 0; //get_constant("item_margin", "Tree"); + + bottom_rect = Rect2(m, rect.size.height + get_theme_constant(SNAME("vseparation")), size.width - m, bottom_editor->get_combined_minimum_size().height); + } + + if (keying) { + Ref<Texture2D> key; + + if (use_keying_next()) { + key = get_theme_icon(SNAME("KeyNext"), SNAME("EditorIcons")); + } else { + key = get_theme_icon(SNAME("Key"), SNAME("EditorIcons")); + } + + rect.size.x -= key->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree")); + if (is_layout_rtl()) { + rect.position.x += key->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree")); + } + + if (no_children) { + text_size -= key->get_width() + 4 * EDSCALE; + } + } + + if (deletable) { + Ref<Texture2D> close; - //compute room needed + close = get_theme_icon(SNAME("Close"), SNAME("EditorIcons")); + + rect.size.x -= close->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree")); + + if (is_layout_rtl()) { + rect.position.x += close->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree")); + } + + if (no_children) { + text_size -= close->get_width() + 4 * EDSCALE; + } + } + } + + //set children for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); if (!c) { @@ -131,252 +205,181 @@ void EditorProperty::_notification(int p_what) { continue; } - Size2 minsize = c->get_combined_minimum_size(); - child_room = MAX(child_room, minsize.width); - height = MAX(height, minsize.height); - no_children = false; - } - - if (no_children) { - text_size = size.width; - rect = Rect2(size.width - 1, 0, 1, height); - } else { - text_size = MAX(0, size.width - (child_room + 4 * EDSCALE)); - if (is_layout_rtl()) { - rect = Rect2(1, 0, child_room, height); - } else { - rect = Rect2(size.width - child_room, 0, child_room, height); - } + fit_child_in_rect(c, rect); + right_child_rect = rect; } if (bottom_editor) { - int m = 0; //get_constant("item_margin", "Tree"); - - bottom_rect = Rect2(m, rect.size.height + get_theme_constant(SNAME("vseparation")), size.width - m, bottom_editor->get_combined_minimum_size().height); + fit_child_in_rect(bottom_editor, bottom_rect); + bottom_child_rect = bottom_rect; } - if (keying) { - Ref<Texture2D> key; - - if (use_keying_next()) { - key = get_theme_icon(SNAME("KeyNext"), SNAME("EditorIcons")); - } else { - key = get_theme_icon(SNAME("Key"), SNAME("EditorIcons")); - } + update(); //need to redraw text + } break; - rect.size.x -= key->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree")); - if (is_layout_rtl()) { - rect.position.x += key->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree")); - } + case NOTIFICATION_DRAW: { + Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Tree")); + int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Tree")); + Color dark_color = get_theme_color(SNAME("dark_color_2"), SNAME("Editor")); + bool rtl = is_layout_rtl(); - if (no_children) { - text_size -= key->get_width() + 4 * EDSCALE; - } + Size2 size = get_size(); + if (bottom_editor) { + size.height = bottom_editor->get_offset(SIDE_TOP); + } else if (label_reference) { + size.height = label_reference->get_size().height; } - if (deletable) { - Ref<Texture2D> close; - - close = get_theme_icon(SNAME("Close"), SNAME("EditorIcons")); - - rect.size.x -= close->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree")); + Ref<StyleBox> sb; + if (selected) { + sb = get_theme_stylebox(SNAME("bg_selected")); + } else { + sb = get_theme_stylebox(SNAME("bg")); + } - if (is_layout_rtl()) { - rect.position.x += close->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree")); - } + draw_style_box(sb, Rect2(Vector2(), size)); - if (no_children) { - text_size -= close->get_width() + 4 * EDSCALE; - } + if (draw_top_bg && right_child_rect != Rect2()) { + draw_rect(right_child_rect, dark_color); } - } - - //set children - for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) { - continue; + if (bottom_child_rect != Rect2()) { + draw_rect(bottom_child_rect, dark_color); } - if (c->is_set_as_top_level()) { - continue; + + Color color; + if (draw_warning) { + color = get_theme_color(is_read_only() ? SNAME("readonly_warning_color") : SNAME("warning_color")); + } else { + color = get_theme_color(is_read_only() ? SNAME("readonly_color") : SNAME("property_color")); } - if (c == bottom_editor) { - continue; + if (label.contains(".")) { + // FIXME: Move this to the project settings editor, as this is only used + // for project settings feature tag overrides. + color.a = 0.5; } - fit_child_in_rect(c, rect); - right_child_rect = rect; - } - - if (bottom_editor) { - fit_child_in_rect(bottom_editor, bottom_rect); - bottom_child_rect = bottom_rect; - } - - update(); //need to redraw text - } - - if (p_what == NOTIFICATION_DRAW) { - Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Tree")); - int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Tree")); - Color dark_color = get_theme_color(SNAME("dark_color_2"), SNAME("Editor")); - bool rtl = is_layout_rtl(); - - Size2 size = get_size(); - if (bottom_editor) { - size.height = bottom_editor->get_offset(SIDE_TOP); - } else if (label_reference) { - size.height = label_reference->get_size().height; - } - - Ref<StyleBox> sb; - if (selected) { - sb = get_theme_stylebox(SNAME("bg_selected")); - } else { - sb = get_theme_stylebox(SNAME("bg")); - } - - draw_style_box(sb, Rect2(Vector2(), size)); - - if (draw_top_bg && right_child_rect != Rect2()) { - draw_rect(right_child_rect, dark_color); - } - if (bottom_child_rect != Rect2()) { - draw_rect(bottom_child_rect, dark_color); - } - - Color color; - if (draw_warning) { - color = get_theme_color(is_read_only() ? SNAME("readonly_warning_color") : SNAME("warning_color")); - } else { - color = get_theme_color(is_read_only() ? SNAME("readonly_color") : SNAME("property_color")); - } - if (label.find(".") != -1) { - // FIXME: Move this to the project settings editor, as this is only used - // for project settings feature tag overrides. - color.a = 0.5; - } + int ofs = get_theme_constant(SNAME("font_offset")); + int text_limit = text_size - ofs; - int ofs = get_theme_constant(SNAME("font_offset")); - int text_limit = text_size; + if (checkable) { + Ref<Texture2D> checkbox; + if (checked) { + checkbox = get_theme_icon(SNAME("GuiChecked"), SNAME("EditorIcons")); + } else { + checkbox = get_theme_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons")); + } - if (checkable) { - Ref<Texture2D> checkbox; - if (checked) { - checkbox = get_theme_icon(SNAME("GuiChecked"), SNAME("EditorIcons")); + Color color2(1, 1, 1); + if (check_hover) { + color2.r *= 1.2; + color2.g *= 1.2; + color2.b *= 1.2; + } + check_rect = Rect2(ofs, ((size.height - checkbox->get_height()) / 2), checkbox->get_width(), checkbox->get_height()); + if (rtl) { + draw_texture(checkbox, Vector2(size.width - check_rect.position.x - checkbox->get_width(), check_rect.position.y), color2); + } else { + draw_texture(checkbox, check_rect.position, color2); + } + int check_ofs = get_theme_constant(SNAME("hseparator"), SNAME("Tree")) + checkbox->get_width() + get_theme_constant(SNAME("hseparation"), SNAME("CheckBox")); + ofs += check_ofs; + text_limit -= check_ofs; } else { - checkbox = get_theme_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons")); + check_rect = Rect2(); } - Color color2(1, 1, 1); - if (check_hover) { - color2.r *= 1.2; - color2.g *= 1.2; - color2.b *= 1.2; - } - check_rect = Rect2(ofs, ((size.height - checkbox->get_height()) / 2), checkbox->get_width(), checkbox->get_height()); - if (rtl) { - draw_texture(checkbox, Vector2(size.width - check_rect.position.x - checkbox->get_width(), check_rect.position.y), color2); + if (can_revert && !is_read_only()) { + Ref<Texture2D> reload_icon = get_theme_icon(SNAME("ReloadSmall"), SNAME("EditorIcons")); + text_limit -= reload_icon->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree")) * 2; + revert_rect = Rect2(ofs + text_limit, (size.height - reload_icon->get_height()) / 2, reload_icon->get_width(), reload_icon->get_height()); + + Color color2(1, 1, 1); + if (revert_hover) { + color2.r *= 1.2; + color2.g *= 1.2; + color2.b *= 1.2; + } + if (rtl) { + draw_texture(reload_icon, Vector2(size.width - revert_rect.position.x - reload_icon->get_width(), revert_rect.position.y), color2); + } else { + draw_texture(reload_icon, revert_rect.position, color2); + } } else { - draw_texture(checkbox, check_rect.position, color2); + revert_rect = Rect2(); } - ofs += get_theme_constant(SNAME("hseparator"), SNAME("Tree")) + checkbox->get_width() + get_theme_constant(SNAME("hseparation"), SNAME("CheckBox")); - text_limit -= ofs; - } else { - check_rect = Rect2(); - } - if (can_revert && !is_read_only()) { - Ref<Texture2D> reload_icon = get_theme_icon(SNAME("ReloadSmall"), SNAME("EditorIcons")); - text_limit -= reload_icon->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree")) * 2; - revert_rect = Rect2(text_limit + get_theme_constant(SNAME("hseparator"), SNAME("Tree")), (size.height - reload_icon->get_height()) / 2, reload_icon->get_width(), reload_icon->get_height()); - - Color color2(1, 1, 1); - if (revert_hover) { - color2.r *= 1.2; - color2.g *= 1.2; - color2.b *= 1.2; - } - if (rtl) { - draw_texture(reload_icon, Vector2(size.width - revert_rect.position.x - reload_icon->get_width(), revert_rect.position.y), color2); - } else { - draw_texture(reload_icon, revert_rect.position, color2); + if (!pin_hidden && pinned) { + Ref<Texture2D> pinned_icon = get_theme_icon(SNAME("Pin"), SNAME("EditorIcons")); + int margin_w = get_theme_constant(SNAME("hseparator"), SNAME("Tree")) * 2; + int total_icon_w = margin_w + pinned_icon->get_width(); + int text_w = font->get_string_size(label, font_size, rtl ? HORIZONTAL_ALIGNMENT_RIGHT : HORIZONTAL_ALIGNMENT_LEFT, text_limit - total_icon_w).x; + int y = (size.height - pinned_icon->get_height()) / 2; + if (rtl) { + draw_texture(pinned_icon, Vector2(size.width - ofs - text_w - total_icon_w, y), color); + } else { + draw_texture(pinned_icon, Vector2(ofs + text_w + margin_w, y), color); + } + text_limit -= total_icon_w; } - } else { - revert_rect = Rect2(); - } - if (!pin_hidden && pinned) { - Ref<Texture2D> pinned_icon = get_theme_icon(SNAME("Pin"), SNAME("EditorIcons")); - int margin_w = get_theme_constant(SNAME("hseparator"), SNAME("Tree")) * 2; - int total_icon_w = margin_w + pinned_icon->get_width(); - int text_w = font->get_string_size(label, font_size, rtl ? HORIZONTAL_ALIGNMENT_RIGHT : HORIZONTAL_ALIGNMENT_LEFT, text_limit - total_icon_w).x; - int y = (size.height - pinned_icon->get_height()) / 2; + int v_ofs = (size.height - font->get_height(font_size)) / 2; if (rtl) { - draw_texture(pinned_icon, Vector2(size.width - ofs - text_w - total_icon_w, y), color); + draw_string(font, Point2(size.width - ofs - text_limit, v_ofs + font->get_ascent(font_size)), label, HORIZONTAL_ALIGNMENT_RIGHT, text_limit, font_size, color); } else { - draw_texture(pinned_icon, Vector2(ofs + text_w + margin_w, y), color); + draw_string(font, Point2(ofs, v_ofs + font->get_ascent(font_size)), label, HORIZONTAL_ALIGNMENT_LEFT, text_limit, font_size, color); } - text_limit -= total_icon_w; - } - int v_ofs = (size.height - font->get_height(font_size)) / 2; - if (rtl) { - draw_string(font, Point2(size.width - ofs - text_limit, v_ofs + font->get_ascent(font_size)), label, HORIZONTAL_ALIGNMENT_RIGHT, text_limit, font_size, color); - } else { - draw_string(font, Point2(ofs, v_ofs + font->get_ascent(font_size)), label, HORIZONTAL_ALIGNMENT_LEFT, text_limit, font_size, color); - } + if (keying) { + Ref<Texture2D> key; - if (keying) { - Ref<Texture2D> key; + if (use_keying_next()) { + key = get_theme_icon(SNAME("KeyNext"), SNAME("EditorIcons")); + } else { + key = get_theme_icon(SNAME("Key"), SNAME("EditorIcons")); + } - if (use_keying_next()) { - key = get_theme_icon(SNAME("KeyNext"), SNAME("EditorIcons")); - } else { - key = get_theme_icon(SNAME("Key"), SNAME("EditorIcons")); - } + ofs = size.width - key->get_width() - get_theme_constant(SNAME("hseparator"), SNAME("Tree")); - ofs = size.width - key->get_width() - get_theme_constant(SNAME("hseparator"), SNAME("Tree")); + Color color2(1, 1, 1); + if (keying_hover) { + color2.r *= 1.2; + color2.g *= 1.2; + color2.b *= 1.2; + } + keying_rect = Rect2(ofs, ((size.height - key->get_height()) / 2), key->get_width(), key->get_height()); + if (rtl) { + draw_texture(key, Vector2(size.width - keying_rect.position.x - key->get_width(), keying_rect.position.y), color2); + } else { + draw_texture(key, keying_rect.position, color2); + } - Color color2(1, 1, 1); - if (keying_hover) { - color2.r *= 1.2; - color2.g *= 1.2; - color2.b *= 1.2; - } - keying_rect = Rect2(ofs, ((size.height - key->get_height()) / 2), key->get_width(), key->get_height()); - if (rtl) { - draw_texture(key, Vector2(size.width - keying_rect.position.x - key->get_width(), keying_rect.position.y), color2); } else { - draw_texture(key, keying_rect.position, color2); + keying_rect = Rect2(); } - } else { - keying_rect = Rect2(); - } - - if (deletable) { - Ref<Texture2D> close; + if (deletable) { + Ref<Texture2D> close; - close = get_theme_icon(SNAME("Close"), SNAME("EditorIcons")); + close = get_theme_icon(SNAME("Close"), SNAME("EditorIcons")); - ofs = size.width - close->get_width() - get_theme_constant(SNAME("hseparator"), SNAME("Tree")); + ofs = size.width - close->get_width() - get_theme_constant(SNAME("hseparator"), SNAME("Tree")); - Color color2(1, 1, 1); - if (delete_hover) { - color2.r *= 1.2; - color2.g *= 1.2; - color2.b *= 1.2; - } - delete_rect = Rect2(ofs, ((size.height - close->get_height()) / 2), close->get_width(), close->get_height()); - if (rtl) { - draw_texture(close, Vector2(size.width - delete_rect.position.x - close->get_width(), delete_rect.position.y), color2); + Color color2(1, 1, 1); + if (delete_hover) { + color2.r *= 1.2; + color2.g *= 1.2; + color2.b *= 1.2; + } + delete_rect = Rect2(ofs, ((size.height - close->get_height()) / 2), close->get_width(), close->get_height()); + if (rtl) { + draw_texture(close, Vector2(size.width - delete_rect.position.x - close->get_width(), delete_rect.position.y), color2); + } else { + draw_texture(close, delete_rect.position, color2); + } } else { - draw_texture(close, delete_rect.position, color2); + delete_rect = Rect2(); } - } else { - delete_rect = Rect2(); - } + } break; } } @@ -833,30 +836,42 @@ void EditorProperty::_update_pin_flags() { } } -Control *EditorProperty::make_custom_tooltip(const String &p_text) const { - tooltip_text = p_text; +static Control *make_help_bit(const String &p_text, bool p_property) { EditorHelpBit *help_bit = memnew(EditorHelpBit); - //help_bit->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TooltipPanel"))); help_bit->get_rich_text()->set_fixed_size_to_width(360 * EDSCALE); - String text; PackedStringArray slices = p_text.split("::", false); - if (!slices.is_empty()) { - String property_name = slices[0].strip_edges(); - text = TTR("Property:") + " [u][b]" + property_name + "[/b][/u]"; + if (slices.is_empty()) { + // Shouldn't happen here, but just in case pass the text along. + help_bit->set_text(p_text); + return help_bit; + } - if (slices.size() > 1) { - String property_doc = slices[1].strip_edges(); - if (property_name != property_doc) { - text += "\n" + property_doc; - } + String property_name = slices[0].strip_edges(); + String text; + if (p_property) { + text = TTR("Property:") + " "; + } + text += "[u][b]" + property_name + "[/b][/u]"; + + if (slices.size() > 1) { + String property_doc = slices[1].strip_edges(); + if (property_name != property_doc) { + text += "\n" + property_doc; } - help_bit->call_deferred(SNAME("set_text"), text); //hack so it uses proper theme once inside scene + } else { + text += "\n[i]" + TTR("No description.") + "[/i]"; } + help_bit->set_text(text); return help_bit; } +Control *EditorProperty::make_custom_tooltip(const String &p_text) const { + tooltip_text = p_text; + return make_help_bit(p_text, true); +} + String EditorProperty::get_tooltip_text() const { return tooltip_text; } @@ -919,6 +934,7 @@ void EditorProperty::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "draw_warning"), "set_draw_warning", "is_draw_warning"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "keying"), "set_keying", "is_keying"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "deletable"), "set_deletable", "is_deletable"); + ADD_SIGNAL(MethodInfo("property_changed", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT))); ADD_SIGNAL(MethodInfo("multiple_properties_changed", PropertyInfo(Variant::PACKED_STRING_ARRAY, "properties"), PropertyInfo(Variant::ARRAY, "value"))); ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING_NAME, "property"))); @@ -1064,54 +1080,38 @@ void EditorInspectorPlugin::_bind_methods() { //////////////////////////////////////////////// void EditorInspectorCategory::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - Ref<StyleBox> sb = get_theme_stylebox(SNAME("prop_category_style"), SNAME("Editor")); + switch (p_what) { + case NOTIFICATION_DRAW: { + Ref<StyleBox> sb = get_theme_stylebox(SNAME("prop_category_style"), SNAME("Editor")); - draw_style_box(sb, Rect2(Vector2(), get_size())); + draw_style_box(sb, Rect2(Vector2(), get_size())); - Ref<Font> font = get_theme_font(SNAME("bold"), SNAME("EditorFonts")); - int font_size = get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts")); + Ref<Font> font = get_theme_font(SNAME("bold"), SNAME("EditorFonts")); + int font_size = get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts")); - int hs = get_theme_constant(SNAME("hseparation"), SNAME("Tree")); + int hs = get_theme_constant(SNAME("hseparation"), SNAME("Tree")); - int w = font->get_string_size(label, font_size).width; - if (icon.is_valid()) { - w += hs + icon->get_width(); - } + int w = font->get_string_size(label, font_size).width; + if (icon.is_valid()) { + w += hs + icon->get_width(); + } - int ofs = (get_size().width - w) / 2; + int ofs = (get_size().width - w) / 2; - if (icon.is_valid()) { - draw_texture(icon, Point2(ofs, (get_size().height - icon->get_height()) / 2).floor()); - ofs += hs + icon->get_width(); - } + if (icon.is_valid()) { + draw_texture(icon, Point2(ofs, (get_size().height - icon->get_height()) / 2).floor()); + ofs += hs + icon->get_width(); + } - Color color = get_theme_color(SNAME("font_color"), SNAME("Tree")); - draw_string(font, Point2(ofs, font->get_ascent(font_size) + (get_size().height - font->get_height(font_size)) / 2).floor(), label, HORIZONTAL_ALIGNMENT_LEFT, get_size().width, font_size, color); + Color color = get_theme_color(SNAME("font_color"), SNAME("Tree")); + draw_string(font, Point2(ofs, font->get_ascent(font_size) + (get_size().height - font->get_height(font_size)) / 2).floor(), label, HORIZONTAL_ALIGNMENT_LEFT, get_size().width, font_size, color); + } break; } } Control *EditorInspectorCategory::make_custom_tooltip(const String &p_text) const { tooltip_text = p_text; - EditorHelpBit *help_bit = memnew(EditorHelpBit); - help_bit->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TooltipPanel"))); - help_bit->get_rich_text()->set_fixed_size_to_width(360 * EDSCALE); - - PackedStringArray slices = p_text.split("::", false); - if (!slices.is_empty()) { - String property_name = slices[0].strip_edges(); - String text = "[u][b]" + property_name + "[/b][/u]"; - - if (slices.size() > 1) { - String property_doc = slices[1].strip_edges(); - if (property_name != property_doc) { - text += "\n" + property_doc; - } - } - help_bit->call_deferred(SNAME("set_text"), text); //hack so it uses proper theme once inside scene - } - - return help_bit; + return make_help_bit(p_text, false); } Size2 EditorInspectorCategory::get_minimum_size() const { @@ -1156,6 +1156,7 @@ void EditorInspectorSection::_notification(int p_what) { case NOTIFICATION_THEME_CHANGED: { update_minimum_size(); } break; + case NOTIFICATION_SORT_CHILDREN: { if (!vbox_added) { return; @@ -1186,6 +1187,15 @@ void EditorInspectorSection::_notification(int p_what) { header_height += get_theme_constant(SNAME("vseparation"), SNAME("Tree")); int inspector_margin = get_theme_constant(SNAME("inspector_margin"), SNAME("Editor")); + int section_indent_size = get_theme_constant(SNAME("indent_size"), SNAME("EditorInspectorSection")); + if (indent_depth > 0 && section_indent_size > 0) { + inspector_margin += indent_depth * section_indent_size; + } + Ref<StyleBoxFlat> section_indent_style = get_theme_stylebox(SNAME("indent_box"), SNAME("EditorInspectorSection")); + if (indent_depth > 0 && section_indent_style.is_valid()) { + inspector_margin += section_indent_style->get_margin(SIDE_LEFT) + section_indent_style->get_margin(SIDE_RIGHT); + } + Size2 size = get_size() - Vector2(inspector_margin, 0); Vector2 offset = Vector2(is_layout_rtl() ? 0 : inspector_margin, header_height); for (int i = 0; i < get_child_count(); i++) { @@ -1200,6 +1210,7 @@ void EditorInspectorSection::_notification(int p_what) { fit_child_in_rect(c, Rect2(offset, size)); } } break; + case NOTIFICATION_DRAW: { // Get the section header font. Ref<Font> font = get_theme_font(SNAME("bold"), SNAME("EditorFonts")); @@ -1221,14 +1232,31 @@ void EditorInspectorSection::_notification(int p_what) { bool rtl = is_layout_rtl(); - // Compute the height of the section header. + // Compute the height and width of the section header. int header_height = font->get_height(font_size); if (arrow.is_valid()) { header_height = MAX(header_height, arrow->get_height()); } header_height += get_theme_constant(SNAME("vseparation"), SNAME("Tree")); - Rect2 header_rect = Rect2(Vector2(), Vector2(get_size().width, header_height)); + int section_indent = 0; + int section_indent_size = get_theme_constant(SNAME("indent_size"), SNAME("EditorInspectorSection")); + if (indent_depth > 0 && section_indent_size > 0) { + section_indent = indent_depth * section_indent_size; + } + Ref<StyleBoxFlat> section_indent_style = get_theme_stylebox(SNAME("indent_box"), SNAME("EditorInspectorSection")); + if (indent_depth > 0 && section_indent_style.is_valid()) { + section_indent += section_indent_style->get_margin(SIDE_LEFT) + section_indent_style->get_margin(SIDE_RIGHT); + } + + int header_width = get_size().width - section_indent; + int header_offset_x = 0.0; + if (!rtl) { + header_offset_x += section_indent; + } + + // Draw header area. + Rect2 header_rect = Rect2(Vector2(header_offset_x, 0.0), Vector2(header_width, header_height)); Color c = bg_color; c.a *= 0.4; if (foldable && header_rect.has_point(get_local_mouse_position())) { @@ -1236,25 +1264,48 @@ void EditorInspectorSection::_notification(int p_what) { } draw_rect(header_rect, c); + // Draw header title and folding arrow. const int arrow_margin = 2; const int arrow_width = arrow.is_valid() ? arrow->get_width() : 0; Color color = get_theme_color(SNAME("font_color")); - float text_width = get_size().width - Math::round(arrow_width + arrow_margin * EDSCALE); - draw_string(font, Point2(rtl ? 0 : Math::round(arrow_width + arrow_margin * EDSCALE), font->get_ascent(font_size) + (header_height - font->get_height(font_size)) / 2).floor(), label, rtl ? HORIZONTAL_ALIGNMENT_RIGHT : HORIZONTAL_ALIGNMENT_LEFT, text_width, font_size, color); + float text_width = get_size().width - Math::round(arrow_width + arrow_margin * EDSCALE) - section_indent; + Point2 text_offset = Point2(0, font->get_ascent(font_size) + (header_height - font->get_height(font_size)) / 2); + HorizontalAlignment text_align = HORIZONTAL_ALIGNMENT_LEFT; + if (rtl) { + text_align = HORIZONTAL_ALIGNMENT_RIGHT; + } else { + text_offset.x = section_indent + Math::round(arrow_width + arrow_margin * EDSCALE); + } + draw_string(font, text_offset.floor(), label, text_align, text_width, font_size, color); if (arrow.is_valid()) { + Point2 arrow_position = Point2(0, (header_height - arrow->get_height()) / 2); if (rtl) { - draw_texture(arrow, Point2(get_size().width - arrow->get_width() - Math::round(arrow_margin * EDSCALE), (header_height - arrow->get_height()) / 2).floor()); + arrow_position.x = get_size().width - section_indent - arrow->get_width() - Math::round(arrow_margin * EDSCALE); } else { - draw_texture(arrow, Point2(Math::round(arrow_margin * EDSCALE), (header_height - arrow->get_height()) / 2).floor()); + arrow_position.x = section_indent + Math::round(arrow_margin * EDSCALE); } + draw_texture(arrow, arrow_position.floor()); } + // Draw dropping highlight. if (dropping && !vbox->is_visible_in_tree()) { Color accent_color = get_theme_color(SNAME("accent_color"), SNAME("Editor")); draw_rect(Rect2(Point2(), get_size()), accent_color, false); } + + // Draw section indentation. + if (section_indent_style.is_valid() && section_indent > 0) { + Rect2 indent_rect = Rect2(Vector2(), Vector2(indent_depth * section_indent_size, get_size().height)); + if (rtl) { + indent_rect.position.x = get_size().width - section_indent + section_indent_style->get_margin(SIDE_RIGHT); + } else { + indent_rect.position.x = section_indent_style->get_margin(SIDE_LEFT); + } + draw_style_box(section_indent_style, indent_rect); + } } break; + case NOTIFICATION_DRAG_BEGIN: { Dictionary dd = get_viewport()->gui_get_drag_data(); @@ -1273,10 +1324,12 @@ void EditorInspectorSection::_notification(int p_what) { dropping = children_can_drop; update(); } break; + case NOTIFICATION_DRAG_END: { dropping = false; update(); } break; + case NOTIFICATION_MOUSE_ENTER: { if (dropping) { dropping_unfold_timer->start(); @@ -1316,15 +1369,25 @@ Size2 EditorInspectorSection::get_minimum_size() const { ms.height += font->get_height(font_size) + get_theme_constant(SNAME("vseparation"), SNAME("Tree")); ms.width += get_theme_constant(SNAME("inspector_margin"), SNAME("Editor")); + int section_indent_size = get_theme_constant(SNAME("indent_size"), SNAME("EditorInspectorSection")); + if (indent_depth > 0 && section_indent_size > 0) { + ms.width += indent_depth * section_indent_size; + } + Ref<StyleBoxFlat> section_indent_style = get_theme_stylebox(SNAME("indent_box"), SNAME("EditorInspectorSection")); + if (indent_depth > 0 && section_indent_style.is_valid()) { + ms.width += section_indent_style->get_margin(SIDE_LEFT) + section_indent_style->get_margin(SIDE_RIGHT); + } + return ms; } -void EditorInspectorSection::setup(const String &p_section, const String &p_label, Object *p_object, const Color &p_bg_color, bool p_foldable) { +void EditorInspectorSection::setup(const String &p_section, const String &p_label, Object *p_object, const Color &p_bg_color, bool p_foldable, int p_indent_depth) { section = p_section; label = p_label; object = p_object; bg_color = p_bg_color; foldable = p_foldable; + indent_depth = p_indent_depth; if (!foldable && !vbox_added) { add_child(vbox); @@ -1406,12 +1469,8 @@ void EditorInspectorSection::_bind_methods() { } EditorInspectorSection::EditorInspectorSection() { - object = nullptr; - foldable = false; vbox = memnew(VBoxContainer); - vbox_added = false; - dropping = false; dropping_unfold_timer = memnew(Timer); dropping_unfold_timer->set_wait_time(0.6); dropping_unfold_timer->set_one_shot(true); @@ -1427,6 +1486,7 @@ EditorInspectorSection::~EditorInspectorSection() { //////////////////////////////////////////////// //////////////////////////////////////////////// + int EditorInspectorArray::_get_array_count() { if (mode == MODE_USE_MOVE_ARRAY_ELEMENT_FUNCTION) { List<PropertyInfo> object_property_list; @@ -1445,31 +1505,8 @@ void EditorInspectorArray::_add_button_pressed() { _move_element(-1, -1); } -void EditorInspectorArray::_first_page_button_pressed() { - emit_signal("page_change_request", 0); -} - -void EditorInspectorArray::_prev_page_button_pressed() { - emit_signal("page_change_request", MAX(0, page - 1)); -} - -void EditorInspectorArray::_page_line_edit_text_submitted(String p_text) { - if (p_text.is_valid_int()) { - int new_page = p_text.to_int() - 1; - new_page = MIN(MAX(0, new_page), max_page); - page_line_edit->set_text(Variant(new_page)); - emit_signal("page_change_request", new_page); - } else { - page_line_edit->set_text(Variant(page)); - } -} - -void EditorInspectorArray::_next_page_button_pressed() { - emit_signal("page_change_request", MIN(max_page, page + 1)); -} - -void EditorInspectorArray::_last_page_button_pressed() { - emit_signal("page_change_request", max_page); +void EditorInspectorArray::_paginator_page_changed(int p_page) { + emit_signal("page_change_request", p_page); } void EditorInspectorArray::_rmb_popup_id_pressed(int p_id) { @@ -1537,7 +1574,7 @@ void EditorInspectorArray::_vbox_visibility_changed() { void EditorInspectorArray::_panel_draw(int p_index) { ERR_FAIL_INDEX(p_index, (int)array_elements.size()); - Ref<StyleBox> style = get_theme_stylebox("Focus", "EditorStyles"); + Ref<StyleBox> style = get_theme_stylebox(SNAME("Focus"), SNAME("EditorStyles")); if (!style.is_valid()) { return; } @@ -1641,17 +1678,17 @@ void EditorInspectorArray::_move_element(int p_element_index, int p_to_pos) { // Handle page change and update counts. if (p_element_index < 0) { int added_index = p_to_pos < 0 ? count : p_to_pos; - emit_signal("page_change_request", added_index / page_lenght); + emit_signal(SNAME("page_change_request"), added_index / page_length); count += 1; } else if (p_to_pos < 0) { count -= 1; - if (page == max_page && (MAX(0, count - 1) / page_lenght != max_page)) { - emit_signal("page_change_request", max_page - 1); + if (page == max_page && (MAX(0, count - 1) / page_length != max_page)) { + emit_signal(SNAME("page_change_request"), max_page - 1); } } - begin_array_index = page * page_lenght; - end_array_index = MIN(count, (page + 1) * page_lenght); - max_page = MAX(0, count - 1) / page_lenght; + begin_array_index = page * page_length; + end_array_index = MIN(count, (page + 1) * page_length); + max_page = MAX(0, count - 1) / page_length; } void EditorInspectorArray::_clear_array() { @@ -1694,7 +1731,7 @@ void EditorInspectorArray::_clear_array() { undo_redo->commit_action(); // Handle page change and update counts. - emit_signal("page_change_request", 0); + emit_signal(SNAME("page_change_request"), 0); count = 0; begin_array_index = 0; end_array_index = 0; @@ -1767,7 +1804,7 @@ void EditorInspectorArray::_resize_array(int p_size) { undo_redo->commit_action(); // Handle page change and update counts. - emit_signal("page_change_request", 0); + emit_signal(SNAME("page_change_request"), 0); /* count = 0; begin_array_index = 0; @@ -1785,7 +1822,7 @@ Array EditorInspectorArray::_extract_properties_as_array(const List<PropertyInfo int to_char_index = 0; while (to_char_index < str.length()) { - if (str[to_char_index] < '0' || str[to_char_index] > '9') { + if (!is_digit(str[to_char_index])) { break; } to_char_index++; @@ -1830,7 +1867,6 @@ int EditorInspectorArray::_drop_position() const { void EditorInspectorArray::_new_size_line_edit_text_changed(String p_text) { bool valid = false; - ; if (p_text.is_valid_int()) { int val = p_text.to_int(); if (val > 0 && val != count) { @@ -1842,7 +1878,6 @@ void EditorInspectorArray::_new_size_line_edit_text_changed(String p_text) { void EditorInspectorArray::_new_size_line_edit_text_submitted(String p_text) { bool valid = false; - ; if (p_text.is_valid_int()) { int val = p_text.to_int(); if (val > 0 && val != count) { @@ -1865,9 +1900,9 @@ void EditorInspectorArray::_resize_dialog_confirmed() { void EditorInspectorArray::_setup() { // Setup counts. count = _get_array_count(); - begin_array_index = page * page_lenght; - end_array_index = MIN(count, (page + 1) * page_lenght); - max_page = MAX(0, count - 1) / page_lenght; + begin_array_index = page * page_length; + end_array_index = MIN(count, (page + 1) * page_length); + max_page = MAX(0, count - 1) / page_length; array_elements.resize(MAX(0, end_array_index - begin_array_index)); if (page < 0 || page > max_page) { WARN_PRINT(vformat("Invalid page number %d", page)); @@ -1894,7 +1929,7 @@ void EditorInspectorArray::_setup() { ae.margin = memnew(MarginContainer); ae.margin->set_mouse_filter(MOUSE_FILTER_PASS); if (is_inside_tree()) { - Size2 min_size = get_theme_stylebox("Focus", "EditorStyles")->get_minimum_size(); + Size2 min_size = get_theme_stylebox(SNAME("Focus"), SNAME("EditorStyles"))->get_minimum_size(); ae.margin->add_theme_constant_override("margin_left", min_size.x / 2); ae.margin->add_theme_constant_override("margin_top", min_size.y / 2); ae.margin->add_theme_constant_override("margin_right", min_size.x / 2); @@ -1925,18 +1960,12 @@ void EditorInspectorArray::_setup() { // Hide/show the add button. add_button->set_visible(page == max_page); - if (max_page == 0) { - hbox_pagination->hide(); - } else { - // Update buttons. - first_page_button->set_disabled(page == 0); - prev_page_button->set_disabled(page == 0); - next_page_button->set_disabled(page == max_page); - last_page_button->set_disabled(page == max_page); - - // Update page number and page count. - page_line_edit->set_text(vformat("%d", page + 1)); - page_count_label->set_text(vformat("/ %d", max_page + 1)); + // Add paginator if there's more than 1 page. + if (max_page > 0) { + EditorPaginator *paginator = memnew(EditorPaginator); + paginator->update(page, max_page); + paginator->connect("page_changed", callable_mp(this, &EditorInspectorArray::_paginator_page_changed)); + vbox->add_child(paginator); } } @@ -1993,7 +2022,7 @@ void EditorInspectorArray::_notification(int p_what) { ArrayElement &ae = array_elements[i]; ae.move_texture_rect->set_texture(get_theme_icon(SNAME("TripleBar"), SNAME("EditorIcons"))); - Size2 min_size = get_theme_stylebox("Focus", "EditorStyles")->get_minimum_size(); + Size2 min_size = get_theme_stylebox(SNAME("Focus"), SNAME("EditorStyles"))->get_minimum_size(); ae.margin->add_theme_constant_override("margin_left", min_size.x / 2); ae.margin->add_theme_constant_override("margin_top", min_size.y / 2); ae.margin->add_theme_constant_override("margin_right", min_size.x / 2); @@ -2001,12 +2030,9 @@ void EditorInspectorArray::_notification(int p_what) { } add_button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); - first_page_button->set_icon(get_theme_icon(SNAME("PageFirst"), SNAME("EditorIcons"))); - prev_page_button->set_icon(get_theme_icon(SNAME("PagePrevious"), SNAME("EditorIcons"))); - next_page_button->set_icon(get_theme_icon(SNAME("PageNext"), SNAME("EditorIcons"))); - last_page_button->set_icon(get_theme_icon(SNAME("PageLast"), SNAME("EditorIcons"))); update_minimum_size(); } break; + case NOTIFICATION_DRAG_BEGIN: { Dictionary dict = get_viewport()->gui_get_drag_data(); if (dict.has("type") && dict["type"] == "property_array_element" && String(dict["property_array_prefix"]) == array_element_prefix) { @@ -2014,6 +2040,7 @@ void EditorInspectorArray::_notification(int p_what) { control_dropping->update(); } } break; + case NOTIFICATION_DRAG_END: { if (dropping) { dropping = false; @@ -2041,7 +2068,7 @@ void EditorInspectorArray::setup_with_move_element_function(Object *p_object, St array_element_prefix = p_array_element_prefix; page = p_page; - EditorInspectorSection::setup(String(p_array_element_prefix) + "_array", p_label, p_object, p_bg_color, p_foldable); + EditorInspectorSection::setup(String(p_array_element_prefix) + "_array", p_label, p_object, p_bg_color, p_foldable, 0); _setup(); } @@ -2052,7 +2079,7 @@ void EditorInspectorArray::setup_with_count_property(Object *p_object, String p_ array_element_prefix = p_array_element_prefix; page = p_page; - EditorInspectorSection::setup(String(count_property) + "_array", p_label, p_object, p_bg_color, p_foldable); + EditorInspectorSection::setup(String(count_property) + "_array", p_label, p_object, p_bg_color, p_foldable, 0); _setup(); } @@ -2097,38 +2124,6 @@ EditorInspectorArray::EditorInspectorArray() { add_button->connect("pressed", callable_mp(this, &EditorInspectorArray::_add_button_pressed)); vbox->add_child(add_button); - hbox_pagination = memnew(HBoxContainer); - hbox_pagination->set_h_size_flags(SIZE_EXPAND_FILL); - hbox_pagination->set_alignment(BoxContainer::ALIGNMENT_CENTER); - vbox->add_child(hbox_pagination); - - first_page_button = memnew(Button); - first_page_button->set_flat(true); - first_page_button->connect("pressed", callable_mp(this, &EditorInspectorArray::_first_page_button_pressed)); - hbox_pagination->add_child(first_page_button); - - prev_page_button = memnew(Button); - prev_page_button->set_flat(true); - prev_page_button->connect("pressed", callable_mp(this, &EditorInspectorArray::_prev_page_button_pressed)); - hbox_pagination->add_child(prev_page_button); - - page_line_edit = memnew(LineEdit); - page_line_edit->connect("text_submitted", callable_mp(this, &EditorInspectorArray::_page_line_edit_text_submitted)); - page_line_edit->add_theme_constant_override("minimum_character_width", 2); - hbox_pagination->add_child(page_line_edit); - - page_count_label = memnew(Label); - hbox_pagination->add_child(page_count_label); - next_page_button = memnew(Button); - next_page_button->set_flat(true); - next_page_button->connect("pressed", callable_mp(this, &EditorInspectorArray::_next_page_button_pressed)); - hbox_pagination->add_child(next_page_button); - - last_page_button = memnew(Button); - last_page_button->set_flat(true); - last_page_button->connect("pressed", callable_mp(this, &EditorInspectorArray::_last_page_button_pressed)); - hbox_pagination->add_child(last_page_button); - control_dropping = memnew(Control); control_dropping->connect("draw", callable_mp(this, &EditorInspectorArray::_control_dropping_draw)); control_dropping->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); @@ -2154,6 +2149,100 @@ EditorInspectorArray::EditorInspectorArray() { //////////////////////////////////////////////// //////////////////////////////////////////////// +void EditorPaginator::_first_page_button_pressed() { + emit_signal("page_changed", 0); +} + +void EditorPaginator::_prev_page_button_pressed() { + emit_signal("page_changed", MAX(0, page - 1)); +} + +void EditorPaginator::_page_line_edit_text_submitted(String p_text) { + if (p_text.is_valid_int()) { + int new_page = p_text.to_int() - 1; + new_page = MIN(MAX(0, new_page), max_page); + page_line_edit->set_text(Variant(new_page)); + emit_signal("page_changed", new_page); + } else { + page_line_edit->set_text(Variant(page)); + } +} + +void EditorPaginator::_next_page_button_pressed() { + emit_signal("page_changed", MIN(max_page, page + 1)); +} + +void EditorPaginator::_last_page_button_pressed() { + emit_signal("page_changed", max_page); +} + +void EditorPaginator::update(int p_page, int p_max_page) { + page = p_page; + max_page = p_max_page; + + // Update buttons. + first_page_button->set_disabled(page == 0); + prev_page_button->set_disabled(page == 0); + next_page_button->set_disabled(page == max_page); + last_page_button->set_disabled(page == max_page); + + // Update page number and page count. + page_line_edit->set_text(vformat("%d", page + 1)); + page_count_label->set_text(vformat("/ %d", max_page + 1)); +} + +void EditorPaginator::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + first_page_button->set_icon(get_theme_icon(SNAME("PageFirst"), SNAME("EditorIcons"))); + prev_page_button->set_icon(get_theme_icon(SNAME("PagePrevious"), SNAME("EditorIcons"))); + next_page_button->set_icon(get_theme_icon(SNAME("PageNext"), SNAME("EditorIcons"))); + last_page_button->set_icon(get_theme_icon(SNAME("PageLast"), SNAME("EditorIcons"))); + } break; + } +} + +void EditorPaginator::_bind_methods() { + ADD_SIGNAL(MethodInfo("page_changed", PropertyInfo(Variant::INT, "page"))); +} + +EditorPaginator::EditorPaginator() { + set_h_size_flags(SIZE_EXPAND_FILL); + set_alignment(ALIGNMENT_CENTER); + + first_page_button = memnew(Button); + first_page_button->set_flat(true); + first_page_button->connect("pressed", callable_mp(this, &EditorPaginator::_first_page_button_pressed)); + add_child(first_page_button); + + prev_page_button = memnew(Button); + prev_page_button->set_flat(true); + prev_page_button->connect("pressed", callable_mp(this, &EditorPaginator::_prev_page_button_pressed)); + add_child(prev_page_button); + + page_line_edit = memnew(LineEdit); + page_line_edit->connect("text_submitted", callable_mp(this, &EditorPaginator::_page_line_edit_text_submitted)); + page_line_edit->add_theme_constant_override("minimum_character_width", 2); + add_child(page_line_edit); + + page_count_label = memnew(Label); + add_child(page_count_label); + + next_page_button = memnew(Button); + next_page_button->set_flat(true); + next_page_button->connect("pressed", callable_mp(this, &EditorPaginator::_next_page_button_pressed)); + add_child(next_page_button); + + last_page_button = memnew(Button); + last_page_button->set_flat(true); + last_page_button->connect("pressed", callable_mp(this, &EditorPaginator::_last_page_button_pressed)); + add_child(last_page_button); +} + +//////////////////////////////////////////////// +//////////////////////////////////////////////// + Ref<EditorInspectorPlugin> EditorInspector::inspector_plugins[MAX_PLUGINS]; int EditorInspector::inspector_plugin_count = 0; @@ -2304,7 +2393,7 @@ void EditorInspector::update_tree() { if (property_focusable != -1) { //check focusable is really focusable bool restore_focus = false; - Control *focused = get_focus_owner(); + Control *focused = get_viewport() ? get_viewport()->gui_get_focus_owner() : nullptr; if (focused) { Node *parent = focused->get_parent(); while (parent) { @@ -2354,6 +2443,7 @@ void EditorInspector::update_tree() { String group_base; String subgroup; String subgroup_base; + int section_depth = 0; VBoxContainer *category_vbox = nullptr; List<PropertyInfo> plist; @@ -2378,14 +2468,29 @@ void EditorInspector::update_tree() { if (p.usage & PROPERTY_USAGE_SUBGROUP) { // Setup a property sub-group. subgroup = p.name; - subgroup_base = p.hint_string; + + Vector<String> hint_parts = p.hint_string.split(","); + subgroup_base = hint_parts[0]; + if (hint_parts.size() > 1) { + section_depth = hint_parts[1].to_int(); + } else { + section_depth = 0; + } continue; } else if (p.usage & PROPERTY_USAGE_GROUP) { // Setup a property group. group = p.name; - group_base = p.hint_string; + + Vector<String> hint_parts = p.hint_string.split(","); + group_base = hint_parts[0]; + if (hint_parts.size() > 1) { + section_depth = hint_parts[1].to_int(); + } else { + section_depth = 0; + } + subgroup = ""; subgroup_base = ""; @@ -2397,6 +2502,7 @@ void EditorInspector::update_tree() { group_base = ""; subgroup = ""; subgroup_base = ""; + section_depth = 0; if (!show_categories) { continue; @@ -2430,7 +2536,7 @@ void EditorInspector::update_tree() { if (!ClassDB::class_exists(type) && !ScriptServer::is_global_class(type) && p.hint_string.length() && FileAccess::exists(p.hint_string)) { // If we have a category inside a script, search for the first script with a valid icon. Ref<Script> script = ResourceLoader::load(p.hint_string, "Script"); - String base_type; + StringName base_type; if (script.is_valid()) { base_type = script->get_instance_base_type(); } @@ -2517,7 +2623,7 @@ void EditorInspector::update_tree() { String str = p.name.trim_prefix(array_prefix); int to_char_index = 0; while (to_char_index < str.length()) { - if (str[to_char_index] < '0' || str[to_char_index] > '9') { + if (!is_digit(str[to_char_index])) { break; } to_char_index++; @@ -2571,7 +2677,7 @@ void EditorInspector::update_tree() { } // Get the property label's string. - String property_label_string = (path.find("/") != -1) ? path.substr(path.rfind("/") + 1) : path; + String property_label_string = (path.contains("/")) ? path.substr(path.rfind("/") + 1) : path; if (capitalize_paths) { // Capitalize paths. int dot = property_label_string.find("."); @@ -2595,7 +2701,7 @@ void EditorInspector::update_tree() { // Ignore properties that do not fit the filter. if (use_filter && !filter.is_empty()) { - if (!filter.is_subsequence_ofn(path) && !filter.is_subsequence_ofn(property_label_string) && property_prefix.to_lower().find(filter.to_lower()) == -1) { + if (!filter.is_subsequence_ofn(path) && !filter.is_subsequence_ofn(property_label_string) && !property_prefix.to_lower().contains(filter.to_lower())) { continue; } } @@ -2638,7 +2744,7 @@ void EditorInspector::update_tree() { Color c = sscolor; c.a /= level; - section->setup(acc_path, component, object, c, use_folding); + section->setup(acc_path, component, object, c, use_folding, section_depth); // Add editors at the start of a group. for (Ref<EditorInspectorPlugin> &ped : valid_plugins) { @@ -2669,7 +2775,7 @@ void EditorInspector::update_tree() { array_element_prefix = p.class_name; editor_inspector_array = memnew(EditorInspectorArray); - String array_label = (path.find("/") != -1) ? path.substr(path.rfind("/") + 1) : path; + String array_label = path.contains("/") ? path.substr(path.rfind("/") + 1) : path; array_label = property_label_string.capitalize(); int page = per_array_page.has(array_element_prefix) ? per_array_page[array_element_prefix] : 0; editor_inspector_array->setup_with_move_element_function(object, array_label, array_element_prefix, page, c, use_folding); @@ -2908,7 +3014,7 @@ void EditorInspector::edit(Object *p_object) { object->connect("property_list_changed", callable_mp(this, &EditorInspector::_changed_callback)); update_tree(); } - emit_signal("edited_object_changed"); + emit_signal(SNAME("edited_object_changed")); } void EditorInspector::set_keying(bool p_active) { @@ -3025,7 +3131,7 @@ void EditorInspector::_update_inspector_bg() { n = n->get_parent(); } count_subinspectors = MIN(15, count_subinspectors); - add_theme_style_override("bg", get_theme_stylebox("sub_inspector_bg" + itos(count_subinspectors), "Editor")); + add_theme_style_override("bg", get_theme_stylebox("sub_inspector_bg" + itos(count_subinspectors), SNAME("Editor"))); } else { add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); } @@ -3332,80 +3438,84 @@ void EditorInspector::_node_removed(Node *p_node) { } void EditorInspector::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", callable_mp(this, &EditorInspector::_feature_profile_changed)); - set_process(is_visible_in_tree()); - _update_inspector_bg(); - } + switch (p_what) { + case NOTIFICATION_READY: { + EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", callable_mp(this, &EditorInspector::_feature_profile_changed)); + set_process(is_visible_in_tree()); + _update_inspector_bg(); + } break; - if (p_what == NOTIFICATION_ENTER_TREE) { - if (!sub_inspector) { - get_tree()->connect("node_removed", callable_mp(this, &EditorInspector::_node_removed)); - } - } - if (p_what == NOTIFICATION_PREDELETE) { - edit(nullptr); //just in case - } - if (p_what == NOTIFICATION_EXIT_TREE) { - if (!sub_inspector) { - get_tree()->disconnect("node_removed", callable_mp(this, &EditorInspector::_node_removed)); - } - edit(nullptr); - } + case NOTIFICATION_ENTER_TREE: { + if (!sub_inspector) { + get_tree()->connect("node_removed", callable_mp(this, &EditorInspector::_node_removed)); + } + } break; - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - set_process(is_visible_in_tree()); - } + case NOTIFICATION_PREDELETE: { + edit(nullptr); //just in case + } break; - if (p_what == NOTIFICATION_PROCESS) { - if (update_scroll_request >= 0) { - get_v_scroll_bar()->call_deferred(SNAME("set_value"), update_scroll_request); - update_scroll_request = -1; - } - if (refresh_countdown > 0) { - refresh_countdown -= get_process_delta_time(); - if (refresh_countdown <= 0) { - for (const KeyValue<StringName, List<EditorProperty *>> &F : editor_property_map) { - for (EditorProperty *E : F.value) { - if (!E->is_cache_valid()) { - E->update_property(); - E->update_revert_and_pin_status(); - E->update_cache(); + case NOTIFICATION_EXIT_TREE: { + if (!sub_inspector) { + get_tree()->disconnect("node_removed", callable_mp(this, &EditorInspector::_node_removed)); + } + edit(nullptr); + } break; + + case NOTIFICATION_VISIBILITY_CHANGED: { + set_process(is_visible_in_tree()); + } break; + + case NOTIFICATION_PROCESS: { + if (update_scroll_request >= 0) { + get_v_scroll_bar()->call_deferred(SNAME("set_value"), update_scroll_request); + update_scroll_request = -1; + } + if (refresh_countdown > 0) { + refresh_countdown -= get_process_delta_time(); + if (refresh_countdown <= 0) { + for (const KeyValue<StringName, List<EditorProperty *>> &F : editor_property_map) { + for (EditorProperty *E : F.value) { + if (!E->is_cache_valid()) { + E->update_property(); + E->update_revert_and_pin_status(); + E->update_cache(); + } } } + refresh_countdown = float(EditorSettings::get_singleton()->get("docks/property_editor/auto_refresh_interval")); } - refresh_countdown = float(EditorSettings::get_singleton()->get("docks/property_editor/auto_refresh_interval")); } - } - changing++; + changing++; - if (update_tree_pending) { - update_tree(); - update_tree_pending = false; - pending.clear(); + if (update_tree_pending) { + update_tree(); + update_tree_pending = false; + pending.clear(); - } else { - while (pending.size()) { - StringName prop = pending.front()->get(); - if (editor_property_map.has(prop)) { - for (EditorProperty *E : editor_property_map[prop]) { - E->update_property(); - E->update_revert_and_pin_status(); - E->update_cache(); + } else { + while (pending.size()) { + StringName prop = pending.front()->get(); + if (editor_property_map.has(prop)) { + for (EditorProperty *E : editor_property_map[prop]) { + E->update_property(); + E->update_revert_and_pin_status(); + E->update_cache(); + } } + pending.erase(pending.front()); } - pending.erase(pending.front()); } - } - changing--; - } + changing--; + } break; - if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - _update_inspector_bg(); + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + _update_inspector_bg(); - update_tree(); + update_tree(); + } break; } } @@ -3484,10 +3594,14 @@ void EditorInspector::_update_script_class_properties(const Object &p_object, Li String path = s->get_path(); String name = EditorNode::get_editor_data().script_class_get_name(path); if (name.is_empty()) { - if (!s->is_built_in()) { - name = path.get_file(); + if (s->is_built_in()) { + if (s->get_name().is_empty()) { + name = TTR("Built-in script"); + } else { + name = vformat("%s (%s)", s->get_name(), TTR("Built-in")); + } } else { - name = TTR("Built-in script"); + name = path.get_file(); } } @@ -3543,7 +3657,7 @@ void EditorInspector::_bind_methods() { ADD_SIGNAL(MethodInfo("property_selected", PropertyInfo(Variant::STRING, "property"))); ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT), PropertyInfo(Variant::BOOL, "advance"))); ADD_SIGNAL(MethodInfo("property_deleted", PropertyInfo(Variant::STRING, "property"))); - ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::OBJECT, "res"), PropertyInfo(Variant::STRING, "prop"))); + ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::OBJECT, "resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource"), PropertyInfo(Variant::STRING, "path"))); ADD_SIGNAL(MethodInfo("object_id_selected", PropertyInfo(Variant::INT, "id"))); ADD_SIGNAL(MethodInfo("property_edited", PropertyInfo(Variant::STRING, "property"))); ADD_SIGNAL(MethodInfo("property_toggled", PropertyInfo(Variant::STRING, "property"), PropertyInfo(Variant::BOOL, "checked"))); diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index 09b25065dc..43f71740e3 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -261,17 +261,18 @@ class EditorInspectorSection : public Container { String label; String section; - bool vbox_added; // Optimization. + bool vbox_added = false; // Optimization. Color bg_color; - bool foldable; + bool foldable = false; + int indent_depth = 0; Timer *dropping_unfold_timer; - bool dropping; + bool dropping = false; void _test_unfold(); protected: - Object *object; + Object *object = nullptr; VBoxContainer *vbox; void _notification(int p_what); @@ -281,7 +282,7 @@ protected: public: virtual Size2 get_minimum_size() const override; - void setup(const String &p_section, const String &p_label, Object *p_object, const Color &p_bg_color, bool p_foldable); + void setup(const String &p_section, const String &p_label, Object *p_object, const Color &p_bg_color, bool p_foldable, int p_indent_depth = 0); VBoxContainer *get_vbox(); void unfold(); void fold(); @@ -317,18 +318,11 @@ class EditorInspectorArray : public EditorInspectorSection { LineEdit *new_size_line_edit; // Pagination - int page_lenght = 5; + int page_length = 5; int page = 0; int max_page = 0; int begin_array_index = 0; int end_array_index = 0; - HBoxContainer *hbox_pagination; - Button *first_page_button; - Button *prev_page_button; - LineEdit *page_line_edit; - Label *page_count_label; - Button *next_page_button; - Button *last_page_button; enum MenuOptions { OPTION_MOVE_UP = 0, @@ -356,12 +350,7 @@ class EditorInspectorArray : public EditorInspectorSection { int _get_array_count(); void _add_button_pressed(); - - void _first_page_button_pressed(); - void _prev_page_button_pressed(); - void _page_line_edit_text_submitted(String p_text); - void _next_page_button_pressed(); - void _last_page_button_pressed(); + void _paginator_page_changed(int p_page); void _rmb_popup_id_pressed(int p_id); @@ -402,6 +391,34 @@ public: EditorInspectorArray(); }; +class EditorPaginator : public HBoxContainer { + GDCLASS(EditorPaginator, HBoxContainer); + + int page = 0; + int max_page = 0; + Button *first_page_button; + Button *prev_page_button; + LineEdit *page_line_edit; + Label *page_count_label; + Button *next_page_button; + Button *last_page_button; + + void _first_page_button_pressed(); + void _prev_page_button_pressed(); + void _page_line_edit_text_submitted(String p_text); + void _next_page_button_pressed(); + void _last_page_button_pressed(); + +protected: + void _notification(int p_what); + static void _bind_methods(); + +public: + void update(int p_page, int p_max_page); + + EditorPaginator(); +}; + class EditorInspector : public ScrollContainer { GDCLASS(EditorInspector, ScrollContainer); diff --git a/editor/editor_locale_dialog.cpp b/editor/editor_locale_dialog.cpp index 5c4ece7065..abef0dc353 100644 --- a/editor/editor_locale_dialog.cpp +++ b/editor/editor_locale_dialog.cpp @@ -30,6 +30,7 @@ #include "editor_locale_dialog.h" +#include "core/config/project_settings.h" #include "editor/editor_node.h" #include "editor/editor_scale.h" #include "scene/gui/check_button.h" @@ -37,14 +38,6 @@ #include "scene/gui/option_button.h" #include "scene/gui/tree.h" -static _FORCE_INLINE_ bool is_upper_case(char32_t c) { - return (c >= 'A' && c <= 'Z'); -} - -static _FORCE_INLINE_ bool is_lower_case(char32_t c) { - return (c >= 'a' && c <= 'z'); -} - void EditorLocaleDialog::_bind_methods() { ADD_SIGNAL(MethodInfo("locale_selected", PropertyInfo(Variant::STRING, "locale"))); } @@ -363,16 +356,16 @@ void EditorLocaleDialog::set_locale(const String &p_locale) { Vector<String> locale_elements = p_locale.split("_"); lang_code->set_text(locale_elements[0]); if (locale_elements.size() >= 2) { - if (locale_elements[1].length() == 4 && is_upper_case(locale_elements[1][0]) && is_lower_case(locale_elements[1][1]) && is_lower_case(locale_elements[1][2]) && is_lower_case(locale_elements[1][3])) { + if (locale_elements[1].length() == 4 && is_ascii_upper_case(locale_elements[1][0]) && is_ascii_lower_case(locale_elements[1][1]) && is_ascii_lower_case(locale_elements[1][2]) && is_ascii_lower_case(locale_elements[1][3])) { script_code->set_text(locale_elements[1]); advanced->set_pressed(true); } - if (locale_elements[1].length() == 2 && is_upper_case(locale_elements[1][0]) && is_upper_case(locale_elements[1][1])) { + if (locale_elements[1].length() == 2 && is_ascii_upper_case(locale_elements[1][0]) && is_ascii_upper_case(locale_elements[1][1])) { country_code->set_text(locale_elements[1]); } } if (locale_elements.size() >= 3) { - if (locale_elements[2].length() == 2 && is_upper_case(locale_elements[2][0]) && is_upper_case(locale_elements[2][1])) { + if (locale_elements[2].length() == 2 && is_ascii_upper_case(locale_elements[2][0]) && is_ascii_upper_case(locale_elements[2][1])) { country_code->set_text(locale_elements[2]); } else { variant_code->set_text(locale_elements[2].to_lower()); diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp index db4de3bed0..d9ba4139c2 100644 --- a/editor/editor_log.cpp +++ b/editor/editor_log.cpp @@ -32,8 +32,8 @@ #include "core/os/keyboard.h" #include "core/version.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" #include "scene/gui/center_container.h" #include "scene/resources/font.h" @@ -93,12 +93,11 @@ void EditorLog::_notification(int p_what) { _update_theme(); _load_state(); } break; + case NOTIFICATION_THEME_CHANGED: { _update_theme(); _rebuild_log(); } break; - default: - break; } } diff --git a/editor/editor_log.h b/editor/editor_log.h index 69a6a0b449..e66b732ffe 100644 --- a/editor/editor_log.h +++ b/editor/editor_log.h @@ -34,7 +34,6 @@ #include "core/os/thread.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" -#include "scene/gui/control.h" #include "scene/gui/label.h" #include "scene/gui/line_edit.h" #include "scene/gui/panel_container.h" diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index a1f259c864..cda5e6b537 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -47,7 +47,6 @@ #include "core/string/print_string.h" #include "core/string/translation.h" #include "core/version.h" -#include "core/version_hash.gen.h" #include "main/main.h" #include "scene/3d/importer_mesh_instance_3d.h" #include "scene/gui/center_container.h" @@ -70,6 +69,7 @@ #include "servers/physics_server_2d.h" #include "servers/rendering/rendering_device.h" +#include "editor/animation_track_editor.h" #include "editor/audio_stream_preview.h" #include "editor/debugger/debug_adapter/debug_adapter_server.h" #include "editor/debugger/editor_debugger_node.h" @@ -77,9 +77,12 @@ #include "editor/editor_about.h" #include "editor/editor_audio_buses.h" #include "editor/editor_command_palette.h" +#include "editor/editor_data.h" #include "editor/editor_export.h" #include "editor/editor_feature_profile.h" +#include "editor/editor_file_dialog.h" #include "editor/editor_file_system.h" +#include "editor/editor_folding.h" #include "editor/editor_help.h" #include "editor/editor_inspector.h" #include "editor/editor_layouts_dialog.h" @@ -89,22 +92,24 @@ #include "editor/editor_properties.h" #include "editor/editor_resource_picker.h" #include "editor/editor_resource_preview.h" +#include "editor/editor_run.h" #include "editor/editor_run_native.h" #include "editor/editor_run_script.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" +#include "editor/editor_settings_dialog.h" #include "editor/editor_spin_slider.h" #include "editor/editor_themes.h" #include "editor/editor_toaster.h" #include "editor/editor_translation_parser.h" #include "editor/export_template_manager.h" #include "editor/filesystem_dock.h" -#include "editor/import/dynamicfont_import_settings.h" +#include "editor/import/dynamic_font_import_settings.h" #include "editor/import/editor_import_collada.h" #include "editor/import/resource_importer_bitmask.h" #include "editor/import/resource_importer_bmfont.h" #include "editor/import/resource_importer_csv_translation.h" -#include "editor/import/resource_importer_dynamicfont.h" +#include "editor/import/resource_importer_dynamic_font.h" #include "editor/import/resource_importer_image.h" #include "editor/import/resource_importer_imagefont.h" #include "editor/import/resource_importer_layered_texture.h" @@ -127,11 +132,12 @@ #include "editor/plugins/animation_tree_editor_plugin.h" #include "editor/plugins/asset_library_editor_plugin.h" #include "editor/plugins/audio_stream_editor_plugin.h" +#include "editor/plugins/audio_stream_randomizer_editor_plugin.h" #include "editor/plugins/camera_3d_editor_plugin.h" #include "editor/plugins/canvas_item_editor_plugin.h" #include "editor/plugins/collision_polygon_2d_editor_plugin.h" -#include "editor/plugins/collision_polygon_3d_editor_plugin.h" #include "editor/plugins/collision_shape_2d_editor_plugin.h" +#include "editor/plugins/control_editor_plugin.h" #include "editor/plugins/cpu_particles_2d_editor_plugin.h" #include "editor/plugins/cpu_particles_3d_editor_plugin.h" #include "editor/plugins/curve_editor_plugin.h" @@ -161,6 +167,8 @@ #include "editor/plugins/path_3d_editor_plugin.h" #include "editor/plugins/physical_bone_3d_editor_plugin.h" #include "editor/plugins/polygon_2d_editor_plugin.h" +#include "editor/plugins/polygon_3d_editor_plugin.h" +#include "editor/plugins/replication_editor_plugin.h" #include "editor/plugins/resource_preloader_editor_plugin.h" #include "editor/plugins/root_motion_editor_plugin.h" #include "editor/plugins/script_editor_plugin.h" @@ -190,7 +198,7 @@ #include "editor/project_settings_editor.h" #include "editor/quick_open.h" #include "editor/register_exporters.h" -#include "editor/settings_config_dialog.h" +#include "editor/scene_tree_dock.h" #include <stdio.h> #include <stdlib.h> @@ -312,7 +320,7 @@ void EditorNode::_update_scene_tabs() { DisplayServer::get_singleton()->global_menu_clear("_dock"); } - // Get all scene names, which may be ambiguous + // Get all scene names, which may be ambiguous. Vector<String> disambiguated_scene_names; Vector<String> full_path_names; for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { @@ -340,7 +348,7 @@ void EditorNode::_update_scene_tabs() { } if (show_rb && editor_data.get_scene_root_script(i).is_valid()) { - scene_tabs->set_tab_right_button(i, script_icon); + scene_tabs->set_tab_button_icon(i, script_icon); } } @@ -349,34 +357,35 @@ void EditorNode::_update_scene_tabs() { DisplayServer::get_singleton()->global_menu_add_item("_dock", TTR("New Window"), callable_mp(this, &EditorNode::_global_menu_new_window)); } - scene_tabs->set_current_tab(editor_data.get_edited_scene()); + if (scene_tabs->get_tab_count() > 0) { + scene_tabs->set_current_tab(editor_data.get_edited_scene()); + } if (scene_tabs->get_offset_buttons_visible()) { - // move add button to fixed position on the tabbar + // Move the add button to a fixed position. if (scene_tab_add->get_parent() == scene_tabs) { - if (scene_tabs->is_layout_rtl()) { - scene_tab_add->set_position(Point2(tabbar_container->get_size().x - scene_tab_add->get_size().x, 0)); - } else { - scene_tab_add->set_position(Point2(0, 0)); - } scene_tabs->remove_child(scene_tab_add); - tabbar_container->add_child(scene_tab_add); - tabbar_container->move_child(scene_tab_add, 1); + scene_tab_add_ph->add_child(scene_tab_add); + scene_tab_add->set_position(Point2()); } } else { - // move add button to after last tab - if (scene_tab_add->get_parent() == tabbar_container) { - tabbar_container->remove_child(scene_tab_add); + // Move the add button to be after the last tab. + if (scene_tab_add->get_parent() == scene_tab_add_ph) { + scene_tab_add_ph->remove_child(scene_tab_add); scene_tabs->add_child(scene_tab_add); } - Rect2 last_tab = Rect2(); - if (scene_tabs->get_tab_count() != 0) { - last_tab = scene_tabs->get_tab_rect(scene_tabs->get_tab_count() - 1); + + if (scene_tabs->get_tab_count() == 0) { + scene_tab_add->set_position(Point2()); + return; } + + Rect2 last_tab = scene_tabs->get_tab_rect(scene_tabs->get_tab_count() - 1); + int hsep = scene_tabs->get_theme_constant(SNAME("hseparation")); if (scene_tabs->is_layout_rtl()) { - scene_tab_add->set_position(Point2(last_tab.get_position().x - scene_tab_add->get_size().x - 3, last_tab.get_position().y)); + scene_tab_add->set_position(Point2(last_tab.position.x - scene_tab_add->get_size().x - hsep, last_tab.position.y)); } else { - scene_tab_add->set_position(Point2(last_tab.get_position().x + last_tab.get_size().x + 3, last_tab.get_position().y)); + scene_tab_add->set_position(Point2(last_tab.position.x + last_tab.size.width + hsep, last_tab.position.y)); } } } @@ -624,6 +633,10 @@ void EditorNode::_notification(int p_what) { editor_data.clear_edited_scenes(); } break; + case Control::NOTIFICATION_THEME_CHANGED: { + scene_tab_add_ph->set_custom_minimum_size(scene_tab_add->get_minimum_size()); + } break; + case NOTIFICATION_READY: { { _initializing_addons = true; @@ -720,8 +733,8 @@ void EditorNode::_notification(int p_what) { if (icon.is_valid()) { tb->set_icon(icon); - } else if (singleton->gui_base->has_theme_icon(p_editor->get_name(), "EditorIcons")) { - tb->set_icon(singleton->gui_base->get_theme_icon(p_editor->get_name(), "EditorIcons")); + } else if (singleton->gui_base->has_theme_icon(p_editor->get_name(), SNAME("EditorIcons"))) { + tb->set_icon(singleton->gui_base->get_theme_icon(p_editor->get_name(), SNAME("EditorIcons"))); } } @@ -739,13 +752,12 @@ void EditorNode::_notification(int p_what) { bottom_panel_raise->set_icon(gui_base->get_theme_icon(SNAME("ExpandBottomDock"), SNAME("EditorIcons"))); - // clear_button->set_icon(gui_base->get_icon("Close", "EditorIcons")); don't have access to that node. needs to become a class property if (gui_base->is_layout_rtl()) { - dock_tab_move_left->set_icon(theme->get_icon("Forward", "EditorIcons")); - dock_tab_move_right->set_icon(theme->get_icon("Back", "EditorIcons")); + dock_tab_move_left->set_icon(theme->get_icon(SNAME("Forward"), SNAME("EditorIcons"))); + dock_tab_move_right->set_icon(theme->get_icon(SNAME("Back"), SNAME("EditorIcons"))); } else { - dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons")); - dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons")); + dock_tab_move_left->set_icon(theme->get_icon(SNAME("Back"), SNAME("EditorIcons"))); + dock_tab_move_right->set_icon(theme->get_icon(SNAME("Forward"), SNAME("EditorIcons"))); } PopupMenu *p = help_menu->get_popup(); @@ -822,8 +834,8 @@ void EditorNode::_on_plugin_ready(Object *p_script, const String &p_activate_nam if (p_activate_name.length()) { set_addon_plugin_enabled(p_activate_name, true); } - project_settings->update_plugins(); - project_settings->hide(); + project_settings_editor->update_plugins(); + project_settings_editor->hide(); push_item(script.operator->()); } @@ -2274,7 +2286,7 @@ void EditorNode::_edit_current(bool p_skip_foreign) { if (main_plugin) { // special case if use of external editor is true Resource *current_res = Object::cast_to<Resource>(current_obj); - if (main_plugin->get_name() == "Script" && current_obj->get_class_name() != StringName("VisualScript") && current_res && !current_res->is_built_in() && (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")) || overrides_external_editor(current_obj))) { + if (main_plugin->get_name() == "Script" && current_obj->is_class("VisualScript") && current_res && !current_res->is_built_in() && (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")) || overrides_external_editor(current_obj))) { if (!changing_scene) { main_plugin->edit(current_obj); } @@ -2773,7 +2785,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } break; case RUN_SETTINGS: { - project_settings->popup_project_settings(); + project_settings_editor->popup_project_settings(); } break; case FILE_INSTALL_ANDROID_SOURCE: { if (p_confirmed) { @@ -2846,7 +2858,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { _update_update_spinner(); } break; case SETTINGS_PREFERENCES: { - settings_config_dialog->popup_edit_settings(); + editor_settings_dialog->popup_edit_settings(); } break; case SETTINGS_EDITOR_DATA_FOLDER: { OS::get_singleton()->shell_open(String("file://") + EditorPaths::get_singleton()->get_data_dir()); @@ -2896,7 +2908,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { command_palette->open_popup(); } break; case HELP_DOCS: { - OS::get_singleton()->shell_open("https://docs.godotengine.org/"); + OS::get_singleton()->shell_open(VERSION_DOCS_URL "/"); } break; case HELP_QA: { OS::get_singleton()->shell_open("https://godotengine.org/qa/"); @@ -3174,8 +3186,8 @@ void EditorNode::add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed Ref<Texture2D> icon = p_editor->get_icon(); if (icon.is_valid()) { tb->set_icon(icon); - } else if (singleton->gui_base->has_theme_icon(p_editor->get_name(), "EditorIcons")) { - tb->set_icon(singleton->gui_base->get_theme_icon(p_editor->get_name(), "EditorIcons")); + } else if (singleton->gui_base->has_theme_icon(p_editor->get_name(), SNAME("EditorIcons"))) { + tb->set_icon(singleton->gui_base->get_theme_icon(p_editor->get_name(), SNAME("EditorIcons"))); } tb->add_theme_font_override("font", singleton->gui_base->get_theme_font(SNAME("main_button_font"), SNAME("EditorFonts"))); @@ -3240,7 +3252,7 @@ void EditorNode::_update_addon_config() { ProjectSettings::get_singleton()->set("editor_plugins/enabled", enabled_addons); } - project_settings->queue_save(); + project_settings_editor->queue_save(); } void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled, bool p_config_changed) { @@ -3287,8 +3299,8 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled, return; } - // Errors in the script cause the base_type to be an empty string. - if (String(script->get_instance_base_type()) == "") { + // Errors in the script cause the base_type to be an empty StringName. + if (script->get_instance_base_type() == StringName()) { show_warning(vformat(TTR("Unable to load addon script from path: '%s'. This might be due to a code error in that script.\nDisabling the addon at '%s' to prevent further errors."), script_path, p_addon)); _remove_plugin_from_enabled(p_addon); return; @@ -3725,7 +3737,7 @@ void EditorNode::_show_messages() { void EditorNode::_add_to_recent_scenes(const String &p_scene) { Array rc = EditorSettings::get_singleton()->get_project_metadata("recent_files", "scenes", Array()); - if (rc.find(p_scene) != -1) { + if (rc.has(p_scene)) { rc.erase(p_scene); } rc.push_front(p_scene); @@ -3904,8 +3916,9 @@ Ref<Script> EditorNode::get_object_custom_type_base(const Object *p_object) cons if (script.is_valid()) { // Uncommenting would break things! Consider adding a parameter if you need it. // StringName name = EditorNode::get_editor_data().script_class_get_name(base_script->get_path()); - // if (name != StringName()) + // if (name != StringName()) { // return name; + // } // should probably be deprecated in 4.x StringName base = script->get_instance_base_type(); @@ -3931,7 +3944,7 @@ StringName EditorNode::get_object_custom_type_name(const Object *p_object) const ERR_FAIL_COND_V(!p_object, StringName()); Ref<Script> script = p_object->get_script(); - if (script.is_null() && p_object->is_class("Script")) { + if (script.is_null() && Object::cast_to<Script>(p_object)) { script = p_object; } @@ -4026,8 +4039,8 @@ Ref<Texture2D> EditorNode::get_object_icon(const Object *p_object, const String return p_object->get_meta("_editor_icon"); } - if (gui_base->has_theme_icon(p_object->get_class(), "EditorIcons")) { - return gui_base->get_theme_icon(p_object->get_class(), "EditorIcons"); + if (gui_base->has_theme_icon(p_object->get_class(), SNAME("EditorIcons"))) { + return gui_base->get_theme_icon(p_object->get_class(), SNAME("EditorIcons")); } if (p_fallback.length()) { @@ -4056,7 +4069,7 @@ Ref<Texture2D> EditorNode::get_class_icon(const String &p_class, const String &p } if (icon.is_null()) { - icon = gui_base->get_theme_icon(ScriptServer::get_global_class_base(name), "EditorIcons"); + icon = gui_base->get_theme_icon(ScriptServer::get_global_class_base(name), SNAME("EditorIcons")); } } @@ -4142,13 +4155,12 @@ Ref<Texture2D> EditorNode::_file_dialog_get_icon(const String &p_path) { void EditorNode::_build_icon_type_cache() { List<StringName> tl; - StringName ei = "EditorIcons"; - theme_base->get_theme()->get_icon_list(ei, &tl); + theme_base->get_theme()->get_icon_list(SNAME("EditorIcons"), &tl); for (const StringName &E : tl) { if (!ClassDB::class_exists(E)) { continue; } - icon_type_cache[E] = theme_base->get_theme()->get_icon(E, ei); + icon_type_cache[E] = theme_base->get_theme()->get_icon(E, SNAME("EditorIcons")); } } @@ -4222,14 +4234,17 @@ void EditorNode::_dock_floating_close_request(Control *p_control) { _update_dock_containers(); floating_docks.erase(p_control); + + _edit_current(); } void EditorNode::_dock_make_float() { Control *dock = dock_slot[dock_popup_selected]->get_current_tab_control(); ERR_FAIL_COND(!dock); - const Size2i borders = Size2i(4, 4) * EDSCALE; - Size2 dock_size = dock->get_size() + borders * 2; // remember size + Size2 borders = Size2(4, 4) * EDSCALE; + // Remember size and position before removing it from the main window. + Size2 dock_size = dock->get_size() + borders * 2; Point2 dock_screen_pos = dock->get_global_position() + get_tree()->get_root()->get_position() - borders; int dock_index = dock->get_index(); @@ -4238,7 +4253,7 @@ void EditorNode::_dock_make_float() { Window *window = memnew(Window); window->set_title(dock->get_name()); Panel *p = memnew(Panel); - p->set_mode(Panel::MODE_FOREGROUND); + p->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("PanelForeground"), SNAME("EditorStyles"))); p->set_anchors_and_offsets_preset(Control::PRESET_WIDE); window->add_child(p); MarginContainer *margin = memnew(MarginContainer); @@ -4264,6 +4279,8 @@ void EditorNode::_dock_make_float() { _update_dock_containers(); floating_docks.push_back(dock); + + _edit_current(); } void EditorNode::_update_dock_containers() { @@ -5594,7 +5611,7 @@ void EditorNode::_update_rendering_driver_color() { if (rendering_driver->get_text() == "opengl3") { rendering_driver->add_theme_color_override("font_color", Color::hex(0x5586a4ff)); } else if (rendering_driver->get_text() == "vulkan") { - rendering_driver->add_theme_color_override("font_color", theme_base->get_theme_color("vulkan_color", "Editor")); + rendering_driver->add_theme_color_override("font_color", theme_base->get_theme_color(SNAME("vulkan_color"), SNAME("Editor"))); } } @@ -5667,6 +5684,7 @@ void EditorNode::_feature_profile_changed() { void EditorNode::_bind_methods() { GLOBAL_DEF("editor/scene/scene_naming", SCENE_NAME_CASING_SNAKE_CASE); ProjectSettings::get_singleton()->set_custom_property_info("editor/scene/scene_naming", PropertyInfo(Variant::INT, "editor/scene/scene_naming", PROPERTY_HINT_ENUM, "Auto,PascalCase,snake_case")); + ClassDB::bind_method("edit_current", &EditorNode::edit_current); ClassDB::bind_method("_editor_select", &EditorNode::_editor_select); ClassDB::bind_method("_node_renamed", &EditorNode::_node_renamed); ClassDB::bind_method("edit_node", &EditorNode::edit_node); @@ -5728,7 +5746,6 @@ static void _execute_thread(void *p_ud) { } eta->done.set(); - ; } int EditorNode::execute_and_show_output(const String &p_title, const String &p_path, const List<String> &p_arguments, bool p_close_on_ok, bool p_close_on_errors) { @@ -6137,9 +6154,9 @@ EditorNode::EditorNode() { dock_tab_move_left = memnew(Button); dock_tab_move_left->set_flat(true); if (gui_base->is_layout_rtl()) { - dock_tab_move_left->set_icon(theme->get_icon("Forward", "EditorIcons")); + dock_tab_move_left->set_icon(theme->get_icon(SNAME("Forward"), SNAME("EditorIcons"))); } else { - dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons")); + dock_tab_move_left->set_icon(theme->get_icon(SNAME("Back"), SNAME("EditorIcons"))); } dock_tab_move_left->set_focus_mode(Control::FOCUS_NONE); dock_tab_move_left->connect("pressed", callable_mp(this, &EditorNode::_dock_move_left)); @@ -6154,9 +6171,9 @@ EditorNode::EditorNode() { dock_tab_move_right = memnew(Button); dock_tab_move_right->set_flat(true); if (gui_base->is_layout_rtl()) { - dock_tab_move_right->set_icon(theme->get_icon("Back", "EditorIcons")); + dock_tab_move_right->set_icon(theme->get_icon(SNAME("Back"), SNAME("EditorIcons"))); } else { - dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons")); + dock_tab_move_right->set_icon(theme->get_icon(SNAME("Forward"), SNAME("EditorIcons"))); } dock_tab_move_right->set_focus_mode(Control::FOCUS_NONE); dock_tab_move_right->connect("pressed", callable_mp(this, &EditorNode::_dock_move_right)); @@ -6223,6 +6240,9 @@ EditorNode::EditorNode() { tab_preview->set_position(Point2(2, 2) * EDSCALE); tab_preview_panel->add_child(tab_preview); + tabbar_container = memnew(HBoxContainer); + srt->add_child(tabbar_container); + scene_tabs = memnew(TabBar); scene_tabs->add_theme_style_override("tab_selected", gui_base->get_theme_stylebox(SNAME("SceneTabFG"), SNAME("EditorStyles"))); scene_tabs->add_theme_style_override("tab_unselected", gui_base->get_theme_stylebox(SNAME("SceneTabBG"), SNAME("EditorStyles"))); @@ -6233,23 +6253,33 @@ EditorNode::EditorNode() { scene_tabs->set_min_width(int(EDITOR_DEF("interface/scene_tabs/minimum_width", 50)) * EDSCALE); scene_tabs->set_drag_to_rearrange_enabled(true); scene_tabs->connect("tab_changed", callable_mp(this, &EditorNode::_scene_tab_changed)); - scene_tabs->connect("tab_rmb_clicked", callable_mp(this, &EditorNode::_scene_tab_script_edited)); + scene_tabs->connect("tab_button_pressed", callable_mp(this, &EditorNode::_scene_tab_script_edited)); scene_tabs->connect("tab_close_pressed", callable_mp(this, &EditorNode::_scene_tab_closed), varray(SCENE_TAB_CLOSE)); scene_tabs->connect("tab_hovered", callable_mp(this, &EditorNode::_scene_tab_hovered)); scene_tabs->connect("mouse_exited", callable_mp(this, &EditorNode::_scene_tab_exit)); scene_tabs->connect("gui_input", callable_mp(this, &EditorNode::_scene_tab_input)); scene_tabs->connect("active_tab_rearranged", callable_mp(this, &EditorNode::_reposition_active_tab)); scene_tabs->connect("resized", callable_mp(this, &EditorNode::_update_scene_tabs)); - - tabbar_container = memnew(HBoxContainer); scene_tabs->set_h_size_flags(Control::SIZE_EXPAND_FILL); + tabbar_container->add_child(scene_tabs); scene_tabs_context_menu = memnew(PopupMenu); tabbar_container->add_child(scene_tabs_context_menu); scene_tabs_context_menu->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option)); - srt->add_child(tabbar_container); - tabbar_container->add_child(scene_tabs); + scene_tab_add = memnew(Button); + scene_tab_add->set_flat(true); + scene_tab_add->set_tooltip(TTR("Add a new scene.")); + scene_tab_add->set_icon(gui_base->get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + scene_tab_add->add_theme_color_override("icon_normal_color", Color(0.6f, 0.6f, 0.6f, 0.8f)); + scene_tabs->add_child(scene_tab_add); + scene_tab_add->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(FILE_NEW_SCENE)); + + scene_tab_add_ph = memnew(Control); + scene_tab_add_ph->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); + scene_tab_add_ph->set_custom_minimum_size(scene_tab_add->get_minimum_size()); + tabbar_container->add_child(scene_tab_add_ph); + distraction_free = memnew(Button); distraction_free->set_flat(true); ED_SHORTCUT_AND_COMMAND("editor/distraction_free_mode", TTR("Distraction Free Mode"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F11); @@ -6259,15 +6289,7 @@ EditorNode::EditorNode() { distraction_free->connect("pressed", callable_mp(this, &EditorNode::_toggle_distraction_free_mode)); distraction_free->set_icon(gui_base->get_theme_icon(SNAME("DistractionFree"), SNAME("EditorIcons"))); distraction_free->set_toggle_mode(true); - - scene_tab_add = memnew(Button); - scene_tab_add->set_flat(true); - tabbar_container->add_child(scene_tab_add); tabbar_container->add_child(distraction_free); - scene_tab_add->set_tooltip(TTR("Add a new scene.")); - scene_tab_add->set_icon(gui_base->get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); - scene_tab_add->add_theme_color_override("icon_normal_color", Color(0.6f, 0.6f, 0.6f, 0.8f)); - scene_tab_add->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(FILE_NEW_SCENE)); scene_root_parent = memnew(PanelContainer); scene_root_parent->set_custom_minimum_size(Size2(0, 80) * EDSCALE); @@ -6325,11 +6347,11 @@ EditorNode::EditorNode() { dependency_fixer = memnew(DependencyEditor); gui_base->add_child(dependency_fixer); - settings_config_dialog = memnew(EditorSettingsDialog); - gui_base->add_child(settings_config_dialog); + editor_settings_dialog = memnew(EditorSettingsDialog); + gui_base->add_child(editor_settings_dialog); - project_settings = memnew(ProjectSettingsEditor(&editor_data)); - gui_base->add_child(project_settings); + project_settings_editor = memnew(ProjectSettingsEditor(&editor_data)); + gui_base->add_child(project_settings_editor); scene_import_settings = memnew(SceneImportSettings); gui_base->add_child(scene_import_settings); @@ -6622,8 +6644,8 @@ EditorNode::EditorNode() { rendering_driver->set_flat(true); rendering_driver->set_focus_mode(Control::FOCUS_NONE); rendering_driver->connect("item_selected", callable_mp(this, &EditorNode::_rendering_driver_selected)); - rendering_driver->add_theme_font_override("font", gui_base->get_theme_font("bold", "EditorFonts")); - rendering_driver->add_theme_font_size_override("font_size", gui_base->get_theme_font_size("bold_size", "EditorFonts")); + rendering_driver->add_theme_font_override("font", gui_base->get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); + rendering_driver->add_theme_font_size_override("font_size", gui_base->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts"))); right_menu_hb->add_child(rendering_driver); @@ -6680,12 +6702,12 @@ EditorNode::EditorNode() { // Instantiate and place editor docks - memnew(SceneTreeDock(this, scene_root, editor_selection, editor_data)); - memnew(InspectorDock(this, editor_data)); + memnew(SceneTreeDock(scene_root, editor_selection, editor_data)); + memnew(InspectorDock(editor_data)); memnew(ImportDock); memnew(NodeDock); - FileSystemDock *filesystem_dock = memnew(FileSystemDock(this)); + FileSystemDock *filesystem_dock = memnew(FileSystemDock); filesystem_dock->connect("inherit", callable_mp(this, &EditorNode::_inherit_request)); filesystem_dock->connect("instance", callable_mp(this, &EditorNode::_instantiate_request)); filesystem_dock->connect("display_mode_changed", callable_mp(this, &EditorNode::_save_docks)); @@ -6905,7 +6927,7 @@ EditorNode::EditorNode() { preview_gen = memnew(AudioStreamPreviewGenerator); add_child(preview_gen); - add_editor_plugin(memnew(DebuggerEditorPlugin(this, debug_menu))); + add_editor_plugin(memnew(DebuggerEditorPlugin(debug_menu))); add_editor_plugin(memnew(DebugAdapterServer())); disk_changed = memnew(ConfirmationDialog); @@ -6931,10 +6953,10 @@ EditorNode::EditorNode() { gui_base->add_child(disk_changed); - add_editor_plugin(memnew(AnimationPlayerEditorPlugin(this))); - add_editor_plugin(memnew(CanvasItemEditorPlugin(this))); - add_editor_plugin(memnew(Node3DEditorPlugin(this))); - add_editor_plugin(memnew(ScriptEditorPlugin(this))); + add_editor_plugin(memnew(AnimationPlayerEditorPlugin)); + add_editor_plugin(memnew(CanvasItemEditorPlugin)); + add_editor_plugin(memnew(Node3DEditorPlugin)); + add_editor_plugin(memnew(ScriptEditorPlugin)); EditorAudioBuses *audio_bus_editor = EditorAudioBuses::register_editor(); @@ -6942,7 +6964,7 @@ EditorNode::EditorNode() { TextEditor::register_editor(); if (StreamPeerSSL::is_available()) { - add_editor_plugin(memnew(AssetLibraryEditorPlugin(this))); + add_editor_plugin(memnew(AssetLibraryEditorPlugin)); } else { WARN_PRINT("Asset Library not available, as it requires SSL to work."); } @@ -6954,62 +6976,65 @@ EditorNode::EditorNode() { // more visually meaningful to have this later raise_bottom_panel_item(AnimationPlayerEditor::get_singleton()); + add_editor_plugin(memnew(ReplicationEditorPlugin)); add_editor_plugin(VersionControlEditorPlugin::get_singleton()); - add_editor_plugin(memnew(ShaderEditorPlugin(this))); - add_editor_plugin(memnew(ShaderFileEditorPlugin(this))); - add_editor_plugin(memnew(VisualShaderEditorPlugin(this))); - - add_editor_plugin(memnew(Camera3DEditorPlugin(this))); - add_editor_plugin(memnew(ThemeEditorPlugin(this))); - add_editor_plugin(memnew(MultiMeshEditorPlugin(this))); - add_editor_plugin(memnew(MeshInstance3DEditorPlugin(this))); - add_editor_plugin(memnew(AnimationTreeEditorPlugin(this))); - add_editor_plugin(memnew(MeshLibraryEditorPlugin(this))); - add_editor_plugin(memnew(StyleBoxEditorPlugin(this))); - add_editor_plugin(memnew(Sprite2DEditorPlugin(this))); - add_editor_plugin(memnew(Skeleton2DEditorPlugin(this))); - add_editor_plugin(memnew(GPUParticles2DEditorPlugin(this))); - add_editor_plugin(memnew(GPUParticles3DEditorPlugin(this))); - add_editor_plugin(memnew(CPUParticles2DEditorPlugin(this))); - add_editor_plugin(memnew(CPUParticles3DEditorPlugin(this))); - add_editor_plugin(memnew(ResourcePreloaderEditorPlugin(this))); - add_editor_plugin(memnew(Polygon3DEditorPlugin(this))); - add_editor_plugin(memnew(CollisionPolygon2DEditorPlugin(this))); - add_editor_plugin(memnew(TilesEditorPlugin(this))); - add_editor_plugin(memnew(SpriteFramesEditorPlugin(this))); - add_editor_plugin(memnew(TextureRegionEditorPlugin(this))); - add_editor_plugin(memnew(VoxelGIEditorPlugin(this))); - add_editor_plugin(memnew(LightmapGIEditorPlugin(this))); - add_editor_plugin(memnew(OccluderInstance3DEditorPlugin(this))); - add_editor_plugin(memnew(Path2DEditorPlugin(this))); - add_editor_plugin(memnew(Path3DEditorPlugin(this))); - add_editor_plugin(memnew(Line2DEditorPlugin(this))); - add_editor_plugin(memnew(Polygon2DEditorPlugin(this))); - add_editor_plugin(memnew(LightOccluder2DEditorPlugin(this))); - add_editor_plugin(memnew(NavigationPolygonEditorPlugin(this))); - add_editor_plugin(memnew(GradientEditorPlugin(this))); - add_editor_plugin(memnew(CollisionShape2DEditorPlugin(this))); - add_editor_plugin(memnew(CurveEditorPlugin(this))); - add_editor_plugin(memnew(FontEditorPlugin(this))); - add_editor_plugin(memnew(OpenTypeFeaturesEditorPlugin(this))); - add_editor_plugin(memnew(TextureEditorPlugin(this))); - add_editor_plugin(memnew(TextureLayeredEditorPlugin(this))); - add_editor_plugin(memnew(Texture3DEditorPlugin(this))); - add_editor_plugin(memnew(AudioStreamEditorPlugin(this))); + add_editor_plugin(memnew(ShaderEditorPlugin)); + add_editor_plugin(memnew(ShaderFileEditorPlugin)); + add_editor_plugin(memnew(VisualShaderEditorPlugin)); + + add_editor_plugin(memnew(Camera3DEditorPlugin)); + add_editor_plugin(memnew(ThemeEditorPlugin)); + add_editor_plugin(memnew(MultiMeshEditorPlugin)); + add_editor_plugin(memnew(MeshInstance3DEditorPlugin)); + add_editor_plugin(memnew(AnimationTreeEditorPlugin)); + add_editor_plugin(memnew(MeshLibraryEditorPlugin)); + add_editor_plugin(memnew(StyleBoxEditorPlugin)); + add_editor_plugin(memnew(Sprite2DEditorPlugin)); + add_editor_plugin(memnew(Skeleton2DEditorPlugin)); + add_editor_plugin(memnew(GPUParticles2DEditorPlugin)); + add_editor_plugin(memnew(GPUParticles3DEditorPlugin)); + add_editor_plugin(memnew(CPUParticles2DEditorPlugin)); + add_editor_plugin(memnew(CPUParticles3DEditorPlugin)); + add_editor_plugin(memnew(ResourcePreloaderEditorPlugin)); + add_editor_plugin(memnew(Polygon3DEditorPlugin)); + add_editor_plugin(memnew(CollisionPolygon2DEditorPlugin)); + add_editor_plugin(memnew(TilesEditorPlugin)); + add_editor_plugin(memnew(SpriteFramesEditorPlugin)); + add_editor_plugin(memnew(TextureRegionEditorPlugin)); + add_editor_plugin(memnew(VoxelGIEditorPlugin)); + add_editor_plugin(memnew(LightmapGIEditorPlugin)); + add_editor_plugin(memnew(OccluderInstance3DEditorPlugin)); + add_editor_plugin(memnew(Path2DEditorPlugin)); + add_editor_plugin(memnew(Path3DEditorPlugin)); + add_editor_plugin(memnew(Line2DEditorPlugin)); + add_editor_plugin(memnew(Polygon2DEditorPlugin)); + add_editor_plugin(memnew(LightOccluder2DEditorPlugin)); + add_editor_plugin(memnew(NavigationPolygonEditorPlugin)); + add_editor_plugin(memnew(GradientEditorPlugin)); + add_editor_plugin(memnew(CollisionShape2DEditorPlugin)); + add_editor_plugin(memnew(CurveEditorPlugin)); + add_editor_plugin(memnew(FontEditorPlugin)); + add_editor_plugin(memnew(OpenTypeFeaturesEditorPlugin)); + add_editor_plugin(memnew(TextureEditorPlugin)); + add_editor_plugin(memnew(TextureLayeredEditorPlugin)); + add_editor_plugin(memnew(Texture3DEditorPlugin)); + add_editor_plugin(memnew(AudioStreamEditorPlugin)); + add_editor_plugin(memnew(AudioStreamRandomizerEditorPlugin)); add_editor_plugin(memnew(AudioBusesEditorPlugin(audio_bus_editor))); - add_editor_plugin(memnew(Skeleton3DEditorPlugin(this))); - add_editor_plugin(memnew(SkeletonIK3DEditorPlugin(this))); - add_editor_plugin(memnew(PhysicalBone3DEditorPlugin(this))); - add_editor_plugin(memnew(MeshEditorPlugin(this))); - add_editor_plugin(memnew(MaterialEditorPlugin(this))); - add_editor_plugin(memnew(GPUParticlesCollisionSDF3DEditorPlugin(this))); - add_editor_plugin(memnew(InputEventEditorPlugin(this))); - add_editor_plugin(memnew(SubViewportPreviewEditorPlugin(this))); - add_editor_plugin(memnew(TextControlEditorPlugin(this))); + add_editor_plugin(memnew(Skeleton3DEditorPlugin)); + add_editor_plugin(memnew(SkeletonIK3DEditorPlugin)); + add_editor_plugin(memnew(PhysicalBone3DEditorPlugin)); + add_editor_plugin(memnew(MeshEditorPlugin)); + add_editor_plugin(memnew(MaterialEditorPlugin)); + add_editor_plugin(memnew(GPUParticlesCollisionSDF3DEditorPlugin)); + add_editor_plugin(memnew(InputEventEditorPlugin)); + add_editor_plugin(memnew(SubViewportPreviewEditorPlugin)); + add_editor_plugin(memnew(TextControlEditorPlugin)); + add_editor_plugin(memnew(ControlEditorPlugin)); for (int i = 0; i < EditorPlugins::get_plugin_count(); i++) { - add_editor_plugin(EditorPlugins::create(i, this)); + add_editor_plugin(EditorPlugins::create(i)); } for (int i = 0; i < plugin_init_callback_count; i++) { diff --git a/editor/editor_node.h b/editor/editor_node.h index f8489777bd..c05e6cd281 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -32,16 +32,12 @@ #define EDITOR_NODE_H #include "core/templates/safe_refcount.h" -#include "editor/editor_data.h" #include "editor/editor_export.h" #include "editor/editor_folding.h" #include "editor/editor_native_shader_source_visualizer.h" #include "editor/editor_run.h" -#include "editor/editor_toaster.h" #include "editor/inspector_dock.h" #include "editor/property_editor.h" -#include "editor/scene_tree_dock.h" -#include "scene/gui/link_button.h" typedef void (*EditorNodeInitCallback)(); typedef void (*EditorPluginInitializeCallback)(); @@ -50,16 +46,20 @@ typedef bool (*EditorBuildCallback)(); class AcceptDialog; class AudioStreamPreviewGenerator; class BackgroundProgress; +class Button; class CenterContainer; class ConfirmationDialog; class Control; class DependencyEditor; class DependencyErrorDialog; +class DynamicFontImportSettings; class EditorAbout; class EditorCommandPalette; class EditorExport; +class EditorExtensionManager; class EditorFeatureProfileManager; class EditorFileServer; +class EditorFolding; class EditorInspector; class EditorLayoutsDialog; class EditorLog; @@ -67,12 +67,16 @@ class EditorPlugin; class EditorPluginList; class EditorQuickOpen; class EditorResourcePreview; +class EditorRun; class EditorRunNative; class EditorSettingsDialog; +class EditorToaster; class ExportTemplateManager; +class FileDialog; class FileSystemDock; class HSplitContainer; class ImportDock; +class LinkButton; class MenuButton; class NodeDock; class OrphanResourcesDialog; @@ -83,17 +87,14 @@ class ProgressDialog; class ProjectExportDialog; class ProjectSettingsEditor; class RunSettingsDialog; +class SceneImportSettings; class ScriptCreateDialog; -class TabContainer; +class SubViewport; class TabBar; +class TabContainer; class TextureProgressBar; -class Button; class VSplitContainer; class Window; -class SubViewport; -class SceneImportSettings; -class EditorExtensionManager; -class DynamicFontImportSettings; class EditorNode : public Node { GDCLASS(EditorNode, Node); @@ -323,8 +324,8 @@ private: ConfirmationDialog *install_android_build_template; ConfirmationDialog *remove_android_build_template; - EditorSettingsDialog *settings_config_dialog; - ProjectSettingsEditor *project_settings; + EditorSettingsDialog *editor_settings_dialog; + ProjectSettingsEditor *project_settings_editor; bool settings_changed = true; // make it update settings on first frame void _update_from_settings(); @@ -384,6 +385,7 @@ private: HBoxContainer *tabbar_container; Button *distraction_free; Button *scene_tab_add; + Control *scene_tab_add_ph; bool scene_distraction; bool script_distraction; @@ -713,7 +715,7 @@ public: EditorPluginList *get_editor_plugins_force_over() { return editor_plugins_force_over; } EditorPluginList *get_editor_plugins_force_input_forwarding() { return editor_plugins_force_input_forwarding; } - ProjectSettingsEditor *get_project_settings() { return project_settings; } + ProjectSettingsEditor *get_project_settings() { return project_settings_editor; } static void add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed = false); static void remove_editor_plugin(EditorPlugin *p_editor, bool p_config_changed = false); diff --git a/editor/editor_path.cpp b/editor/editor_path.cpp index 3dee06fb3e..5cb3d0cd75 100644 --- a/editor/editor_path.cpp +++ b/editor/editor_path.cpp @@ -30,8 +30,9 @@ #include "editor_path.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_data.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" void EditorPath::_add_children_to_popup(Object *p_obj, int p_depth) { if (p_depth > 8) { diff --git a/editor/editor_path.h b/editor/editor_path.h index ad8443534d..539ae7a11d 100644 --- a/editor/editor_path.h +++ b/editor/editor_path.h @@ -31,10 +31,13 @@ #ifndef EDITOR_PATH_H #define EDITOR_PATH_H -#include "editor_data.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" +#include "scene/gui/label.h" #include "scene/gui/popup_menu.h" +#include "scene/gui/texture_rect.h" + +class EditorHistory; class EditorPath : public Button { GDCLASS(EditorPath, Button); diff --git a/editor/editor_paths.cpp b/editor/editor_paths.cpp index d4e40db406..7b454055e0 100644 --- a/editor/editor_paths.cpp +++ b/editor/editor_paths.cpp @@ -34,7 +34,7 @@ #include "core/config/project_settings.h" #include "core/io/dir_access.h" #include "core/os/os.h" -#include "main/main.h" // For `is_project_manager`. +#include "main/main.h" EditorPaths *EditorPaths::singleton = nullptr; @@ -193,7 +193,7 @@ EditorPaths::EditorPaths() { // Validate or create project-specific editor data dir, // including shader cache subdir. - if (Main::is_project_manager() || Main::is_cmdline_tool()) { + if (Engine::get_singleton()->is_project_manager_hint() || Main::is_cmdline_tool()) { // Nothing to create, use shared editor data dir for shader cache. Engine::get_singleton()->set_shader_cache_path(data_dir); } else { diff --git a/editor/editor_paths.h b/editor/editor_paths.h index 4b814707b2..7d863a7c6c 100644 --- a/editor/editor_paths.h +++ b/editor/editor_paths.h @@ -32,6 +32,7 @@ #define EDITOR_PATHS_H #include "core/object/class_db.h" +#include "core/object/object.h" #include "core/string/ustring.h" class EditorPaths : public Object { diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp index 29f6079fcf..5166200ee3 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -34,13 +34,15 @@ #include "editor/editor_export.h" #include "editor/editor_node.h" #include "editor/editor_paths.h" +#include "editor/editor_resource_preview.h" #include "editor/editor_settings.h" #include "editor/filesystem_dock.h" +#include "editor/plugins/canvas_item_editor_plugin.h" +#include "editor/plugins/node_3d_editor_plugin.h" +#include "editor/plugins/script_editor_plugin.h" #include "editor/project_settings_editor.h" -#include "editor_resource_preview.h" +#include "editor/scene_tree_dock.h" #include "main/main.h" -#include "plugins/canvas_item_editor_plugin.h" -#include "plugins/node_3d_editor_plugin.h" #include "scene/3d/camera_3d.h" #include "scene/gui/popup_menu.h" #include "servers/rendering_server.h" @@ -513,11 +515,9 @@ void EditorPlugin::add_tool_menu_item(const String &p_name, const Callable &p_ca EditorNode::get_singleton()->add_tool_menu_item(p_name, p_callable); } -void EditorPlugin::add_tool_submenu_item(const String &p_name, Object *p_submenu) { +void EditorPlugin::add_tool_submenu_item(const String &p_name, PopupMenu *p_submenu) { ERR_FAIL_NULL(p_submenu); - PopupMenu *submenu = Object::cast_to<PopupMenu>(p_submenu); - ERR_FAIL_NULL(submenu); - EditorNode::get_singleton()->add_tool_submenu_item(p_name, submenu); + EditorNode::get_singleton()->add_tool_submenu_item(p_name, p_submenu); } void EditorPlugin::remove_tool_menu_item(const String &p_name) { @@ -719,9 +719,9 @@ void EditorPlugin::remove_translation_parser_plugin(const Ref<EditorTranslationP EditorTranslationParser::get_singleton()->remove_parser(p_parser, EditorTranslationParser::CUSTOM); } -void EditorPlugin::add_import_plugin(const Ref<EditorImportPlugin> &p_importer) { +void EditorPlugin::add_import_plugin(const Ref<EditorImportPlugin> &p_importer, bool p_first_priority) { ERR_FAIL_COND(!p_importer.is_valid()); - ResourceFormatImporter::get_singleton()->add_importer(p_importer); + ResourceFormatImporter::get_singleton()->add_importer(p_importer, p_first_priority); EditorFileSystem::get_singleton()->call_deferred(SNAME("scan")); } @@ -761,9 +761,9 @@ void EditorPlugin::remove_inspector_plugin(const Ref<EditorInspectorPlugin> &p_p EditorInspector::remove_inspector_plugin(p_plugin); } -void EditorPlugin::add_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer) { +void EditorPlugin::add_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer, bool p_first_priority) { ERR_FAIL_COND(!p_importer.is_valid()); - ResourceImporterScene::get_singleton()->add_importer(p_importer); + ResourceImporterScene::get_singleton()->add_importer(p_importer, p_first_priority); } void EditorPlugin::remove_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer) { @@ -771,9 +771,10 @@ void EditorPlugin::remove_scene_format_importer_plugin(const Ref<EditorSceneForm ResourceImporterScene::get_singleton()->remove_importer(p_importer); } -void EditorPlugin::add_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin) { - ResourceImporterScene::get_singleton()->add_post_importer_plugin(p_plugin); +void EditorPlugin::add_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin, bool p_first_priority) { + ResourceImporterScene::get_singleton()->add_post_importer_plugin(p_plugin, p_first_priority); } + void EditorPlugin::remove_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin) { ResourceImporterScene::get_singleton()->remove_post_importer_plugin(p_plugin); } @@ -848,11 +849,14 @@ void EditorPlugin::_editor_project_settings_changed() { emit_signal(SNAME("project_settings_changed")); } void EditorPlugin::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - EditorNode::get_singleton()->connect("project_settings_changed", callable_mp(this, &EditorPlugin::_editor_project_settings_changed)); - } - if (p_what == NOTIFICATION_EXIT_TREE) { - EditorNode::get_singleton()->disconnect("project_settings_changed", callable_mp(this, &EditorPlugin::_editor_project_settings_changed)); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + EditorNode::get_singleton()->connect("project_settings_changed", callable_mp(this, &EditorPlugin::_editor_project_settings_changed)); + } break; + + case NOTIFICATION_EXIT_TREE: { + EditorNode::get_singleton()->disconnect("project_settings_changed", callable_mp(this, &EditorPlugin::_editor_project_settings_changed)); + } break; } } @@ -883,11 +887,11 @@ void EditorPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("queue_save_layout"), &EditorPlugin::queue_save_layout); ClassDB::bind_method(D_METHOD("add_translation_parser_plugin", "parser"), &EditorPlugin::add_translation_parser_plugin); ClassDB::bind_method(D_METHOD("remove_translation_parser_plugin", "parser"), &EditorPlugin::remove_translation_parser_plugin); - ClassDB::bind_method(D_METHOD("add_import_plugin", "importer"), &EditorPlugin::add_import_plugin); + ClassDB::bind_method(D_METHOD("add_import_plugin", "importer", "first_priority"), &EditorPlugin::add_import_plugin, DEFVAL(false)); ClassDB::bind_method(D_METHOD("remove_import_plugin", "importer"), &EditorPlugin::remove_import_plugin); - ClassDB::bind_method(D_METHOD("add_scene_format_importer_plugin", "scene_format_importer"), &EditorPlugin::add_scene_format_importer_plugin); + ClassDB::bind_method(D_METHOD("add_scene_format_importer_plugin", "scene_format_importer", "first_priority"), &EditorPlugin::add_scene_format_importer_plugin, DEFVAL(false)); ClassDB::bind_method(D_METHOD("remove_scene_format_importer_plugin", "scene_format_importer"), &EditorPlugin::remove_scene_format_importer_plugin); - ClassDB::bind_method(D_METHOD("add_scene_post_import_plugin", "scene_import_plugin"), &EditorPlugin::add_scene_post_import_plugin); + ClassDB::bind_method(D_METHOD("add_scene_post_import_plugin", "scene_import_plugin", "first_priority"), &EditorPlugin::add_scene_post_import_plugin, DEFVAL(false)); ClassDB::bind_method(D_METHOD("remove_scene_post_import_plugin", "scene_import_plugin"), &EditorPlugin::remove_scene_post_import_plugin); ClassDB::bind_method(D_METHOD("add_export_plugin", "plugin"), &EditorPlugin::add_export_plugin); ClassDB::bind_method(D_METHOD("remove_export_plugin", "plugin"), &EditorPlugin::remove_export_plugin); diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h index faa8ae1ce6..1a5be7a89b 100644 --- a/editor/editor_plugin.h +++ b/editor/editor_plugin.h @@ -42,7 +42,7 @@ #include "scene/3d/camera_3d.h" #include "scene/main/node.h" #include "scene/resources/texture.h" -class EditorNode; + class Node3D; class Camera3D; class EditorCommandPalette; @@ -217,7 +217,7 @@ public: void remove_control_from_bottom_panel(Control *p_control); void add_tool_menu_item(const String &p_name, const Callable &p_callable); - void add_tool_submenu_item(const String &p_name, Object *p_submenu); + void add_tool_submenu_item(const String &p_name, PopupMenu *p_submenu); void remove_tool_menu_item(const String &p_name); void set_input_event_forwarding_always_enabled(); @@ -277,7 +277,7 @@ public: void add_translation_parser_plugin(const Ref<EditorTranslationParserPlugin> &p_parser); void remove_translation_parser_plugin(const Ref<EditorTranslationParserPlugin> &p_parser); - void add_import_plugin(const Ref<EditorImportPlugin> &p_importer); + void add_import_plugin(const Ref<EditorImportPlugin> &p_importer, bool p_first_priority = false); void remove_import_plugin(const Ref<EditorImportPlugin> &p_importer); void add_export_plugin(const Ref<EditorExportPlugin> &p_exporter); @@ -289,10 +289,10 @@ public: void add_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin); void remove_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin); - void add_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer); + void add_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer, bool p_first_priority = false); void remove_scene_format_importer_plugin(const Ref<EditorSceneFormatImporter> &p_importer); - void add_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_importer); + void add_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_importer, bool p_first_priority = false); void remove_scene_post_import_plugin(const Ref<EditorScenePostImportPlugin> &p_importer); void add_autoload_singleton(const String &p_name, const String &p_path); @@ -311,7 +311,7 @@ public: VARIANT_ENUM_CAST(EditorPlugin::CustomControlContainer); VARIANT_ENUM_CAST(EditorPlugin::DockSlot); -typedef EditorPlugin *(*EditorPluginCreateFunc)(EditorNode *); +typedef EditorPlugin *(*EditorPluginCreateFunc)(); class EditorPlugins { enum { @@ -322,15 +322,15 @@ class EditorPlugins { static int creation_func_count; template <class T> - static EditorPlugin *creator(EditorNode *p_node) { - return memnew(T(p_node)); + static EditorPlugin *creator() { + return memnew(T); } public: static int get_plugin_count() { return creation_func_count; } - static EditorPlugin *create(int p_idx, EditorNode *p_editor) { + static EditorPlugin *create(int p_idx) { ERR_FAIL_INDEX_V(p_idx, creation_func_count, nullptr); - return creation_funcs[p_idx](p_editor); + return creation_funcs[p_idx](); } template <class T> diff --git a/editor/editor_plugin_settings.cpp b/editor/editor_plugin_settings.cpp index 80329a36b2..401414ae50 100644 --- a/editor/editor_plugin_settings.cpp +++ b/editor/editor_plugin_settings.cpp @@ -34,16 +34,20 @@ #include "core/io/config_file.h" #include "core/io/file_access.h" #include "core/os/main_loop.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" #include "scene/gui/margin_container.h" void EditorPluginSettings::_notification(int p_what) { - if (p_what == NOTIFICATION_WM_WINDOW_FOCUS_IN) { - update_plugins(); - } else if (p_what == Node::NOTIFICATION_READY) { - plugin_config_dialog->connect("plugin_ready", Callable(EditorNode::get_singleton(), "_on_plugin_ready")); - plugin_list->connect("button_pressed", callable_mp(this, &EditorPluginSettings::_cell_button_pressed)); + switch (p_what) { + case NOTIFICATION_WM_WINDOW_FOCUS_IN: { + update_plugins(); + } break; + + case Node::NOTIFICATION_READY: { + plugin_config_dialog->connect("plugin_ready", Callable(EditorNode::get_singleton(), "_on_plugin_ready")); + plugin_list->connect("button_pressed", callable_mp(this, &EditorPluginSettings::_cell_button_pressed)); + } break; } } diff --git a/editor/editor_plugin_settings.h b/editor/editor_plugin_settings.h index 8ff6e4b9e1..4648d105f7 100644 --- a/editor/editor_plugin_settings.h +++ b/editor/editor_plugin_settings.h @@ -32,8 +32,8 @@ #define EDITORPLUGINSETTINGS_H #include "core/object/undo_redo.h" +#include "editor/editor_data.h" #include "editor/plugin_config_dialog.h" -#include "editor_data.h" #include "property_editor.h" #include "scene/gui/dialogs.h" diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index bce553661c..68a3fabe1e 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -30,11 +30,13 @@ #include "editor_properties.h" +#include "core/config/project_settings.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" +#include "editor/editor_properties_array_dict.h" #include "editor/editor_resource_preview.h" +#include "editor/editor_scale.h" #include "editor/filesystem_dock.h" -#include "editor_node.h" -#include "editor_properties_array_dict.h" -#include "editor_scale.h" #include "scene/2d/gpu_particles_2d.h" #include "scene/3d/fog_volume.h" #include "scene/3d/gpu_particles_3d.h" @@ -164,7 +166,6 @@ void EditorPropertyMultilineText::_notification(int p_what) { Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Label")); int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); text->set_custom_minimum_size(Vector2(0, font->get_height(font_size) * 6)); - } break; } } @@ -292,11 +293,11 @@ void EditorPropertyTextEnum::_bind_methods() { void EditorPropertyTextEnum::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_THEME_CHANGED: { edit_button->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); accept_button->set_icon(get_theme_icon(SNAME("ImportCheck"), SNAME("EditorIcons"))); cancel_button->set_icon(get_theme_icon(SNAME("ImportFail"), SNAME("EditorIcons"))); - break; + } break; } } @@ -372,8 +373,11 @@ void EditorPropertyLocale::setup(const String &p_hint_text) { } void EditorPropertyLocale::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - locale_edit->set_icon(get_theme_icon(SNAME("Translation"), SNAME("EditorIcons"))); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + locale_edit->set_icon(get_theme_icon(SNAME("Translation"), SNAME("EditorIcons"))); + } break; } } @@ -465,8 +469,11 @@ void EditorPropertyPath::set_save_mode() { } void EditorPropertyPath::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - path_edit->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + path_edit->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); + } break; } } @@ -592,7 +599,7 @@ void EditorPropertyMember::_property_select() { } else if (hint == MEMBER_PROPERTY_OF_VARIANT_TYPE) { Variant::Type type = Variant::NIL; String tname = hint_text; - if (tname.find(".") != -1) { + if (tname.contains(".")) { tname = tname.get_slice(".", 0); } for (int i = 0; i < Variant::VARIANT_MAX; i++) { @@ -809,7 +816,7 @@ void EditorPropertyLayersGrid::_rename_operation_confirm() { if (new_name.length() == 0) { EditorNode::get_singleton()->show_warning(TTR("No name provided.")); return; - } else if (new_name.find("/") != -1 || new_name.find("\\") != -1 || new_name.find(":") != -1) { + } else if (new_name.contains("/") || new_name.contains("\\") || new_name.contains(":")) { EditorNode::get_singleton()->show_warning(TTR("Name contains invalid characters.")); return; } @@ -1063,9 +1070,6 @@ void EditorPropertyLayersGrid::_notification(int p_what) { update(); } } break; - - default: - break; } } @@ -1617,11 +1621,14 @@ void EditorPropertyVector2::update_property() { } void EditorPropertyVector2::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 2; i++) { - spin[i]->set_custom_label_color(true, colors[i]); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 2; i++) { + spin[i]->set_custom_label_color(true, colors[i]); + } + } break; } } @@ -1708,11 +1715,14 @@ void EditorPropertyRect2::update_property() { } void EditorPropertyRect2::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 4; i++) { - spin[i]->set_custom_label_color(true, colors[i % 2]); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 4; i++) { + spin[i]->set_custom_label_color(true, colors[i % 2]); + } + } break; } } @@ -1834,11 +1844,14 @@ Vector3 EditorPropertyVector3::get_vector() { } void EditorPropertyVector3::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 3; i++) { - spin[i]->set_custom_label_color(true, colors[i]); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 3; i++) { + spin[i]->set_custom_label_color(true, colors[i]); + } + } break; } } @@ -1921,11 +1934,14 @@ void EditorPropertyVector2i::update_property() { } void EditorPropertyVector2i::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 2; i++) { - spin[i]->set_custom_label_color(true, colors[i]); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 2; i++) { + spin[i]->set_custom_label_color(true, colors[i]); + } + } break; } } @@ -2012,11 +2028,14 @@ void EditorPropertyRect2i::update_property() { } void EditorPropertyRect2i::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 4; i++) { - spin[i]->set_custom_label_color(true, colors[i % 2]); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 4; i++) { + spin[i]->set_custom_label_color(true, colors[i % 2]); + } + } break; } } @@ -2111,11 +2130,14 @@ void EditorPropertyVector3i::update_property() { } void EditorPropertyVector3i::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 3; i++) { - spin[i]->set_custom_label_color(true, colors[i]); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 3; i++) { + spin[i]->set_custom_label_color(true, colors[i]); + } + } break; } } @@ -2201,11 +2223,14 @@ void EditorPropertyPlane::update_property() { } void EditorPropertyPlane::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 4; i++) { - spin[i]->set_custom_label_color(true, colors[i]); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 4; i++) { + spin[i]->set_custom_label_color(true, colors[i]); + } + } break; } } @@ -2292,11 +2317,14 @@ void EditorPropertyQuaternion::update_property() { } void EditorPropertyQuaternion::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 4; i++) { - spin[i]->set_custom_label_color(true, colors[i]); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 4; i++) { + spin[i]->set_custom_label_color(true, colors[i]); + } + } break; } } @@ -2386,11 +2414,14 @@ void EditorPropertyAABB::update_property() { } void EditorPropertyAABB::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 6; i++) { - spin[i]->set_custom_label_color(true, colors[i % 3]); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 6; i++) { + spin[i]->set_custom_label_color(true, colors[i % 3]); + } + } break; } } @@ -2467,16 +2498,19 @@ void EditorPropertyTransform2D::update_property() { } void EditorPropertyTransform2D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 6; i++) { - // For Transform2D, use the 4th color (cyan) for the origin vector. - if (i % 3 == 2) { - spin[i]->set_custom_label_color(true, colors[3]); - } else { - spin[i]->set_custom_label_color(true, colors[i % 3]); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 6; i++) { + // For Transform2D, use the 4th color (cyan) for the origin vector. + if (i % 3 == 2) { + spin[i]->set_custom_label_color(true, colors[3]); + } else { + spin[i]->set_custom_label_color(true, colors[i % 3]); + } } - } + } break; } } @@ -2560,11 +2594,14 @@ void EditorPropertyBasis::update_property() { } void EditorPropertyBasis::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 9; i++) { - spin[i]->set_custom_label_color(true, colors[i % 3]); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 9; i++) { + spin[i]->set_custom_label_color(true, colors[i % 3]); + } + } break; } } @@ -2654,11 +2691,14 @@ void EditorPropertyTransform3D::update_using_transform(Transform3D p_transform) } void EditorPropertyTransform3D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - const Color *colors = _get_property_colors(); - for (int i = 0; i < 12; i++) { - spin[i]->set_custom_label_color(true, colors[i % 4]); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + const Color *colors = _get_property_colors(); + for (int i = 0; i < 12; i++) { + spin[i]->set_custom_label_color(true, colors[i % 4]); + } + } break; } } @@ -2883,7 +2923,7 @@ void EditorPropertyNodePath::update_property() { Node *target_node = base_node->get_node(p); ERR_FAIL_COND(!target_node); - if (String(target_node->get_name()).find("@") != -1) { + if (String(target_node->get_name()).contains("@")) { assign->set_icon(Ref<Texture2D>()); assign->set_text(p); return; @@ -2900,9 +2940,12 @@ void EditorPropertyNodePath::setup(const NodePath &p_base_hint, Vector<StringNam } void EditorPropertyNodePath::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - Ref<Texture2D> t = get_theme_icon(SNAME("Clear"), SNAME("EditorIcons")); - clear->set_icon(t); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + Ref<Texture2D> t = get_theme_icon(SNAME("Clear"), SNAME("EditorIcons")); + clear->set_icon(t); + } break; } } @@ -3318,9 +3361,9 @@ struct EditorPropertyRangeHint { bool angle_in_degrees = false; bool greater = true; bool lesser = true; - double min = -99999; - double max = 99999; - double step = 0; + double min = -99999.0; + double max = 99999.0; + double step = 1.0; String suffix; bool exp_range = false; bool hide_slider = true; @@ -3331,18 +3374,25 @@ static EditorPropertyRangeHint _parse_range_hint(PropertyHint p_hint, const Stri EditorPropertyRangeHint hint; hint.step = p_default_step; bool degrees = false; - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - hint.greater = false; //if using ranged, assume false by default + + if (p_hint == PROPERTY_HINT_RANGE) { + Vector<String> slices = p_hint_text.split(","); + ERR_FAIL_COND_V_MSG(slices.size() < 2, hint, + vformat("Invalid PROPERTY_HINT_RANGE with hint \"%s\": Missing required min and/or max values.", p_hint_text)); + + hint.greater = false; // If using ranged, assume false by default. hint.lesser = false; - hint.min = p_hint_text.get_slice(",", 0).to_float(); - hint.max = p_hint_text.get_slice(",", 1).to_float(); - if (p_hint_text.get_slice_count(",") >= 3) { - hint.step = p_hint_text.get_slice(",", 2).to_float(); + hint.min = slices[0].to_float(); + hint.max = slices[1].to_float(); + + if (slices.size() >= 3 && slices[2].is_valid_float()) { + // Step is optional, could be something else if not a number. + hint.step = slices[2].to_float(); } hint.hide_slider = false; - for (int i = 2; i < p_hint_text.get_slice_count(","); i++) { - String slice = p_hint_text.get_slice(",", i).strip_edges(); + for (int i = 2; i < slices.size(); i++) { + String slice = slices[i].strip_edges(); if (slice == "radians") { hint.radians = true; } else if (slice == "degrees") { @@ -3365,6 +3415,9 @@ static EditorPropertyRangeHint _parse_range_hint(PropertyHint p_hint, const Stri hint.suffix = U"\u00B0"; } + ERR_FAIL_COND_V_MSG(hint.step == 0, hint, + vformat("Invalid PROPERTY_HINT_RANGE with hint \"%s\": Step cannot be 0.", p_hint_text)); + return hint; } @@ -3435,7 +3488,6 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ EditorPropertyInteger *editor = memnew(EditorPropertyInteger); EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1); - editor->setup(hint.min, hint.max, hint.step, hint.greater, hint.lesser); return editor; diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index 71a855b22c..61261af608 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -32,9 +32,9 @@ #include "core/input/input.h" #include "core/io/marshalls.h" -#include "editor/editor_node.h" +#include "editor/editor_properties.h" #include "editor/editor_scale.h" -#include "editor_properties.h" +#include "editor/inspector_dock.h" bool EditorPropertyArrayObject::_set(const StringName &p_name, const Variant &p_value) { String name = p_name; @@ -259,8 +259,8 @@ void EditorPropertyArray::update_property() { } int size = array.call("size"); - int pages = MAX(0, size - 1) / page_length + 1; - page_index = MIN(page_index, pages - 1); + int max_page = MAX(0, size - 1) / page_length; + page_index = MIN(page_index, max_page); int offset = page_index * page_length; edit->set_text(arrtype + " (size " + itos(size) + ")"); @@ -292,35 +292,37 @@ void EditorPropertyArray::update_property() { size_slider->connect("value_changed", callable_mp(this, &EditorPropertyArray::_length_changed)); hbox->add_child(size_slider); - page_hbox = memnew(HBoxContainer); - vbox->add_child(page_hbox); + property_vbox = memnew(VBoxContainer); + property_vbox->set_h_size_flags(SIZE_EXPAND_FILL); + vbox->add_child(property_vbox); - label = memnew(Label(TTR("Page: "))); - label->set_h_size_flags(SIZE_EXPAND_FILL); - page_hbox->add_child(label); + button_add_item = memnew(Button); + button_add_item->set_text(TTR("Add Element")); + button_add_item->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + button_add_item->connect(SNAME("pressed"), callable_mp(this, &EditorPropertyArray::_add_element)); + vbox->add_child(button_add_item); - page_slider = memnew(EditorSpinSlider); - page_slider->set_step(1); - page_slider->set_h_size_flags(SIZE_EXPAND_FILL); - page_slider->connect("value_changed", callable_mp(this, &EditorPropertyArray::_page_changed)); - page_hbox->add_child(page_slider); + paginator = memnew(EditorPaginator); + paginator->connect("page_changed", callable_mp(this, &EditorPropertyArray::_page_changed)); + vbox->add_child(paginator); } else { // Bye bye children of the box. - for (int i = vbox->get_child_count() - 1; i >= 2; i--) { - Node *child = vbox->get_child(i); + for (int i = property_vbox->get_child_count() - 1; i >= 0; i--) { + Node *child = property_vbox->get_child(i); if (child == reorder_selected_element_hbox) { continue; // Don't remove the property that the user is moving. } child->queue_delete(); // Button still needed after pressed is called. - vbox->remove_child(child); + property_vbox->remove_child(child); } } size_slider->set_value(size); - page_slider->set_max(pages); - page_slider->set_value(page_index); - page_hbox->set_visible(pages > 1); + property_vbox->set_visible(size > 0); + button_add_item->set_visible(page_index == max_page); + paginator->update(page_index, max_page); + paginator->set_visible(max_page > 0); if (array.get_type() == Variant::ARRAY) { array = array.call("duplicate"); @@ -343,7 +345,7 @@ void EditorPropertyArray::update_property() { } HBoxContainer *hbox = memnew(HBoxContainer); - vbox->add_child(hbox); + property_vbox->add_child(hbox); Button *reorder_button = memnew(Button); reorder_button->set_icon(get_theme_icon(SNAME("TripleBar"), SNAME("EditorIcons"))); @@ -397,7 +399,7 @@ void EditorPropertyArray::update_property() { } if (reorder_to_index % page_length > 0) { - vbox->move_child(vbox->get_child(2), reorder_to_index % page_length + 2); + property_vbox->move_child(property_vbox->get_child(0), reorder_to_index % page_length); } updating = false; @@ -502,20 +504,37 @@ void EditorPropertyArray::drop_data_fw(const Point2 &p_point, const Variant &p_d } void EditorPropertyArray::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAG_BEGIN) { - if (is_visible_in_tree()) { - if (_is_drop_valid(get_viewport()->gui_get_drag_data())) { - dropping = true; - edit->update(); + switch (p_what) { + case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_ENTER_TREE: { + change_type->clear(); + for (int i = 0; i < Variant::VARIANT_MAX; i++) { + String type = Variant::get_type_name(Variant::Type(i)); + change_type->add_icon_item(get_theme_icon(type, SNAME("EditorIcons")), type, i); } - } - } + change_type->add_separator(); + change_type->add_icon_item(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Remove Item"), Variant::VARIANT_MAX); - if (p_what == NOTIFICATION_DRAG_END) { - if (dropping) { - dropping = false; - edit->update(); - } + if (Object::cast_to<Button>(button_add_item)) { + button_add_item->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + } + } break; + + case NOTIFICATION_DRAG_BEGIN: { + if (is_visible_in_tree()) { + if (_is_drop_valid(get_viewport()->gui_get_drag_data())) { + dropping = true; + edit->update(); + } + } + } break; + + case NOTIFICATION_DRAG_END: { + if (dropping) { + dropping = false; + edit->update(); + } + } break; } } @@ -532,7 +551,7 @@ void EditorPropertyArray::_edit_pressed() { update_property(); } -void EditorPropertyArray::_page_changed(double p_page) { +void EditorPropertyArray::_page_changed(int p_page) { if (updating) { return; } @@ -579,6 +598,10 @@ void EditorPropertyArray::_length_changed(double p_page) { update_property(); } +void EditorPropertyArray::_add_element() { + _length_changed(double(object->get_array().call("size")) + 1.0); +} + void EditorPropertyArray::setup(Variant::Type p_array_type, const String &p_hint_string) { array_type = p_array_type; @@ -623,9 +646,9 @@ void EditorPropertyArray::_reorder_button_gui_input(const Ref<InputEvent> &p_eve reorder_to_index += direction; if ((direction < 0 && reorder_to_index % page_length == page_length - 1) || (direction > 0 && reorder_to_index % page_length == 0)) { // Automatically move to the next/previous page. - page_slider->set_value(page_index + direction); + _page_changed(page_index + direction); } - vbox->move_child(reorder_selected_element_hbox, reorder_to_index % page_length + 2); + property_vbox->move_child(reorder_selected_element_hbox, reorder_to_index % page_length); // Ensure the moving element is visible. InspectorDock::get_inspector_singleton()->ensure_control_visible(reorder_selected_element_hbox); } @@ -635,7 +658,7 @@ void EditorPropertyArray::_reorder_button_gui_input(const Ref<InputEvent> &p_eve void EditorPropertyArray::_reorder_button_down(int p_index) { reorder_from_index = p_index; reorder_to_index = p_index; - reorder_selected_element_hbox = Object::cast_to<HBoxContainer>(vbox->get_child(p_index % page_length + 2)); + reorder_selected_element_hbox = Object::cast_to<HBoxContainer>(property_vbox->get_child(p_index % page_length)); reorder_selected_button = Object::cast_to<Button>(reorder_selected_element_hbox->get_child(0)); // Ideally it'd to be able to show the mouse but I had issues with // Control's `mouse_exit()`/`mouse_entered()` signals not getting called. @@ -648,7 +671,7 @@ void EditorPropertyArray::_reorder_button_up() { Variant array = object->get_array(); Variant value_to_move = array.get(reorder_from_index); - array.call("remove", reorder_from_index); + array.call("remove_at", reorder_from_index); array.call("insert", reorder_to_index, value_to_move); emit_changed(get_edited_property(), array, "", false); @@ -675,6 +698,7 @@ void EditorPropertyArray::_bind_methods() { EditorPropertyArray::EditorPropertyArray() { object.instantiate(); page_length = int(EDITOR_GET("interface/inspector/max_array_dictionary_items_per_page")); + edit = memnew(Button); edit->set_h_size_flags(SIZE_EXPAND_FILL); edit->set_clip_text(true); @@ -684,20 +708,16 @@ EditorPropertyArray::EditorPropertyArray() { edit->connect("draw", callable_mp(this, &EditorPropertyArray::_button_draw)); add_child(edit); add_focusable(edit); + vbox = nullptr; - page_slider = nullptr; + property_vbox = nullptr; size_slider = nullptr; + button_add_item = nullptr; + paginator = nullptr; updating = false; change_type = memnew(PopupMenu); add_child(change_type); change_type->connect("id_pressed", callable_mp(this, &EditorPropertyArray::_change_type_menu)); - - for (int i = 0; i < Variant::VARIANT_MAX; i++) { - String type = Variant::get_type_name(Variant::Type(i)); - change_type->add_item(type, i); - } - change_type->add_separator(); - change_type->add_item(TTR("Remove Item"), Variant::VARIANT_MAX); changing_type_index = -1; subtype = Variant::NIL; @@ -821,35 +841,32 @@ void EditorPropertyDictionary::update_property() { add_child(vbox); set_bottom_editor(vbox); - page_hbox = memnew(HBoxContainer); - vbox->add_child(page_hbox); - Label *label = memnew(Label(TTR("Page: "))); - label->set_h_size_flags(SIZE_EXPAND_FILL); - page_hbox->add_child(label); - page_slider = memnew(EditorSpinSlider); - page_slider->set_step(1); - page_hbox->add_child(page_slider); - page_slider->set_h_size_flags(SIZE_EXPAND_FILL); - page_slider->connect("value_changed", callable_mp(this, &EditorPropertyDictionary::_page_changed)); + property_vbox = memnew(VBoxContainer); + property_vbox->set_h_size_flags(SIZE_EXPAND_FILL); + vbox->add_child(property_vbox); + + paginator = memnew(EditorPaginator); + paginator->connect("page_changed", callable_mp(this, &EditorPropertyDictionary::_page_changed)); + vbox->add_child(paginator); } else { // Queue children for deletion, deleting immediately might cause errors. - for (int i = 1; i < vbox->get_child_count(); i++) { - vbox->get_child(i)->queue_delete(); + for (int i = property_vbox->get_child_count() - 1; i >= 0; i--) { + property_vbox->get_child(i)->queue_delete(); } } int size = dict.size(); - int pages = MAX(0, size - 1) / page_length + 1; + int max_page = MAX(0, size - 1) / page_length; + page_index = MIN(page_index, max_page); - page_slider->set_max(pages); - page_index = MIN(page_index, pages - 1); - page_slider->set_value(page_index); - page_hbox->set_visible(pages > 1); + paginator->update(page_index, max_page); + paginator->set_visible(max_page > 0); int offset = page_index * page_length; int amount = MIN(size - offset, page_length); + int total_amount = page_index == max_page ? amount + 2 : amount; // For the "Add Key/Value Pair" box on last page. dict = dict.duplicate(); @@ -857,7 +874,7 @@ void EditorPropertyDictionary::update_property() { VBoxContainer *add_vbox = nullptr; double default_float_step = EDITOR_GET("interface/inspector/default_float_step"); - for (int i = 0; i < amount + 2; i++) { + for (int i = 0; i < total_amount; i++) { String prop_name; Variant key; Variant value; @@ -1071,15 +1088,9 @@ void EditorPropertyDictionary::update_property() { if (i == amount) { PanelContainer *pc = memnew(PanelContainer); - vbox->add_child(pc); - Ref<StyleBoxFlat> flat; - flat.instantiate(); - for (int j = 0; j < 4; j++) { - flat->set_default_margin(Side(j), 2 * EDSCALE); - } - flat->set_bg_color(get_theme_color(SNAME("prop_subsection"), SNAME("Editor"))); + property_vbox->add_child(pc); + pc->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("DictionaryAddItem"), SNAME("EditorStyles"))); - pc->add_theme_style_override("panel", flat); add_vbox = memnew(VBoxContainer); pc->add_child(add_vbox); } @@ -1107,7 +1118,7 @@ void EditorPropertyDictionary::update_property() { if (add_vbox) { add_vbox->add_child(hbox); } else { - vbox->add_child(hbox); + property_vbox->add_child(hbox); } hbox->add_child(prop); prop->set_h_size_flags(SIZE_EXPAND_FILL); @@ -1119,10 +1130,11 @@ void EditorPropertyDictionary::update_property() { prop->update_property(); if (i == amount + 1) { - Button *butt_add_item = memnew(Button); - butt_add_item->set_text(TTR("Add Key/Value Pair")); - butt_add_item->connect("pressed", callable_mp(this, &EditorPropertyDictionary::_add_key_value)); - add_vbox->add_child(butt_add_item); + button_add_item = memnew(Button); + button_add_item->set_text(TTR("Add Key/Value Pair")); + button_add_item->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + button_add_item->connect("pressed", callable_mp(this, &EditorPropertyDictionary::_add_key_value)); + add_vbox->add_child(button_add_item); } } @@ -1142,6 +1154,22 @@ void EditorPropertyDictionary::_object_id_selected(const StringName &p_property, } void EditorPropertyDictionary::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_ENTER_TREE: { + change_type->clear(); + for (int i = 0; i < Variant::VARIANT_MAX; i++) { + String type = Variant::get_type_name(Variant::Type(i)); + change_type->add_icon_item(get_theme_icon(type, SNAME("EditorIcons")), type, i); + } + change_type->add_separator(); + change_type->add_icon_item(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Remove Item"), Variant::VARIANT_MAX); + + if (Object::cast_to<Button>(button_add_item)) { + button_add_item->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + } + } break; + } } void EditorPropertyDictionary::_edit_pressed() { @@ -1156,7 +1184,7 @@ void EditorPropertyDictionary::_edit_pressed() { update_property(); } -void EditorPropertyDictionary::_page_changed(double p_page) { +void EditorPropertyDictionary::_page_changed(int p_page) { if (updating) { return; } @@ -1170,6 +1198,7 @@ void EditorPropertyDictionary::_bind_methods() { EditorPropertyDictionary::EditorPropertyDictionary() { object.instantiate(); page_length = int(EDITOR_GET("interface/inspector/max_array_dictionary_items_per_page")); + edit = memnew(Button); edit->set_h_size_flags(SIZE_EXPAND_FILL); edit->set_clip_text(true); @@ -1177,18 +1206,13 @@ EditorPropertyDictionary::EditorPropertyDictionary() { edit->set_toggle_mode(true); add_child(edit); add_focusable(edit); + vbox = nullptr; - page_slider = nullptr; + button_add_item = nullptr; + paginator = nullptr; updating = false; change_type = memnew(PopupMenu); add_child(change_type); change_type->connect("id_pressed", callable_mp(this, &EditorPropertyDictionary::_change_type_menu)); - - for (int i = 0; i < Variant::VARIANT_MAX; i++) { - String type = Variant::get_type_name(Variant::Type(i)); - change_type->add_item(type, i); - } - change_type->add_separator(); - change_type->add_item(TTR("Remove Item"), Variant::VARIANT_MAX); changing_type_index = -1; } diff --git a/editor/editor_properties_array_dict.h b/editor/editor_properties_array_dict.h index 4c31ba0b49..292de6d6db 100644 --- a/editor/editor_properties_array_dict.h +++ b/editor/editor_properties_array_dict.h @@ -89,9 +89,10 @@ class EditorPropertyArray : public EditorProperty { int changing_type_index; Button *edit; VBoxContainer *vbox; + VBoxContainer *property_vbox; EditorSpinSlider *size_slider; - EditorSpinSlider *page_slider; - HBoxContainer *page_hbox; + Button *button_add_item; + EditorPaginator *paginator; Variant::Type array_type; Variant::Type subtype; PropertyHint subtype_hint; @@ -103,8 +104,9 @@ class EditorPropertyArray : public EditorProperty { HBoxContainer *reorder_selected_element_hbox = nullptr; Button *reorder_selected_button = nullptr; - void _page_changed(double p_page); + void _page_changed(int p_page); void _length_changed(double p_page); + void _add_element(); void _edit_pressed(); void _property_changed(const String &p_property, Variant p_value, const String &p_name = "", bool p_changing = false); void _change_type(Object *p_button, int p_index); @@ -144,11 +146,12 @@ class EditorPropertyDictionary : public EditorProperty { int changing_type_index; Button *edit; VBoxContainer *vbox; + VBoxContainer *property_vbox; EditorSpinSlider *size_slider; - EditorSpinSlider *page_slider; - HBoxContainer *page_hbox; + Button *button_add_item; + EditorPaginator *paginator; - void _page_changed(double p_page); + void _page_changed(int p_page); void _edit_pressed(); void _property_changed(const String &p_property, Variant p_value, const String &p_name = "", bool p_changing = false); void _change_type(Object *p_button, int p_index); diff --git a/editor/editor_resource_picker.cpp b/editor/editor_resource_picker.cpp index 716643f812..2f14667fc0 100644 --- a/editor/editor_resource_picker.cpp +++ b/editor/editor_resource_picker.cpp @@ -30,11 +30,15 @@ #include "editor_resource_picker.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_resource_preview.h" -#include "editor_node.h" -#include "editor_scale.h" -#include "editor_settings.h" -#include "filesystem_dock.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" +#include "editor/filesystem_dock.h" +#include "editor/plugins/script_editor_plugin.h" +#include "editor/quick_open.h" +#include "editor/scene_tree_dock.h" HashMap<StringName, List<StringName>> EditorResourcePicker::allowed_types_cache; @@ -77,16 +81,16 @@ void EditorResourcePicker::_update_resource_preview(const String &p_path, const return; } - String type = edited_resource->get_class_name(); - if (ClassDB::is_parent_class(type, "Script")) { - assign_button->set_text(edited_resource->get_path().get_file()); + Ref<Script> script = edited_resource; + if (script.is_valid()) { + assign_button->set_text(script->get_path().get_file()); return; } if (p_preview.is_valid()) { preview_rect->set_offset(SIDE_LEFT, assign_button->get_icon()->get_width() + assign_button->get_theme_stylebox(SNAME("normal"))->get_default_margin(SIDE_LEFT) + get_theme_constant(SNAME("hseparation"), SNAME("Button"))); - if (type == "GradientTexture1D") { + if (Ref<GradientTexture1D>(edited_resource).is_valid()) { preview_rect->set_stretch_mode(TextureRect::STRETCH_SCALE); assign_button->set_custom_minimum_size(Size2(1, 1)); } else { @@ -377,6 +381,8 @@ void EditorResourcePicker::_edit_menu_cbk(int p_which) { Resource *resp = Object::cast_to<Resource>(obj); ERR_BREAK(!resp); + EditorNode::get_editor_data().instantiate_object_properties(obj); + edited_resource = RES(resp); emit_signal(SNAME("resource_changed"), edited_resource); _update_resource(); @@ -640,7 +646,7 @@ void EditorResourcePicker::drop_data_fw(const Point2 &p_point, const Variant &p_ for (Set<String>::Element *E = allowed_types.front(); E; E = E->next()) { String at = E->get().strip_edges(); - if (at == "BaseMaterial3D" && ClassDB::is_parent_class(dropped_resource->get_class(), "Texture2D")) { + if (at == "BaseMaterial3D" && Ref<Texture2D>(dropped_resource).is_valid()) { // Use existing resource if possible and only replace its data. Ref<StandardMaterial3D> mat = edited_resource; if (!mat.is_valid()) { @@ -651,7 +657,7 @@ void EditorResourcePicker::drop_data_fw(const Point2 &p_point, const Variant &p_ break; } - if (at == "ShaderMaterial" && ClassDB::is_parent_class(dropped_resource->get_class(), "Shader")) { + if (at == "ShaderMaterial" && Ref<Shader>(dropped_resource).is_valid()) { Ref<ShaderMaterial> mat = edited_resource; if (!mat.is_valid()) { mat.instantiate(); @@ -661,7 +667,7 @@ void EditorResourcePicker::drop_data_fw(const Point2 &p_point, const Variant &p_ break; } - if (at == "Font" && ClassDB::is_parent_class(dropped_resource->get_class(), "FontData")) { + if (at == "Font" && Ref<FontData>(dropped_resource).is_valid()) { Ref<Font> font = edited_resource; if (!font.is_valid()) { font.instantiate(); @@ -671,7 +677,7 @@ void EditorResourcePicker::drop_data_fw(const Point2 &p_point, const Variant &p_ break; } - if (at == "Texture2D" && ClassDB::is_parent_class(dropped_resource->get_class(), "Image")) { + if (at == "Texture2D" && Ref<Image>(dropped_resource).is_valid()) { Ref<ImageTexture> texture = edited_resource; if (!texture.is_valid()) { texture.instantiate(); diff --git a/editor/editor_resource_picker.h b/editor/editor_resource_picker.h index 8ffa52f14f..a6eff760e7 100644 --- a/editor/editor_resource_picker.h +++ b/editor/editor_resource_picker.h @@ -31,13 +31,14 @@ #ifndef EDITOR_RESOURCE_PICKER_H #define EDITOR_RESOURCE_PICKER_H -#include "editor_file_dialog.h" -#include "quick_open.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" #include "scene/gui/popup_menu.h" #include "scene/gui/texture_rect.h" +class EditorFileDialog; +class EditorQuickOpen; + class EditorResourcePicker : public HBoxContainer { GDCLASS(EditorResourcePicker, HBoxContainer); diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp index 2d1335270c..2bc92427e5 100644 --- a/editor/editor_resource_preview.cpp +++ b/editor/editor_resource_preview.cpp @@ -35,9 +35,10 @@ #include "core/io/resource_loader.h" #include "core/io/resource_saver.h" #include "core/object/message_queue.h" -#include "editor_node.h" -#include "editor_scale.h" -#include "editor_settings.h" +#include "editor/editor_node.h" +#include "editor/editor_paths.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" bool EditorResourcePreviewGenerator::handles(const String &p_type) const { bool success; diff --git a/editor/editor_run.cpp b/editor/editor_run.cpp index 574abf85ea..4743294967 100644 --- a/editor/editor_run.cpp +++ b/editor/editor_run.cpp @@ -32,7 +32,7 @@ #include "core/config/project_settings.h" #include "editor/editor_node.h" -#include "editor_settings.h" +#include "editor/editor_settings.h" #include "servers/display_server.h" EditorRun::Status EditorRun::get_status() const { diff --git a/editor/editor_run_native.cpp b/editor/editor_run_native.cpp index adaeaad6ae..85d304ec5d 100644 --- a/editor/editor_run_native.cpp +++ b/editor/editor_run_native.cpp @@ -30,66 +30,68 @@ #include "editor_run_native.h" -#include "editor_export.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_export.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" void EditorRunNative::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - for (int i = 0; i < EditorExport::get_singleton()->get_export_platform_count(); i++) { - Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(i); - if (eep.is_null()) { - continue; - } - Ref<ImageTexture> icon = eep->get_run_icon(); - if (!icon.is_null()) { - Ref<Image> im = icon->get_image(); - im = im->duplicate(); - im->clear_mipmaps(); - if (!im->is_empty()) { - im->resize(16 * EDSCALE, 16 * EDSCALE); - Ref<ImageTexture> small_icon; - small_icon.instantiate(); - small_icon->create_from_image(im); - MenuButton *mb = memnew(MenuButton); - mb->get_popup()->connect("id_pressed", callable_mp(this, &EditorRunNative::run_native), varray(i)); - mb->connect("pressed", callable_mp(this, &EditorRunNative::run_native), varray(-1, i)); - mb->set_icon(small_icon); - add_child(mb); - menus[i] = mb; + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + for (int i = 0; i < EditorExport::get_singleton()->get_export_platform_count(); i++) { + Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(i); + if (eep.is_null()) { + continue; + } + Ref<ImageTexture> icon = eep->get_run_icon(); + if (!icon.is_null()) { + Ref<Image> im = icon->get_image(); + im = im->duplicate(); + im->clear_mipmaps(); + if (!im->is_empty()) { + im->resize(16 * EDSCALE, 16 * EDSCALE); + Ref<ImageTexture> small_icon; + small_icon.instantiate(); + small_icon->create_from_image(im); + MenuButton *mb = memnew(MenuButton); + mb->get_popup()->connect("id_pressed", callable_mp(this, &EditorRunNative::run_native), varray(i)); + mb->connect("pressed", callable_mp(this, &EditorRunNative::run_native), varray(-1, i)); + mb->set_icon(small_icon); + add_child(mb); + menus[i] = mb; + } } } - } - } + } break; - if (p_what == NOTIFICATION_PROCESS) { - bool changed = EditorExport::get_singleton()->poll_export_platforms() || first; - - if (changed) { - for (KeyValue<int, MenuButton *> &E : menus) { - Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(E.key); - MenuButton *mb = E.value; - int dc = eep->get_options_count(); - - if (dc == 0) { - mb->hide(); - } else { - mb->get_popup()->clear(); - mb->show(); - if (dc == 1) { - mb->set_tooltip(eep->get_option_tooltip(0)); + case NOTIFICATION_PROCESS: { + bool changed = EditorExport::get_singleton()->poll_export_platforms() || first; + + if (changed) { + for (KeyValue<int, MenuButton *> &E : menus) { + Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(E.key); + MenuButton *mb = E.value; + int dc = eep->get_options_count(); + + if (dc == 0) { + mb->hide(); } else { - mb->set_tooltip(eep->get_options_tooltip()); - for (int i = 0; i < dc; i++) { - mb->get_popup()->add_icon_item(eep->get_option_icon(i), eep->get_option_label(i)); - mb->get_popup()->set_item_tooltip(mb->get_popup()->get_item_count() - 1, eep->get_option_tooltip(i)); + mb->get_popup()->clear(); + mb->show(); + if (dc == 1) { + mb->set_tooltip(eep->get_option_tooltip(0)); + } else { + mb->set_tooltip(eep->get_options_tooltip()); + for (int i = 0; i < dc; i++) { + mb->get_popup()->add_icon_item(eep->get_option_icon(i), eep->get_option_label(i)); + mb->get_popup()->set_item_tooltip(mb->get_popup()->get_item_count() - 1, eep->get_option_tooltip(i)); + } } } } - } - first = false; - } + first = false; + } + } break; } } diff --git a/editor/editor_run_script.cpp b/editor/editor_run_script.cpp index 77173d178b..2197bc8eb7 100644 --- a/editor/editor_run_script.cpp +++ b/editor/editor_run_script.cpp @@ -30,7 +30,7 @@ #include "editor_run_script.h" -#include "editor_node.h" +#include "editor/editor_node.h" void EditorScript::add_root_node(Node *p_node) { if (!editor) { diff --git a/editor/editor_run_script.h b/editor/editor_run_script.h index 7fb728a00a..28a854aaeb 100644 --- a/editor/editor_run_script.h +++ b/editor/editor_run_script.h @@ -32,8 +32,10 @@ #define EDITOR_RUN_SCRIPT_H #include "core/object/ref_counted.h" -#include "editor_plugin.h" +#include "editor/editor_plugin.h" + class EditorNode; + class EditorScript : public RefCounted { GDCLASS(EditorScript, RefCounted); diff --git a/editor/editor_sectioned_inspector.cpp b/editor/editor_sectioned_inspector.cpp index 6853045345..19374f826a 100644 --- a/editor/editor_sectioned_inspector.cpp +++ b/editor/editor_sectioned_inspector.cpp @@ -30,7 +30,7 @@ #include "editor_sectioned_inspector.h" -#include "editor_scale.h" +#include "editor/editor_scale.h" class SectionedInspectorFilter : public Object { GDCLASS(SectionedInspectorFilter, Object); @@ -89,7 +89,7 @@ class SectionedInspectorFilter : public Object { if (pi.name.begins_with(section + "/")) { pi.name = pi.name.replace_first(section + "/", ""); - if (!allow_sub && pi.name.find("/") != -1) { + if (!allow_sub && pi.name.contains("/")) { continue; } p_list->push_back(pi); @@ -227,7 +227,7 @@ void SectionedInspector::update_category_list() { continue; } - if (pi.name.find(":") != -1 || pi.name == "script" || pi.name == "resource_name" || pi.name == "resource_path" || pi.name == "resource_local_to_scene" || pi.name.begins_with("_global_script")) { + if (pi.name.contains(":") || pi.name == "script" || pi.name == "resource_name" || pi.name == "resource_path" || pi.name == "resource_local_to_scene" || pi.name.begins_with("_global_script")) { continue; } diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 8146f48f91..6bd11fcdd6 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -31,18 +31,22 @@ #include "editor_settings.h" #include "core/config/project_settings.h" +#include "core/input/input_event.h" #include "core/input/input_map.h" +#include "core/input/shortcut.h" #include "core/io/certs_compressed.gen.h" -#include "core/io/config_file.h" #include "core/io/dir_access.h" #include "core/io/file_access.h" #include "core/io/ip.h" #include "core/io/resource_loader.h" #include "core/io/resource_saver.h" +#include "core/object/class_db.h" #include "core/os/keyboard.h" #include "core/os/os.h" +#include "core/string/translation.h" #include "core/version.h" #include "editor/editor_node.h" +#include "editor/editor_paths.h" #include "editor/editor_translation.h" #include "scene/main/node.h" #include "scene/main/scene_tree.h" @@ -369,7 +373,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { // Skip locales which we can't render properly (see above comment). // Test against language code without regional variants (e.g. ur_PK). String lang_code = locale.get_slice("_", 0); - if (locales_to_skip.find(lang_code) != -1) { + if (locales_to_skip.has(lang_code)) { continue; } @@ -415,6 +419,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { #else EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/font_hinting", 0, "Auto (Light),None,Light,Normal") #endif + EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/font_subpixel_positioning", 1, "Disabled,Auto,One half of a pixel,One quarter of a pixel") + EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "interface/editor/main_font", "", "*.ttf,*.otf") EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "interface/editor/main_font_bold", "", "*.ttf,*.otf") EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "interface/editor/code_font", "", "*.ttf,*.otf") @@ -741,7 +747,7 @@ void EditorSettings::_load_godot2_text_editor_theme() { _initial_set("text_editor/theme/highlighting/completion_background_color", Color(0.17, 0.16, 0.2)); _initial_set("text_editor/theme/highlighting/completion_selected_color", Color(0.26, 0.26, 0.27)); _initial_set("text_editor/theme/highlighting/completion_existing_color", Color(0.87, 0.87, 0.87, 0.13)); - _initial_set("text_editor/theme/highlighting/completion_scroll_color", Color(1, 1, 1)); + _initial_set("text_editor/theme/highlighting/completion_scroll_color", Color(1, 1, 1, 0.29)); _initial_set("text_editor/theme/highlighting/completion_font_color", Color(0.67, 0.67, 0.67)); _initial_set("text_editor/theme/highlighting/text_color", Color(0.67, 0.67, 0.67)); _initial_set("text_editor/theme/highlighting/line_number_color", Color(0.67, 0.67, 0.67, 0.4)); @@ -845,7 +851,7 @@ void EditorSettings::create() { singleton->setup_language(); singleton->setup_network(); - singleton->load_favorites(); + singleton->load_favorites_and_recent_dirs(); singleton->list_text_editor_themes(); return; @@ -1103,7 +1109,13 @@ Variant EditorSettings::get_project_metadata(const String &p_section, const Stri void EditorSettings::set_favorites(const Vector<String> &p_favorites) { favorites = p_favorites; - FileAccess *f = FileAccess::open(get_project_settings_dir().plus_file("favorites"), FileAccess::WRITE); + String favorites_file; + if (Engine::get_singleton()->is_project_manager_hint()) { + favorites_file = EditorPaths::get_singleton()->get_config_dir().plus_file("favorite_dirs"); + } else { + favorites_file = get_project_settings_dir().plus_file("favorites"); + } + FileAccess *f = FileAccess::open(favorites_file, FileAccess::WRITE); if (f) { for (int i = 0; i < favorites.size(); i++) { f->store_line(favorites[i]); @@ -1118,7 +1130,13 @@ Vector<String> EditorSettings::get_favorites() const { void EditorSettings::set_recent_dirs(const Vector<String> &p_recent_dirs) { recent_dirs = p_recent_dirs; - FileAccess *f = FileAccess::open(get_project_settings_dir().plus_file("recent_dirs"), FileAccess::WRITE); + String recent_dirs_file; + if (Engine::get_singleton()->is_project_manager_hint()) { + recent_dirs_file = EditorPaths::get_singleton()->get_config_dir().plus_file("recent_dirs"); + } else { + recent_dirs_file = get_project_settings_dir().plus_file("recent_dirs"); + } + FileAccess *f = FileAccess::open(recent_dirs_file, FileAccess::WRITE); if (f) { for (int i = 0; i < recent_dirs.size(); i++) { f->store_line(recent_dirs[i]); @@ -1131,8 +1149,17 @@ Vector<String> EditorSettings::get_recent_dirs() const { return recent_dirs; } -void EditorSettings::load_favorites() { - FileAccess *f = FileAccess::open(get_project_settings_dir().plus_file("favorites"), FileAccess::READ); +void EditorSettings::load_favorites_and_recent_dirs() { + String favorites_file; + String recent_dirs_file; + if (Engine::get_singleton()->is_project_manager_hint()) { + favorites_file = EditorPaths::get_singleton()->get_config_dir().plus_file("favorite_dirs"); + recent_dirs_file = EditorPaths::get_singleton()->get_config_dir().plus_file("recent_dirs"); + } else { + favorites_file = get_project_settings_dir().plus_file("favorites"); + recent_dirs_file = get_project_settings_dir().plus_file("recent_dirs"); + } + FileAccess *f = FileAccess::open(favorites_file, FileAccess::READ); if (f) { String line = f->get_line().strip_edges(); while (!line.is_empty()) { @@ -1142,7 +1169,7 @@ void EditorSettings::load_favorites() { memdelete(f); } - f = FileAccess::open(get_project_settings_dir().plus_file("recent_dirs"), FileAccess::READ); + f = FileAccess::open(recent_dirs_file, FileAccess::READ); if (f) { String line = f->get_line().strip_edges(); while (!line.is_empty()) { diff --git a/editor/editor_settings.h b/editor/editor_settings.h index f1a0329d65..f0fec3acc7 100644 --- a/editor/editor_settings.h +++ b/editor/editor_settings.h @@ -31,15 +31,13 @@ #ifndef EDITOR_SETTINGS_H #define EDITOR_SETTINGS_H -#include "core/input/shortcut.h" #include "core/io/config_file.h" #include "core/io/resource.h" -#include "core/object/class_db.h" #include "core/os/thread_safe.h" -#include "core/string/translation.h" -#include "editor/editor_paths.h" class EditorPlugin; +class InputEvent; +class Shortcut; class EditorSettings : public Resource { GDCLASS(EditorSettings, Resource); @@ -161,7 +159,7 @@ public: Vector<String> get_favorites() const; void set_recent_dirs(const Vector<String> &p_recent_dirs); Vector<String> get_recent_dirs() const; - void load_favorites(); + void load_favorites_and_recent_dirs(); bool is_dark_theme(); diff --git a/editor/settings_config_dialog.cpp b/editor/editor_settings_dialog.cpp index c4d361bd49..18324f9971 100644 --- a/editor/settings_config_dialog.cpp +++ b/editor/editor_settings_dialog.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* settings_config_dialog.cpp */ +/* editor_settings_dialog.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,17 +28,17 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "settings_config_dialog.h" +#include "editor_settings_dialog.h" #include "core/config/project_settings.h" #include "core/input/input_map.h" #include "core/os/keyboard.h" #include "editor/debugger/editor_debugger_node.h" -#include "editor_file_system.h" -#include "editor_log.h" -#include "editor_node.h" -#include "editor_scale.h" -#include "editor_settings.h" +#include "editor/editor_file_system.h" +#include "editor/editor_log.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" #include "scene/gui/margin_container.h" void EditorSettingsDialog::ok_pressed() { @@ -121,14 +121,17 @@ void EditorSettingsDialog::_notification(int p_what) { set_process_unhandled_input(false); } } break; + case NOTIFICATION_READY: { undo_redo->set_method_notify_callback(EditorDebuggerNode::_method_changeds, nullptr); undo_redo->set_property_notify_callback(EditorDebuggerNode::_property_changeds, nullptr); undo_redo->set_commit_notify_callback(_undo_redo_callback, this); } break; + case NOTIFICATION_ENTER_TREE: { _update_icons(); } break; + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { _update_icons(); // Update theme colors. @@ -272,15 +275,15 @@ void EditorSettingsDialog::_create_shortcut_treeitem(TreeItem *p_parent, const S shortcut_item->set_text(1, sc_text); if (sc_text == "None") { // Fade out unassigned shortcut labels for easier visual grepping. - shortcut_item->set_custom_color(1, shortcuts->get_theme_color("font_color", "Label") * Color(1, 1, 1, 0.5)); + shortcut_item->set_custom_color(1, shortcuts->get_theme_color(SNAME("font_color"), SNAME("Label")) * Color(1, 1, 1, 0.5)); } if (p_allow_revert) { - shortcut_item->add_button(1, shortcuts->get_theme_icon("Reload", "EditorIcons"), SHORTCUT_REVERT); + shortcut_item->add_button(1, shortcuts->get_theme_icon(SNAME("Reload"), SNAME("EditorIcons")), SHORTCUT_REVERT); } - shortcut_item->add_button(1, shortcuts->get_theme_icon("Add", "EditorIcons"), SHORTCUT_ADD); - shortcut_item->add_button(1, shortcuts->get_theme_icon("Close", "EditorIcons"), SHORTCUT_ERASE); + shortcut_item->add_button(1, shortcuts->get_theme_icon(SNAME("Add"), SNAME("EditorIcons")), SHORTCUT_ADD); + shortcut_item->add_button(1, shortcuts->get_theme_icon(SNAME("Close"), SNAME("EditorIcons")), SHORTCUT_ERASE); shortcut_item->set_meta("is_action", p_is_action); shortcut_item->set_meta("type", "shortcut"); @@ -299,11 +302,11 @@ void EditorSettingsDialog::_create_shortcut_treeitem(TreeItem *p_parent, const S event_item->set_text(0, shortcut_item->get_child_count() == 1 ? "Primary" : ""); event_item->set_text(1, ie->as_text()); - event_item->add_button(1, shortcuts->get_theme_icon("Edit", "EditorIcons"), SHORTCUT_EDIT); - event_item->add_button(1, shortcuts->get_theme_icon("Close", "EditorIcons"), SHORTCUT_ERASE); + event_item->add_button(1, shortcuts->get_theme_icon(SNAME("Edit"), SNAME("EditorIcons")), SHORTCUT_EDIT); + event_item->add_button(1, shortcuts->get_theme_icon(SNAME("Close"), SNAME("EditorIcons")), SHORTCUT_ERASE); - event_item->set_custom_bg_color(0, shortcuts->get_theme_color("dark_color_3", "Editor")); - event_item->set_custom_bg_color(1, shortcuts->get_theme_color("dark_color_3", "Editor")); + event_item->set_custom_bg_color(0, shortcuts->get_theme_color(SNAME("dark_color_3"), SNAME("Editor"))); + event_item->set_custom_bg_color(1, shortcuts->get_theme_color(SNAME("dark_color_3"), SNAME("Editor"))); event_item->set_meta("is_action", p_is_action); event_item->set_meta("type", "event"); @@ -366,6 +369,11 @@ void EditorSettingsDialog::_update_shortcuts() { Array events; // Need to get the list of events into an array so it can be set as metadata on the item. Vector<String> event_strings; + // Skip non-builtin actions. + if (!InputMap::get_singleton()->get_builtins_with_feature_overrides_applied().has(action_name)) { + continue; + } + List<Ref<InputEvent>> all_default_events = InputMap::get_singleton()->get_builtins_with_feature_overrides_applied().find(action_name).value(); List<Ref<InputEventKey>> key_default_events; // Remove all non-key events from the defaults. Only check keys, since we are in the editor. @@ -513,6 +521,38 @@ void EditorSettingsDialog::_shortcut_button_pressed(Object *p_item, int p_column } } +void EditorSettingsDialog::_shortcut_cell_double_clicked() { + // When a shortcut cell is double clicked: + // If the cell has children and is in the bindings column, and if its first child is editable, + // then uncollapse the cell, and if the first child is the only child, then edit that child. + // If the cell is in the bindings column and can be edited, then edit it. + // If the cell is in the name column, then toggle collapse. + const ShortcutButton edit_btn_id = EditorSettingsDialog::SHORTCUT_EDIT; + const int edit_btn_col = 1; + TreeItem *ti = shortcuts->get_selected(); + String type = ti->get_meta("type"); + int col = shortcuts->get_selected_column(); + if (type == "shortcut" && col == 0) { + if (ti->get_first_child()) { + ti->set_collapsed(!ti->is_collapsed()); + } + } else if (type == "shortcut" && col == 1) { + if (ti->get_first_child()) { + TreeItem *child_ti = ti->get_first_child(); + if (child_ti->get_button_by_id(edit_btn_col, edit_btn_id) != -1) { + ti->set_collapsed(false); + if (ti->get_child_count() == 1) { + _shortcut_button_pressed(child_ti, edit_btn_col, edit_btn_id); + } + } + } + } else if (type == "event" && col == 1) { + if (ti->get_button_by_id(edit_btn_col, edit_btn_id) != -1) { + _shortcut_button_pressed(ti, edit_btn_col, edit_btn_id); + } + } +} + Variant EditorSettingsDialog::get_drag_data_fw(const Point2 &p_point, Control *p_from) { TreeItem *selected = shortcuts->get_selected(); @@ -692,6 +732,7 @@ EditorSettingsDialog::EditorSettingsDialog() { shortcuts->set_column_title(0, TTR("Name")); shortcuts->set_column_title(1, TTR("Binding")); shortcuts->connect("button_pressed", callable_mp(this, &EditorSettingsDialog::_shortcut_button_pressed)); + shortcuts->connect("item_activated", callable_mp(this, &EditorSettingsDialog::_shortcut_cell_double_clicked)); tab_shortcuts->add_child(shortcuts); shortcuts->set_drag_forwarding(this); diff --git a/editor/settings_config_dialog.h b/editor/editor_settings_dialog.h index c3dfd736d5..4b90506b4b 100644 --- a/editor/settings_config_dialog.h +++ b/editor/editor_settings_dialog.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* settings_config_dialog.h */ +/* editor_settings_dialog.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,12 +28,12 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef SETTINGS_CONFIG_DIALOG_H -#define SETTINGS_CONFIG_DIALOG_H +#ifndef EDITOR_SETTINGS_DIALOG_H +#define EDITOR_SETTINGS_DIALOG_H #include "editor/action_map_editor.h" +#include "editor/editor_inspector.h" #include "editor/editor_sectioned_inspector.h" -#include "editor_inspector.h" #include "scene/gui/dialogs.h" #include "scene/gui/panel_container.h" #include "scene/gui/rich_text_label.h" @@ -104,6 +104,7 @@ class EditorSettingsDialog : public AcceptDialog { void _update_shortcuts(); void _shortcut_button_pressed(Object *p_item, int p_column, int p_idx); + void _shortcut_cell_double_clicked(); void _builtin_action_popup_index_pressed(int p_index); @@ -128,4 +129,4 @@ public: ~EditorSettingsDialog(); }; -#endif // SETTINGS_CONFIG_DIALOG_H +#endif // EDITOR_SETTINGS_DIALOG_H diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index cd28a65c7b..a4a9e691a0 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -33,8 +33,7 @@ #include "core/input/input.h" #include "core/math/expression.h" #include "core/os/keyboard.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_scale.h" String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const { if (grabber->is_visible()) { @@ -431,47 +430,49 @@ void EditorSpinSlider::_draw_spin_slider() { void EditorSpinSlider::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_THEME_CHANGED: { _update_value_input_stylebox(); - break; + } break; - case NOTIFICATION_INTERNAL_PROCESS: + case NOTIFICATION_INTERNAL_PROCESS: { if (value_input_dirty) { value_input_dirty = false; value_input->set_text(get_text_value()); } set_process_internal(false); - break; + } break; - case NOTIFICATION_DRAW: + case NOTIFICATION_DRAW: { _draw_spin_slider(); - break; + } break; case NOTIFICATION_WM_WINDOW_FOCUS_IN: case NOTIFICATION_WM_WINDOW_FOCUS_OUT: - case NOTIFICATION_EXIT_TREE: + case NOTIFICATION_EXIT_TREE: { if (grabbing_spinner) { grabber->hide(); Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); grabbing_spinner = false; grabbing_spinner_attempt = false; } - break; + } break; - case NOTIFICATION_MOUSE_ENTER: + case NOTIFICATION_MOUSE_ENTER: { mouse_over_spin = true; update(); - break; - case NOTIFICATION_MOUSE_EXIT: + } break; + + case NOTIFICATION_MOUSE_EXIT: { mouse_over_spin = false; update(); - break; - case NOTIFICATION_FOCUS_ENTER: + } break; + + case NOTIFICATION_FOCUS_ENTER: { if ((Input::get_singleton()->is_action_pressed("ui_focus_next") || Input::get_singleton()->is_action_pressed("ui_focus_prev")) && !value_input_just_closed) { _focus_entered(); } value_input_just_closed = false; - break; + } break; } } diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 238df4a8aa..05aa638a4b 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -33,10 +33,10 @@ #include "core/error/error_macros.h" #include "core/io/resource_loader.h" #include "core/variant/dictionary.h" -#include "editor_fonts.h" -#include "editor_icons.gen.h" -#include "editor_scale.h" -#include "editor_settings.h" +#include "editor/editor_fonts.h" +#include "editor/editor_icons.gen.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" #include "modules/modules_enabled.gen.h" // For svg. #ifdef MODULE_SVG_ENABLED @@ -159,7 +159,7 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#ffffff", "#414141"); // Pure white ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#000000", "#bfbfbf"); // Pure black - // Keep pure RGB colors as is, but list them for explicity. + // Keep pure RGB colors as is, but list them for explicitly. ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#ff0000", "#ff0000"); // Pure red ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#00ff00", "#00ff00"); // Pure green ADD_CONVERT_COLOR(dark_icon_color_dictionary, "#0000ff", "#0000ff"); // Pure blue @@ -277,12 +277,13 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = exceptions.insert("StatusSuccess"); exceptions.insert("StatusWarning"); exceptions.insert("OverbrightIndicator"); + exceptions.insert("GuiMiniCheckerboard"); } // These ones should be converted even if we are using a dark theme. - const Color error_color = p_theme->get_color("error_color", "Editor"); - const Color success_color = p_theme->get_color("success_color", "Editor"); - const Color warning_color = p_theme->get_color("warning_color", "Editor"); + const Color error_color = p_theme->get_color(SNAME("error_color"), SNAME("Editor")); + const Color success_color = p_theme->get_color(SNAME("success_color"), SNAME("Editor")); + const Color warning_color = p_theme->get_color(SNAME("warning_color"), SNAME("Editor")); dark_icon_color_dictionary[Color::html("#ff5f5f")] = error_color; dark_icon_color_dictionary[Color::html("#5fff97")] = success_color; dark_icon_color_dictionary[Color::html("#ffdd65")] = warning_color; @@ -299,7 +300,7 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = const int is_exception = exceptions.has(editor_icons_names[i]); const Ref<ImageTexture> icon = editor_generate_icon(i, !is_exception, EDSCALE, saturation, dark_icon_color_dictionary); - p_theme->set_icon(editor_icons_names[i], "EditorIcons", icon); + p_theme->set_icon(editor_icons_names[i], SNAME("EditorIcons"), icon); } } @@ -313,7 +314,7 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = const int is_exception = exceptions.has(editor_icons_names[index]); const Ref<ImageTexture> icon = editor_generate_icon(index, !p_dark_theme && !is_exception, scale, force_filter, dark_icon_color_dictionary); - p_theme->set_icon(editor_icons_names[index], "EditorIcons", icon); + p_theme->set_icon(editor_icons_names[index], SNAME("EditorIcons"), icon); } } else { const float scale = (float)p_thumb_size / 32.0 * EDSCALE; @@ -322,7 +323,7 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = const bool is_exception = exceptions.has(editor_icons_names[index]); const Ref<ImageTexture> icon = editor_generate_icon(index, !p_dark_theme && !is_exception, scale, force_filter, dark_icon_color_dictionary); - p_theme->set_icon(editor_icons_names[index], "EditorIcons", icon); + p_theme->set_icon(editor_icons_names[index], SNAME("EditorIcons"), icon); } } #else @@ -427,6 +428,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color font_focus_color = mono_color.lerp(base_color, 0.125); const Color font_disabled_color = Color(mono_color.r, mono_color.g, mono_color.b, 0.3); const Color font_readonly_color = Color(mono_color.r, mono_color.g, mono_color.b, 0.65); + const Color font_placeholder_color = Color(mono_color.r, mono_color.g, mono_color.b, 0.6); const Color selection_color = accent_color * Color(1, 1, 1, 0.4); const Color disabled_color = mono_color.inverted().lerp(base_color, 0.7); const Color disabled_bg_color = mono_color.inverted().lerp(base_color, 0.9); @@ -443,7 +445,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color highlight_color = Color(accent_color.r, accent_color.g, accent_color.b, 0.275); const Color disabled_highlight_color = highlight_color.lerp(dark_theme ? Color(0, 0, 0) : Color(1, 1, 1), 0.5); - float prev_icon_saturation = theme->has_color("icon_saturation", "Editor") ? theme->get_color("icon_saturation", "Editor").r : 1.0; + float prev_icon_saturation = theme->has_color(SNAME("icon_saturation"), SNAME("Editor")) ? theme->get_color(SNAME("icon_saturation"), SNAME("Editor")).r : 1.0; theme->set_color("icon_saturation", "Editor", Color(icon_saturation, icon_saturation, icon_saturation)); // can't save single float in theme, so using color theme->set_color("accent_color", "Editor", accent_color); @@ -465,6 +467,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("font_color", "Editor", font_color); theme->set_color("highlighted_font_color", "Editor", font_hover_color); theme->set_color("disabled_font_color", "Editor", font_disabled_color); + theme->set_color("readonly_font_color", "Editor", font_readonly_color); theme->set_color("mono_color", "Editor", mono_color); @@ -501,16 +504,16 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // Register icons + font // The resolution and the icon color (dark_theme bool) has not changed, so we do not regenerate the icons. - if (p_theme != nullptr && fabs(p_theme->get_constant("scale", "Editor") - EDSCALE) < 0.00001 && (bool)p_theme->get_constant("dark_theme", "Editor") == dark_theme && prev_icon_saturation == icon_saturation) { + if (p_theme != nullptr && fabs(p_theme->get_constant(SNAME("scale"), SNAME("Editor")) - EDSCALE) < 0.00001 && (bool)p_theme->get_constant(SNAME("dark_theme"), SNAME("Editor")) == dark_theme && prev_icon_saturation == icon_saturation) { // Register already generated icons. for (int i = 0; i < editor_icons_count; i++) { - theme->set_icon(editor_icons_names[i], "EditorIcons", p_theme->get_icon(editor_icons_names[i], "EditorIcons")); + theme->set_icon(editor_icons_names[i], SNAME("EditorIcons"), p_theme->get_icon(editor_icons_names[i], SNAME("EditorIcons"))); } } else { editor_register_and_generate_icons(theme, dark_theme, thumb_size, false, icon_saturation); } // Thumbnail size has changed, so we regenerate the medium sizes - if (p_theme != nullptr && fabs((double)p_theme->get_constant("thumb_size", "Editor") - thumb_size) > 0.00001) { + if (p_theme != nullptr && fabs((double)p_theme->get_constant(SNAME("thumb_size"), SNAME("Editor")) - thumb_size) > 0.00001) { editor_register_and_generate_icons(p_theme, dark_theme, thumb_size, true); } @@ -707,7 +710,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("font_disabled_color", "OptionButton", font_disabled_color); theme->set_color("icon_hover_color", "OptionButton", icon_hover_color); theme->set_color("icon_focus_color", "OptionButton", icon_focus_color); - theme->set_icon("arrow", "OptionButton", theme->get_icon("GuiOptionArrow", "EditorIcons")); + theme->set_icon("arrow", "OptionButton", theme->get_icon(SNAME("GuiOptionArrow"), SNAME("EditorIcons"))); theme->set_constant("arrow_margin", "OptionButton", widget_default_margin.x - 2 * EDSCALE); theme->set_constant("modulate_arrow", "OptionButton", true); theme->set_constant("hseparation", "OptionButton", 4 * EDSCALE); @@ -718,15 +721,15 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("disabled", "CheckButton", style_menu); theme->set_stylebox("hover", "CheckButton", style_menu); - theme->set_icon("on", "CheckButton", theme->get_icon("GuiToggleOn", "EditorIcons")); - theme->set_icon("on_disabled", "CheckButton", theme->get_icon("GuiToggleOnDisabled", "EditorIcons")); - theme->set_icon("off", "CheckButton", theme->get_icon("GuiToggleOff", "EditorIcons")); - theme->set_icon("off_disabled", "CheckButton", theme->get_icon("GuiToggleOffDisabled", "EditorIcons")); + theme->set_icon("on", "CheckButton", theme->get_icon(SNAME("GuiToggleOn"), SNAME("EditorIcons"))); + theme->set_icon("on_disabled", "CheckButton", theme->get_icon(SNAME("GuiToggleOnDisabled"), SNAME("EditorIcons"))); + theme->set_icon("off", "CheckButton", theme->get_icon(SNAME("GuiToggleOff"), SNAME("EditorIcons"))); + theme->set_icon("off_disabled", "CheckButton", theme->get_icon(SNAME("GuiToggleOffDisabled"), SNAME("EditorIcons"))); - theme->set_icon("on_mirrored", "CheckButton", theme->get_icon("GuiToggleOnMirrored", "EditorIcons")); - theme->set_icon("on_disabled_mirrored", "CheckButton", theme->get_icon("GuiToggleOnDisabledMirrored", "EditorIcons")); - theme->set_icon("off_mirrored", "CheckButton", theme->get_icon("GuiToggleOffMirrored", "EditorIcons")); - theme->set_icon("off_disabled_mirrored", "CheckButton", theme->get_icon("GuiToggleOffDisabledMirrored", "EditorIcons")); + theme->set_icon("on_mirrored", "CheckButton", theme->get_icon(SNAME("GuiToggleOnMirrored"), SNAME("EditorIcons"))); + theme->set_icon("on_disabled_mirrored", "CheckButton", theme->get_icon(SNAME("GuiToggleOnDisabledMirrored"), SNAME("EditorIcons"))); + theme->set_icon("off_mirrored", "CheckButton", theme->get_icon(SNAME("GuiToggleOffMirrored"), SNAME("EditorIcons"))); + theme->set_icon("off_disabled_mirrored", "CheckButton", theme->get_icon(SNAME("GuiToggleOffDisabledMirrored"), SNAME("EditorIcons"))); theme->set_color("font_color", "CheckButton", font_color); theme->set_color("font_hover_color", "CheckButton", font_hover_color); @@ -750,14 +753,14 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("pressed", "CheckBox", sb_checkbox); theme->set_stylebox("disabled", "CheckBox", sb_checkbox); theme->set_stylebox("hover", "CheckBox", sb_checkbox); - theme->set_icon("checked", "CheckBox", theme->get_icon("GuiChecked", "EditorIcons")); - theme->set_icon("unchecked", "CheckBox", theme->get_icon("GuiUnchecked", "EditorIcons")); - theme->set_icon("radio_checked", "CheckBox", theme->get_icon("GuiRadioChecked", "EditorIcons")); - theme->set_icon("radio_unchecked", "CheckBox", theme->get_icon("GuiRadioUnchecked", "EditorIcons")); - theme->set_icon("checked_disabled", "CheckBox", theme->get_icon("GuiCheckedDisabled", "EditorIcons")); - theme->set_icon("unchecked_disabled", "CheckBox", theme->get_icon("GuiUncheckedDisabled", "EditorIcons")); - theme->set_icon("radio_checked_disabled", "CheckBox", theme->get_icon("GuiRadioCheckedDisabled", "EditorIcons")); - theme->set_icon("radio_unchecked_disabled", "CheckBox", theme->get_icon("GuiRadioUncheckedDisabled", "EditorIcons")); + theme->set_icon("checked", "CheckBox", theme->get_icon(SNAME("GuiChecked"), SNAME("EditorIcons"))); + theme->set_icon("unchecked", "CheckBox", theme->get_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons"))); + theme->set_icon("radio_checked", "CheckBox", theme->get_icon(SNAME("GuiRadioChecked"), SNAME("EditorIcons"))); + theme->set_icon("radio_unchecked", "CheckBox", theme->get_icon(SNAME("GuiRadioUnchecked"), SNAME("EditorIcons"))); + theme->set_icon("checked_disabled", "CheckBox", theme->get_icon(SNAME("GuiCheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("unchecked_disabled", "CheckBox", theme->get_icon(SNAME("GuiUncheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("radio_checked_disabled", "CheckBox", theme->get_icon(SNAME("GuiRadioCheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("radio_unchecked_disabled", "CheckBox", theme->get_icon(SNAME("GuiRadioUncheckedDisabled"), SNAME("EditorIcons"))); theme->set_color("font_color", "CheckBox", font_color); theme->set_color("font_hover_color", "CheckBox", font_hover_color); @@ -802,19 +805,19 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("font_accelerator_color", "PopupMenu", font_disabled_color); theme->set_color("font_disabled_color", "PopupMenu", font_disabled_color); theme->set_color("font_separator_color", "PopupMenu", font_disabled_color); - theme->set_icon("checked", "PopupMenu", theme->get_icon("GuiChecked", "EditorIcons")); - theme->set_icon("unchecked", "PopupMenu", theme->get_icon("GuiUnchecked", "EditorIcons")); - theme->set_icon("radio_checked", "PopupMenu", theme->get_icon("GuiRadioChecked", "EditorIcons")); - theme->set_icon("radio_unchecked", "PopupMenu", theme->get_icon("GuiRadioUnchecked", "EditorIcons")); - theme->set_icon("checked_disabled", "PopupMenu", theme->get_icon("GuiCheckedDisabled", "EditorIcons")); - theme->set_icon("unchecked_disabled", "PopupMenu", theme->get_icon("GuiUncheckedDisabled", "EditorIcons")); - theme->set_icon("radio_checked_disabled", "PopupMenu", theme->get_icon("GuiRadioCheckedDisabled", "EditorIcons")); - theme->set_icon("radio_unchecked_disabled", "PopupMenu", theme->get_icon("GuiRadioUncheckedDisabled", "EditorIcons")); - theme->set_icon("submenu", "PopupMenu", theme->get_icon("ArrowRight", "EditorIcons")); - theme->set_icon("submenu_mirrored", "PopupMenu", theme->get_icon("ArrowLeft", "EditorIcons")); - theme->set_icon("visibility_hidden", "PopupMenu", theme->get_icon("GuiVisibilityHidden", "EditorIcons")); - theme->set_icon("visibility_visible", "PopupMenu", theme->get_icon("GuiVisibilityVisible", "EditorIcons")); - theme->set_icon("visibility_xray", "PopupMenu", theme->get_icon("GuiVisibilityXray", "EditorIcons")); + theme->set_icon("checked", "PopupMenu", theme->get_icon(SNAME("GuiChecked"), SNAME("EditorIcons"))); + theme->set_icon("unchecked", "PopupMenu", theme->get_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons"))); + theme->set_icon("radio_checked", "PopupMenu", theme->get_icon(SNAME("GuiRadioChecked"), SNAME("EditorIcons"))); + theme->set_icon("radio_unchecked", "PopupMenu", theme->get_icon(SNAME("GuiRadioUnchecked"), SNAME("EditorIcons"))); + theme->set_icon("checked_disabled", "PopupMenu", theme->get_icon(SNAME("GuiCheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("unchecked_disabled", "PopupMenu", theme->get_icon(SNAME("GuiUncheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("radio_checked_disabled", "PopupMenu", theme->get_icon(SNAME("GuiRadioCheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("radio_unchecked_disabled", "PopupMenu", theme->get_icon(SNAME("GuiRadioUncheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("submenu", "PopupMenu", theme->get_icon(SNAME("ArrowRight"), SNAME("EditorIcons"))); + theme->set_icon("submenu_mirrored", "PopupMenu", theme->get_icon(SNAME("ArrowLeft"), SNAME("EditorIcons"))); + theme->set_icon("visibility_hidden", "PopupMenu", theme->get_icon(SNAME("GuiVisibilityHidden"), SNAME("EditorIcons"))); + theme->set_icon("visibility_visible", "PopupMenu", theme->get_icon(SNAME("GuiVisibilityVisible"), SNAME("EditorIcons"))); + theme->set_icon("visibility_xray", "PopupMenu", theme->get_icon(SNAME("GuiVisibilityXray"), SNAME("EditorIcons"))); theme->set_constant("vseparation", "PopupMenu", (extra_spacing + default_margin_size + 1) * EDSCALE); theme->set_constant("item_start_padding", "PopupMenu", popup_menu_margin_size * EDSCALE); @@ -874,9 +877,21 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("readonly_color", "EditorProperty", readonly_color); theme->set_color("readonly_warning_color", "EditorProperty", readonly_warning_color); + Ref<StyleBoxFlat> style_property_group_note = style_default->duplicate(); + Color property_group_note_color = accent_color; + property_group_note_color.a = 0.1; + style_property_group_note->set_bg_color(property_group_note_color); + theme->set_stylebox("bg_group_note", "EditorProperty", style_property_group_note); + Color inspector_section_color = font_color.lerp(Color(0.5, 0.5, 0.5), 0.35); theme->set_color("font_color", "EditorInspectorSection", inspector_section_color); + Color inspector_indent_color = accent_color; + inspector_indent_color.a = 0.2; + Ref<StyleBoxFlat> inspector_indent_style = make_flat_stylebox(inspector_indent_color, 2.0 * EDSCALE, 0, 2.0 * EDSCALE, 0); + theme->set_stylebox("indent_box", "EditorInspectorSection", inspector_indent_style); + theme->set_constant("indent_size", "EditorInspectorSection", 6.0 * EDSCALE); + theme->set_constant("inspector_margin", "Editor", 12 * EDSCALE); // Tree & ItemList background @@ -887,14 +902,14 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("bg", "Tree", style_tree_bg); // Tree - theme->set_icon("checked", "Tree", theme->get_icon("GuiChecked", "EditorIcons")); - theme->set_icon("indeterminate", "Tree", theme->get_icon("GuiIndeterminate", "EditorIcons")); - theme->set_icon("unchecked", "Tree", theme->get_icon("GuiUnchecked", "EditorIcons")); - theme->set_icon("arrow", "Tree", theme->get_icon("GuiTreeArrowDown", "EditorIcons")); - theme->set_icon("arrow_collapsed", "Tree", theme->get_icon("GuiTreeArrowRight", "EditorIcons")); - theme->set_icon("arrow_collapsed_mirrored", "Tree", theme->get_icon("GuiTreeArrowLeft", "EditorIcons")); - theme->set_icon("updown", "Tree", theme->get_icon("GuiTreeUpdown", "EditorIcons")); - theme->set_icon("select_arrow", "Tree", theme->get_icon("GuiDropdown", "EditorIcons")); + theme->set_icon("checked", "Tree", theme->get_icon(SNAME("GuiChecked"), SNAME("EditorIcons"))); + theme->set_icon("indeterminate", "Tree", theme->get_icon(SNAME("GuiIndeterminate"), SNAME("EditorIcons"))); + theme->set_icon("unchecked", "Tree", theme->get_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons"))); + theme->set_icon("arrow", "Tree", theme->get_icon(SNAME("GuiTreeArrowDown"), SNAME("EditorIcons"))); + theme->set_icon("arrow_collapsed", "Tree", theme->get_icon(SNAME("GuiTreeArrowRight"), SNAME("EditorIcons"))); + theme->set_icon("arrow_collapsed_mirrored", "Tree", theme->get_icon(SNAME("GuiTreeArrowLeft"), SNAME("EditorIcons"))); + theme->set_icon("updown", "Tree", theme->get_icon(SNAME("GuiTreeUpdown"), SNAME("EditorIcons"))); + theme->set_icon("select_arrow", "Tree", theme->get_icon(SNAME("GuiDropdown"), SNAME("EditorIcons"))); theme->set_stylebox("bg_focus", "Tree", style_widget_focus); theme->set_stylebox("custom_button", "Tree", make_empty_stylebox()); theme->set_stylebox("custom_button_pressed", "Tree", make_empty_stylebox()); @@ -1011,21 +1026,21 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("font_unselected_color", "TabContainer", font_disabled_color); theme->set_color("font_selected_color", "TabBar", font_color); theme->set_color("font_unselected_color", "TabBar", font_disabled_color); - theme->set_icon("menu", "TabContainer", theme->get_icon("GuiTabMenu", "EditorIcons")); - theme->set_icon("menu_highlight", "TabContainer", theme->get_icon("GuiTabMenuHl", "EditorIcons")); + theme->set_icon("menu", "TabContainer", theme->get_icon(SNAME("GuiTabMenu"), SNAME("EditorIcons"))); + theme->set_icon("menu_highlight", "TabContainer", theme->get_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); theme->set_stylebox("SceneTabFG", "EditorStyles", style_tab_selected); theme->set_stylebox("SceneTabBG", "EditorStyles", style_tab_unselected); - theme->set_icon("close", "TabBar", theme->get_icon("GuiClose", "EditorIcons")); - theme->set_stylebox("close_bg_pressed", "TabBar", style_menu); - theme->set_stylebox("close_bg_highlight", "TabBar", style_menu); - theme->set_icon("increment", "TabContainer", theme->get_icon("GuiScrollArrowRight", "EditorIcons")); - theme->set_icon("decrement", "TabContainer", theme->get_icon("GuiScrollArrowLeft", "EditorIcons")); - theme->set_icon("increment", "TabBar", theme->get_icon("GuiScrollArrowRight", "EditorIcons")); - theme->set_icon("decrement", "TabBar", theme->get_icon("GuiScrollArrowLeft", "EditorIcons")); - theme->set_icon("increment_highlight", "TabBar", theme->get_icon("GuiScrollArrowRightHl", "EditorIcons")); - theme->set_icon("decrement_highlight", "TabBar", theme->get_icon("GuiScrollArrowLeftHl", "EditorIcons")); - theme->set_icon("increment_highlight", "TabContainer", theme->get_icon("GuiScrollArrowRightHl", "EditorIcons")); - theme->set_icon("decrement_highlight", "TabContainer", theme->get_icon("GuiScrollArrowLeftHl", "EditorIcons")); + theme->set_icon("close", "TabBar", theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); + theme->set_stylebox("button_pressed", "TabBar", style_menu); + theme->set_stylebox("button_highlight", "TabBar", style_menu); + theme->set_icon("increment", "TabContainer", theme->get_icon(SNAME("GuiScrollArrowRight"), SNAME("EditorIcons"))); + theme->set_icon("decrement", "TabContainer", theme->get_icon(SNAME("GuiScrollArrowLeft"), SNAME("EditorIcons"))); + theme->set_icon("increment", "TabBar", theme->get_icon(SNAME("GuiScrollArrowRight"), SNAME("EditorIcons"))); + theme->set_icon("decrement", "TabBar", theme->get_icon(SNAME("GuiScrollArrowLeft"), SNAME("EditorIcons"))); + theme->set_icon("increment_highlight", "TabBar", theme->get_icon(SNAME("GuiScrollArrowRightHl"), SNAME("EditorIcons"))); + theme->set_icon("decrement_highlight", "TabBar", theme->get_icon(SNAME("GuiScrollArrowLeftHl"), SNAME("EditorIcons"))); + theme->set_icon("increment_highlight", "TabContainer", theme->get_icon(SNAME("GuiScrollArrowRightHl"), SNAME("EditorIcons"))); + theme->set_icon("decrement_highlight", "TabContainer", theme->get_icon(SNAME("GuiScrollArrowLeftHl"), SNAME("EditorIcons"))); theme->set_constant("hseparation", "TabBar", 4 * EDSCALE); // Content of each tab @@ -1078,7 +1093,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("DebuggerPanel", "EditorStyles", style_panel_debugger); Ref<StyleBoxFlat> style_panel_invisible_top = style_content_panel->duplicate(); - int stylebox_offset = theme->get_font("tab_selected", "TabContainer")->get_height(theme->get_font_size("tab_selected", "TabContainer")) + theme->get_stylebox(SNAME("tab_selected"), SNAME("TabContainer"))->get_minimum_size().height + theme->get_stylebox(SNAME("panel"), SNAME("TabContainer"))->get_default_margin(SIDE_TOP); + int stylebox_offset = theme->get_font(SNAME("tab_selected"), SNAME("TabContainer"))->get_height(theme->get_font_size(SNAME("tab_selected"), SNAME("TabContainer"))) + theme->get_stylebox(SNAME("tab_selected"), SNAME("TabContainer"))->get_minimum_size().height + theme->get_stylebox(SNAME("panel"), SNAME("TabContainer"))->get_default_margin(SIDE_TOP); style_panel_invisible_top->set_expand_margin_size(SIDE_TOP, -stylebox_offset); style_panel_invisible_top->set_default_margin(SIDE_TOP, 0); theme->set_stylebox("BottomPanelDebuggerOverride", "EditorStyles", style_panel_invisible_top); @@ -1104,11 +1119,12 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("normal", "LineEdit", style_line_edit); theme->set_stylebox("focus", "LineEdit", style_widget_focus); theme->set_stylebox("read_only", "LineEdit", style_line_edit_disabled); - theme->set_icon("clear", "LineEdit", theme->get_icon("GuiClose", "EditorIcons")); + theme->set_icon("clear", "LineEdit", theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); theme->set_color("read_only", "LineEdit", font_disabled_color); theme->set_color("font_color", "LineEdit", font_color); theme->set_color("font_selected_color", "LineEdit", mono_color); theme->set_color("font_uneditable_color", "LineEdit", font_readonly_color); + theme->set_color("font_placeholder_color", "LineEdit", font_placeholder_color); theme->set_color("caret_color", "LineEdit", font_color); theme->set_color("selection_color", "LineEdit", selection_color); theme->set_color("clear_button_color", "LineEdit", font_color); @@ -1119,34 +1135,35 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("focus", "TextEdit", style_widget_focus); theme->set_stylebox("read_only", "TextEdit", style_line_edit_disabled); theme->set_constant("side_margin", "TabContainer", 0); - theme->set_icon("tab", "TextEdit", theme->get_icon("GuiTab", "EditorIcons")); - theme->set_icon("space", "TextEdit", theme->get_icon("GuiSpace", "EditorIcons")); + theme->set_icon("tab", "TextEdit", theme->get_icon(SNAME("GuiTab"), SNAME("EditorIcons"))); + theme->set_icon("space", "TextEdit", theme->get_icon(SNAME("GuiSpace"), SNAME("EditorIcons"))); theme->set_color("font_color", "TextEdit", font_color); theme->set_color("font_readonly_color", "TextEdit", font_readonly_color); + theme->set_color("font_placeholder_color", "TextEdit", font_placeholder_color); theme->set_color("caret_color", "TextEdit", font_color); theme->set_color("selection_color", "TextEdit", selection_color); theme->set_constant("line_spacing", "TextEdit", 4 * EDSCALE); // CodeEdit - theme->set_font("font", "CodeEdit", theme->get_font("source", "EditorFonts")); - theme->set_font_size("font_size", "CodeEdit", theme->get_font_size("source_size", "EditorFonts")); + theme->set_font("font", "CodeEdit", theme->get_font(SNAME("source"), SNAME("EditorFonts"))); + theme->set_font_size("font_size", "CodeEdit", theme->get_font_size(SNAME("source_size"), SNAME("EditorFonts"))); theme->set_stylebox("normal", "CodeEdit", style_widget); theme->set_stylebox("focus", "CodeEdit", style_widget_hover); theme->set_stylebox("read_only", "CodeEdit", style_widget_disabled); - theme->set_icon("tab", "CodeEdit", theme->get_icon("GuiTab", "EditorIcons")); - theme->set_icon("space", "CodeEdit", theme->get_icon("GuiSpace", "EditorIcons")); - theme->set_icon("folded", "CodeEdit", theme->get_icon("GuiTreeArrowRight", "EditorIcons")); - theme->set_icon("can_fold", "CodeEdit", theme->get_icon("GuiTreeArrowDown", "EditorIcons")); - theme->set_icon("executing_line", "CodeEdit", theme->get_icon("MainPlay", "EditorIcons")); - theme->set_icon("breakpoint", "CodeEdit", theme->get_icon("Breakpoint", "EditorIcons")); + theme->set_icon("tab", "CodeEdit", theme->get_icon(SNAME("GuiTab"), SNAME("EditorIcons"))); + theme->set_icon("space", "CodeEdit", theme->get_icon(SNAME("GuiSpace"), SNAME("EditorIcons"))); + theme->set_icon("folded", "CodeEdit", theme->get_icon(SNAME("GuiTreeArrowRight"), SNAME("EditorIcons"))); + theme->set_icon("can_fold", "CodeEdit", theme->get_icon(SNAME("GuiTreeArrowDown"), SNAME("EditorIcons"))); + theme->set_icon("executing_line", "CodeEdit", theme->get_icon(SNAME("MainPlay"), SNAME("EditorIcons"))); + theme->set_icon("breakpoint", "CodeEdit", theme->get_icon(SNAME("Breakpoint"), SNAME("EditorIcons"))); theme->set_constant("line_spacing", "CodeEdit", EDITOR_DEF("text_editor/appearance/whitespace/line_spacing", 6)); // H/VSplitContainer - theme->set_stylebox("bg", "VSplitContainer", make_stylebox(theme->get_icon("GuiVsplitBg", "EditorIcons"), 1, 1, 1, 1)); - theme->set_stylebox("bg", "HSplitContainer", make_stylebox(theme->get_icon("GuiHsplitBg", "EditorIcons"), 1, 1, 1, 1)); + theme->set_stylebox("bg", "VSplitContainer", make_stylebox(theme->get_icon(SNAME("GuiVsplitBg"), SNAME("EditorIcons")), 1, 1, 1, 1)); + theme->set_stylebox("bg", "HSplitContainer", make_stylebox(theme->get_icon(SNAME("GuiHsplitBg"), SNAME("EditorIcons")), 1, 1, 1, 1)); - theme->set_icon("grabber", "VSplitContainer", theme->get_icon("GuiVsplitter", "EditorIcons")); - theme->set_icon("grabber", "HSplitContainer", theme->get_icon("GuiHsplitter", "EditorIcons")); + theme->set_icon("grabber", "VSplitContainer", theme->get_icon(SNAME("GuiVsplitter"), SNAME("EditorIcons"))); + theme->set_icon("grabber", "HSplitContainer", theme->get_icon(SNAME("GuiHsplitter"), SNAME("EditorIcons"))); theme->set_constant("separation", "HSplitContainer", default_margin_size * 2 * EDSCALE); theme->set_constant("separation", "VSplitContainer", default_margin_size * 2 * EDSCALE); @@ -1184,14 +1201,14 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("embedded_border", "Window", style_window); theme->set_color("title_color", "Window", font_color); - theme->set_icon("close", "Window", theme->get_icon("GuiClose", "EditorIcons")); - theme->set_icon("close_pressed", "Window", theme->get_icon("GuiClose", "EditorIcons")); + theme->set_icon("close", "Window", theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); + theme->set_icon("close_pressed", "Window", theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); theme->set_constant("close_h_ofs", "Window", 22 * EDSCALE); theme->set_constant("close_v_ofs", "Window", 20 * EDSCALE); theme->set_constant("title_height", "Window", 24 * EDSCALE); theme->set_constant("resize_margin", "Window", 4 * EDSCALE); - theme->set_font("title_font", "Window", theme->get_font("title", "EditorFonts")); - theme->set_font_size("title_font_size", "Window", theme->get_font_size("title_size", "EditorFonts")); + theme->set_font("title_font", "Window", theme->get_font(SNAME("title"), SNAME("EditorFonts"))); + theme->set_font_size("title_font_size", "Window", theme->get_font_size(SNAME("title_size"), SNAME("EditorFonts"))); // Complex window (currently only Editor Settings and Project Settings) Ref<StyleBoxFlat> style_complex_window = style_window->duplicate(); @@ -1207,11 +1224,11 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // HScrollBar Ref<Texture2D> empty_icon = memnew(ImageTexture); - theme->set_stylebox("scroll", "HScrollBar", make_stylebox(theme->get_icon("GuiScrollBg", "EditorIcons"), 5, 5, 5, 5, 0, 0, 0, 0)); - theme->set_stylebox("scroll_focus", "HScrollBar", make_stylebox(theme->get_icon("GuiScrollBg", "EditorIcons"), 5, 5, 5, 5, 0, 0, 0, 0)); - theme->set_stylebox("grabber", "HScrollBar", make_stylebox(theme->get_icon("GuiScrollGrabber", "EditorIcons"), 6, 6, 6, 6, 2, 2, 2, 2)); - theme->set_stylebox("grabber_highlight", "HScrollBar", make_stylebox(theme->get_icon("GuiScrollGrabberHl", "EditorIcons"), 5, 5, 5, 5, 2, 2, 2, 2)); - theme->set_stylebox("grabber_pressed", "HScrollBar", make_stylebox(theme->get_icon("GuiScrollGrabberPressed", "EditorIcons"), 6, 6, 6, 6, 2, 2, 2, 2)); + theme->set_stylebox("scroll", "HScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); + theme->set_stylebox("scroll_focus", "HScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); + theme->set_stylebox("grabber", "HScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabber"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); + theme->set_stylebox("grabber_highlight", "HScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberHl"), SNAME("EditorIcons")), 5, 5, 5, 5, 2, 2, 2, 2)); + theme->set_stylebox("grabber_pressed", "HScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberPressed"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); theme->set_icon("increment", "HScrollBar", empty_icon); theme->set_icon("increment_highlight", "HScrollBar", empty_icon); @@ -1221,11 +1238,11 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_icon("decrement_pressed", "HScrollBar", empty_icon); // VScrollBar - theme->set_stylebox("scroll", "VScrollBar", make_stylebox(theme->get_icon("GuiScrollBg", "EditorIcons"), 5, 5, 5, 5, 0, 0, 0, 0)); - theme->set_stylebox("scroll_focus", "VScrollBar", make_stylebox(theme->get_icon("GuiScrollBg", "EditorIcons"), 5, 5, 5, 5, 0, 0, 0, 0)); - theme->set_stylebox("grabber", "VScrollBar", make_stylebox(theme->get_icon("GuiScrollGrabber", "EditorIcons"), 6, 6, 6, 6, 2, 2, 2, 2)); - theme->set_stylebox("grabber_highlight", "VScrollBar", make_stylebox(theme->get_icon("GuiScrollGrabberHl", "EditorIcons"), 5, 5, 5, 5, 2, 2, 2, 2)); - theme->set_stylebox("grabber_pressed", "VScrollBar", make_stylebox(theme->get_icon("GuiScrollGrabberPressed", "EditorIcons"), 6, 6, 6, 6, 2, 2, 2, 2)); + theme->set_stylebox("scroll", "VScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); + theme->set_stylebox("scroll_focus", "VScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); + theme->set_stylebox("grabber", "VScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabber"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); + theme->set_stylebox("grabber_highlight", "VScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberHl"), SNAME("EditorIcons")), 5, 5, 5, 5, 2, 2, 2, 2)); + theme->set_stylebox("grabber_pressed", "VScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberPressed"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); theme->set_icon("increment", "VScrollBar", empty_icon); theme->set_icon("increment_highlight", "VScrollBar", empty_icon); @@ -1235,15 +1252,15 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_icon("decrement_pressed", "VScrollBar", empty_icon); // HSlider - theme->set_icon("grabber_highlight", "HSlider", theme->get_icon("GuiSliderGrabberHl", "EditorIcons")); - theme->set_icon("grabber", "HSlider", theme->get_icon("GuiSliderGrabber", "EditorIcons")); + theme->set_icon("grabber_highlight", "HSlider", theme->get_icon(SNAME("GuiSliderGrabberHl"), SNAME("EditorIcons"))); + theme->set_icon("grabber", "HSlider", theme->get_icon(SNAME("GuiSliderGrabber"), SNAME("EditorIcons"))); theme->set_stylebox("slider", "HSlider", make_flat_stylebox(dark_color_3, 0, default_margin_size / 2, 0, default_margin_size / 2, corner_width)); theme->set_stylebox("grabber_area", "HSlider", make_flat_stylebox(contrast_color_1, 0, default_margin_size / 2, 0, default_margin_size / 2, corner_width)); theme->set_stylebox("grabber_area_highlight", "HSlider", make_flat_stylebox(contrast_color_1, 0, default_margin_size / 2, 0, default_margin_size / 2)); // VSlider - theme->set_icon("grabber", "VSlider", theme->get_icon("GuiSliderGrabber", "EditorIcons")); - theme->set_icon("grabber_highlight", "VSlider", theme->get_icon("GuiSliderGrabberHl", "EditorIcons")); + theme->set_icon("grabber", "VSlider", theme->get_icon(SNAME("GuiSliderGrabber"), SNAME("EditorIcons"))); + theme->set_icon("grabber_highlight", "VSlider", theme->get_icon(SNAME("GuiSliderGrabberHl"), SNAME("EditorIcons"))); theme->set_stylebox("slider", "VSlider", make_flat_stylebox(dark_color_3, default_margin_size / 2, 0, default_margin_size / 2, 0, corner_width)); theme->set_stylebox("grabber_area", "VSlider", make_flat_stylebox(contrast_color_1, default_margin_size / 2, 0, default_margin_size / 2, 0, corner_width)); theme->set_stylebox("grabber_area_highlight", "VSlider", make_flat_stylebox(contrast_color_1, default_margin_size / 2, 0, default_margin_size / 2, 0)); @@ -1276,7 +1293,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // Panel theme->set_stylebox("panel", "Panel", make_flat_stylebox(dark_color_1, 6, 4, 6, 4, corner_width)); - theme->set_stylebox("panel_fg", "Panel", style_default); + theme->set_stylebox("PanelForeground", "EditorStyles", style_default); // Label theme->set_stylebox("normal", "Label", style_empty); @@ -1312,12 +1329,12 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("panel", "PopupPanel", style_popup); // SpinBox - theme->set_icon("updown", "SpinBox", theme->get_icon("GuiSpinboxUpdown", "EditorIcons")); - theme->set_icon("updown_disabled", "SpinBox", theme->get_icon("GuiSpinboxUpdownDisabled", "EditorIcons")); + theme->set_icon("updown", "SpinBox", theme->get_icon(SNAME("GuiSpinboxUpdown"), SNAME("EditorIcons"))); + theme->set_icon("updown_disabled", "SpinBox", theme->get_icon(SNAME("GuiSpinboxUpdownDisabled"), SNAME("EditorIcons"))); // ProgressBar - theme->set_stylebox("bg", "ProgressBar", make_stylebox(theme->get_icon("GuiProgressBar", "EditorIcons"), 4, 4, 4, 4, 0, 0, 0, 0)); - theme->set_stylebox("fg", "ProgressBar", make_stylebox(theme->get_icon("GuiProgressFill", "EditorIcons"), 6, 6, 6, 6, 2, 1, 2, 1)); + theme->set_stylebox("bg", "ProgressBar", make_stylebox(theme->get_icon(SNAME("GuiProgressBar"), SNAME("EditorIcons")), 4, 4, 4, 4, 0, 0, 0, 0)); + theme->set_stylebox("fg", "ProgressBar", make_stylebox(theme->get_icon(SNAME("GuiProgressFill"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 1, 2, 1)); theme->set_color("font_color", "ProgressBar", font_color); // GraphEdit @@ -1329,15 +1346,15 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_color("grid_major", "GraphEdit", Color(0.0, 0.0, 0.0, 0.15)); theme->set_color("grid_minor", "GraphEdit", Color(0.0, 0.0, 0.0, 0.07)); } - theme->set_color("selection_fill", "GraphEdit", theme->get_color("box_selection_fill_color", "Editor")); - theme->set_color("selection_stroke", "GraphEdit", theme->get_color("box_selection_stroke_color", "Editor")); + theme->set_color("selection_fill", "GraphEdit", theme->get_color(SNAME("box_selection_fill_color"), SNAME("Editor"))); + theme->set_color("selection_stroke", "GraphEdit", theme->get_color(SNAME("box_selection_stroke_color"), SNAME("Editor"))); theme->set_color("activity", "GraphEdit", accent_color); - theme->set_icon("minus", "GraphEdit", theme->get_icon("ZoomLess", "EditorIcons")); - theme->set_icon("more", "GraphEdit", theme->get_icon("ZoomMore", "EditorIcons")); - theme->set_icon("reset", "GraphEdit", theme->get_icon("ZoomReset", "EditorIcons")); - theme->set_icon("snap", "GraphEdit", theme->get_icon("SnapGrid", "EditorIcons")); - theme->set_icon("minimap", "GraphEdit", theme->get_icon("GridMinimap", "EditorIcons")); - theme->set_icon("layout", "GraphEdit", theme->get_icon("GridLayout", "EditorIcons")); + theme->set_icon("minus", "GraphEdit", theme->get_icon(SNAME("ZoomLess"), SNAME("EditorIcons"))); + theme->set_icon("more", "GraphEdit", theme->get_icon(SNAME("ZoomMore"), SNAME("EditorIcons"))); + theme->set_icon("reset", "GraphEdit", theme->get_icon(SNAME("ZoomReset"), SNAME("EditorIcons"))); + theme->set_icon("snap", "GraphEdit", theme->get_icon(SNAME("SnapGrid"), SNAME("EditorIcons"))); + theme->set_icon("minimap", "GraphEdit", theme->get_icon(SNAME("GridMinimap"), SNAME("EditorIcons"))); + theme->set_icon("layout", "GraphEdit", theme->get_icon(SNAME("GridLayout"), SNAME("EditorIcons"))); theme->set_constant("bezier_len_pos", "GraphEdit", 80 * EDSCALE); theme->set_constant("bezier_len_neg", "GraphEdit", 160 * EDSCALE); @@ -1363,7 +1380,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("camera", "GraphEditMinimap", style_minimap_camera); theme->set_stylebox("node", "GraphEditMinimap", style_minimap_node); - Ref<Texture2D> minimap_resizer_icon = theme->get_icon("GuiResizer", "EditorIcons"); + Ref<Texture2D> minimap_resizer_icon = theme->get_icon(SNAME("GuiResizer"), SNAME("EditorIcons")); Color minimap_resizer_color; if (dark_theme) { minimap_resizer_color = Color(1, 1, 1, 0.65); @@ -1432,20 +1449,20 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_constant("close_offset", "GraphNode", 20 * EDSCALE); theme->set_constant("separation", "GraphNode", 1 * EDSCALE); - theme->set_icon("close", "GraphNode", theme->get_icon("GuiCloseCustomizable", "EditorIcons")); - theme->set_icon("resizer", "GraphNode", theme->get_icon("GuiResizer", "EditorIcons")); - theme->set_icon("port", "GraphNode", theme->get_icon("GuiGraphNodePort", "EditorIcons")); + theme->set_icon("close", "GraphNode", theme->get_icon(SNAME("GuiCloseCustomizable"), SNAME("EditorIcons"))); + theme->set_icon("resizer", "GraphNode", theme->get_icon(SNAME("GuiResizer"), SNAME("EditorIcons"))); + theme->set_icon("port", "GraphNode", theme->get_icon(SNAME("GuiGraphNodePort"), SNAME("EditorIcons"))); // GridContainer theme->set_constant("vseparation", "GridContainer", Math::round(widget_default_margin.y - 2 * EDSCALE)); // 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")); + theme->set_icon("folder", "FileDialog", theme->get_icon(SNAME("Folder"), SNAME("EditorIcons"))); + theme->set_icon("parent_folder", "FileDialog", theme->get_icon(SNAME("ArrowUp"), SNAME("EditorIcons"))); + theme->set_icon("back_folder", "FileDialog", theme->get_icon(SNAME("Back"), SNAME("EditorIcons"))); + theme->set_icon("forward_folder", "FileDialog", theme->get_icon(SNAME("Forward"), SNAME("EditorIcons"))); + theme->set_icon("reload", "FileDialog", theme->get_icon(SNAME("Reload"), SNAME("EditorIcons"))); + theme->set_icon("toggle_hidden", "FileDialog", theme->get_icon(SNAME("GuiVisibilityVisible"), SNAME("EditorIcons"))); // Use a different color for folder icons to make them easier to distinguish from files. // On a light theme, the icon will be dark, so we need to lighten it before blending it with the accent color. theme->set_color("folder_icon_modulate", "FileDialog", (dark_theme ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25)).lerp(accent_color, 0.7)); @@ -1457,22 +1474,22 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_constant("sv_height", "ColorPicker", 256 * EDSCALE); theme->set_constant("h_width", "ColorPicker", 30 * EDSCALE); theme->set_constant("label_width", "ColorPicker", 10 * EDSCALE); - theme->set_icon("screen_picker", "ColorPicker", theme->get_icon("ColorPick", "EditorIcons")); - theme->set_icon("add_preset", "ColorPicker", theme->get_icon("Add", "EditorIcons")); - theme->set_icon("sample_bg", "ColorPicker", theme->get_icon("GuiMiniCheckerboard", "EditorIcons")); - theme->set_icon("overbright_indicator", "ColorPicker", theme->get_icon("OverbrightIndicator", "EditorIcons")); - theme->set_icon("bar_arrow", "ColorPicker", theme->get_icon("ColorPickerBarArrow", "EditorIcons")); - theme->set_icon("picker_cursor", "ColorPicker", theme->get_icon("PickerCursor", "EditorIcons")); + theme->set_icon("screen_picker", "ColorPicker", theme->get_icon(SNAME("ColorPick"), SNAME("EditorIcons"))); + theme->set_icon("add_preset", "ColorPicker", theme->get_icon(SNAME("Add"), SNAME("EditorIcons"))); + theme->set_icon("sample_bg", "ColorPicker", theme->get_icon(SNAME("GuiMiniCheckerboard"), SNAME("EditorIcons"))); + theme->set_icon("overbright_indicator", "ColorPicker", theme->get_icon(SNAME("OverbrightIndicator"), SNAME("EditorIcons"))); + theme->set_icon("bar_arrow", "ColorPicker", theme->get_icon(SNAME("ColorPickerBarArrow"), SNAME("EditorIcons"))); + theme->set_icon("picker_cursor", "ColorPicker", theme->get_icon(SNAME("PickerCursor"), SNAME("EditorIcons"))); // ColorPickerButton - theme->set_icon("bg", "ColorPickerButton", theme->get_icon("GuiMiniCheckerboard", "EditorIcons")); + theme->set_icon("bg", "ColorPickerButton", theme->get_icon(SNAME("GuiMiniCheckerboard"), SNAME("EditorIcons"))); // ColorPresetButton Ref<StyleBoxFlat> preset_sb = make_flat_stylebox(Color(1, 1, 1), 2, 2, 2, 2, 2); preset_sb->set_anti_aliased(false); theme->set_stylebox("preset_fg", "ColorPresetButton", preset_sb); - theme->set_icon("preset_bg", "ColorPresetButton", theme->get_icon("GuiMiniCheckerboard", "EditorIcons")); - theme->set_icon("overbright_indicator", "ColorPresetButton", theme->get_icon("OverbrightIndicator", "EditorIcons")); + theme->set_icon("preset_bg", "ColorPresetButton", theme->get_icon(SNAME("GuiMiniCheckerboard"), SNAME("EditorIcons"))); + theme->set_icon("overbright_indicator", "ColorPresetButton", theme->get_icon(SNAME("OverbrightIndicator"), SNAME("EditorIcons"))); // Information on 3D viewport Ref<StyleBoxFlat> style_info_3d_viewport = style_default->duplicate(); @@ -1483,7 +1500,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // Asset Library. theme->set_stylebox("panel", "AssetLib", style_content_panel); theme->set_color("status_color", "AssetLib", Color(0.5, 0.5, 0.5)); - theme->set_icon("dismiss", "AssetLib", theme->get_icon("Close", "EditorIcons")); + theme->set_icon("dismiss", "AssetLib", theme->get_icon(SNAME("Close"), SNAME("EditorIcons"))); // Theme editor. theme->set_color("preview_picker_overlay_color", "ThemeEditor", Color(0.1, 0.1, 0.1, 0.25)); @@ -1498,6 +1515,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { Ref<StyleBoxFlat> theme_preview_picker_label_sb = make_flat_stylebox(theme_preview_picker_label_bg_color, 4.0, 1.0, 4.0, 3.0); theme->set_stylebox("preview_picker_label", "ThemeEditor", theme_preview_picker_label_sb); + // Dictionary editor add item. + theme->set_stylebox("DictionaryAddItem", "EditorStyles", make_flat_stylebox(prop_subsection_color, 4, 4, 4, 4, corner_radius)); + // adaptive script theme constants // for comments and elements with lower relevance const Color dim_color = Color(font_color.r, font_color.g, font_color.b, 0.5); @@ -1524,7 +1544,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color completion_background_color = dark_theme ? base_color : background_color; const Color completion_selected_color = alpha1; const Color completion_existing_color = alpha2; - const Color completion_scroll_color = alpha1; + // Same opacity as the scroll grabber editor icon. + const Color completion_scroll_color = Color(mono_value, mono_value, mono_value, 0.29); const Color completion_font_color = font_color; const Color text_color = font_color; const Color line_number_color = dim_color; diff --git a/editor/editor_toaster.cpp b/editor/editor_toaster.cpp index 6c9e4ab0fc..319b4709fe 100644 --- a/editor/editor_toaster.cpp +++ b/editor/editor_toaster.cpp @@ -28,13 +28,14 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "editor/editor_node.h" +#include "editor_toaster.h" + #include "editor/editor_scale.h" +#include "editor/editor_settings.h" +#include "scene/gui/button.h" #include "scene/gui/label.h" #include "scene/gui/panel_container.h" -#include "editor_toaster.h" - EditorToaster *EditorToaster::singleton = nullptr; void EditorToaster::_notification(int p_what) { @@ -103,6 +104,7 @@ void EditorToaster::_notification(int p_what) { main_button->update(); } } break; + case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { if (vbox_container->is_visible()) { @@ -113,32 +115,31 @@ void EditorToaster::_notification(int p_what) { disable_notifications_button->set_icon(get_theme_icon(SNAME("NotificationDisabled"), SNAME("EditorIcons"))); // Styleboxes background. - info_panel_style_background->set_bg_color(get_theme_color("base_color", "Editor")); + info_panel_style_background->set_bg_color(get_theme_color(SNAME("base_color"), SNAME("Editor"))); - warning_panel_style_background->set_bg_color(get_theme_color("base_color", "Editor")); - warning_panel_style_background->set_border_color(get_theme_color("warning_color", "Editor")); + warning_panel_style_background->set_bg_color(get_theme_color(SNAME("base_color"), SNAME("Editor"))); + warning_panel_style_background->set_border_color(get_theme_color(SNAME("warning_color"), SNAME("Editor"))); - error_panel_style_background->set_bg_color(get_theme_color("base_color", "Editor")); - error_panel_style_background->set_border_color(get_theme_color("error_color", "Editor")); + error_panel_style_background->set_bg_color(get_theme_color(SNAME("base_color"), SNAME("Editor"))); + error_panel_style_background->set_border_color(get_theme_color(SNAME("error_color"), SNAME("Editor"))); // Styleboxes progress. - info_panel_style_progress->set_bg_color(get_theme_color("base_color", "Editor").lightened(0.03)); + info_panel_style_progress->set_bg_color(get_theme_color(SNAME("base_color"), SNAME("Editor")).lightened(0.03)); - warning_panel_style_progress->set_bg_color(get_theme_color("base_color", "Editor").lightened(0.03)); - warning_panel_style_progress->set_border_color(get_theme_color("warning_color", "Editor")); + warning_panel_style_progress->set_bg_color(get_theme_color(SNAME("base_color"), SNAME("Editor")).lightened(0.03)); + warning_panel_style_progress->set_border_color(get_theme_color(SNAME("warning_color"), SNAME("Editor"))); - error_panel_style_progress->set_bg_color(get_theme_color("base_color", "Editor").lightened(0.03)); - error_panel_style_progress->set_border_color(get_theme_color("error_color", "Editor")); + error_panel_style_progress->set_bg_color(get_theme_color(SNAME("base_color"), SNAME("Editor")).lightened(0.03)); + error_panel_style_progress->set_border_color(get_theme_color(SNAME("error_color"), SNAME("Editor"))); main_button->update(); disable_notifications_button->update(); } break; + case NOTIFICATION_TRANSFORM_CHANGED: { _update_vbox_position(); _update_disable_notifications_button(); } break; - default: - break; } } @@ -256,13 +257,13 @@ void EditorToaster::_draw_button() { real_t button_radius = main_button->get_size().x / 8; switch (highest_severity) { case SEVERITY_INFO: - color = get_theme_color("accent_color", "Editor"); + color = get_theme_color(SNAME("accent_color"), SNAME("Editor")); break; case SEVERITY_WARNING: - color = get_theme_color("warning_color", "Editor"); + color = get_theme_color(SNAME("warning_color"), SNAME("Editor")); break; case SEVERITY_ERROR: - color = get_theme_color("error_color", "Editor"); + color = get_theme_color(SNAME("error_color"), SNAME("Editor")); break; default: break; @@ -360,7 +361,7 @@ Control *EditorToaster::popup(Control *p_control, Severity p_severity, double p_ if (p_time > 0.0) { Button *close_button = memnew(Button); close_button->set_flat(true); - close_button->set_icon(get_theme_icon("Close", "EditorIcons")); + close_button->set_icon(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); close_button->connect("pressed", callable_bind(callable_mp(this, &EditorToaster::close), panel)); close_button->connect("theme_changed", callable_bind(callable_mp(this, &EditorToaster::_close_button_theme_changed), close_button)); hbox_container->add_child(close_button); @@ -442,7 +443,7 @@ void EditorToaster::close(Control *p_control) { void EditorToaster::_close_button_theme_changed(Control *p_close_button) { Button *close_button = Object::cast_to<Button>(p_close_button); if (close_button) { - close_button->set_icon(get_theme_icon("Close", "EditorIcons")); + close_button->set_icon(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); } } diff --git a/editor/editor_toaster.h b/editor/editor_toaster.h index 5f220e98c4..2ad8752bee 100644 --- a/editor/editor_toaster.h +++ b/editor/editor_toaster.h @@ -31,12 +31,12 @@ #ifndef EDITOR_TOASTER_H #define EDITOR_TOASTER_H -#include "scene/gui/box_container.h" -#include "scene/gui/button.h" -#include "scene/gui/popup.h" - #include "core/string/ustring.h" #include "core/templates/local_vector.h" +#include "scene/gui/box_container.h" + +class Button; +class PanelContainer; class EditorToaster : public HBoxContainer { GDCLASS(EditorToaster, HBoxContainer); diff --git a/editor/editor_translation.cpp b/editor/editor_translation.cpp index 98248f3a87..f64adcf0a1 100644 --- a/editor/editor_translation.cpp +++ b/editor/editor_translation.cpp @@ -56,7 +56,8 @@ void load_editor_translations(const String &p_locale) { if (etl->lang == p_locale) { Vector<uint8_t> data; data.resize(etl->uncomp_size); - Compression::decompress(data.ptrw(), etl->uncomp_size, etl->data, etl->comp_size, Compression::MODE_DEFLATE); + int ret = Compression::decompress(data.ptrw(), etl->uncomp_size, etl->data, etl->comp_size, Compression::MODE_DEFLATE); + ERR_FAIL_COND_MSG(ret == -1, "Compressed file is corrupt."); FileAccessMemory *fa = memnew(FileAccessMemory); fa->open_custom(data.ptr(), data.size()); @@ -80,7 +81,8 @@ void load_doc_translations(const String &p_locale) { if (dtl->lang == p_locale) { Vector<uint8_t> data; data.resize(dtl->uncomp_size); - Compression::decompress(data.ptrw(), dtl->uncomp_size, dtl->data, dtl->comp_size, Compression::MODE_DEFLATE); + int ret = Compression::decompress(data.ptrw(), dtl->uncomp_size, dtl->data, dtl->comp_size, Compression::MODE_DEFLATE); + ERR_FAIL_COND_MSG(ret == -1, "Compressed file is corrupt."); FileAccessMemory *fa = memnew(FileAccessMemory); fa->open_custom(data.ptr(), data.size()); diff --git a/editor/editor_zoom_widget.cpp b/editor/editor_zoom_widget.cpp index abfa383297..c8099c9a0b 100644 --- a/editor/editor_zoom_widget.cpp +++ b/editor/editor_zoom_widget.cpp @@ -144,12 +144,10 @@ void EditorZoomWidget::set_zoom_by_increments(int p_increment_count, bool p_inte void EditorZoomWidget::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_THEME_CHANGED: { zoom_minus->set_icon(get_theme_icon(SNAME("ZoomLess"), SNAME("EditorIcons"))); zoom_plus->set_icon(get_theme_icon(SNAME("ZoomMore"), SNAME("EditorIcons"))); - break; - default: - break; + } break; } } diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index 8c34609e9c..3cad600002 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -36,8 +36,9 @@ #include "core/io/zip_io.h" #include "core/os/keyboard.h" #include "core/version.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_node.h" +#include "editor/editor_paths.h" +#include "editor/editor_scale.h" #include "progress_dialog.h" #include "scene/gui/link_button.h" diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index cd29a3e617..b41123c0dd 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -37,16 +37,18 @@ #include "core/os/keyboard.h" #include "core/os/os.h" #include "core/templates/list.h" -#include "editor_feature_profile.h" -#include "editor_node.h" -#include "editor_resource_preview.h" -#include "editor_scale.h" -#include "editor_settings.h" -#include "import_dock.h" +#include "editor/editor_feature_profile.h" +#include "editor/editor_node.h" +#include "editor/editor_resource_preview.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" +#include "editor/import_dock.h" +#include "editor/scene_tree_dock.h" +#include "editor/shader_create_dialog.h" +#include "scene/gui/label.h" #include "scene/main/window.h" #include "scene/resources/packed_scene.h" #include "servers/display_server.h" -#include "shader_create_dialog.h" FileSystemDock *FileSystemDock::singleton = nullptr; @@ -338,30 +340,28 @@ void FileSystemDock::_notification(int p_what) { EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &FileSystemDock::_fs_changed)); EditorResourcePreview::get_singleton()->connect("preview_invalidated", callable_mp(this, &FileSystemDock::_preview_invalidated)); - String ei = "EditorIcons"; - - button_reload->set_icon(get_theme_icon(SNAME("Reload"), ei)); - button_toggle_display_mode->set_icon(get_theme_icon(SNAME("Panels2"), ei)); + button_reload->set_icon(get_theme_icon(SNAME("Reload"), SNAME("EditorIcons"))); + button_toggle_display_mode->set_icon(get_theme_icon(SNAME("Panels2"), SNAME("EditorIcons"))); button_file_list_display_mode->connect("pressed", callable_mp(this, &FileSystemDock::_toggle_file_display)); files->connect("item_activated", callable_mp(this, &FileSystemDock::_file_list_activate_file)); button_hist_next->connect("pressed", callable_mp(this, &FileSystemDock::_fw_history)); button_hist_prev->connect("pressed", callable_mp(this, &FileSystemDock::_bw_history)); - tree_search_box->set_right_icon(get_theme_icon(SNAME("Search"), ei)); + tree_search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); tree_search_box->set_clear_button_enabled(true); - tree_button_sort->set_icon(get_theme_icon(SNAME("Sort"), ei)); + tree_button_sort->set_icon(get_theme_icon(SNAME("Sort"), SNAME("EditorIcons"))); - file_list_search_box->set_right_icon(get_theme_icon(SNAME("Search"), ei)); + file_list_search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); file_list_search_box->set_clear_button_enabled(true); - file_list_button_sort->set_icon(get_theme_icon(SNAME("Sort"), ei)); + file_list_button_sort->set_icon(get_theme_icon(SNAME("Sort"), SNAME("EditorIcons"))); if (is_layout_rtl()) { - button_hist_next->set_icon(get_theme_icon(SNAME("Back"), ei)); - button_hist_prev->set_icon(get_theme_icon(SNAME("Forward"), ei)); + button_hist_next->set_icon(get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); + button_hist_prev->set_icon(get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); } else { - button_hist_next->set_icon(get_theme_icon(SNAME("Forward"), ei)); - button_hist_prev->set_icon(get_theme_icon(SNAME("Back"), ei)); + button_hist_next->set_icon(get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); + button_hist_prev->set_icon(get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); } file_list_popup->connect("id_pressed", callable_mp(this, &FileSystemDock::_file_list_rmb_option)); tree_popup->connect("id_pressed", callable_mp(this, &FileSystemDock::_tree_rmb_option)); @@ -412,15 +412,14 @@ void FileSystemDock::_notification(int p_what) { case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { // Update icons. - String ei = "EditorIcons"; - button_reload->set_icon(get_theme_icon(SNAME("Reload"), ei)); - button_toggle_display_mode->set_icon(get_theme_icon(SNAME("Panels2"), ei)); + button_reload->set_icon(get_theme_icon(SNAME("Reload"), SNAME("EditorIcons"))); + button_toggle_display_mode->set_icon(get_theme_icon(SNAME("Panels2"), SNAME("EditorIcons"))); if (is_layout_rtl()) { - button_hist_next->set_icon(get_theme_icon(SNAME("Back"), ei)); - button_hist_prev->set_icon(get_theme_icon(SNAME("Forward"), ei)); + button_hist_next->set_icon(get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); + button_hist_prev->set_icon(get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); } else { - button_hist_next->set_icon(get_theme_icon(SNAME("Forward"), ei)); - button_hist_prev->set_icon(get_theme_icon(SNAME("Back"), ei)); + button_hist_next->set_icon(get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); + button_hist_prev->set_icon(get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); } if (file_list_display_mode == FILE_LIST_DISPLAY_LIST) { button_file_list_display_mode->set_icon(get_theme_icon(SNAME("FileThumbnail"), SNAME("EditorIcons"))); @@ -428,13 +427,13 @@ void FileSystemDock::_notification(int p_what) { button_file_list_display_mode->set_icon(get_theme_icon(SNAME("FileList"), SNAME("EditorIcons"))); } - tree_search_box->set_right_icon(get_theme_icon(SNAME("Search"), ei)); + tree_search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); tree_search_box->set_clear_button_enabled(true); - tree_button_sort->set_icon(get_theme_icon(SNAME("Sort"), ei)); + tree_button_sort->set_icon(get_theme_icon(SNAME("Sort"), SNAME("EditorIcons"))); - file_list_search_box->set_right_icon(get_theme_icon(SNAME("Search"), ei)); + file_list_search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); file_list_search_box->set_clear_button_enabled(true); - file_list_button_sort->set_icon(get_theme_icon(SNAME("Sort"), ei)); + file_list_button_sort->set_icon(get_theme_icon(SNAME("Sort"), SNAME("EditorIcons"))); // Update always show folders. bool new_always_show_folders = bool(EditorSettings::get_singleton()->get("docks/filesystem/always_show_folders")); @@ -629,7 +628,7 @@ void FileSystemDock::_search(EditorFileSystemDirectory *p_path, List<FileInfo> * for (int i = 0; i < p_path->get_file_count(); i++) { String file = p_path->get_file(i); - if (file.to_lower().find(searched_string) != -1) { + if (file.to_lower().contains(searched_string)) { FileInfo fi; fi.name = file; fi.type = p_path->get_file_type(i); @@ -718,7 +717,6 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { String directory = path; String file = ""; - String ei = "EditorIcons"; int thumbnail_size = EditorSettings::get_singleton()->get("docks/filesystem/thumbnail_size"); thumbnail_size *= EDSCALE; Ref<Texture2D> folder_thumbnail; @@ -736,13 +734,13 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { files->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size)); if (thumbnail_size < 64) { - folder_thumbnail = get_theme_icon(SNAME("FolderMediumThumb"), ei); - file_thumbnail = get_theme_icon(SNAME("FileMediumThumb"), ei); - file_thumbnail_broken = get_theme_icon(SNAME("FileDeadMediumThumb"), ei); + folder_thumbnail = get_theme_icon(SNAME("FolderMediumThumb"), SNAME("EditorIcons")); + file_thumbnail = get_theme_icon(SNAME("FileMediumThumb"), SNAME("EditorIcons")); + file_thumbnail_broken = get_theme_icon(SNAME("FileDeadMediumThumb"), SNAME("EditorIcons")); } else { - folder_thumbnail = get_theme_icon(SNAME("FolderBigThumb"), ei); - file_thumbnail = get_theme_icon(SNAME("FileBigThumb"), ei); - file_thumbnail_broken = get_theme_icon(SNAME("FileDeadBigThumb"), ei); + folder_thumbnail = get_theme_icon(SNAME("FolderBigThumb"), SNAME("EditorIcons")); + file_thumbnail = get_theme_icon(SNAME("FileBigThumb"), SNAME("EditorIcons")); + file_thumbnail_broken = get_theme_icon(SNAME("FileDeadBigThumb"), SNAME("EditorIcons")); } } else { // No thumbnails. @@ -871,7 +869,6 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { // Fills the ItemList control node from the FileInfos. String main_scene = ProjectSettings::get_singleton()->get("application/run/main_scene"); - String oi = "Object"; for (FileInfo &E : file_list) { FileInfo *finfo = &(E); String fname = finfo->name; @@ -885,10 +882,10 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { // Select the icons. if (!finfo->import_broken) { - type_icon = (has_theme_icon(ftype, ei)) ? get_theme_icon(ftype, ei) : get_theme_icon(oi, ei); + type_icon = (has_theme_icon(ftype, SNAME("EditorIcons"))) ? get_theme_icon(ftype, SNAME("EditorIcons")) : get_theme_icon(SNAME("Object"), SNAME("EditorIcons")); big_icon = file_thumbnail; } else { - type_icon = get_theme_icon(SNAME("ImportFail"), ei); + type_icon = get_theme_icon(SNAME("ImportFail"), SNAME("EditorIcons")); big_icon = file_thumbnail_broken; tooltip += "\n" + TTR("Status: Import of file failed. Please fix file and reimport manually."); } @@ -980,10 +977,10 @@ void FileSystemDock::_select_file(const String &p_path, bool p_select_in_favorit if (is_imported) { ResourceImporterScene::get_singleton()->show_advanced_options(fpath); } else { - editor->open_request(fpath); + EditorNode::get_singleton()->open_request(fpath); } } else { - editor->load_resource(fpath); + EditorNode::get_singleton()->load_resource(fpath); } } _navigate_to_path(fpath, p_select_in_favorites); @@ -1176,12 +1173,12 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_ // Update scene if it is open. for (int i = 0; i < file_changed_paths.size(); ++i) { String new_item_path = p_item.is_file ? new_path : file_changed_paths[i].replace_first(old_path, new_path); - if (ResourceLoader::get_resource_type(new_item_path) == "PackedScene" && editor->is_scene_open(file_changed_paths[i])) { - EditorData *ed = &editor->get_editor_data(); + if (ResourceLoader::get_resource_type(new_item_path) == "PackedScene" && EditorNode::get_singleton()->is_scene_open(file_changed_paths[i])) { + EditorData *ed = &EditorNode::get_singleton()->get_editor_data(); for (int j = 0; j < ed->get_edited_scene_count(); j++) { if (ed->get_scene_path(j) == file_changed_paths[i]) { ed->get_edited_scene_root(j)->set_scene_file_path(new_item_path); - editor->save_layout(); + EditorNode::get_singleton()->save_layout(); break; } } @@ -1230,6 +1227,30 @@ void FileSystemDock::_try_duplicate_item(const FileOrFolder &p_item, const Strin if (err != OK) { EditorNode::get_singleton()->add_io_error(TTR("Error duplicating:") + "\n" + old_path + ".import\n"); } + + // Remove uid from .import file to avoid conflict. + Ref<ConfigFile> cfg; + cfg.instantiate(); + cfg->load(new_path + ".import"); + cfg->erase_section_key("remap", "uid"); + cfg->save(new_path + ".import"); + } else if (p_item.is_file && (old_path.get_extension() == "tscn" || old_path.get_extension() == "tres")) { + // FIXME: Quick hack to fix text resources. This should be fixed properly. + FileAccessRef file = FileAccess::open(old_path, FileAccess::READ, &err); + if (err == OK) { + PackedStringArray lines = file->get_as_utf8_string().split("\n"); + String line = lines[0]; + + if (line.contains("uid")) { + line = line.substr(0, line.find(" uid")) + "]"; + lines.write[0] = line; + + FileAccessRef file2 = FileAccess::open(new_path, FileAccess::WRITE, &err); + if (err == OK) { + file2->store_string(String("\n").join(lines)); + } + } + } } } else { EditorNode::get_singleton()->add_io_error(TTR("Error duplicating:") + "\n" + old_path + "\n"); @@ -1295,7 +1316,7 @@ void FileSystemDock::_update_dependencies_after_move(const Map<String, String> & Error err = ResourceLoader::rename_dependencies(file, p_renames); if (err == OK) { if (ResourceLoader::get_resource_type(file) == "PackedScene") { - editor->reload_scene(file); + EditorNode::get_singleton()->reload_scene(file); } } else { EditorNode::get_singleton()->add_io_error(TTR("Unable to update dependencies:") + "\n" + remaps[i] + "\n"); @@ -1364,7 +1385,7 @@ void FileSystemDock::_save_scenes_after_move(const Map<String, String> &p_rename } } - editor->save_scene_list(new_filenames); + EditorNode::get_singleton()->save_scene_list(new_filenames); } void FileSystemDock::_make_dir_confirm() { @@ -1373,8 +1394,8 @@ void FileSystemDock::_make_dir_confirm() { if (dir_name.length() == 0) { EditorNode::get_singleton()->show_warning(TTR("No name provided.")); return; - } else if (dir_name.find("/") != -1 || dir_name.find("\\") != -1 || dir_name.find(":") != -1 || dir_name.find("*") != -1 || - dir_name.find("|") != -1 || dir_name.find(">") != -1 || dir_name.ends_with(".") || dir_name.ends_with(" ")) { + } else if (dir_name.contains("/") || dir_name.contains("\\") || dir_name.contains(":") || dir_name.contains("*") || + dir_name.contains("|") || dir_name.contains(">") || dir_name.ends_with(".") || dir_name.ends_with(" ")) { EditorNode::get_singleton()->show_warning(TTR("Provided name contains invalid characters.")); return; } @@ -1438,8 +1459,8 @@ void FileSystemDock::_make_scene_confirm() { } memdelete(da); - int idx = editor->new_scene(); - editor->get_editor_data().set_scene_path(idx, scene_name); + int idx = EditorNode::get_singleton()->new_scene(); + EditorNode::get_singleton()->get_editor_data().set_scene_path(idx, scene_name); } void FileSystemDock::_file_removed(String p_file) { @@ -1478,7 +1499,7 @@ void FileSystemDock::_rename_operation_confirm() { if (new_name.length() == 0) { EditorNode::get_singleton()->show_warning(TTR("No name provided.")); return; - } else if (new_name.find("/") != -1 || new_name.find("\\") != -1 || new_name.find(":") != -1) { + } else if (new_name.contains("/") || new_name.contains("\\") || new_name.contains(":")) { EditorNode::get_singleton()->show_warning(TTR("Name contains invalid characters.")); return; } else if (to_rename.is_file && old_name.get_extension() != new_name.get_extension()) { @@ -1516,14 +1537,14 @@ void FileSystemDock::_rename_operation_confirm() { Map<String, String> folder_renames; _try_move_item(to_rename, new_path, file_renames, folder_renames); - int current_tab = editor->get_current_tab(); + int current_tab = EditorNode::get_singleton()->get_current_tab(); _save_scenes_after_move(file_renames); // save scenes before updating _update_dependencies_after_move(file_renames); _update_resource_paths_after_move(file_renames); _update_project_settings_after_move(file_renames); _update_favorites_list_after_move(file_renames, folder_renames); - editor->set_current_tab(current_tab); + EditorNode::get_singleton()->set_current_tab(current_tab); print_verbose("FileSystem: calling rescan."); _rescan(); @@ -1540,7 +1561,7 @@ void FileSystemDock::_duplicate_operation_confirm() { if (new_name.length() == 0) { EditorNode::get_singleton()->show_warning(TTR("No name provided.")); return; - } else if (new_name.find("/") != -1 || new_name.find("\\") != -1 || new_name.find(":") != -1) { + } else if (new_name.contains("/") || new_name.contains("\\") || new_name.contains(":")) { EditorNode::get_singleton()->show_warning(TTR("Name contains invalid characters.")); return; } @@ -1627,14 +1648,14 @@ void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool p_ove } if (is_moved) { - int current_tab = editor->get_current_tab(); + int current_tab = EditorNode::get_singleton()->get_current_tab(); _save_scenes_after_move(file_renames); // Save scenes before updating. _update_dependencies_after_move(file_renames); _update_resource_paths_after_move(file_renames); _update_project_settings_after_move(file_renames); _update_favorites_list_after_move(file_renames, folder_renames); - editor->set_current_tab(current_tab); + EditorNode::get_singleton()->set_current_tab(current_tab); print_verbose("FileSystem: calling rescan."); _rescan(); @@ -1801,7 +1822,7 @@ void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected // Add the files from favorites. Vector<String> favorites = EditorSettings::get_singleton()->get_favorites(); for (int i = 0; i < p_selected.size(); i++) { - if (favorites.find(p_selected[i]) == -1) { + if (!favorites.has(p_selected[i])) { favorites.push_back(p_selected[i]); } } @@ -2006,8 +2027,8 @@ void FileSystemDock::_resource_created() { memdelete(node); } - editor->push_item(r); - editor->save_resource_as(RES(r), fpath); + EditorNode::get_singleton()->push_item(r); + EditorNode::get_singleton()->save_resource_as(RES(r), fpath); } void FileSystemDock::_search_changed(const String &p_text, const Control *p_from) { @@ -2324,7 +2345,7 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data, Vector<String> fnames = drag_data["files"]; Vector<String> favorites = EditorSettings::get_singleton()->get_favorites(); for (int i = 0; i < fnames.size(); i++) { - if (favorites.find(fnames[i]) == -1) { + if (!favorites.has(fnames[i])) { favorites.push_back(fnames[i]); } } @@ -2817,10 +2838,9 @@ void FileSystemDock::_bind_methods() { ADD_SIGNAL(MethodInfo("display_mode_changed")); } -FileSystemDock::FileSystemDock(EditorNode *p_editor) { +FileSystemDock::FileSystemDock() { singleton = this; set_name("FileSystem"); - editor = p_editor; path = "res://"; // `KeyModifierMask::CMD | Key::C` conflicts with other editor shortcuts. @@ -2960,7 +2980,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { deps_editor = memnew(DependencyEditor); add_child(deps_editor); - owners_editor = memnew(DependencyEditorOwners(editor)); + owners_editor = memnew(DependencyEditorOwners()); add_child(owners_editor); remove_dialog = memnew(DependencyRemoveDialog); diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index 1dc986dcb2..21c50beeb2 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -31,29 +31,22 @@ #ifndef FILESYSTEM_DOCK_H #define FILESYSTEM_DOCK_H +#include "editor/create_dialog.h" +#include "editor/dependency_editor.h" +#include "editor/editor_dir_dialog.h" +#include "editor/editor_file_system.h" +#include "editor/plugins/script_editor_plugin.h" +#include "editor/script_create_dialog.h" #include "scene/gui/box_container.h" #include "scene/gui/control.h" #include "scene/gui/dialogs.h" #include "scene/gui/item_list.h" -#include "scene/gui/label.h" +#include "scene/gui/line_edit.h" #include "scene/gui/menu_button.h" -#include "scene/gui/option_button.h" #include "scene/gui/progress_bar.h" #include "scene/gui/split_container.h" #include "scene/gui/tree.h" -#include "scene/main/timer.h" -#include "core/io/dir_access.h" -#include "core/os/thread.h" - -#include "create_dialog.h" - -#include "dependency_editor.h" -#include "editor_dir_dialog.h" -#include "editor_file_system.h" -#include "script_create_dialog.h" - -class EditorNode; class ShaderCreateDialog; class FileSystemDock : public VBoxContainer { @@ -114,7 +107,6 @@ private: VSplitContainer *split_box; VBoxContainer *file_list_vb; - EditorNode *editor; Set<String> favorites; Button *button_toggle_display_mode; @@ -336,7 +328,7 @@ public: void set_file_list_display_mode(FileListDisplayMode p_mode); FileListDisplayMode get_file_list_display_mode() { return file_list_display_mode; }; - FileSystemDock(EditorNode *p_editor); + FileSystemDock(); ~FileSystemDock(); }; diff --git a/editor/find_in_files.cpp b/editor/find_in_files.cpp index 131ecc3b12..eff9185c71 100644 --- a/editor/find_in_files.cpp +++ b/editor/find_in_files.cpp @@ -30,10 +30,11 @@ #include "find_in_files.h" +#include "core/config/project_settings.h" #include "core/io/dir_access.h" #include "core/os/os.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" #include "scene/gui/check_box.h" @@ -53,11 +54,6 @@ inline void pop_back(T &container) { container.resize(container.size() - 1); } -// TODO: Copied from TextEdit private, would be nice to extract it in a single place. -static bool is_text_char(char32_t c) { - return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'; -} - static bool find_next(const String &line, String pattern, int from, bool match_case, bool whole_words, int &out_begin, int &out_end) { int end = from; @@ -73,10 +69,10 @@ static bool find_next(const String &line, String pattern, int from, bool match_c out_end = end; if (whole_words) { - if (begin > 0 && is_text_char(line[begin - 1])) { + if (begin > 0 && (is_ascii_identifier_char(line[begin - 1]))) { continue; } - if (end < line.size() && is_text_char(line[end])) { + if (end < line.size() && (is_ascii_identifier_char(line[end]))) { continue; } } @@ -107,9 +103,11 @@ void FindInFiles::set_filter(const Set<String> &exts) { _extension_filter = exts; } -void FindInFiles::_notification(int p_notification) { - if (p_notification == NOTIFICATION_PROCESS) { - _process(); +void FindInFiles::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_PROCESS: { + _process(); + } break; } } @@ -460,26 +458,28 @@ Set<String> FindInFilesDialog::get_filter() const { } void FindInFilesDialog::_notification(int p_what) { - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (is_visible()) { - // Doesn't work more than once if not deferred... - _search_text_line_edit->call_deferred(SNAME("grab_focus")); - _search_text_line_edit->select_all(); - // Extensions might have changed in the meantime, we clean them and instance them again. - for (int i = 0; i < _filters_container->get_child_count(); i++) { - _filters_container->get_child(i)->queue_delete(); - } - Array exts = ProjectSettings::get_singleton()->get("editor/script/search_in_file_extensions"); - for (int i = 0; i < exts.size(); ++i) { - CheckBox *cb = memnew(CheckBox); - cb->set_text(exts[i]); - if (!_filters_preferences.has(exts[i])) { - _filters_preferences[exts[i]] = true; + switch (p_what) { + case NOTIFICATION_VISIBILITY_CHANGED: { + if (is_visible()) { + // Doesn't work more than once if not deferred... + _search_text_line_edit->call_deferred(SNAME("grab_focus")); + _search_text_line_edit->select_all(); + // Extensions might have changed in the meantime, we clean them and instance them again. + for (int i = 0; i < _filters_container->get_child_count(); i++) { + _filters_container->get_child(i)->queue_delete(); + } + Array exts = ProjectSettings::get_singleton()->get("editor/script/search_in_file_extensions"); + for (int i = 0; i < exts.size(); ++i) { + CheckBox *cb = memnew(CheckBox); + cb->set_text(exts[i]); + if (!_filters_preferences.has(exts[i])) { + _filters_preferences[exts[i]] = true; + } + cb->set_pressed(_filters_preferences[exts[i]]); + _filters_container->add_child(cb); } - cb->set_pressed(_filters_preferences[exts[i]]); - _filters_container->add_child(cb); } - } + } break; } } @@ -691,11 +691,15 @@ void FindInFilesPanel::stop_search() { } void FindInFilesPanel::_notification(int p_what) { - if (p_what == NOTIFICATION_PROCESS) { - _progress_bar->set_as_ratio(_finder->get_progress()); - } else if (p_what == NOTIFICATION_THEME_CHANGED) { - _search_text_label->add_theme_font_override("font", get_theme_font(SNAME("source"), SNAME("EditorFonts"))); - _results_display->add_theme_font_override("font", get_theme_font(SNAME("source"), SNAME("EditorFonts"))); + switch (p_what) { + case NOTIFICATION_PROCESS: { + _progress_bar->set_as_ratio(_finder->get_progress()); + } break; + + case NOTIFICATION_THEME_CHANGED: { + _search_text_label->add_theme_font_override("font", get_theme_font(SNAME("source"), SNAME("EditorFonts"))); + _results_display->add_theme_font_override("font", get_theme_font(SNAME("source"), SNAME("EditorFonts"))); + } break; } } diff --git a/editor/find_in_files.h b/editor/find_in_files.h index fca6910f1c..1b6666b554 100644 --- a/editor/find_in_files.h +++ b/editor/find_in_files.h @@ -60,7 +60,7 @@ public: float get_progress() const; protected: - void _notification(int p_notification); + void _notification(int p_what); static void _bind_methods(); diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp index 1644bb9dbe..4b3a7a8313 100644 --- a/editor/groups_editor.cpp +++ b/editor/groups_editor.cpp @@ -30,9 +30,10 @@ #include "groups_editor.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/scene_tree_dock.h" #include "editor/scene_tree_editor.h" -#include "editor_node.h" -#include "editor_scale.h" #include "scene/gui/box_container.h" #include "scene/gui/label.h" #include "scene/resources/packed_scene.h" diff --git a/editor/icons/ControlAlignBottomCenter.svg b/editor/icons/ControlAlignCenterBottom.svg index ca7f0c2e01..ca7f0c2e01 100644 --- a/editor/icons/ControlAlignBottomCenter.svg +++ b/editor/icons/ControlAlignCenterBottom.svg diff --git a/editor/icons/ControlAlignLeftCenter.svg b/editor/icons/ControlAlignCenterLeft.svg index 612c36b4d6..612c36b4d6 100644 --- a/editor/icons/ControlAlignLeftCenter.svg +++ b/editor/icons/ControlAlignCenterLeft.svg diff --git a/editor/icons/ControlAlignRightCenter.svg b/editor/icons/ControlAlignCenterRight.svg index 43f8618c80..43f8618c80 100644 --- a/editor/icons/ControlAlignRightCenter.svg +++ b/editor/icons/ControlAlignCenterRight.svg diff --git a/editor/icons/ControlAlignTopCenter.svg b/editor/icons/ControlAlignCenterTop.svg index dca9c84ce6..dca9c84ce6 100644 --- a/editor/icons/ControlAlignTopCenter.svg +++ b/editor/icons/ControlAlignCenterTop.svg diff --git a/editor/icons/ControlHcenterWide.svg b/editor/icons/ControlAlignHCenterWide.svg index af3f9b495b..af3f9b495b 100644 --- a/editor/icons/ControlHcenterWide.svg +++ b/editor/icons/ControlAlignHCenterWide.svg diff --git a/editor/icons/ControlVcenterWide.svg b/editor/icons/ControlAlignVCenterWide.svg index decd1cbd12..decd1cbd12 100644 --- a/editor/icons/ControlVcenterWide.svg +++ b/editor/icons/ControlAlignVCenterWide.svg diff --git a/editor/icons/GuiMiniCheckerboard.svg b/editor/icons/GuiMiniCheckerboard.svg index 0ae6a855bd..03438f75a6 100644 --- a/editor/icons/GuiMiniCheckerboard.svg +++ b/editor/icons/GuiMiniCheckerboard.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-linecap="round" stroke-linejoin="round" stroke-width="1.9994"><path d="m0 0v8h8v-8zm8 8v8h8v-8z" fill="#e0e0e0"/><path d="m8 0v8h8v-8zm0 8h-8v8h8z" fill="#fff"/></g></svg> +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g stroke-width="2"><path d="m0 0v8h8v-8zm8 8v8h8v-8z" fill="#808080"/><path d="m8 0v8h8v-8zm0 8h-8v8h8z" fill="#fff"/></g></svg> diff --git a/editor/icons/GuiToggleOffDisabled.svg b/editor/icons/GuiToggleOffDisabled.svg new file mode 100644 index 0000000000..020ebdc3a8 --- /dev/null +++ b/editor/icons/GuiToggleOffDisabled.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 38 15.999999" width="38" xmlns="http://www.w3.org/2000/svg"><g fill="#808080"><rect fill-opacity=".188235" height="14" rx="7" stroke-width="55.8958" width="36" x="1" y="1"/><circle cx="8" cy="8" r="5" stroke-width="97.3613"/></g></svg> diff --git a/editor/icons/GuiToggleOffDisabledMirrored.svg b/editor/icons/GuiToggleOffDisabledMirrored.svg new file mode 100644 index 0000000000..79ab79a20f --- /dev/null +++ b/editor/icons/GuiToggleOffDisabledMirrored.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 38 16" xmlns="http://www.w3.org/2000/svg"><g fill="#808080"><path d="m1 8c0-3.863 3.137-7 7-7h22c3.863 0 7 3.137 7 7s-3.137 7-7 7h-22c-3.863 0-7-3.137-7-7z" fill-opacity=".18"/><circle cx="30" cy="8" r="5"/></g></svg> diff --git a/editor/icons/GuiToggleOffMirrored.svg b/editor/icons/GuiToggleOffMirrored.svg index d650de9cda..58122b9d1f 100644 --- a/editor/icons/GuiToggleOffMirrored.svg +++ b/editor/icons/GuiToggleOffMirrored.svg @@ -1 +1 @@ -<svg height="26" width="42" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="matrix(-1 0 0 1 42 0)"><rect fill-opacity=".188" height="16" rx="9" width="38" x="2" y="5"/><circle cx="10" cy="13" r="5"/></g></svg> +<svg viewBox="0 0 38 16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m1 8c0-3.863 3.137-7 7-7h22c3.863 0 7 3.137 7 7s-3.137 7-7 7h-22c-3.863 0-7-3.137-7-7z" fill-opacity=".18"/><circle cx="30" cy="8" r="5"/></g></svg> diff --git a/editor/icons/GuiToggleOnDisabled.svg b/editor/icons/GuiToggleOnDisabled.svg new file mode 100644 index 0000000000..df6b27c71e --- /dev/null +++ b/editor/icons/GuiToggleOnDisabled.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 38 15.999999" width="38" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-4 0-7 3.0000002-7 7.0000002 0 3.9999998 3 6.9999998 7 6.9999998h22c4 0 7-3 7-6.9999998 0-4-3-7.0000002-7-7.0000002-7.333334 0-14.55609 0-22 0z" fill="#808080"/><circle cx="30" cy="8" fill="#b3b3b3" r="5"/></svg> diff --git a/editor/icons/GuiToggleOnMirrored.svg b/editor/icons/GuiToggleOnMirrored.svg index affbb5c7a8..e4706b82eb 100644 --- a/editor/icons/GuiToggleOnMirrored.svg +++ b/editor/icons/GuiToggleOnMirrored.svg @@ -1 +1 @@ -<svg height="26" width="42" xmlns="http://www.w3.org/2000/svg"><path d="m31 5c4.986 0 9 3.568 9 8s-4.014 8-9 8h-20c-4.986 0-9-3.568-9-8s4.014-8 9-8z" fill="#699ce8"/><circle cx="10" cy="13" fill="#ffffff" r="5"/></svg> +<svg viewBox="0 0 38 16" xmlns="http://www.w3.org/2000/svg"><path d="m30 1c4 0 7 3 7 7s-3 7-7 7h-22c-4 0-7-3-7-7s3-7 7-7z" fill="#699ce8" fill-rule="nonzero"/><circle cx="8" cy="8" fill="#fff" r="5"/></svg> diff --git a/editor/icons/GuiToggleOnMirroredDisabled.svg b/editor/icons/GuiToggleOnMirroredDisabled.svg new file mode 100644 index 0000000000..3541221e29 --- /dev/null +++ b/editor/icons/GuiToggleOnMirroredDisabled.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 38 16" xmlns="http://www.w3.org/2000/svg"><path d="m30 1c4 0 7 3 7 7s-3 7-7 7h-22c-4 0-7-3-7-7s3-7 7-7z" fill="#808080" fill-rule="nonzero"/><circle cx="8" cy="8" fill="#b3b3b3" r="5"/></svg> diff --git a/editor/import/collada.cpp b/editor/import/collada.cpp index b40a810763..fe32399fc6 100644 --- a/editor/import/collada.cpp +++ b/editor/import/collada.cpp @@ -287,7 +287,7 @@ void Collada::_parse_image(XMLParser &parser) { if (state.version < State::Version(1, 4, 0)) { /* <1.4 */ String path = parser.get_attribute_value("source").strip_edges(); - if (path.find("://") == -1 && path.is_relative_path()) { + if (!path.contains("://") && path.is_relative_path()) { // path is relative to file being loaded, so convert to a resource path image.path = ProjectSettings::get_singleton()->localize_path(state.local_path.get_base_dir().plus_file(path.uri_decode())); } @@ -300,7 +300,7 @@ void Collada::_parse_image(XMLParser &parser) { parser.read(); String path = parser.get_node_data().strip_edges().uri_decode(); - if (path.find("://") == -1 && path.is_relative_path()) { + if (!path.contains("://") && path.is_relative_path()) { // path is relative to file being loaded, so convert to a resource path path = ProjectSettings::get_singleton()->localize_path(state.local_path.get_base_dir().plus_file(path)); @@ -1009,11 +1009,6 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name String source = _uri_to_id(parser.get_attribute_value("source")); if (semantic == "TEXCOORD") { - /* - if (parser.has_attribute("set"))// a texcoord - semantic+=parser.get_attribute_value("set"); - else - semantic="TEXCOORD0";*/ semantic = "TEXCOORD" + itos(last_ref++); } int offset = parser.get_attribute_value("offset").to_int(); @@ -1194,11 +1189,6 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) { skindata.weights = weights; } - /* - else if (!parser.is_empty()) - parser.skip_section(); - */ - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "skin") { break; } @@ -1258,19 +1248,8 @@ void Collada::_parse_morph_controller(XMLParser &parser, String p_id) { } } else if (section == "Name_array" || section == "IDREF_array") { // create a new array and read it. - - /* - if (section=="IDREF_array") - morphdata.use_idrefs=true; - */ if (morphdata.sources.has(current_source)) { morphdata.sources[current_source].sarray = _read_string_array(parser); - /* - if (section=="IDREF_array") { - Vector<String> sa = morphdata.sources[current_source].sarray; - for(int i=0;i<sa.size();i++) - state.idref_joints.insert(sa[i]); - }*/ COLLADA_PRINT("section: " + current_source + " read " + itos(morphdata.sources[current_source].array.size()) + " values."); } } else if (section == "technique_common") { @@ -1303,11 +1282,6 @@ void Collada::_parse_morph_controller(XMLParser &parser, String p_id) { } } } - /* - else if (!parser.is_empty()) - parser.skip_section(); - */ - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "morph") { break; } @@ -1832,10 +1806,10 @@ void Collada::_parse_animation(XMLParser &parser) { } } - if (target.find("/") != -1) { //transform component + if (target.contains("/")) { //transform component track.target = target.get_slicec('/', 0); track.param = target.get_slicec('/', 1); - if (track.param.find(".") != -1) { + if (track.param.contains(".")) { track.component = track.param.get_slice(".", 1).to_upper(); } track.param = track.param.get_slice(".", 0); diff --git a/editor/import/dynamicfont_import_settings.cpp b/editor/import/dynamic_font_import_settings.cpp index 81b98c1d45..ebfb0b32fb 100644 --- a/editor/import/dynamicfont_import_settings.cpp +++ b/editor/import/dynamic_font_import_settings.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* dynamicfont_import_settings.cpp */ +/* dynamic_font_import_settings.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,8 +28,12 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "dynamicfont_import_settings.h" +#include "dynamic_font_import_settings.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_file_system.h" +#include "editor/editor_inspector.h" +#include "editor/editor_locale_dialog.h" #include "editor/editor_node.h" #include "editor/editor_scale.h" @@ -476,6 +480,10 @@ void DynamicFontImportSettings::_main_prop_changed(const String &p_edited_proper if (font_preview->get_data_count() > 0) { font_preview->get_data(0)->set_hinting((TextServer::Hinting)import_settings_data->get("hinting").operator int()); } + } else if (p_edited_property == "subpixel_positioning") { + if (font_preview->get_data_count() > 0) { + font_preview->get_data(0)->set_subpixel_positioning((TextServer::SubpixelPositioning)import_settings_data->get("subpixel_positioning").operator int()); + } } else if (p_edited_property == "oversampling") { if (font_preview->get_data_count() > 0) { font_preview->get_data(0)->set_oversampling(import_settings_data->get("oversampling")); @@ -495,7 +503,7 @@ void DynamicFontImportSettings::_variation_add() { vars_item->set_text(0, TTR("New configuration")); vars_item->set_editable(0, true); - vars_item->add_button(1, vars_list->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_VAR, false, TTR("Remove Variation")); + vars_item->add_button(1, vars_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), BUTTON_REMOVE_VAR, false, TTR("Remove Variation")); vars_item->set_button_color(1, 0, Color(1, 1, 1, 0.75)); Ref<DynamicFontImportSettingsData> import_variation_data; @@ -552,7 +560,7 @@ void DynamicFontImportSettings::_variation_changed(const String &p_edited_proper void DynamicFontImportSettings::_variations_validate() { String warn; if (!vars_list_root->get_first_child()) { - warn = TTR("Warinig: There are no configurations specified, no glyphs will be pre-rendered."); + warn = TTR("Warning: There are no configurations specified, no glyphs will be pre-rendered."); } for (TreeItem *vars_item_a = vars_list_root->get_first_child(); vars_item_a; vars_item_a = vars_item_a->get_next()) { Ref<DynamicFontImportSettingsData> import_variation_data_a = vars_item_a->get_metadata(0); @@ -567,7 +575,7 @@ void DynamicFontImportSettings::_variations_validate() { match = match && (import_variation_data_b->settings[E->key()] == E->get()); } if (match) { - warn = TTR("Warinig: Multiple configurations have identical settings. Duplicates will be ignored."); + warn = TTR("Warning: Multiple configurations have identical settings. Duplicates will be ignored."); break; } } @@ -643,8 +651,8 @@ void DynamicFontImportSettings::_glyph_selected() { TreeItem *item = glyph_table->get_selected(); ERR_FAIL_NULL(item); - Color scol = glyph_table->get_theme_color("box_selection_fill_color", "Editor"); - Color fcol = glyph_table->get_theme_color("font_selected_color", "Editor"); + Color scol = glyph_table->get_theme_color(SNAME("box_selection_fill_color"), SNAME("Editor")); + Color fcol = glyph_table->get_theme_color(SNAME("font_selected_color"), SNAME("Editor")); scol.a = 1.f; int32_t c = item->get_metadata(glyph_table->get_selected_column()); @@ -705,8 +713,8 @@ void DynamicFontImportSettings::_edit_range(int32_t p_start, int32_t p_end) { TreeItem *root = glyph_table->create_item(); ERR_FAIL_NULL(root); - Color scol = glyph_table->get_theme_color("box_selection_fill_color", "Editor"); - Color fcol = glyph_table->get_theme_color("font_selected_color", "Editor"); + Color scol = glyph_table->get_theme_color(SNAME("box_selection_fill_color"), SNAME("Editor")); + Color fcol = glyph_table->get_theme_color(SNAME("font_selected_color"), SNAME("Editor")); scol.a = 1.f; TreeItem *item = nullptr; @@ -719,12 +727,12 @@ void DynamicFontImportSettings::_edit_range(int32_t p_start, int32_t p_end) { item->set_text(0, _pad_zeros(String::num_int64(c, 16))); item->set_text_alignment(0, HORIZONTAL_ALIGNMENT_LEFT); item->set_selectable(0, false); - item->set_custom_bg_color(0, glyph_table->get_theme_color("dark_color_3", "Editor")); + item->set_custom_bg_color(0, glyph_table->get_theme_color(SNAME("dark_color_3"), SNAME("Editor"))); } if (font_main->has_char(c)) { item->set_text(col + 1, String::chr(c)); item->set_custom_color(col + 1, Color(1, 1, 1)); - if (selected_chars.has(c) || (font_main->get_data(0).is_valid() && selected_glyphs.has(font_main->get_data(0)->get_glyph_index(get_theme_font_size("font_size") * 2, c)))) { + if (selected_chars.has(c) || (font_main->get_data(0).is_valid() && selected_glyphs.has(font_main->get_data(0)->get_glyph_index(get_theme_font_size(SNAME("font_size")) * 2, c)))) { item->set_custom_color(col + 1, fcol); item->set_custom_bg_color(col + 1, scol); } else { @@ -732,13 +740,13 @@ void DynamicFontImportSettings::_edit_range(int32_t p_start, int32_t p_end) { item->clear_custom_bg_color(col + 1); } } else { - item->set_custom_bg_color(col + 1, glyph_table->get_theme_color("dark_color_2", "Editor")); + item->set_custom_bg_color(col + 1, glyph_table->get_theme_color(SNAME("dark_color_2"), SNAME("Editor"))); } item->set_metadata(col + 1, c); item->set_text_alignment(col + 1, HORIZONTAL_ALIGNMENT_CENTER); item->set_selectable(col + 1, true); item->set_custom_font(col + 1, font_main); - item->set_custom_font_size(col + 1, get_theme_font_size("font_size") * 2); + item->set_custom_font_size(col + 1, get_theme_font_size(SNAME("font_size")) * 2); col++; if (col == 16) { @@ -752,8 +760,8 @@ bool DynamicFontImportSettings::_char_update(int32_t p_char) { if (selected_chars.has(p_char)) { selected_chars.erase(p_char); return false; - } else if (font_main->get_data(0).is_valid() && selected_glyphs.has(font_main->get_data(0)->get_glyph_index(get_theme_font_size("font_size") * 2, p_char))) { - selected_glyphs.erase(font_main->get_data(0)->get_glyph_index(get_theme_font_size("font_size") * 2, p_char)); + } else if (font_main->get_data(0).is_valid() && selected_glyphs.has(font_main->get_data(0)->get_glyph_index(get_theme_font_size(SNAME("font_size")) * 2, p_char))) { + selected_glyphs.erase(font_main->get_data(0)->get_glyph_index(get_theme_font_size(SNAME("font_size")) * 2, p_char)); return false; } else { selected_chars.insert(p_char); @@ -767,7 +775,7 @@ void DynamicFontImportSettings::_range_update(int32_t p_start, int32_t p_end) { for (int32_t i = p_start; i <= p_end; i++) { if (font_main->has_char(i)) { if (font_main->get_data(0).is_valid()) { - all_selected = all_selected && (selected_chars.has(i) || (font_main->get_data(0).is_valid() && selected_glyphs.has(font_main->get_data(0)->get_glyph_index(get_theme_font_size("font_size") * 2, i)))); + all_selected = all_selected && (selected_chars.has(i) || (font_main->get_data(0).is_valid() && selected_glyphs.has(font_main->get_data(0)->get_glyph_index(get_theme_font_size(SNAME("font_size")) * 2, i)))); } else { all_selected = all_selected && selected_chars.has(i); } @@ -780,7 +788,7 @@ void DynamicFontImportSettings::_range_update(int32_t p_start, int32_t p_end) { } else { selected_chars.erase(i); if (font_main->get_data(0).is_valid()) { - selected_glyphs.erase(font_main->get_data(0)->get_glyph_index(get_theme_font_size("font_size") * 2, i)); + selected_glyphs.erase(font_main->get_data(0)->get_glyph_index(get_theme_font_size(SNAME("font_size")) * 2, i)); } } } @@ -809,7 +817,7 @@ void DynamicFontImportSettings::_lang_add_item(const String &p_locale) { lang_item->set_checked(0, false); lang_item->set_text(1, p_locale); lang_item->set_editable(1, true); - lang_item->add_button(2, lang_list->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_VAR, false, TTR("Remove")); + lang_item->add_button(2, lang_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), BUTTON_REMOVE_VAR, false, TTR("Remove")); lang_item->set_button_color(2, 0, Color(1, 1, 1, 0.75)); } @@ -841,7 +849,7 @@ void DynamicFontImportSettings::_ot_add_item(int p_option) { ot_item->set_editable(0, false); ot_item->set_text(1, "1"); ot_item->set_editable(1, true); - ot_item->add_button(2, ot_list->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_VAR, false, TTR("Remove")); + ot_item->add_button(2, ot_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), BUTTON_REMOVE_VAR, false, TTR("Remove")); ot_item->set_button_color(2, 0, Color(1, 1, 1, 0.75)); } @@ -868,7 +876,7 @@ void DynamicFontImportSettings::_script_add_item(int p_option) { script_item->set_checked(0, false); script_item->set_text(1, script_codes[p_option]); script_item->set_editable(1, true); - script_item->add_button(2, lang_list->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_VAR, false, TTR("Remove")); + script_item->add_button(2, lang_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), BUTTON_REMOVE_VAR, false, TTR("Remove")); script_item->set_button_color(2, 0, Color(1, 1, 1, 0.75)); } @@ -892,13 +900,18 @@ String DynamicFontImportSettings::_pad_zeros(const String &p_hex) const { } void DynamicFontImportSettings::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - connect("confirmed", callable_mp(this, &DynamicFontImportSettings::_re_import)); - } else if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - add_lang->set_icon(add_var->get_theme_icon("Add", "EditorIcons")); - add_script->set_icon(add_var->get_theme_icon("Add", "EditorIcons")); - add_var->set_icon(add_var->get_theme_icon("Add", "EditorIcons")); - add_ot->set_icon(add_var->get_theme_icon("Add", "EditorIcons")); + switch (p_what) { + case NOTIFICATION_READY: { + connect("confirmed", callable_mp(this, &DynamicFontImportSettings::_re_import)); + } break; + + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + add_lang->set_icon(add_var->get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + add_script->set_icon(add_var->get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + add_var->set_icon(add_var->get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + add_ot->set_icon(add_var->get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + } break; } } @@ -911,6 +924,7 @@ void DynamicFontImportSettings::_re_import() { main_settings["msdf_size"] = import_settings_data->get("msdf_size"); main_settings["force_autohinter"] = import_settings_data->get("force_autohinter"); main_settings["hinting"] = import_settings_data->get("hinting"); + main_settings["subpixel_positioning"] = import_settings_data->get("subpixel_positioning"); main_settings["oversampling"] = import_settings_data->get("oversampling"); main_settings["compress"] = import_settings_data->get("compress"); @@ -1043,7 +1057,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) { inspector_vars->edit(nullptr); inspector_general->edit(nullptr); - int gww = get_theme_font("font")->get_string_size("00000", get_theme_font_size("font_size")).x + 50; + int gww = get_theme_font(SNAME("font"))->get_string_size("00000", get_theme_font_size(SNAME("font_size"))).x + 50; glyph_table->set_column_custom_minimum_width(0, gww); glyph_table->clear(); @@ -1146,7 +1160,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) { vars_item->set_text(0, TTR("Configuration") + " " + itos(i)); vars_item->set_editable(0, true); - vars_item->add_button(1, vars_list->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_VAR, false, TTR("Remove Variation")); + vars_item->add_button(1, vars_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), BUTTON_REMOVE_VAR, false, TTR("Remove Variation")); vars_item->set_button_color(1, 0, Color(1, 1, 1, 0.75)); Ref<DynamicFontImportSettingsData> import_variation_data_custom; @@ -1184,7 +1198,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) { lang_item->set_checked(0, true); lang_item->set_text(1, _langs[i]); lang_item->set_editable(1, true); - lang_item->add_button(2, lang_list->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_VAR, false, TTR("Remove")); + lang_item->add_button(2, lang_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), BUTTON_REMOVE_VAR, false, TTR("Remove")); } } else if (key == "support_overrides/language_disabled") { PackedStringArray _langs = config->get_value("params", key); @@ -1197,7 +1211,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) { lang_item->set_checked(0, false); lang_item->set_text(1, _langs[i]); lang_item->set_editable(1, true); - lang_item->add_button(2, lang_list->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_VAR, false, TTR("Remove")); + lang_item->add_button(2, lang_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), BUTTON_REMOVE_VAR, false, TTR("Remove")); } } else if (key == "support_overrides/script_enabled") { PackedStringArray _scripts = config->get_value("params", key); @@ -1210,7 +1224,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) { script_item->set_checked(0, true); script_item->set_text(1, _scripts[i]); script_item->set_editable(1, true); - script_item->add_button(2, lang_list->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_VAR, false, TTR("Remove")); + script_item->add_button(2, lang_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), BUTTON_REMOVE_VAR, false, TTR("Remove")); } } else if (key == "support_overrides/script_disabled") { PackedStringArray _scripts = config->get_value("params", key); @@ -1223,7 +1237,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) { script_item->set_checked(0, false); script_item->set_text(1, _scripts[i]); script_item->set_editable(1, true); - script_item->add_button(2, lang_list->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_VAR, false, TTR("Remove")); + script_item->add_button(2, lang_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), BUTTON_REMOVE_VAR, false, TTR("Remove")); } } else if (key == "opentype_feature_overrides") { Dictionary features = config->get_value("params", key); @@ -1239,7 +1253,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) { ot_item->set_editable(0, false); ot_item->set_text(1, itos(value)); ot_item->set_editable(1, true); - ot_item->add_button(2, ot_list->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_VAR, false, TTR("Remove")); + ot_item->add_button(2, ot_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), BUTTON_REMOVE_VAR, false, TTR("Remove")); ot_item->set_button_color(2, 0, Color(1, 1, 1, 0.75)); } } else { @@ -1261,6 +1275,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) { font_preview->get_data(0)->set_msdf_size(import_settings_data->get("msdf_size")); font_preview->get_data(0)->set_force_autohinter(import_settings_data->get("force_autohinter")); font_preview->get_data(0)->set_hinting((TextServer::Hinting)import_settings_data->get("hinting").operator int()); + font_preview->get_data(0)->set_subpixel_positioning((TextServer::SubpixelPositioning)import_settings_data->get("subpixel_positioning").operator int()); font_preview->get_data(0)->set_oversampling(import_settings_data->get("oversampling")); } font_preview_label->add_theme_font_override("font", font_preview); @@ -1319,6 +1334,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() { options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::INT, "msdf_size", PROPERTY_HINT_RANGE, "1,250,1"), 48)); options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "force_autohinter"), false)); options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::INT, "hinting", PROPERTY_HINT_ENUM, "None,Light,Normal"), 1)); + options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::INT, "subpixel_positioning", PROPERTY_HINT_ENUM, "Disabled,Auto,One half of a pixel,One quarter of a pixel"), 1)); options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::FLOAT, "oversampling", PROPERTY_HINT_RANGE, "0,10,0.1"), 0.0)); options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "compress", PROPERTY_HINT_NONE, ""), false)); @@ -1356,7 +1372,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() { menu_ot->add_child(menu_ot_cu); menu_ot_cu->connect("id_pressed", callable_mp(this, &DynamicFontImportSettings::_ot_add_item)); - Color warn_color = (EditorNode::get_singleton()) ? EditorNode::get_singleton()->get_gui_base()->get_theme_color("warning_color", "Editor") : Color(1, 1, 0); + Color warn_color = (EditorNode::get_singleton()) ? EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("warning_color"), SNAME("Editor")) : Color(1, 1, 0); // Root layout @@ -1438,7 +1454,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() { add_var = memnew(Button); page2_hb_vars->add_child(add_var); add_var->set_tooltip(TTR("Add configuration")); - add_var->set_icon(add_var->get_theme_icon("Add", "EditorIcons")); + add_var->set_icon(add_var->get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); add_var->connect("pressed", callable_mp(this, &DynamicFontImportSettings::_variation_add)); vars_list = memnew(Tree); @@ -1545,8 +1561,8 @@ DynamicFontImportSettings::DynamicFontImportSettings() { for (int i = 0; i < 16; i++) { glyph_table->set_column_title(i + 1, String::num_int64(i, 16)); } - glyph_table->add_theme_style_override("selected", glyph_table->get_theme_stylebox("bg")); - glyph_table->add_theme_style_override("selected_focus", glyph_table->get_theme_stylebox("bg")); + glyph_table->add_theme_style_override("selected", glyph_table->get_theme_stylebox(SNAME("bg"))); + glyph_table->add_theme_style_override("selected_focus", glyph_table->get_theme_stylebox(SNAME("bg"))); glyph_table->add_theme_constant_override("hseparation", 0); glyph_table->set_h_size_flags(Control::SIZE_EXPAND_FILL); glyph_table->set_v_size_flags(Control::SIZE_EXPAND_FILL); @@ -1590,7 +1606,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() { add_lang = memnew(Button); hb_lang->add_child(add_lang); add_lang->set_tooltip(TTR("Add language override")); - add_lang->set_icon(add_var->get_theme_icon("Add", "EditorIcons")); + add_lang->set_icon(add_var->get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); add_lang->connect("pressed", callable_mp(this, &DynamicFontImportSettings::_lang_add)); lang_list = memnew(Tree); @@ -1618,7 +1634,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() { add_script = memnew(Button); hb_script->add_child(add_script); add_script->set_tooltip(TTR("Add script override")); - add_script->set_icon(add_var->get_theme_icon("Add", "EditorIcons")); + add_script->set_icon(add_var->get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); add_script->connect("pressed", callable_mp(this, &DynamicFontImportSettings::_script_add)); script_list = memnew(Tree); @@ -1646,7 +1662,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() { add_ot = memnew(Button); hb_ot->add_child(add_ot); add_ot->set_tooltip(TTR("Add feature override")); - add_ot->set_icon(add_var->get_theme_icon("Add", "EditorIcons")); + add_ot->set_icon(add_var->get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); add_ot->connect("pressed", callable_mp(this, &DynamicFontImportSettings::_ot_add)); ot_list = memnew(Tree); diff --git a/editor/import/dynamicfont_import_settings.h b/editor/import/dynamic_font_import_settings.h index 5d37f58b9b..7b2a9184a4 100644 --- a/editor/import/dynamicfont_import_settings.h +++ b/editor/import/dynamic_font_import_settings.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* dynamicfont_import_settings.h */ +/* dynamic_font_import_settings.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,14 +28,10 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef FONTDATA_IMPORT_SETTINGS_H -#define FONTDATA_IMPORT_SETTINGS_H +#ifndef DYNAMIC_FONT_IMPORT_SETTINGS_H +#define DYNAMIC_FONT_IMPORT_SETTINGS_H -#include "editor/editor_file_dialog.h" -#include "editor/editor_inspector.h" -#include "editor/editor_locale_dialog.h" - -#include "editor/import/resource_importer_dynamicfont.h" +#include "editor/import/resource_importer_dynamic_font.h" #include "scene/gui/dialogs.h" #include "scene/gui/item_list.h" @@ -45,11 +41,13 @@ #include "scene/gui/tab_container.h" #include "scene/gui/text_edit.h" #include "scene/gui/tree.h" - #include "scene/resources/font.h" #include "servers/text_server.h" class DynamicFontImportSettingsData; +class EditorFileDialog; +class EditorInspector; +class EditorLocaleDialog; class DynamicFontImportSettings : public ConfirmationDialog { GDCLASS(DynamicFontImportSettings, ConfirmationDialog) @@ -180,4 +178,4 @@ public: DynamicFontImportSettings(); }; -#endif // FONTDATA_IMPORT_SETTINGS_H +#endif // DYNAMIC_FONT_IMPORT_SETTINGS_H diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp index c1ae5be0bb..3b5a82b2c3 100644 --- a/editor/import/editor_import_collada.cpp +++ b/editor/import/editor_import_collada.cpp @@ -1535,7 +1535,7 @@ void ColladaImport::create_animation(int p_clip, bool p_import_value_tracks) { bool has_rotation = false; bool has_scale = false; - for (int i = 0; cn->xform_list.size(); i++) { + for (int i = 0; i < cn->xform_list.size(); i++) { switch (cn->xform_list[i].op) { case Collada::Node::XForm::OP_ROTATE: { has_rotation = true; diff --git a/editor/import/editor_import_plugin.cpp b/editor/import/editor_import_plugin.cpp index cf3464b168..f7d373ef60 100644 --- a/editor/import/editor_import_plugin.cpp +++ b/editor/import/editor_import_plugin.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "editor_import_plugin.h" + #include "core/object/script_language.h" EditorImportPlugin::EditorImportPlugin() { diff --git a/editor/import/resource_importer_bitmask.cpp b/editor/import/resource_importer_bitmask.cpp index 16b68bcc22..46d15e8989 100644 --- a/editor/import/resource_importer_bitmask.cpp +++ b/editor/import/resource_importer_bitmask.cpp @@ -29,13 +29,11 @@ /*************************************************************************/ #include "resource_importer_bitmask.h" -#include "core/io/config_file.h" + #include "core/io/image.h" #include "core/io/image_loader.h" -#include "editor/editor_file_system.h" -#include "editor/editor_node.h" +#include "core/io/resource_saver.h" #include "scene/resources/bit_map.h" -#include "scene/resources/texture.h" String ResourceImporterBitMap::get_importer_name() const { return "bitmap"; diff --git a/editor/import/resource_importer_bitmask.h b/editor/import/resource_importer_bitmask.h index e5cf1facff..6dd6843171 100644 --- a/editor/import/resource_importer_bitmask.h +++ b/editor/import/resource_importer_bitmask.h @@ -31,11 +31,8 @@ #ifndef RESOURCE_IMPORTER_BITMASK_H #define RESOURCE_IMPORTER_BITMASK_H -#include "core/io/image.h" #include "core/io/resource_importer.h" -class StreamBitMap; - class ResourceImporterBitMap : public ResourceImporter { GDCLASS(ResourceImporterBitMap, ResourceImporter); diff --git a/editor/import/resource_importer_dynamicfont.cpp b/editor/import/resource_importer_dynamic_font.cpp index 11f563a982..70fc87ea3f 100644 --- a/editor/import/resource_importer_dynamicfont.cpp +++ b/editor/import/resource_importer_dynamic_font.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* resource_importer_dynamicfont.cpp */ +/* resource_importer_dynamic_font.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,12 +28,13 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "resource_importer_dynamicfont.h" +#include "resource_importer_dynamic_font.h" #include "core/io/file_access.h" #include "core/io/resource_saver.h" -#include "dynamicfont_import_settings.h" -#include "editor/editor_node.h" +#include "editor/import/dynamic_font_import_settings.h" +#include "scene/resources/font.h" +#include "servers/text_server.h" #include "modules/modules_enabled.gen.h" // For freetype. @@ -76,6 +77,9 @@ bool ResourceImporterDynamicFont::get_option_visibility(const String &p_path, co if (p_option == "oversampling" && bool(p_options["multichannel_signed_distance_field"])) { return false; } + if (p_option == "subpixel_positioning" && bool(p_options["multichannel_signed_distance_field"])) { + return false; + } return true; } @@ -104,6 +108,7 @@ void ResourceImporterDynamicFont::get_import_options(const String &p_path, List< r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force_autohinter"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "hinting", PROPERTY_HINT_ENUM, "None,Light,Normal"), 1)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "subpixel_positioning", PROPERTY_HINT_ENUM, "Disabled,Auto,One half of a pixel,One quarter of a pixel"), 1)); r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "oversampling", PROPERTY_HINT_RANGE, "0,10,0.1"), 0.0)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "compress"), true)); @@ -179,6 +184,7 @@ Error ResourceImporterDynamicFont::import(const String &p_source_file, const Str bool autohinter = p_options["force_autohinter"]; int hinting = p_options["hinting"]; + int subpixel_positioning = p_options["subpixel_positioning"]; real_t oversampling = p_options["oversampling"]; // Load base font data. @@ -195,6 +201,7 @@ Error ResourceImporterDynamicFont::import(const String &p_source_file, const Str font->set_opentype_feature_overrides(ot_ov); font->set_fixed_size(0); font->set_force_autohinter(autohinter); + font->set_subpixel_positioning((TextServer::SubpixelPositioning)subpixel_positioning); font->set_hinting((TextServer::Hinting)hinting); font->set_oversampling(oversampling); diff --git a/editor/import/resource_importer_dynamicfont.h b/editor/import/resource_importer_dynamic_font.h index a55d639e10..2761b418e1 100644 --- a/editor/import/resource_importer_dynamicfont.h +++ b/editor/import/resource_importer_dynamic_font.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* resource_importer_dynamicfont.h */ +/* resource_importer_dynamic_font.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,12 +28,10 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef RESOURCE_IMPORTER_FONT_DATA_H -#define RESOURCE_IMPORTER_FONT_DATA_H +#ifndef RESOURCE_IMPORTER_DYNAMIC_FONT_H +#define RESOURCE_IMPORTER_DYNAMIC_FONT_H #include "core/io/resource_importer.h" -#include "scene/resources/font.h" -#include "servers/text_server.h" class ResourceImporterDynamicFont : public ResourceImporter { GDCLASS(ResourceImporterDynamicFont, ResourceImporter); @@ -68,4 +66,4 @@ public: ResourceImporterDynamicFont(); }; -#endif // RESOURCE_IMPORTER_FONTDATA_H +#endif // RESOURCE_IMPORTER_DYNAMIC_FONT_H diff --git a/editor/import/resource_importer_imagefont.cpp b/editor/import/resource_importer_imagefont.cpp index 0a15284ef5..1338cf03a8 100644 --- a/editor/import/resource_importer_imagefont.cpp +++ b/editor/import/resource_importer_imagefont.cpp @@ -98,6 +98,7 @@ Error ResourceImporterImageFont::import(const String &p_source_file, const Strin font->set_antialiased(false); font->set_multichannel_signed_distance_field(false); font->set_fixed_size(base_size); + font->set_subpixel_positioning(TextServer::SUBPIXEL_POSITIONING_DISABLED); font->set_force_autohinter(false); font->set_hinting(TextServer::HINTING_NONE); font->set_oversampling(1.0f); diff --git a/editor/import/resource_importer_layered_texture.cpp b/editor/import/resource_importer_layered_texture.cpp index 7ca61e83e7..7071042818 100644 --- a/editor/import/resource_importer_layered_texture.cpp +++ b/editor/import/resource_importer_layered_texture.cpp @@ -30,10 +30,11 @@ #include "resource_importer_layered_texture.h" -#include "resource_importer_texture.h" - +#include "core/config/project_settings.h" +#include "core/error/error_macros.h" #include "core/io/config_file.h" #include "core/io/image_loader.h" +#include "core/object/ref_counted.h" #include "editor/editor_file_system.h" #include "editor/editor_node.h" #include "resource_importer_texture.h" @@ -263,12 +264,12 @@ void ResourceImporterLayeredTexture::_save_tex(Vector<Ref<Image>> p_images, cons f->store_8('L'); f->store_32(StreamTextureLayered::FORMAT_VERSION); - f->store_32(p_images.size()); //2d layers or 3d depth + f->store_32(p_images.size()); // For 2d layers or 3d depth. f->store_32(mode); f->store_32(0); f->store_32(0); - f->store_32(mipmap_images.size()); // amount of mipmaps + f->store_32(mipmap_images.size()); // Adjust the amount of mipmaps. f->store_32(0); f->store_32(0); @@ -289,7 +290,6 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const int hdr_compression = p_options["compress/hdr_compression"]; int bptc_ldr = p_options["compress/bptc_ldr"]; bool mipmaps = p_options["mipmaps/generate"]; - //bool mipmap_limit = p_options["mipmaps/limit"]; int channel_pack = p_options["compress/channel_pack"]; int hslices = (p_options.has("slices/horizontal")) ? int(p_options["slices/horizontal"]) : 0; @@ -377,87 +377,23 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const slices.push_back(slice); } } - - String extension = get_save_extension(); Array formats_imported; - - if (compress_mode == COMPRESS_VRAM_COMPRESSED) { - //must import in all formats, in order of priority (so platform choses the best supported one. IE, etc2 over etc). - //Android, GLES 2.x - - bool ok_on_pc = false; - bool is_hdr = (image->get_format() >= Image::FORMAT_RF && image->get_format() <= Image::FORMAT_RGBE9995); - bool is_ldr = (image->get_format() >= Image::FORMAT_L8 && image->get_format() <= Image::FORMAT_RGB565); - bool can_bptc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_bptc"); - bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_s3tc"); - - if (can_bptc) { - formats_imported.push_back("bptc"); // Needs to be added anyway. - } - bool can_compress_hdr = hdr_compression > 0; - - if (is_hdr && can_compress_hdr) { - if (used_channels == Image::USED_CHANNELS_LA || used_channels == Image::USED_CHANNELS_RGBA) { - //can compress hdr, but hdr with alpha is not compressible - - if (hdr_compression == 2) { - //but user selected to compress hdr anyway, so force an alpha-less format. - if (image->get_format() == Image::FORMAT_RGBAF) { - for (int i = 0; i < slices.size(); i++) { - slices.write[i]->convert(Image::FORMAT_RGBF); - } - - } else if (image->get_format() == Image::FORMAT_RGBAH) { - for (int i = 0; i < slices.size(); i++) { - slices.write[i]->convert(Image::FORMAT_RGBH); - } - } - } else { - can_compress_hdr = false; - } - } - - if (can_compress_hdr) { - if (!can_bptc) { - //default to rgbe - if (image->get_format() != Image::FORMAT_RGBE9995) { - for (int i = 0; i < slices.size(); i++) { - slices.write[i]->convert(Image::FORMAT_RGBE9995); - } - } - } - } else { - can_bptc = false; - } - } - - if (is_ldr && can_bptc) { - if (bptc_ldr == 0 || (bptc_ldr == 1 && !(used_channels == Image::USED_CHANNELS_LA || used_channels == Image::USED_CHANNELS_RGBA))) { - can_bptc = false; - } - } - - if (can_bptc || can_s3tc) { - _save_tex(slices, p_save_path + ".s3tc." + extension, compress_mode, lossy, can_bptc ? Image::COMPRESS_BPTC : Image::COMPRESS_S3TC, csource, used_channels, mipmaps, false); - r_platform_variants->push_back("s3tc"); - formats_imported.push_back("s3tc"); - ok_on_pc = true; - } - - if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2")) { - _save_tex(slices, p_save_path + ".etc2." + extension, compress_mode, lossy, Image::COMPRESS_ETC2, csource, used_channels, mipmaps, true); - r_platform_variants->push_back("etc2"); - formats_imported.push_back("etc2"); - } - - if (!ok_on_pc) { - EditorNode::add_io_error("Warning, no suitable PC VRAM compression enabled in Project Settings. This texture will not display correctly on PC."); - } - } else { - //import normally - _save_tex(slices, p_save_path + "." + extension, compress_mode, lossy, Image::COMPRESS_S3TC /* IGNORED */, csource, used_channels, mipmaps, false); - } - + Ref<LayeredTextureImport> texture_import; + texture_import.instantiate(); + texture_import->csource = &csource; + texture_import->save_path = p_save_path; + texture_import->options = p_options; + texture_import->platform_variants = r_platform_variants; + texture_import->image = image; + texture_import->formats_imported = formats_imported; + texture_import->slices = &slices; + texture_import->compress_mode = compress_mode; + texture_import->lossy = lossy; + texture_import->hdr_compression = hdr_compression; + texture_import->bptc_ldr = bptc_ldr; + texture_import->mipmaps = mipmaps; + texture_import->used_channels = used_channels; + _check_compress_stex(texture_import); if (r_metadata) { Dictionary metadata; metadata["vram_texture"] = compress_mode == COMPRESS_VRAM_COMPRESSED; @@ -517,7 +453,7 @@ bool ResourceImporterLayeredTexture::are_import_settings_valid(const String &p_p String setting_path = "rendering/textures/vram_compression/import_" + String(compression_formats[index]); bool test = ProjectSettings::get_singleton()->get(setting_path); if (test) { - if (formats_imported.find(compression_formats[index]) == -1) { + if (!formats_imported.has(compression_formats[index])) { valid = false; break; } @@ -537,3 +473,76 @@ ResourceImporterLayeredTexture::ResourceImporterLayeredTexture() { ResourceImporterLayeredTexture::~ResourceImporterLayeredTexture() { } + +void ResourceImporterLayeredTexture::_check_compress_stex(Ref<LayeredTextureImport> r_texture_import) { + String extension = get_save_extension(); + ERR_FAIL_NULL(r_texture_import->csource); + if (r_texture_import->compress_mode != COMPRESS_VRAM_COMPRESSED) { + // Import normally. + _save_tex(*r_texture_import->slices, r_texture_import->save_path + "." + extension, r_texture_import->compress_mode, r_texture_import->lossy, Image::COMPRESS_S3TC /* IGNORED */, *r_texture_import->csource, r_texture_import->used_channels, r_texture_import->mipmaps, false); + return; + } + // Must import in all formats, in order of priority (so platform choses the best supported one. IE, etc2 over etc). + // Android, GLES 2.x + + bool can_bptc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_bptc"); + if (can_bptc) { + r_texture_import->formats_imported.push_back("bptc"); // BPTC needs to be added anyway. + } + bool can_compress_hdr = r_texture_import->hdr_compression > 0; + ERR_FAIL_NULL(r_texture_import->image); + bool is_hdr = (r_texture_import->image->get_format() >= Image::FORMAT_RF && r_texture_import->image->get_format() <= Image::FORMAT_RGBE9995); + bool is_ldr = (r_texture_import->image->get_format() >= Image::FORMAT_L8 && r_texture_import->image->get_format() <= Image::FORMAT_RGB565); + bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_s3tc"); + ERR_FAIL_NULL(r_texture_import->slices); + // Can compress hdr, but hdr with alpha is not compressible. + if (r_texture_import->hdr_compression == 2) { + // The user selected to compress hdr anyway, so force an alpha-less format. + if (r_texture_import->image->get_format() == Image::FORMAT_RGBAF) { + for (int i = 0; i < r_texture_import->slices->size(); i++) { + r_texture_import->slices->write[i]->convert(Image::FORMAT_RGBF); + } + + } else if (r_texture_import->image->get_format() == Image::FORMAT_RGBAH) { + for (int i = 0; i < r_texture_import->slices->size(); i++) { + r_texture_import->slices->write[i]->convert(Image::FORMAT_RGBH); + } + } + } else { + can_compress_hdr = false; + } + + if (is_hdr && can_compress_hdr) { + if (!can_bptc) { + //default to rgbe + if (r_texture_import->image->get_format() != Image::FORMAT_RGBE9995) { + for (int i = 0; i < r_texture_import->slices->size(); i++) { + r_texture_import->slices->write[i]->convert(Image::FORMAT_RGBE9995); + } + } + } + } else { + can_bptc = false; + } + + if (is_ldr && can_bptc) { + if (r_texture_import->bptc_ldr == 0 || (r_texture_import->bptc_ldr == 1 && !(r_texture_import->used_channels == Image::USED_CHANNELS_LA || r_texture_import->used_channels == Image::USED_CHANNELS_RGBA))) { + can_bptc = false; + } + } + if (!(r_texture_import->used_channels == Image::USED_CHANNELS_LA || r_texture_import->used_channels == Image::USED_CHANNELS_RGBA)) { + if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2")) { + _save_tex(*r_texture_import->slices, r_texture_import->save_path + ".etc2." + extension, r_texture_import->compress_mode, r_texture_import->lossy, Image::COMPRESS_ETC2, *r_texture_import->csource, r_texture_import->used_channels, r_texture_import->mipmaps, true); + r_texture_import->platform_variants->push_back("etc2"); + r_texture_import->formats_imported.push_back("etc2"); + } + + if (can_bptc || can_s3tc) { + _save_tex(*r_texture_import->slices, r_texture_import->save_path + ".s3tc." + extension, r_texture_import->compress_mode, r_texture_import->lossy, can_bptc ? Image::COMPRESS_BPTC : Image::COMPRESS_S3TC, *r_texture_import->csource, r_texture_import->used_channels, r_texture_import->mipmaps, false); + r_texture_import->platform_variants->push_back("s3tc"); + r_texture_import->formats_imported.push_back("s3tc"); + } + return; + } + EditorNode::add_io_error("Warning, no suitable PC VRAM compression enabled in Project Settings. This texture will not display correctly on PC."); +} diff --git a/editor/import/resource_importer_layered_texture.h b/editor/import/resource_importer_layered_texture.h index ee8e7dc615..edd981c63d 100644 --- a/editor/import/resource_importer_layered_texture.h +++ b/editor/import/resource_importer_layered_texture.h @@ -33,9 +33,30 @@ #include "core/io/image.h" #include "core/io/resource_importer.h" +#include "core/object/ref_counted.h" class StreamTexture2D; +class LayeredTextureImport : public RefCounted { + GDCLASS(LayeredTextureImport, RefCounted); + +public: + Image::CompressSource *csource = nullptr; + String save_path; + Map<StringName, Variant> options; + List<String> *platform_variants = nullptr; + Ref<Image> image = nullptr; + Array formats_imported; + Vector<Ref<Image>> *slices = nullptr; + int compress_mode = 0; + float lossy = 1.0; + int hdr_compression = 0; + int bptc_ldr = 0; + bool mipmaps = true; + Image::UsedChannels used_channels = Image::USED_CHANNELS_RGBA; + virtual ~LayeredTextureImport() {} +}; + class ResourceImporterLayeredTexture : public ResourceImporter { GDCLASS(ResourceImporterLayeredTexture, ResourceImporter); @@ -66,6 +87,8 @@ protected: static ResourceImporterLayeredTexture *singleton; public: + void _check_compress_stex(Ref<LayeredTextureImport> r_texture_import); + static ResourceImporterLayeredTexture *get_singleton() { return singleton; } virtual String get_importer_name() const override; virtual String get_visible_name() const override; diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp index 96645665aa..9042f1e32c 100644 --- a/editor/import/resource_importer_obj.cpp +++ b/editor/import/resource_importer_obj.cpp @@ -317,8 +317,6 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh>> &r_meshes, bool p_ ERR_FAIL_INDEX_V(vtx, vertices.size(), ERR_FILE_CORRUPT); Vector3 vertex = vertices[vtx]; - //if (weld_vertices) - // vertex.snap(Vector3(weld_tolerance, weld_tolerance, weld_tolerance)); if (!smoothing) { smooth_group++; } diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index 0fefa0f3c4..e7c605aaf0 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -39,6 +39,7 @@ #include "scene/3d/importer_mesh_instance_3d.h" #include "scene/3d/mesh_instance_3d.h" #include "scene/3d/navigation_region_3d.h" +#include "scene/3d/occluder_instance_3d.h" #include "scene/3d/physics_body_3d.h" #include "scene/3d/vehicle_body_3d.h" #include "scene/animation/animation_player.h" @@ -258,8 +259,8 @@ String ResourceImporterScene::get_visible_name() const { } void ResourceImporterScene::get_recognized_extensions(List<String> *p_extensions) const { - for (Set<Ref<EditorSceneFormatImporter>>::Element *E = importers.front(); E; E = E->next()) { - E->get()->get_extensions(p_extensions); + for (Ref<EditorSceneFormatImporter> importer_elem : importers) { + importer_elem->get_extensions(p_extensions); } } @@ -316,7 +317,7 @@ static bool _teststr(const String &p_what, const String &p_str) { String what = p_what; //remove trailing spaces and numbers, some apps like blender add ".number" to duplicates so also compensate for this - while (what.length() && ((what[what.length() - 1] >= '0' && what[what.length() - 1] <= '9') || what[what.length() - 1] <= 32 || what[what.length() - 1] == '.')) { + while (what.length() && (is_digit(what[what.length() - 1]) || what[what.length() - 1] <= 32 || what[what.length() - 1] == '.')) { what = what.substr(0, what.length() - 1); } @@ -336,7 +337,7 @@ static String _fixstr(const String &p_what, const String &p_str) { String what = p_what; //remove trailing spaces and numbers, some apps like blender add ".number" to duplicates so also compensate for this - while (what.length() && ((what[what.length() - 1] >= '0' && what[what.length() - 1] <= '9') || what[what.length() - 1] <= 32 || what[what.length() - 1] == '.')) { + while (what.length() && (is_digit(what[what.length() - 1]) || what[what.length() - 1] <= 32 || what[what.length() - 1] == '.')) { what = what.substr(0, what.length() - 1); } @@ -371,10 +372,10 @@ static void _pre_gen_shape_list(Ref<ImporterMesh> &mesh, Vector<Ref<Shape3D>> &r } } -Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> &collision_map, List<Pair<NodePath, Node *>> &r_node_renames) { +Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> &r_collision_map, Pair<PackedVector3Array, PackedInt32Array> *r_occluder_arrays, List<Pair<NodePath, Node *>> &r_node_renames) { // Children first. for (int i = 0; i < p_node->get_child_count(); i++) { - Node *r = _pre_fix_node(p_node->get_child(i), p_root, collision_map, r_node_renames); + Node *r = _pre_fix_node(p_node->get_child(i), p_root, r_collision_map, r_occluder_arrays, r_node_renames); if (!r) { i--; // Was erased. } @@ -498,14 +499,14 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<I if (mesh.is_valid()) { Vector<Ref<Shape3D>> shapes; - if (collision_map.has(mesh)) { - shapes = collision_map[mesh]; + if (r_collision_map.has(mesh)) { + shapes = r_collision_map[mesh]; } else if (_teststr(name, "colonly")) { _pre_gen_shape_list(mesh, shapes, false); - collision_map[mesh] = shapes; + r_collision_map[mesh] = shapes; } else if (_teststr(name, "convcolonly")) { _pre_gen_shape_list(mesh, shapes, true); - collision_map[mesh] = shapes; + r_collision_map[mesh] = shapes; } if (shapes.size()) { @@ -560,8 +561,8 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<I if (mesh.is_valid()) { Vector<Ref<Shape3D>> shapes; - if (collision_map.has(mesh)) { - shapes = collision_map[mesh]; + if (r_collision_map.has(mesh)) { + shapes = r_collision_map[mesh]; } else { _pre_gen_shape_list(mesh, shapes, true); } @@ -586,14 +587,14 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<I if (mesh.is_valid()) { Vector<Ref<Shape3D>> shapes; String fixed_name; - if (collision_map.has(mesh)) { - shapes = collision_map[mesh]; + if (r_collision_map.has(mesh)) { + shapes = r_collision_map[mesh]; } else if (_teststr(name, "col")) { _pre_gen_shape_list(mesh, shapes, false); - collision_map[mesh] = shapes; + r_collision_map[mesh] = shapes; } else if (_teststr(name, "convcol")) { _pre_gen_shape_list(mesh, shapes, true); - collision_map[mesh] = shapes; + r_collision_map[mesh] = shapes; } if (_teststr(name, "col")) { @@ -635,7 +636,31 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<I p_node->replace_by(nmi); memdelete(p_node); p_node = nmi; + } else if (_teststr(name, "occ") || _teststr(name, "occonly")) { + if (isroot) { + return p_node; + } + ImporterMeshInstance3D *mi = Object::cast_to<ImporterMeshInstance3D>(p_node); + if (mi) { + Ref<ImporterMesh> mesh = mi->get_mesh(); + if (mesh.is_valid()) { + if (r_occluder_arrays) { + OccluderInstance3D::bake_single_node(mi, 0.0f, r_occluder_arrays->first, r_occluder_arrays->second); + } + if (_teststr(name, "occ")) { + String fixed_name = _fixstr(name, "occ"); + if (!fixed_name.is_empty()) { + if (mi->get_parent() && !mi->get_parent()->has_node(fixed_name)) { + mi->set_name(fixed_name); + } + } + } else { + memdelete(p_node); + p_node = nullptr; + } + } + } } else if (Object::cast_to<ImporterMeshInstance3D>(p_node)) { //last attempt, maybe collision inside the mesh data @@ -644,16 +669,21 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<I Ref<ImporterMesh> mesh = mi->get_mesh(); if (!mesh.is_null()) { Vector<Ref<Shape3D>> shapes; - if (collision_map.has(mesh)) { - shapes = collision_map[mesh]; + if (r_collision_map.has(mesh)) { + shapes = r_collision_map[mesh]; } else if (_teststr(mesh->get_name(), "col")) { _pre_gen_shape_list(mesh, shapes, false); - collision_map[mesh] = shapes; + r_collision_map[mesh] = shapes; mesh->set_name(_fixstr(mesh->get_name(), "col")); } else if (_teststr(mesh->get_name(), "convcol")) { _pre_gen_shape_list(mesh, shapes, true); - collision_map[mesh] = shapes; + r_collision_map[mesh] = shapes; mesh->set_name(_fixstr(mesh->get_name(), "convcol")); + } else if (_teststr(mesh->get_name(), "occ")) { + if (r_occluder_arrays) { + OccluderInstance3D::bake_single_node(mi, 0.0f, r_occluder_arrays->first, r_occluder_arrays->second); + } + mesh->set_name(_fixstr(mesh->get_name(), "occ")); } if (shapes.size()) { @@ -677,10 +707,10 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<I return p_node; } -Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> &collision_map, Set<Ref<ImporterMesh>> &r_scanned_meshes, const Dictionary &p_node_data, const Dictionary &p_material_data, const Dictionary &p_animation_data, float p_animation_fps) { +Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> &collision_map, Pair<PackedVector3Array, PackedInt32Array> &r_occluder_arrays, Set<Ref<ImporterMesh>> &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); + Node *r = _post_fix_node(p_node->get_child(i), p_root, collision_map, r_occluder_arrays, r_scanned_meshes, p_node_data, p_material_data, p_animation_data, p_animation_fps); if (!r) { i--; //was erased } @@ -883,6 +913,32 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref< } } + if (Object::cast_to<ImporterMeshInstance3D>(p_node)) { + ImporterMeshInstance3D *mi = Object::cast_to<ImporterMeshInstance3D>(p_node); + + Ref<ImporterMesh> m = mi->get_mesh(); + + if (m.is_valid()) { + if (node_settings.has("generate/occluder")) { + int occluder_mode = node_settings["generate/occluder"]; + + if (occluder_mode != OCCLUDER_DISABLED) { + float simplification_dist = 0.0f; + if (node_settings.has("occluder/simplification_distance")) { + simplification_dist = node_settings["occluder/simplification_distance"]; + } + + OccluderInstance3D::bake_single_node(mi, simplification_dist, r_occluder_arrays.first, r_occluder_arrays.second); + + if (occluder_mode == OCCLUDER_OCCLUDER_ONLY) { + memdelete(p_node); + p_node = nullptr; + } + } + } + } + } + if (Object::cast_to<AnimationPlayer>(p_node)) { AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(p_node); @@ -1255,6 +1311,9 @@ void ResourceImporterScene::get_internal_import_options(InternalImportCategory p r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "primitive/radius", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 1.0)); r_options->push_back(ImportOption(PropertyInfo(Variant::VECTOR3, "primitive/position", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), Vector3())); r_options->push_back(ImportOption(PropertyInfo(Variant::VECTOR3, "primitive/rotation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), Vector3())); + + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "generate/occluder", PROPERTY_HINT_ENUM, "Disabled,Mesh + Occluder,Occluder Only", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "occluder/simplification_distance", PROPERTY_HINT_RANGE, "0.0,2.0,0.01", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0.1f)); } 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)); @@ -1376,6 +1435,11 @@ bool ResourceImporterScene::get_internal_option_visibility(InternalImportCategor (physics_shape == SHAPE_TYPE_CYLINDER || physics_shape == SHAPE_TYPE_CAPSULE); } + + if (p_option == "occluder/simplification_distance") { + // Show only if occluder generation is enabled + return p_options.has("generate/occluder") && p_options["generate/occluder"].operator signed int() != OCCLUDER_DISABLED; + } } break; case INTERNAL_IMPORT_CATEGORY_MESH: { if (p_option == "save_to_file/path" || p_option == "save_to_file/make_streamable") { @@ -1490,8 +1554,8 @@ void ResourceImporterScene::get_import_options(const String &p_path, List<Import post_importer_plugins.write[i]->get_import_options(p_path, r_options); } - for (Ref<EditorSceneFormatImporter> importer : importers) { - importer->get_import_options(p_path, r_options); + for (Ref<EditorSceneFormatImporter> importer_elem : importers) { + importer_elem->get_import_options(p_path, r_options); } } @@ -1585,14 +1649,6 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, const Dictionary &p_m } } - if (generate_lods) { - src_mesh_node->get_mesh()->generate_lods(merge_angle, split_angle); - } - - if (create_shadow_meshes) { - src_mesh_node->get_mesh()->create_shadow_mesh(); - } - if (bake_lightmaps) { Transform3D xf; Node3D *n = src_mesh_node; @@ -1625,6 +1681,14 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, const Dictionary &p_m } } + if (generate_lods) { + src_mesh_node->get_mesh()->generate_lods(merge_angle, split_angle); + } + + if (create_shadow_meshes) { + src_mesh_node->get_mesh()->create_shadow_mesh(); + } + if (!save_to_file.is_empty()) { Ref<Mesh> existing = Ref<Resource>(ResourceCache::get(save_to_file)); if (existing.is_valid()) { @@ -1843,13 +1907,13 @@ Node *ResourceImporterScene::pre_import(const String &p_source_file) { EditorProgress progress("pre-import", TTR("Pre-Import Scene"), 0); progress.step(TTR("Importing Scene..."), 0); - for (Set<Ref<EditorSceneFormatImporter>>::Element *E = importers.front(); E; E = E->next()) { + for (Ref<EditorSceneFormatImporter> importer_elem : importers) { List<String> extensions; - E->get()->get_extensions(&extensions); + importer_elem->get_extensions(&extensions); for (const String &F : extensions) { if (F.to_lower() == ext) { - importer = E->get(); + importer = importer_elem; break; } } @@ -1869,7 +1933,7 @@ Node *ResourceImporterScene::pre_import(const String &p_source_file) { Map<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> collision_map; List<Pair<NodePath, Node *>> node_renames; - _pre_fix_node(scene, scene, collision_map, node_renames); + _pre_fix_node(scene, scene, collision_map, nullptr, node_renames); return scene; } @@ -1883,13 +1947,13 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p EditorProgress progress("import", TTR("Import Scene"), 104); progress.step(TTR("Importing Scene..."), 0); - for (Set<Ref<EditorSceneFormatImporter>>::Element *E = importers.front(); E; E = E->next()) { + for (Ref<EditorSceneFormatImporter> importer_elem : importers) { List<String> extensions; - E->get()->get_extensions(&extensions); + importer_elem->get_extensions(&extensions); for (const String &F : extensions) { if (F.to_lower() == ext) { - importer = E->get(); + importer = importer_elem; break; } } @@ -1944,15 +2008,16 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p Set<Ref<ImporterMesh>> scanned_meshes; Map<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> collision_map; + Pair<PackedVector3Array, PackedInt32Array> occluder_arrays; List<Pair<NodePath, Node *>> node_renames; - _pre_fix_node(scene, scene, collision_map, node_renames); + _pre_fix_node(scene, scene, collision_map, &occluder_arrays, node_renames); for (int i = 0; i < post_importer_plugins.size(); i++) { post_importer_plugins.write[i]->pre_process(scene, p_options); } - _post_fix_node(scene, scene, collision_map, scanned_meshes, node_data, material_data, animation_data, fps); + _post_fix_node(scene, scene, collision_map, occluder_arrays, 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. @@ -1989,6 +2054,15 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p scene->set_name(p_save_path.get_file().get_basename()); } + if (!occluder_arrays.first.is_empty() && !occluder_arrays.second.is_empty()) { + Ref<ArrayOccluder3D> occ = memnew(ArrayOccluder3D); + occ->set_arrays(occluder_arrays.first, occluder_arrays.second); + OccluderInstance3D *occluder_instance = memnew(OccluderInstance3D); + occluder_instance->set_occluder(occ); + scene->add_child(occluder_instance, true); + occluder_instance->set_owner(scene); + } + bool gen_lods = bool(p_options["meshes/generate_lods"]); bool create_shadow_meshes = bool(p_options["meshes/create_shadow_meshes"]); int light_bake_mode = p_options["meshes/light_baking"]; @@ -2088,6 +2162,32 @@ ResourceImporterScene::ResourceImporterScene() { singleton = this; } +void ResourceImporterScene::add_importer(Ref<EditorSceneFormatImporter> p_importer, bool p_first_priority) { + ERR_FAIL_COND(p_importer.is_null()); + if (p_first_priority) { + importers.insert(0, p_importer); + } else { + importers.push_back(p_importer); + } +} + +void ResourceImporterScene::remove_post_importer_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin) { + post_importer_plugins.erase(p_plugin); +} + +void ResourceImporterScene::add_post_importer_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin, bool p_first_priority) { + ERR_FAIL_COND(p_plugin.is_null()); + if (p_first_priority) { + post_importer_plugins.insert(0, p_plugin); + } else { + post_importer_plugins.push_back(p_plugin); + } +} + +void ResourceImporterScene::remove_importer(Ref<EditorSceneFormatImporter> p_importer) { + importers.erase(p_importer); +} + /////////////////////////////////////// uint32_t EditorSceneFormatImporterESCN::get_import_flags() const { diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h index 13b55b5754..a819be682d 100644 --- a/editor/import/resource_importer_scene.h +++ b/editor/import/resource_importer_scene.h @@ -153,7 +153,7 @@ VARIANT_ENUM_CAST(EditorScenePostImportPlugin::InternalImportCategory) class ResourceImporterScene : public ResourceImporter { GDCLASS(ResourceImporterScene, ResourceImporter); - Set<Ref<EditorSceneFormatImporter>> importers; + Vector<Ref<EditorSceneFormatImporter>> importers; static ResourceImporterScene *singleton; @@ -178,6 +178,12 @@ class ResourceImporterScene : public ResourceImporter { NAVMESH_NAVMESH_ONLY, }; + enum OccluderMode { + OCCLUDER_DISABLED, + OCCLUDER_MESH_AND_OCCLUDER, + OCCLUDER_OCCLUDER_ONLY, + }; + enum MeshOverride { MESH_OVERRIDE_DEFAULT, MESH_OVERRIDE_ENABLE, @@ -224,13 +230,13 @@ class ResourceImporterScene : public ResourceImporter { public: static ResourceImporterScene *get_singleton() { return singleton; } - void add_post_importer_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin) { post_importer_plugins.push_back(p_plugin); } - void remove_post_importer_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin) { post_importer_plugins.erase(p_plugin); } + void add_post_importer_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin, bool p_first_priority = false); + void remove_post_importer_plugin(const Ref<EditorScenePostImportPlugin> &p_plugin); - const Set<Ref<EditorSceneFormatImporter>> &get_importers() const { return importers; } + const Vector<Ref<EditorSceneFormatImporter>> &get_importers() const { return importers; } - void add_importer(Ref<EditorSceneFormatImporter> p_importer) { importers.insert(p_importer); } - void remove_importer(Ref<EditorSceneFormatImporter> p_importer) { importers.erase(p_importer); } + void add_importer(Ref<EditorSceneFormatImporter> p_importer, bool p_first_priority = false); + void remove_importer(Ref<EditorSceneFormatImporter> p_importer); virtual String get_importer_name() const override; virtual String get_visible_name() const override; @@ -261,8 +267,8 @@ public: // Import scenes *after* everything else (such as textures). virtual int get_import_order() const override { return ResourceImporter::IMPORT_ORDER_SCENE; } - Node *_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> &collision_map, List<Pair<NodePath, Node *>> &r_node_renames); - Node *_post_fix_node(Node *p_node, Node *p_root, Map<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> &collision_map, Set<Ref<ImporterMesh>> &r_scanned_meshes, const Dictionary &p_node_data, const Dictionary &p_material_data, const Dictionary &p_animation_data, float p_animation_fps); + Node *_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> &r_collision_map, Pair<PackedVector3Array, PackedInt32Array> *r_occluder_arrays, List<Pair<NodePath, Node *>> &r_node_renames); + Node *_post_fix_node(Node *p_node, Node *p_root, Map<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> &collision_map, Pair<PackedVector3Array, PackedInt32Array> &r_occluder_arrays, Set<Ref<ImporterMesh>> &r_scanned_meshes, const Dictionary &p_node_data, const Dictionary &p_material_data, const Dictionary &p_animation_data, float p_animation_fps); 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); diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp index f21012258c..35a20e85c1 100644 --- a/editor/import/resource_importer_texture.cpp +++ b/editor/import/resource_importer_texture.cpp @@ -30,6 +30,7 @@ #include "resource_importer_texture.h" +#include "core/config/project_settings.h" #include "core/io/config_file.h" #include "core/io/image_loader.h" #include "core/version.h" @@ -215,7 +216,7 @@ void ResourceImporterTexture::get_import_options(const String &p_path, List<Impo r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/fix_alpha_border"), p_preset != PRESET_3D)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/premult_alpha"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/normal_map_invert_y"), false)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/HDR_as_SRGB"), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/hdr_as_srgb"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "process/size_limit", PROPERTY_HINT_RANGE, "0,4096,1"), 0)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "detect_3d/compress_to", PROPERTY_HINT_ENUM, "Disabled,VRAM Compressed,Basis Universal"), (p_preset == PRESET_DETECT) ? 1 : 0)); @@ -400,21 +401,21 @@ void ResourceImporterTexture::_save_stex(const Ref<Image> &p_image, const String Error ResourceImporterTexture::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) { CompressMode compress_mode = CompressMode(int(p_options["compress/mode"])); - float lossy = p_options["compress/lossy_quality"]; - int pack_channels = p_options["compress/channel_pack"]; - bool mipmaps = p_options["mipmaps/generate"]; - uint32_t mipmap_limit = mipmaps ? uint32_t(p_options["mipmaps/limit"]) : uint32_t(-1); - bool fix_alpha_border = p_options["process/fix_alpha_border"]; - bool premult_alpha = p_options["process/premult_alpha"]; - bool normal_map_invert_y = p_options["process/normal_map_invert_y"]; - bool stream = p_options["compress/streamed"]; - int size_limit = p_options["process/size_limit"]; - bool hdr_as_srgb = p_options["process/HDR_as_SRGB"]; - int normal = p_options["compress/normal_map"]; - int hdr_compression = p_options["compress/hdr_compression"]; - int bptc_ldr = p_options["compress/bptc_ldr"]; - int roughness = p_options["roughness/mode"]; - String normal_map = p_options["roughness/src_normal"]; + const float lossy = p_options["compress/lossy_quality"]; + const int pack_channels = p_options["compress/channel_pack"]; + const bool mipmaps = p_options["mipmaps/generate"]; + const uint32_t mipmap_limit = mipmaps ? uint32_t(p_options["mipmaps/limit"]) : uint32_t(-1); + const bool fix_alpha_border = p_options["process/fix_alpha_border"]; + const bool premult_alpha = p_options["process/premult_alpha"]; + const bool normal_map_invert_y = p_options["process/normal_map_invert_y"]; + const bool stream = p_options["compress/streamed"]; + const int size_limit = p_options["process/size_limit"]; + const bool hdr_as_srgb = p_options["process/hdr_as_srgb"]; + const int normal = p_options["compress/normal_map"]; + const int hdr_compression = p_options["compress/hdr_compression"]; + const int bptc_ldr = p_options["compress/bptc_ldr"]; + const int roughness = p_options["roughness/mode"]; + const String normal_map = p_options["roughness/src_normal"]; float scale = 1.0; if (p_options.has("svg/scale")) { scale = p_options["svg/scale"]; @@ -496,11 +497,10 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String //must import in all formats, in order of priority (so platform choses the best supported one. IE, etc2 over etc). //Android, GLES 2.x - bool ok_on_pc = false; - bool is_hdr = (image->get_format() >= Image::FORMAT_RF && image->get_format() <= Image::FORMAT_RGBE9995); + const bool is_hdr = (image->get_format() >= Image::FORMAT_RF && image->get_format() <= Image::FORMAT_RGBE9995); bool is_ldr = (image->get_format() >= Image::FORMAT_L8 && image->get_format() <= Image::FORMAT_RGB565); - bool can_bptc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_bptc"); - bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_s3tc"); + const bool can_bptc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_bptc"); + const bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_s3tc"); if (can_bptc) { //add to the list anyway @@ -525,29 +525,24 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String } } - if (can_compress_hdr) { - if (!can_bptc) { - //fallback to RGBE99995 - if (image->get_format() != Image::FORMAT_RGBE9995) { - image->convert(Image::FORMAT_RGBE9995); - } + if (!can_compress_hdr) { + //fallback to RGBE99995 + if (image->get_format() != Image::FORMAT_RGBE9995) { + image->convert(Image::FORMAT_RGBE9995); } - } else { - can_bptc = false; - } - } - - if (is_ldr && can_bptc) { - if (bptc_ldr == 0 || (bptc_ldr == 1 && !has_alpha)) { - can_bptc = false; } } + bool ok_on_pc = false; if (can_bptc || can_s3tc) { - _save_stex(image, p_save_path + ".s3tc.stex", compress_mode, lossy, can_bptc ? Image::COMPRESS_BPTC : Image::COMPRESS_S3TC, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel); + ok_on_pc = true; + Image::CompressMode image_compress_mode = Image::COMPRESS_BPTC; + if (!bptc_ldr && can_s3tc && is_ldr) { + image_compress_mode = Image::COMPRESS_S3TC; + } + _save_stex(image, p_save_path + ".s3tc.stex", compress_mode, lossy, image_compress_mode, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel); r_platform_variants->push_back("s3tc"); formats_imported.push_back("s3tc"); - ok_on_pc = true; } if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2")) { @@ -628,7 +623,7 @@ bool ResourceImporterTexture::are_import_settings_valid(const String &p_path) co String setting_path = "rendering/textures/vram_compression/import_" + String(compression_formats[index]); bool test = ProjectSettings::get_singleton()->get(setting_path); if (test) { - if (formats_imported.find(compression_formats[index]) == -1) { + if (!formats_imported.has(compression_formats[index])) { valid = false; break; } diff --git a/editor/import/resource_importer_texture_atlas.cpp b/editor/import/resource_importer_texture_atlas.cpp index d2a9fe2538..cd481e009e 100644 --- a/editor/import/resource_importer_texture_atlas.cpp +++ b/editor/import/resource_importer_texture_atlas.cpp @@ -75,6 +75,7 @@ void ResourceImporterTextureAtlas::get_import_options(const String &p_path, List r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "atlas_file", PROPERTY_HINT_SAVE_FILE, "*.png"), "")); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "import_mode", PROPERTY_HINT_ENUM, "Region,Mesh2D"), 0)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "crop_to_region"), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "trim_alpha_border_from_region"), true)); } String ResourceImporterTextureAtlas::get_option_group_file() const { @@ -210,14 +211,18 @@ Error ResourceImporterTextureAtlas::import_group_file(const String &p_group_file pack_data.is_cropped = options["crop_to_region"]; int mode = options["import_mode"]; + bool trim_alpha_border_from_region = options["trim_alpha_border_from_region"]; if (mode == IMPORT_MODE_REGION) { pack_data.is_mesh = false; EditorAtlasPacker::Chart chart; - //clip a region from the image - Rect2 used_rect = image->get_used_rect(); + Rect2 used_rect = Rect2(Vector2(), image->get_size()); + if (trim_alpha_border_from_region) { + // Clip a region from the image. + used_rect = image->get_used_rect(); + } pack_data.region = used_rect; chart.vertices.push_back(used_rect.position); diff --git a/editor/import/resource_importer_wav.h b/editor/import/resource_importer_wav.h index a5b576ceb9..2316ce80e5 100644 --- a/editor/import/resource_importer_wav.h +++ b/editor/import/resource_importer_wav.h @@ -28,8 +28,8 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef RESOURCEIMPORTWAV_H -#define RESOURCEIMPORTWAV_H +#ifndef RESOURCE_IMPORTER_WAV_H +#define RESOURCE_IMPORTER_WAV_H #include "core/io/resource_importer.h" @@ -50,9 +50,6 @@ public: virtual bool get_option_visibility(const String &p_path, const String &p_option, const Map<StringName, Variant> &p_options) const override; static void _compress_ima_adpcm(const Vector<float> &p_data, Vector<uint8_t> &dst_data) { - /*p_sample_data->data = (void*)malloc(len); - xm_s8 *dataptr=(xm_s8*)p_sample_data->data;*/ - static const int16_t _ima_adpcm_step_table[89] = { 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, @@ -81,15 +78,14 @@ public: int i, step_idx = 0, prev = 0; uint8_t *out = w; - //int16_t xm_prev=0; const float *in = p_data.ptr(); - /* initial value is zero */ + // Initial value is zero. *(out++) = 0; *(out++) = 0; - /* Table index initial value */ + // Table index initial value. *(out++) = 0; - /* unused */ + // Unused. *(out++) = 0; for (i = 0; i < datalen; i++) { @@ -101,15 +97,8 @@ public: xm_sample = 0; } else { xm_sample = CLAMP(in[i] * 32767.0, -32768, 32767); - /* - if (xm_sample==32767 || xm_sample==-32768) - printf("clippy!\n",xm_sample); - */ } - //xm_sample=xm_sample+xm_prev; - //xm_prev=xm_sample; - diff = (int)xm_sample - prev; nibble = 0; @@ -129,7 +118,7 @@ public: step >>= 1; mask >>= 1; - }; + } if (nibble & 8) { prev -= vpdiff; @@ -137,20 +126,10 @@ public: prev += vpdiff; } - if (prev > 32767) { - //printf("%i,xms %i, prev %i,diff %i, vpdiff %i, clip up %i\n",i,xm_sample,prev,diff,vpdiff,prev); - prev = 32767; - } else if (prev < -32768) { - //printf("%i,xms %i, prev %i,diff %i, vpdiff %i, clip down %i\n",i,xm_sample,prev,diff,vpdiff,prev); - prev = -32768; - } + prev = CLAMP(prev, -32768, 32767); step_idx += _ima_adpcm_index_table[nibble]; - if (step_idx < 0) { - step_idx = 0; - } else if (step_idx > 88) { - step_idx = 88; - } + step_idx = CLAMP(step_idx, 0, 88); if (i & 1) { *out |= nibble << 4; @@ -158,7 +137,6 @@ public: } else { *out = nibble; } - /*dataptr[i]=prev>>8;*/ } } @@ -167,4 +145,4 @@ public: ResourceImporterWAV(); }; -#endif // RESOURCEIMPORTWAV_H +#endif // RESOURCE_IMPORTER_WAV_H diff --git a/editor/import/scene_import_settings.cpp b/editor/import/scene_import_settings.cpp index eed1888c6a..4e06253041 100644 --- a/editor/import/scene_import_settings.cpp +++ b/editor/import/scene_import_settings.cpp @@ -29,9 +29,14 @@ /*************************************************************************/ #include "scene_import_settings.h" + +#include "editor/editor_file_dialog.h" +#include "editor/editor_file_system.h" +#include "editor/editor_inspector.h" #include "editor/editor_node.h" #include "editor/editor_scale.h" #include "scene/3d/importer_mesh_instance_3d.h" +#include "scene/animation/animation_player.h" #include "scene/resources/importer_mesh.h" #include "scene/resources/surface_tool.h" @@ -372,9 +377,10 @@ void SceneImportSettings::_update_view_gizmos() { continue; } - MeshInstance3D *collider_view = static_cast<MeshInstance3D *>(mesh_node->find_node("collider_view")); - CRASH_COND_MSG(collider_view == nullptr, "This is unreachable, since the collider view is always created even when the collision is not used! If this is triggered there is a bug on the function `_fill_scene`."); + TypedArray<Node> descendants = mesh_node->find_nodes("collider_view", "MeshInstance3D"); + CRASH_COND_MSG(descendants.is_empty(), "This is unreachable, since the collider view is always created even when the collision is not used! If this is triggered there is a bug on the function `_fill_scene`."); + MeshInstance3D *collider_view = static_cast<MeshInstance3D *>(descendants[0].operator Object *()); collider_view->set_visible(generate_collider); if (generate_collider) { // This collider_view doesn't have a mesh so we need to generate a new one. @@ -832,8 +838,10 @@ void SceneImportSettings::_re_import() { } void SceneImportSettings::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - connect("confirmed", callable_mp(this, &SceneImportSettings::_re_import)); + switch (p_what) { + case NOTIFICATION_READY: { + connect("confirmed", callable_mp(this, &SceneImportSettings::_re_import)); + } break; } } diff --git a/editor/import/scene_import_settings.h b/editor/import/scene_import_settings.h index 4edf05c7bb..b51f342729 100644 --- a/editor/import/scene_import_settings.h +++ b/editor/import/scene_import_settings.h @@ -31,8 +31,6 @@ #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" @@ -47,6 +45,8 @@ #include "scene/gui/tree.h" #include "scene/resources/primitive_meshes.h" +class EditorFileDialog; +class EditorInspector; class SceneImportSettingsData; class SceneImportSettings : public ConfirmationDialog { diff --git a/editor/import_defaults_editor.cpp b/editor/import_defaults_editor.cpp index 15d3c4b3ee..ca979c094f 100644 --- a/editor/import_defaults_editor.cpp +++ b/editor/import_defaults_editor.cpp @@ -30,6 +30,16 @@ #include "import_defaults_editor.h" +#include "core/config/project_settings.h" +#include "core/io/resource_importer.h" +#include "editor/action_map_editor.h" +#include "editor/editor_autoload_settings.h" +#include "editor/editor_plugin_settings.h" +#include "editor/editor_sectioned_inspector.h" +#include "editor/localization_editor.h" +#include "editor/shader_globals_editor.h" +#include "scene/gui/center_container.h" + class ImportDefaultsEditorSettings : public Object { GDCLASS(ImportDefaultsEditorSettings, Object) friend class ImportDefaultsEditor; @@ -70,8 +80,10 @@ protected: }; void ImportDefaultsEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_PREDELETE) { - inspector->edit(nullptr); + switch (p_what) { + case NOTIFICATION_PREDELETE: { + inspector->edit(nullptr); + } break; } } diff --git a/editor/import_defaults_editor.h b/editor/import_defaults_editor.h index e84e4b6646..ed94fe6156 100644 --- a/editor/import_defaults_editor.h +++ b/editor/import_defaults_editor.h @@ -31,18 +31,12 @@ #ifndef IMPORT_DEFAULTS_EDITOR_H #define IMPORT_DEFAULTS_EDITOR_H -#include "core/object/undo_redo.h" -#include "editor/action_map_editor.h" -#include "editor/editor_data.h" -#include "editor/editor_plugin_settings.h" -#include "editor/editor_sectioned_inspector.h" -#include "editor/localization_editor.h" -#include "editor/shader_globals_editor.h" -#include "editor_autoload_settings.h" -#include "scene/gui/center_container.h" +#include "scene/gui/box_container.h" +#include "scene/gui/button.h" #include "scene/gui/option_button.h" class ImportDefaultsEditorSettings; +class EditorInspector; class ImportDefaultsEditor : public VBoxContainer { GDCLASS(ImportDefaultsEditor, VBoxContainer) diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp index 419688fd9f..72cc33048c 100644 --- a/editor/import_dock.cpp +++ b/editor/import_dock.cpp @@ -29,9 +29,11 @@ /*************************************************************************/ #include "import_dock.h" -#include "editor_node.h" -#include "editor_resource_preview.h" -#include "editor_scale.h" + +#include "core/config/project_settings.h" +#include "editor/editor_node.h" +#include "editor/editor_resource_preview.h" +#include "editor/editor_scale.h" class ImportDockParameters : public Object { GDCLASS(ImportDockParameters, Object); @@ -447,7 +449,7 @@ static bool _find_owners(EditorFileSystemDirectory *efsd, const String &p_path) for (int i = 0; i < efsd->get_file_count(); i++) { Vector<String> deps = efsd->get_file_deps(i); - if (deps.find(p_path) != -1) { + if (deps.has(p_path)) { return true; } } diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp index e36c86fb10..087e51b0cb 100644 --- a/editor/inspector_dock.cpp +++ b/editor/inspector_dock.cpp @@ -30,8 +30,10 @@ #include "inspector_dock.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" -#include "editor/plugins/animation_player_editor_plugin.h" +#include "editor/plugins/script_editor_plugin.h" InspectorDock *InspectorDock::singleton = nullptr; @@ -75,7 +77,7 @@ void InspectorDock::_menu_option_confirm(int p_option, bool p_confirmed) { case OBJECT_REQUEST_HELP: { if (current) { - editor->set_visible_editor(EditorNode::EDITOR_SCRIPT); + EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT); emit_signal(SNAME("request_help"), current->get_class()); } } break; @@ -167,8 +169,8 @@ void InspectorDock::_menu_option_confirm(int p_option, bool p_confirmed) { editor_data->get_undo_redo().clear_history(); - editor->get_editor_plugins_over()->edit(nullptr); - editor->get_editor_plugins_over()->edit(current); + EditorNode::get_singleton()->get_editor_plugins_over()->edit(nullptr); + EditorNode::get_singleton()->get_editor_plugins_over()->edit(current); } } break; @@ -230,7 +232,7 @@ void InspectorDock::_resource_file_selected(String p_file) { return; }; - editor->push_item(res.operator->()); + EditorNode::get_singleton()->push_item(res.operator->()); } void InspectorDock::_save_resource(bool save_as) { @@ -242,9 +244,9 @@ void InspectorDock::_save_resource(bool save_as) { RES current_res = RES(Object::cast_to<Resource>(current_obj)); if (save_as) { - editor->save_resource_as(current_res); + EditorNode::get_singleton()->save_resource_as(current_res); } else { - editor->save_resource(current_res); + EditorNode::get_singleton()->save_resource(current_res); } } @@ -256,7 +258,7 @@ void InspectorDock::_unref_resource() { RES current_res = RES(Object::cast_to<Resource>(current_obj)); current_res->set_path(""); - editor->edit_current(); + EditorNode::get_singleton()->edit_current(); } void InspectorDock::_copy_resource() { @@ -273,7 +275,7 @@ void InspectorDock::_copy_resource() { void InspectorDock::_paste_resource() { RES r = EditorSettings::get_singleton()->get_resource_clipboard(); if (r.is_valid()) { - editor->push_item(EditorSettings::get_singleton()->get_resource_clipboard().ptr(), String()); + EditorNode::get_singleton()->push_item(EditorSettings::get_singleton()->get_resource_clipboard().ptr(), String()); } } @@ -341,7 +343,7 @@ void InspectorDock::_select_history(int p_idx) { if (!obj) { return; } - editor->push_item(obj); + EditorNode::get_singleton()->push_item(obj); } void InspectorDock::_resource_created() { @@ -351,7 +353,7 @@ void InspectorDock::_resource_created() { Resource *r = Object::cast_to<Resource>(c); ERR_FAIL_COND(!r); - editor->push_item(r); + EditorNode::get_singleton()->push_item(r); } void InspectorDock::_resource_selected(const RES &p_res, const String &p_property) { @@ -360,19 +362,19 @@ void InspectorDock::_resource_selected(const RES &p_res, const String &p_propert } RES r = p_res; - editor->push_item(r.operator->(), p_property); + EditorNode::get_singleton()->push_item(r.operator->(), p_property); } void InspectorDock::_edit_forward() { if (EditorNode::get_singleton()->get_editor_history()->next()) { - editor->edit_current(); + EditorNode::get_singleton()->edit_current(); } } void InspectorDock::_edit_back() { EditorHistory *editor_history = EditorNode::get_singleton()->get_editor_history(); if ((current && editor_history->previous()) || editor_history->get_path_size() == 1) { - editor->edit_current(); + EditorNode::get_singleton()->edit_current(); } } @@ -398,7 +400,7 @@ void InspectorDock::_notification(int p_what) { case NOTIFICATION_TRANSLATION_CHANGED: case NOTIFICATION_LAYOUT_DIRECTION_CHANGED: case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - set_theme(editor->get_gui_base()->get_theme()); + set_theme(EditorNode::get_singleton()->get_gui_base()->get_theme()); resource_new_button->set_icon(get_theme_icon(SNAME("New"), SNAME("EditorIcons"))); resource_load_button->set_icon(get_theme_icon(SNAME("Load"), SNAME("EditorIcons"))); @@ -532,11 +534,10 @@ void InspectorDock::go_back() { _edit_back(); } -InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) { +InspectorDock::InspectorDock(EditorData &p_editor_data) { singleton = this; set_name("Inspector"); - editor = p_editor; editor_data = &p_editor_data; HBoxContainer *general_options_hb = memnew(HBoxContainer); @@ -601,7 +602,7 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) { HBoxContainer *subresource_hb = memnew(HBoxContainer); add_child(subresource_hb); - editor_path = memnew(EditorPath(editor->get_editor_history())); + editor_path = memnew(EditorPath(EditorNode::get_singleton()->get_editor_history())); editor_path->set_h_size_flags(Control::SIZE_EXPAND_FILL); subresource_hb->add_child(editor_path); @@ -614,7 +615,7 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) { open_docs_button->connect("pressed", callable_mp(this, &InspectorDock::_menu_option), varray(OBJECT_REQUEST_HELP)); new_resource_dialog = memnew(CreateDialog); - editor->get_gui_base()->add_child(new_resource_dialog); + EditorNode::get_singleton()->get_gui_base()->add_child(new_resource_dialog); new_resource_dialog->set_base_type("Resource"); new_resource_dialog->connect("create", callable_mp(this, &InspectorDock::_resource_created)); @@ -664,7 +665,7 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) { unique_resources_confirmation->connect("confirmed", callable_mp(this, &InspectorDock::_menu_confirm_current)); warning_dialog = memnew(AcceptDialog); - editor->get_gui_base()->add_child(warning_dialog); + EditorNode::get_singleton()->get_gui_base()->add_child(warning_dialog); load_resource_dialog = memnew(EditorFileDialog); add_child(load_resource_dialog); diff --git a/editor/inspector_dock.h b/editor/inspector_dock.h index 9dd3fa2070..27552407bd 100644 --- a/editor/inspector_dock.h +++ b/editor/inspector_dock.h @@ -31,16 +31,18 @@ #ifndef INSPECTOR_DOCK_H #define INSPECTOR_DOCK_H -#include "editor/animation_track_editor.h" #include "editor/create_dialog.h" #include "editor/editor_data.h" #include "editor/editor_inspector.h" #include "editor/editor_path.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" -#include "scene/gui/control.h" +#include "scene/gui/dialogs.h" +#include "scene/gui/line_edit.h" +#include "scene/gui/menu_button.h" +#include "scene/gui/tree.h" -class EditorNode; +class EditorFileDialog; class InspectorDock : public VBoxContainer { GDCLASS(InspectorDock, VBoxContainer); @@ -63,7 +65,6 @@ class InspectorDock : public VBoxContainer { OBJECT_METHOD_BASE = 500 }; - EditorNode *editor; EditorData *editor_data; EditorInspector *inspector; @@ -138,7 +139,7 @@ public: Container *get_addon_area(); EditorInspector *get_inspector() { return inspector; } - InspectorDock(EditorNode *p_editor, EditorData &p_editor_data); + InspectorDock(EditorData &p_editor_data); ~InspectorDock(); }; diff --git a/editor/localization_editor.cpp b/editor/localization_editor.cpp index 1e9e2fc09b..cd9986d527 100644 --- a/editor/localization_editor.cpp +++ b/editor/localization_editor.cpp @@ -30,33 +30,37 @@ #include "localization_editor.h" +#include "core/config/project_settings.h" #include "core/string/translation.h" -#include "editor_node.h" -#include "editor_scale.h" -#include "editor_translation_parser.h" -#include "pot_generator.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_translation_parser.h" +#include "editor/pot_generator.h" #include "scene/gui/control.h" void LocalizationEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - translation_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_translation_delete)); - translation_pot_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_pot_delete)); - - List<String> tfn; - ResourceLoader::get_recognized_extensions_for_type("Translation", &tfn); - for (const String &E : tfn) { - translation_file_open->add_filter("*." + E); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + translation_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_translation_delete)); + translation_pot_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_pot_delete)); + + List<String> tfn; + ResourceLoader::get_recognized_extensions_for_type("Translation", &tfn); + for (const String &E : tfn) { + translation_file_open->add_filter("*." + E); + } - List<String> rfn; - ResourceLoader::get_recognized_extensions_for_type("Resource", &rfn); - for (const String &E : rfn) { - translation_res_file_open_dialog->add_filter("*." + E); - translation_res_option_file_open_dialog->add_filter("*." + E); - } + List<String> rfn; + ResourceLoader::get_recognized_extensions_for_type("Resource", &rfn); + for (const String &E : rfn) { + translation_res_file_open_dialog->add_filter("*." + E); + translation_res_option_file_open_dialog->add_filter("*." + E); + } - _update_pot_file_extensions(); - pot_generate_dialog->add_filter("*.pot"); + _update_pot_file_extensions(); + pot_generate_dialog->add_filter("*.pot"); + } break; } } diff --git a/editor/localization_editor.h b/editor/localization_editor.h index cad07dd336..bde1b894e2 100644 --- a/editor/localization_editor.h +++ b/editor/localization_editor.h @@ -32,10 +32,11 @@ #define LOCALIZATION_EDITOR_H #include "core/object/undo_redo.h" -#include "editor_file_dialog.h" -#include "editor_locale_dialog.h" +#include "editor/editor_locale_dialog.h" #include "scene/gui/tree.h" +class EditorFileDialog; + class LocalizationEditor : public VBoxContainer { GDCLASS(LocalizationEditor, VBoxContainer); diff --git a/editor/multi_node_edit.cpp b/editor/multi_node_edit.cpp index c61380684a..432d1ee4cc 100644 --- a/editor/multi_node_edit.cpp +++ b/editor/multi_node_edit.cpp @@ -31,7 +31,7 @@ #include "multi_node_edit.h" #include "core/math/math_fieldwise.h" -#include "editor_node.h" +#include "editor/editor_node.h" bool MultiNodeEdit::_set(const StringName &p_name, const Variant &p_value) { return _set_impl(p_name, p_value, ""); diff --git a/editor/node_dock.cpp b/editor/node_dock.cpp index 1246ebe0dd..18545d3c9a 100644 --- a/editor/node_dock.cpp +++ b/editor/node_dock.cpp @@ -31,8 +31,8 @@ #include "node_dock.h" #include "connections_dialog.h" -#include "editor_node.h" -#include "editor_scale.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" void NodeDock::show_groups() { groups_button->set_pressed(true); @@ -52,9 +52,12 @@ void NodeDock::_bind_methods() { } void NodeDock::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - connections_button->set_icon(get_theme_icon(SNAME("Signals"), SNAME("EditorIcons"))); - groups_button->set_icon(get_theme_icon(SNAME("Groups"), SNAME("EditorIcons"))); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + connections_button->set_icon(get_theme_icon(SNAME("Signals"), SNAME("EditorIcons"))); + groups_button->set_icon(get_theme_icon(SNAME("Groups"), SNAME("EditorIcons"))); + } break; } } @@ -113,7 +116,7 @@ NodeDock::NodeDock() { mode_hb->add_child(groups_button); groups_button->connect("pressed", callable_mp(this, &NodeDock::show_groups)); - connections = memnew(ConnectionsDock(EditorNode::get_singleton())); + connections = memnew(ConnectionsDock); connections->set_undoredo(EditorNode::get_undo_redo()); add_child(connections); connections->set_v_size_flags(SIZE_EXPAND_FILL); diff --git a/editor/plugin_config_dialog.cpp b/editor/plugin_config_dialog.cpp index 5786d24d23..48ea3013f7 100644 --- a/editor/plugin_config_dialog.cpp +++ b/editor/plugin_config_dialog.cpp @@ -160,6 +160,7 @@ void PluginConfigDialog::_notification(int p_what) { name_edit->grab_focus(); } } break; + case NOTIFICATION_READY: { connect("confirmed", callable_mp(this, &PluginConfigDialog::_on_confirmed)); get_cancel_button()->connect("pressed", callable_mp(this, &PluginConfigDialog::_on_cancelled)); diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp index c6bde4c98a..5a2696fff1 100644 --- a/editor/plugins/abstract_polygon_2d_editor.cpp +++ b/editor/plugins/abstract_polygon_2d_editor.cpp @@ -33,6 +33,7 @@ #include "canvas_item_editor_plugin.h" #include "core/math/geometry_2d.h" #include "core/os/keyboard.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" bool AbstractPolygon2DEditor::Vertex::operator==(const AbstractPolygon2DEditor::Vertex &p_vertex) const { @@ -153,6 +154,7 @@ void AbstractPolygon2DEditor::_notification(int p_what) { button_edit->set_icon(get_theme_icon(SNAME("CurveEdit"), SNAME("EditorIcons"))); button_delete->set_icon(get_theme_icon(SNAME("CurveDelete"), SNAME("EditorIcons"))); } break; + case NOTIFICATION_READY: { disable_polygon_editing(false, String()); @@ -245,6 +247,10 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) return false; } + if (!_get_node()->is_visible_in_tree()) { + return false; + } + Ref<InputEventMouseButton> mb = p_event; if (!_has_resource()) { @@ -478,6 +484,10 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl return; } + if (!_get_node()->is_visible_in_tree()) { + return; + } + Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform(); // All polygon points are sharp, so use the sharp handle icon const Ref<Texture2D> handle = get_theme_icon(SNAME("EditorPathSharpHandle"), SNAME("EditorIcons")); @@ -693,9 +703,8 @@ AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_edge_point(c return closest; } -AbstractPolygon2DEditor::AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wip_destructive) { +AbstractPolygon2DEditor::AbstractPolygon2DEditor(bool p_wip_destructive) { canvas_item_editor = nullptr; - editor = p_editor; undo_redo = EditorNode::get_undo_redo(); wip_active = false; @@ -749,9 +758,8 @@ void AbstractPolygon2DEditorPlugin::make_visible(bool p_visible) { } } -AbstractPolygon2DEditorPlugin::AbstractPolygon2DEditorPlugin(EditorNode *p_node, AbstractPolygon2DEditor *p_polygon_editor, String p_class) : +AbstractPolygon2DEditorPlugin::AbstractPolygon2DEditorPlugin(AbstractPolygon2DEditor *p_polygon_editor, String p_class) : polygon_editor(p_polygon_editor), - editor(p_node), klass(p_class) { CanvasItemEditor::get_singleton()->add_control_to_menu_panel(polygon_editor); polygon_editor->hide(); diff --git a/editor/plugins/abstract_polygon_2d_editor.h b/editor/plugins/abstract_polygon_2d_editor.h index 8db5bf58dd..c0e7c1be2e 100644 --- a/editor/plugins/abstract_polygon_2d_editor.h +++ b/editor/plugins/abstract_polygon_2d_editor.h @@ -31,9 +31,9 @@ #ifndef ABSTRACT_POLYGON_2D_EDITOR_H #define ABSTRACT_POLYGON_2D_EDITOR_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/2d/polygon_2d.h" +#include "scene/gui/box_container.h" class CanvasItemEditor; @@ -86,7 +86,6 @@ class AbstractPolygon2DEditor : public HBoxContainer { bool _polygon_editing_enabled; CanvasItemEditor *canvas_item_editor; - EditorNode *editor; Panel *panel; ConfirmationDialog *create_resource; @@ -144,14 +143,13 @@ public: void forward_canvas_draw_over_viewport(Control *p_overlay); void edit(Node *p_polygon); - AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wip_destructive = true); + AbstractPolygon2DEditor(bool p_wip_destructive = true); }; class AbstractPolygon2DEditorPlugin : public EditorPlugin { GDCLASS(AbstractPolygon2DEditorPlugin, EditorPlugin); AbstractPolygon2DEditor *polygon_editor; - EditorNode *editor; String klass; public: @@ -164,7 +162,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - AbstractPolygon2DEditorPlugin(EditorNode *p_node, AbstractPolygon2DEditor *p_polygon_editor, String p_class); + AbstractPolygon2DEditorPlugin(AbstractPolygon2DEditor *p_polygon_editor, String p_class); ~AbstractPolygon2DEditorPlugin(); }; diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp index 3dcb769faf..fe8b462084 100644 --- a/editor/plugins/animation_blend_space_1d_editor.cpp +++ b/editor/plugins/animation_blend_space_1d_editor.cpp @@ -31,6 +31,8 @@ #include "animation_blend_space_1d_editor.h" #include "core/os/keyboard.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "scene/animation/animation_blend_tree.h" @@ -529,39 +531,42 @@ void AnimationNodeBlendSpace1DEditor::_open_editor() { } void AnimationNodeBlendSpace1DEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); - panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - tool_blend->set_icon(get_theme_icon(SNAME("EditPivot"), SNAME("EditorIcons"))); - tool_select->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); - tool_create->set_icon(get_theme_icon(SNAME("EditKey"), SNAME("EditorIcons"))); - tool_erase->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); - snap->set_icon(get_theme_icon(SNAME("SnapGrid"), SNAME("EditorIcons"))); - open_editor->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); - } - - if (p_what == NOTIFICATION_PROCESS) { - String error; - - if (!AnimationTreeEditor::get_singleton()->get_tree()->is_active()) { - error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); - } else if (AnimationTreeEditor::get_singleton()->get_tree()->is_state_invalid()) { - error = AnimationTreeEditor::get_singleton()->get_tree()->get_invalid_state_reason(); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + tool_blend->set_icon(get_theme_icon(SNAME("EditPivot"), SNAME("EditorIcons"))); + tool_select->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); + tool_create->set_icon(get_theme_icon(SNAME("EditKey"), SNAME("EditorIcons"))); + tool_erase->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); + snap->set_icon(get_theme_icon(SNAME("SnapGrid"), SNAME("EditorIcons"))); + open_editor->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); + } break; + + case NOTIFICATION_PROCESS: { + String error; + + if (!AnimationTreeEditor::get_singleton()->get_tree()->is_active()) { + error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); + } else if (AnimationTreeEditor::get_singleton()->get_tree()->is_state_invalid()) { + error = AnimationTreeEditor::get_singleton()->get_tree()->get_invalid_state_reason(); + } - if (error != error_label->get_text()) { - error_label->set_text(error); - if (!error.is_empty()) { - error_panel->show(); - } else { - error_panel->hide(); + if (error != error_label->get_text()) { + error_label->set_text(error); + if (!error.is_empty()) { + error_panel->show(); + } else { + error_panel->hide(); + } } - } - } + } break; - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - set_process(is_visible_in_tree()); + case NOTIFICATION_VISIBILITY_CHANGED: { + set_process(is_visible_in_tree()); + } break; } } diff --git a/editor/plugins/animation_blend_space_1d_editor.h b/editor/plugins/animation_blend_space_1d_editor.h index 7906395c8f..54cded6048 100644 --- a/editor/plugins/animation_blend_space_1d_editor.h +++ b/editor/plugins/animation_blend_space_1d_editor.h @@ -31,7 +31,6 @@ #ifndef ANIMATION_BLEND_SPACE_1D_EDITOR_H #define ANIMATION_BLEND_SPACE_1D_EDITOR_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/plugins/animation_tree_editor_plugin.h" #include "editor/property_editor.h" diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp index c0029312a7..506a709728 100644 --- a/editor/plugins/animation_blend_space_2d_editor.cpp +++ b/editor/plugins/animation_blend_space_2d_editor.cpp @@ -35,6 +35,8 @@ #include "core/io/resource_loader.h" #include "core/math/geometry_2d.h" #include "core/os/keyboard.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "scene/animation/animation_blend_tree.h" #include "scene/animation/animation_player.h" @@ -180,7 +182,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven selected_point = -1; for (int i = 0; i < points.size(); i++) { - if (making_triangle.find(i) != -1) { + if (making_triangle.has(i)) { continue; } @@ -729,49 +731,52 @@ void AnimationNodeBlendSpace2DEditor::_edit_point_pos(double) { } void AnimationNodeBlendSpace2DEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); - panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - tool_blend->set_icon(get_theme_icon(SNAME("EditPivot"), SNAME("EditorIcons"))); - tool_select->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); - tool_create->set_icon(get_theme_icon(SNAME("EditKey"), SNAME("EditorIcons"))); - tool_triangle->set_icon(get_theme_icon(SNAME("ToolTriangle"), SNAME("EditorIcons"))); - tool_erase->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); - snap->set_icon(get_theme_icon(SNAME("SnapGrid"), SNAME("EditorIcons"))); - open_editor->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); - auto_triangles->set_icon(get_theme_icon(SNAME("AutoTriangle"), SNAME("EditorIcons"))); - interpolation->clear(); - interpolation->add_icon_item(get_theme_icon(SNAME("TrackContinuous"), SNAME("EditorIcons")), "", 0); - interpolation->add_icon_item(get_theme_icon(SNAME("TrackDiscrete"), SNAME("EditorIcons")), "", 1); - interpolation->add_icon_item(get_theme_icon(SNAME("TrackCapture"), SNAME("EditorIcons")), "", 2); - } - - if (p_what == NOTIFICATION_PROCESS) { - String error; - - if (!AnimationTreeEditor::get_singleton()->get_tree()) { - error = TTR("BlendSpace2D does not belong to an AnimationTree node."); - } else if (!AnimationTreeEditor::get_singleton()->get_tree()->is_active()) { - error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); - } else if (AnimationTreeEditor::get_singleton()->get_tree()->is_state_invalid()) { - error = AnimationTreeEditor::get_singleton()->get_tree()->get_invalid_state_reason(); - } else if (blend_space->get_triangle_count() == 0) { - error = TTR("No triangles exist, so no blending can take place."); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + tool_blend->set_icon(get_theme_icon(SNAME("EditPivot"), SNAME("EditorIcons"))); + tool_select->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); + tool_create->set_icon(get_theme_icon(SNAME("EditKey"), SNAME("EditorIcons"))); + tool_triangle->set_icon(get_theme_icon(SNAME("ToolTriangle"), SNAME("EditorIcons"))); + tool_erase->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); + snap->set_icon(get_theme_icon(SNAME("SnapGrid"), SNAME("EditorIcons"))); + open_editor->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); + auto_triangles->set_icon(get_theme_icon(SNAME("AutoTriangle"), SNAME("EditorIcons"))); + interpolation->clear(); + interpolation->add_icon_item(get_theme_icon(SNAME("TrackContinuous"), SNAME("EditorIcons")), "", 0); + interpolation->add_icon_item(get_theme_icon(SNAME("TrackDiscrete"), SNAME("EditorIcons")), "", 1); + interpolation->add_icon_item(get_theme_icon(SNAME("TrackCapture"), SNAME("EditorIcons")), "", 2); + } break; + + case NOTIFICATION_PROCESS: { + String error; + + if (!AnimationTreeEditor::get_singleton()->get_tree()) { + error = TTR("BlendSpace2D does not belong to an AnimationTree node."); + } else if (!AnimationTreeEditor::get_singleton()->get_tree()->is_active()) { + error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); + } else if (AnimationTreeEditor::get_singleton()->get_tree()->is_state_invalid()) { + error = AnimationTreeEditor::get_singleton()->get_tree()->get_invalid_state_reason(); + } else if (blend_space->get_triangle_count() == 0) { + error = TTR("No triangles exist, so no blending can take place."); + } - if (error != error_label->get_text()) { - error_label->set_text(error); - if (!error.is_empty()) { - error_panel->show(); - } else { - error_panel->hide(); + if (error != error_label->get_text()) { + error_label->set_text(error); + if (!error.is_empty()) { + error_panel->show(); + } else { + error_panel->hide(); + } } - } - } + } break; - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - set_process(is_visible_in_tree()); + case NOTIFICATION_VISIBILITY_CHANGED: { + set_process(is_visible_in_tree()); + } break; } } diff --git a/editor/plugins/animation_blend_space_2d_editor.h b/editor/plugins/animation_blend_space_2d_editor.h index b46efff304..933d2bd96d 100644 --- a/editor/plugins/animation_blend_space_2d_editor.h +++ b/editor/plugins/animation_blend_space_2d_editor.h @@ -31,7 +31,6 @@ #ifndef ANIMATION_BLEND_SPACE_2D_EDITOR_H #define ANIMATION_BLEND_SPACE_2D_EDITOR_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/plugins/animation_tree_editor_plugin.h" #include "editor/property_editor.h" diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp index e46c81b77e..0b3164aada 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.cpp +++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -34,7 +34,9 @@ #include "core/input/input.h" #include "core/io/resource_loader.h" #include "core/os/keyboard.h" +#include "editor/editor_file_dialog.h" #include "editor/editor_inspector.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "scene/animation/animation_player.h" #include "scene/gui/menu_button.h" @@ -300,7 +302,7 @@ void AnimationNodeBlendTreeEditor::_add_node(int p_idx) { base_name = add_options[p_idx].name; } else { ERR_FAIL_COND(add_options[p_idx].script.is_null()); - String base_type = add_options[p_idx].script->get_instance_base_type(); + StringName base_type = add_options[p_idx].script->get_instance_base_type(); AnimationNode *an = Object::cast_to<AnimationNode>(ClassDB::instantiate(base_type)); ERR_FAIL_COND(!an); anode = Ref<AnimationNode>(an); @@ -732,80 +734,95 @@ void AnimationNodeBlendTreeEditor::_removed_from_graph() { } } +void AnimationNodeBlendTreeEditor::_update_editor_settings() { + graph->get_panner()->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); + graph->set_warped_panning(bool(EditorSettings::get_singleton()->get("editors/panning/warped_mouse_panning"))); +} + +void AnimationNodeBlendTreeEditor::_update_theme() { + error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); +} + void AnimationNodeBlendTreeEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - graph->get_panner()->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); - graph->set_warped_panning(bool(EditorSettings::get_singleton()->get("editors/panning/warped_mouse_panning"))); - } + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + _update_editor_settings(); + _update_theme(); + } break; - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + _update_editor_settings(); + } break; - if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree()) { - _update_graph(); - } - } + case NOTIFICATION_THEME_CHANGED: { + _update_theme(); - if (p_what == NOTIFICATION_PROCESS) { - String error; + if (is_visible_in_tree()) { + _update_graph(); + } + } break; - if (!AnimationTreeEditor::get_singleton()->get_tree()->is_active()) { - error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); - } else if (AnimationTreeEditor::get_singleton()->get_tree()->is_state_invalid()) { - error = AnimationTreeEditor::get_singleton()->get_tree()->get_invalid_state_reason(); - } + case NOTIFICATION_PROCESS: { + String error; - if (error != error_label->get_text()) { - error_label->set_text(error); - if (!error.is_empty()) { - error_panel->show(); - } else { - error_panel->hide(); + if (!AnimationTreeEditor::get_singleton()->get_tree()->is_active()) { + error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); + } else if (AnimationTreeEditor::get_singleton()->get_tree()->is_state_invalid()) { + error = AnimationTreeEditor::get_singleton()->get_tree()->get_invalid_state_reason(); } - } - List<AnimationNodeBlendTree::NodeConnection> conns; - blend_tree->get_node_connections(&conns); - for (const AnimationNodeBlendTree::NodeConnection &E : conns) { - float activity = 0; - StringName path = AnimationTreeEditor::get_singleton()->get_base_path() + E.input_node; - if (AnimationTreeEditor::get_singleton()->get_tree() && !AnimationTreeEditor::get_singleton()->get_tree()->is_state_invalid()) { - activity = AnimationTreeEditor::get_singleton()->get_tree()->get_connection_activity(path, E.input_index); + if (error != error_label->get_text()) { + error_label->set_text(error); + if (!error.is_empty()) { + error_panel->show(); + } else { + error_panel->hide(); + } } - graph->set_connection_activity(E.output_node, 0, E.input_node, E.input_index, activity); - } - AnimationTree *graph_player = AnimationTreeEditor::get_singleton()->get_tree(); - AnimationPlayer *player = nullptr; - if (graph_player->has_node(graph_player->get_animation_player())) { - player = Object::cast_to<AnimationPlayer>(graph_player->get_node(graph_player->get_animation_player())); - } + List<AnimationNodeBlendTree::NodeConnection> conns; + blend_tree->get_node_connections(&conns); + for (const AnimationNodeBlendTree::NodeConnection &E : conns) { + float activity = 0; + StringName path = AnimationTreeEditor::get_singleton()->get_base_path() + E.input_node; + if (AnimationTreeEditor::get_singleton()->get_tree() && !AnimationTreeEditor::get_singleton()->get_tree()->is_state_invalid()) { + activity = AnimationTreeEditor::get_singleton()->get_tree()->get_connection_activity(path, E.input_index); + } + graph->set_connection_activity(E.output_node, 0, E.input_node, E.input_index, activity); + } - if (player) { - for (const KeyValue<StringName, ProgressBar *> &E : animations) { - Ref<AnimationNodeAnimation> an = blend_tree->get_node(E.key); - if (an.is_valid()) { - if (player->has_animation(an->get_animation())) { - Ref<Animation> anim = player->get_animation(an->get_animation()); - if (anim.is_valid()) { - E.value->set_max(anim->get_length()); - //StringName path = AnimationTreeEditor::get_singleton()->get_base_path() + E.input_node; - StringName time_path = AnimationTreeEditor::get_singleton()->get_base_path() + String(E.key) + "/time"; - E.value->set_value(AnimationTreeEditor::get_singleton()->get_tree()->get(time_path)); + AnimationTree *graph_player = AnimationTreeEditor::get_singleton()->get_tree(); + AnimationPlayer *player = nullptr; + if (graph_player->has_node(graph_player->get_animation_player())) { + player = Object::cast_to<AnimationPlayer>(graph_player->get_node(graph_player->get_animation_player())); + } + + if (player) { + for (const KeyValue<StringName, ProgressBar *> &E : animations) { + Ref<AnimationNodeAnimation> an = blend_tree->get_node(E.key); + if (an.is_valid()) { + if (player->has_animation(an->get_animation())) { + Ref<Animation> anim = player->get_animation(an->get_animation()); + if (anim.is_valid()) { + E.value->set_max(anim->get_length()); + //StringName path = AnimationTreeEditor::get_singleton()->get_base_path() + E.input_node; + StringName time_path = AnimationTreeEditor::get_singleton()->get_base_path() + String(E.key) + "/time"; + E.value->set_value(AnimationTreeEditor::get_singleton()->get_tree()->get(time_path)); + } } } } } - } - for (int i = 0; i < visible_properties.size(); i++) { - visible_properties[i]->update_property(); - } - } + for (int i = 0; i < visible_properties.size(); i++) { + visible_properties[i]->update_property(); + } + } break; - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - set_process(is_visible_in_tree()); + case NOTIFICATION_VISIBILITY_CHANGED: { + set_process(is_visible_in_tree()); + } break; } } @@ -833,7 +850,7 @@ void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<Anima const String &new_name = p_text; - ERR_FAIL_COND(new_name.is_empty() || new_name.find(".") != -1 || new_name.find("/") != -1); + ERR_FAIL_COND(new_name.is_empty() || new_name.contains(".") || new_name.contains("/")); if (new_name == prev_name) { return; //nothing to do diff --git a/editor/plugins/animation_blend_tree_editor_plugin.h b/editor/plugins/animation_blend_tree_editor_plugin.h index 1e55cc8598..c111f9245e 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.h +++ b/editor/plugins/animation_blend_tree_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef ANIMATION_BLEND_TREE_EDITOR_PLUGIN_H #define ANIMATION_BLEND_TREE_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/plugins/animation_tree_editor_plugin.h" #include "editor/property_editor.h" @@ -42,6 +41,7 @@ #include "scene/gui/tree.h" class ProgressBar; +class EditorFileDialog; class AnimationNodeBlendTreeEditor : public AnimationTreeNodeEditorPlugin { GDCLASS(AnimationNodeBlendTreeEditor, AnimationTreeNodeEditorPlugin); @@ -119,6 +119,9 @@ class AnimationNodeBlendTreeEditor : public AnimationTreeNodeEditorPlugin { void _property_changed(const StringName &p_property, const Variant &p_value, const String &p_field, bool p_changing); void _removed_from_graph(); + void _update_editor_settings(); + void _update_theme(); + EditorFileDialog *open_file; Ref<AnimationNode> file_loaded; void _file_opened(const String &p_file); diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 83c2b53241..ad126d28f6 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -35,11 +35,13 @@ #include "core/io/resource_loader.h" #include "core/io/resource_saver.h" #include "core/os/keyboard.h" -#include "editor/animation_track_editor.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" #include "editor/plugins/canvas_item_editor_plugin.h" // For onion skinning. #include "editor/plugins/node_3d_editor_plugin.h" // For onion skinning. +#include "editor/scene_tree_dock.h" #include "scene/main/window.h" #include "scene/resources/animation.h" #include "scene/scene_string_names.h" @@ -92,6 +94,7 @@ void AnimationPlayerEditor::_notification(int p_what) { last_active = player->is_playing(); updating = false; } break; + case NOTIFICATION_ENTER_TREE: { tool_anim->get_popup()->connect("id_pressed", callable_mp(this, &AnimationPlayerEditor::_animation_tool_menu)); @@ -101,11 +104,13 @@ void AnimationPlayerEditor::_notification(int p_what) { get_tree()->connect("node_removed", callable_mp(this, &AnimationPlayerEditor::_node_removed)); - add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); + add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); } break; + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); + add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); } break; + case NOTIFICATION_TRANSLATION_CHANGED: case NOTIFICATION_LAYOUT_DIRECTION_CHANGED: case NOTIFICATION_THEME_CHANGED: { @@ -305,7 +310,7 @@ void AnimationPlayerEditor::_animation_selected(int p_which) { } void AnimationPlayerEditor::_animation_new() { - renaming = false; + name_dialog_op = TOOL_NEW_ANIM; name_title->set_text(TTR("New Animation Name:")); int count = 1; @@ -338,7 +343,7 @@ void AnimationPlayerEditor::_animation_rename() { name_title->set_text(TTR("Change Animation Name:")); name->set_text(selected_name); - renaming = true; + name_dialog_op = TOOL_RENAME_ANIM; name_dialog->popup_centered(Size2(300, 90)); name->select_all(); name->grab_focus(); @@ -373,7 +378,7 @@ void AnimationPlayerEditor::_animation_save_in_path(const Ref<Resource> &p_resou } ((Resource *)p_resource.ptr())->set_path(path); - editor->emit_signal(SNAME("resource_saved"), p_resource); + EditorNode::get_singleton()->emit_signal(SNAME("resource_saved"), p_resource); } void AnimationPlayerEditor::_animation_save(const Ref<Resource> &p_resource) { @@ -485,13 +490,13 @@ void AnimationPlayerEditor::_animation_name_edited() { player->stop(); String new_name = name->get_text(); - if (new_name.is_empty() || new_name.find(":") != -1 || new_name.find("/") != -1) { + if (new_name.is_empty() || new_name.contains(":") || new_name.contains("/")) { error_dialog->set_text(TTR("Invalid animation name!")); error_dialog->popup_centered(); return; } - if (renaming && animation->get_item_count() > 0 && animation->get_item_text(animation->get_selected()) == new_name) { + if (name_dialog_op == TOOL_RENAME_ANIM && animation->get_item_count() > 0 && animation->get_item_text(animation->get_selected()) == new_name) { name_dialog->hide(); return; } @@ -502,37 +507,57 @@ void AnimationPlayerEditor::_animation_name_edited() { return; } - if (renaming) { - String current = animation->get_item_text(animation->get_selected()); - Ref<Animation> anim = player->get_animation(current); + switch (name_dialog_op) { + case TOOL_RENAME_ANIM: { + String current = animation->get_item_text(animation->get_selected()); + Ref<Animation> anim = player->get_animation(current); + + undo_redo->create_action(TTR("Rename Animation")); + undo_redo->add_do_method(player, "rename_animation", current, new_name); + undo_redo->add_do_method(anim.ptr(), "set_name", new_name); + undo_redo->add_undo_method(player, "rename_animation", new_name, current); + undo_redo->add_undo_method(anim.ptr(), "set_name", current); + undo_redo->add_do_method(this, "_animation_player_changed", player); + undo_redo->add_undo_method(this, "_animation_player_changed", player); + undo_redo->commit_action(); + + _select_anim_by_name(new_name); + } break; - undo_redo->create_action(TTR("Rename Animation")); - undo_redo->add_do_method(player, "rename_animation", current, new_name); - undo_redo->add_do_method(anim.ptr(), "set_name", new_name); - undo_redo->add_undo_method(player, "rename_animation", new_name, current); - undo_redo->add_undo_method(anim.ptr(), "set_name", current); - undo_redo->add_do_method(this, "_animation_player_changed", player); - undo_redo->add_undo_method(this, "_animation_player_changed", player); - undo_redo->commit_action(); + case TOOL_NEW_ANIM: { + Ref<Animation> new_anim = Ref<Animation>(memnew(Animation)); + new_anim->set_name(new_name); + + undo_redo->create_action(TTR("Add Animation")); + undo_redo->add_do_method(player, "add_animation", new_name, new_anim); + undo_redo->add_undo_method(player, "remove_animation", new_name); + undo_redo->add_do_method(this, "_animation_player_changed", player); + undo_redo->add_undo_method(this, "_animation_player_changed", player); + if (animation->get_item_count() == 0) { + undo_redo->add_do_method(this, "_start_onion_skinning"); + undo_redo->add_undo_method(this, "_stop_onion_skinning"); + } + undo_redo->commit_action(); - _select_anim_by_name(new_name); + _select_anim_by_name(new_name); + } break; - } else { - Ref<Animation> new_anim = Ref<Animation>(memnew(Animation)); - new_anim->set_name(new_name); + case TOOL_DUPLICATE_ANIM: { + String current = animation->get_item_text(animation->get_selected()); + Ref<Animation> anim = player->get_animation(current); - undo_redo->create_action(TTR("Add Animation")); - undo_redo->add_do_method(player, "add_animation", new_name, new_anim); - undo_redo->add_undo_method(player, "remove_animation", new_name); - undo_redo->add_do_method(this, "_animation_player_changed", player); - undo_redo->add_undo_method(this, "_animation_player_changed", player); - if (animation->get_item_count() == 0) { - undo_redo->add_do_method(this, "_start_onion_skinning"); - undo_redo->add_undo_method(this, "_stop_onion_skinning"); - } - undo_redo->commit_action(); + Ref<Animation> new_anim = _animation_clone(anim); + + undo_redo->create_action(TTR("Duplicate Animation")); + undo_redo->add_do_method(player, "add_animation", new_name, new_anim); + undo_redo->add_undo_method(player, "remove_animation", new_name); + undo_redo->add_do_method(player, "animation_set_next", new_name, player->animation_get_next(current)); + undo_redo->add_do_method(this, "_animation_player_changed", player); + undo_redo->add_undo_method(this, "_animation_player_changed", player); + undo_redo->commit_action(); - _select_anim_by_name(new_name); + _select_anim_by_name(new_name); + } break; } name_dialog->hide(); @@ -674,7 +699,7 @@ void AnimationPlayerEditor::set_state(const Dictionary &p_state) { if (Object::cast_to<AnimationPlayer>(n) && EditorNode::get_singleton()->get_editor_selection()->is_selected(n)) { player = Object::cast_to<AnimationPlayer>(n); _update_player(); - editor->make_bottom_panel_item_visible(this); + EditorNode::get_singleton()->make_bottom_panel_item_visible(this); set_process(true); ensure_visibility(); @@ -697,7 +722,7 @@ void AnimationPlayerEditor::_animation_resource_edit() { if (animation->get_item_count()) { String current = animation->get_item_text(animation->get_selected()); Ref<Animation> anim = player->get_animation(current); - editor->edit_resource(anim); + EditorNode::get_singleton()->edit_resource(anim); } } @@ -746,7 +771,7 @@ void AnimationPlayerEditor::_load_animations(Vector<String> p_files) { file = file.substr(file.rfind("\\") + 1, file.length()); } - if (file.find(".") != -1) { + if (file.contains(".")) { file = file.substr(0, file.find(".")); } @@ -965,28 +990,17 @@ void AnimationPlayerEditor::_animation_duplicate() { return; } - Ref<Animation> new_anim = _animation_clone(anim); String new_name = current; while (player->has_animation(new_name)) { new_name = new_name + " (copy)"; } - new_anim->set_name(new_name); - undo_redo->create_action(TTR("Duplicate Animation")); - undo_redo->add_do_method(player, "add_animation", new_name, new_anim); - undo_redo->add_undo_method(player, "remove_animation", new_name); - undo_redo->add_do_method(player, "animation_set_next", new_name, player->animation_get_next(current)); - undo_redo->add_do_method(this, "_animation_player_changed", player); - undo_redo->add_undo_method(this, "_animation_player_changed", player); - undo_redo->commit_action(); - - for (int i = 0; i < animation->get_item_count(); i++) { - if (animation->get_item_text(i) == new_name) { - animation->select(i); - _animation_selected(i); - return; - } - } + name_title->set_text(TTR("New Animation Name:")); + name->set_text(new_name); + name_dialog_op = TOOL_DUPLICATE_ANIM; + name_dialog->popup_centered(Size2(300, 90)); + name->select_all(); + name->grab_focus(); } Ref<Animation> AnimationPlayerEditor::_animation_clone(Ref<Animation> p_anim) { @@ -1136,9 +1150,7 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) { } break; case TOOL_DUPLICATE_ANIM: { _animation_duplicate(); - - [[fallthrough]]; // Allow immediate rename after animation is duplicated - } + } break; case TOOL_RENAME_ANIM: { _animation_rename(); } break; @@ -1188,7 +1200,7 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) { String current2 = animation->get_item_text(animation->get_selected()); Ref<Animation> anim2 = player->get_animation(current2); - editor->edit_resource(anim2); + EditorNode::get_singleton()->edit_resource(anim2); } break; } } @@ -1532,8 +1544,7 @@ AnimationPlayer *AnimationPlayerEditor::get_player() const { return player; } -AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlayerEditorPlugin *p_plugin) { - editor = p_editor; +AnimationPlayerEditor::AnimationPlayerEditor(AnimationPlayerEditorPlugin *p_plugin) { plugin = p_plugin; singleton = this; @@ -1607,7 +1618,7 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay tool_anim->get_popup()->add_shortcut(ED_SHORTCUT("animation_player_editor/paste_animation", TTR("Paste")), TOOL_PASTE_ANIM); tool_anim->get_popup()->add_shortcut(ED_SHORTCUT("animation_player_editor/paste_animation_as_reference", TTR("Paste As Reference")), TOOL_PASTE_ANIM_REF); tool_anim->get_popup()->add_separator(); - tool_anim->get_popup()->add_shortcut(ED_SHORTCUT("animation_player_editor/duplicate_animation", TTR("Duplicate")), TOOL_DUPLICATE_ANIM); + tool_anim->get_popup()->add_shortcut(ED_SHORTCUT("animation_player_editor/duplicate_animation", TTR("Duplicate...")), TOOL_DUPLICATE_ANIM); tool_anim->get_popup()->add_separator(); tool_anim->get_popup()->add_shortcut(ED_SHORTCUT("animation_player_editor/rename_animation", TTR("Rename...")), TOOL_RENAME_ANIM); tool_anim->get_popup()->add_shortcut(ED_SHORTCUT("animation_player_editor/edit_transitions", TTR("Edit Transitions...")), TOOL_EDIT_TRANSITIONS); @@ -1723,7 +1734,6 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay frame->connect("value_changed", callable_mp(this, &AnimationPlayerEditor::_seek_value_changed), make_binds(true, false)); scale->connect("text_submitted", callable_mp(this, &AnimationPlayerEditor::_scale_changed)); - renaming = false; last_active = false; timeline_position = 0; @@ -1840,17 +1850,16 @@ bool AnimationPlayerEditorPlugin::handles(Object *p_object) const { void AnimationPlayerEditorPlugin::make_visible(bool p_visible) { if (p_visible) { - editor->make_bottom_panel_item_visible(anim_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(anim_editor); anim_editor->set_process(true); anim_editor->ensure_visibility(); } } -AnimationPlayerEditorPlugin::AnimationPlayerEditorPlugin(EditorNode *p_node) { - editor = p_node; - anim_editor = memnew(AnimationPlayerEditor(editor, this)); +AnimationPlayerEditorPlugin::AnimationPlayerEditorPlugin() { + anim_editor = memnew(AnimationPlayerEditor(this)); anim_editor->set_undo_redo(EditorNode::get_undo_redo()); - editor->add_bottom_panel_item(TTR("Animation"), anim_editor); + EditorNode::get_singleton()->add_bottom_panel_item(TTR("Animation"), anim_editor); } AnimationPlayerEditorPlugin::~AnimationPlayerEditorPlugin() { diff --git a/editor/plugins/animation_player_editor_plugin.h b/editor/plugins/animation_player_editor_plugin.h index 06dca11aff..446c4d2f0e 100644 --- a/editor/plugins/animation_player_editor_plugin.h +++ b/editor/plugins/animation_player_editor_plugin.h @@ -31,21 +31,21 @@ #ifndef ANIMATION_PLAYER_EDITOR_PLUGIN_H #define ANIMATION_PLAYER_EDITOR_PLUGIN_H -#include "editor/editor_node.h" +#include "editor/animation_track_editor.h" #include "editor/editor_plugin.h" #include "scene/animation/animation_player.h" #include "scene/gui/dialogs.h" #include "scene/gui/slider.h" #include "scene/gui/spin_box.h" #include "scene/gui/texture_button.h" +#include "scene/gui/tree.h" -class AnimationTrackEditor; +class EditorFileDialog; class AnimationPlayerEditorPlugin; class AnimationPlayerEditor : public VBoxContainer { GDCLASS(AnimationPlayerEditor, VBoxContainer); - EditorNode *editor; AnimationPlayerEditorPlugin *plugin; AnimationPlayer *player; @@ -123,7 +123,7 @@ class AnimationPlayerEditor : public VBoxContainer { ConfirmationDialog *name_dialog; ConfirmationDialog *error_dialog; - bool renaming; + int name_dialog_op = TOOL_NEW_ANIM; bool updating; bool updating_blends; @@ -243,14 +243,13 @@ public: void edit(AnimationPlayer *p_player); void forward_force_draw_over_viewport(Control *p_overlay); - AnimationPlayerEditor(EditorNode *p_editor, AnimationPlayerEditorPlugin *p_plugin); + AnimationPlayerEditor(AnimationPlayerEditorPlugin *p_plugin); }; class AnimationPlayerEditorPlugin : public EditorPlugin { GDCLASS(AnimationPlayerEditorPlugin, EditorPlugin); AnimationPlayerEditor *anim_editor; - EditorNode *editor; protected: void _notification(int p_what); @@ -272,7 +271,7 @@ public: virtual void forward_canvas_force_draw_over_viewport(Control *p_overlay) override { anim_editor->forward_force_draw_over_viewport(p_overlay); } virtual void forward_spatial_force_draw_over_viewport(Control *p_overlay) override { anim_editor->forward_force_draw_over_viewport(p_overlay); } - AnimationPlayerEditorPlugin(EditorNode *p_node); + AnimationPlayerEditorPlugin(); ~AnimationPlayerEditorPlugin(); }; diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp index 94990636da..6c284f2268 100644 --- a/editor/plugins/animation_state_machine_editor.cpp +++ b/editor/plugins/animation_state_machine_editor.cpp @@ -35,6 +35,8 @@ #include "core/io/resource_loader.h" #include "core/math/geometry_2d.h" #include "core/os/keyboard.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "scene/animation/animation_blend_tree.h" #include "scene/animation/animation_player.h" @@ -755,7 +757,7 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() { //now scroll it to draw state_machine_draw->draw_style_box(sb, nr.node); - if (playing && (blend_from == name || current == name || travel_path.find(name) != -1)) { + if (playing && (blend_from == name || current == name || travel_path.has(name))) { state_machine_draw->draw_style_box(playing_overlay, nr.node); } @@ -882,169 +884,174 @@ void AnimationNodeStateMachineEditor::_update_graph() { } void AnimationNodeStateMachineEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED || p_what == NOTIFICATION_LAYOUT_DIRECTION_CHANGED || p_what == NOTIFICATION_TRANSLATION_CHANGED) { - error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); - panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - - tool_select->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); - tool_create->set_icon(get_theme_icon(SNAME("ToolAddNode"), SNAME("EditorIcons"))); - tool_connect->set_icon(get_theme_icon(SNAME("ToolConnect"), SNAME("EditorIcons"))); - - transition_mode->clear(); - transition_mode->add_icon_item(get_theme_icon(SNAME("TransitionImmediate"), SNAME("EditorIcons")), TTR("Immediate")); - transition_mode->add_icon_item(get_theme_icon(SNAME("TransitionSync"), SNAME("EditorIcons")), TTR("Sync")); - transition_mode->add_icon_item(get_theme_icon(SNAME("TransitionEnd"), SNAME("EditorIcons")), TTR("At End")); - - tool_erase->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); - tool_autoplay->set_icon(get_theme_icon(SNAME("AutoPlay"), SNAME("EditorIcons"))); - tool_end->set_icon(get_theme_icon(SNAME("AutoEnd"), SNAME("EditorIcons"))); - - play_mode->clear(); - play_mode->add_icon_item(get_theme_icon(SNAME("PlayTravel"), SNAME("EditorIcons")), TTR("Travel")); - play_mode->add_icon_item(get_theme_icon(SNAME("Play"), SNAME("EditorIcons")), TTR("Immediate")); - } - - if (p_what == NOTIFICATION_PROCESS) { - String error; - - Ref<AnimationNodeStateMachinePlayback> playback = AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); - - if (error_time > 0) { - error = error_text; - error_time -= get_process_delta_time(); - } else if (!AnimationTreeEditor::get_singleton()->get_tree()->is_active()) { - error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); - } else if (AnimationTreeEditor::get_singleton()->get_tree()->is_state_invalid()) { - error = AnimationTreeEditor::get_singleton()->get_tree()->get_invalid_state_reason(); - /*} else if (state_machine->get_parent().is_valid() && state_machine->get_parent()->is_class("AnimationNodeStateMachine")) { - if (state_machine->get_start_node() == StringName() || state_machine->get_end_node() == StringName()) { - error = TTR("Start and end nodes are needed for a sub-transition."); - }*/ - } else if (playback.is_null()) { - error = vformat(TTR("No playback resource set at path: %s."), AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); - } - - if (error != error_label->get_text()) { - error_label->set_text(error); - if (!error.is_empty()) { - error_panel->show(); - } else { - error_panel->hide(); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_LAYOUT_DIRECTION_CHANGED: + case NOTIFICATION_TRANSLATION_CHANGED: { + error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + + tool_select->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); + tool_create->set_icon(get_theme_icon(SNAME("ToolAddNode"), SNAME("EditorIcons"))); + tool_connect->set_icon(get_theme_icon(SNAME("ToolConnect"), SNAME("EditorIcons"))); + + transition_mode->clear(); + transition_mode->add_icon_item(get_theme_icon(SNAME("TransitionImmediate"), SNAME("EditorIcons")), TTR("Immediate")); + transition_mode->add_icon_item(get_theme_icon(SNAME("TransitionSync"), SNAME("EditorIcons")), TTR("Sync")); + transition_mode->add_icon_item(get_theme_icon(SNAME("TransitionEnd"), SNAME("EditorIcons")), TTR("At End")); + + tool_erase->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); + tool_autoplay->set_icon(get_theme_icon(SNAME("AutoPlay"), SNAME("EditorIcons"))); + tool_end->set_icon(get_theme_icon(SNAME("AutoEnd"), SNAME("EditorIcons"))); + + play_mode->clear(); + play_mode->add_icon_item(get_theme_icon(SNAME("PlayTravel"), SNAME("EditorIcons")), TTR("Travel")); + play_mode->add_icon_item(get_theme_icon(SNAME("Play"), SNAME("EditorIcons")), TTR("Immediate")); + } break; + + case NOTIFICATION_PROCESS: { + String error; + + Ref<AnimationNodeStateMachinePlayback> playback = AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); + + if (error_time > 0) { + error = error_text; + error_time -= get_process_delta_time(); + } else if (!AnimationTreeEditor::get_singleton()->get_tree()->is_active()) { + error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); + } else if (AnimationTreeEditor::get_singleton()->get_tree()->is_state_invalid()) { + error = AnimationTreeEditor::get_singleton()->get_tree()->get_invalid_state_reason(); + /*} else if (state_machine->get_parent().is_valid() && state_machine->get_parent()->is_class("AnimationNodeStateMachine")) { + if (state_machine->get_start_node() == StringName() || state_machine->get_end_node() == StringName()) { + error = TTR("Start and end nodes are needed for a sub-transition."); + }*/ + } else if (playback.is_null()) { + error = vformat(TTR("No playback resource set at path: %s."), AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); } - } - for (int i = 0; i < transition_lines.size(); i++) { - int tidx = -1; - for (int j = 0; j < state_machine->get_transition_count(); j++) { - if (transition_lines[i].from_node == state_machine->get_transition_from(j) && transition_lines[i].to_node == state_machine->get_transition_to(j)) { - tidx = j; - break; + if (error != error_label->get_text()) { + error_label->set_text(error); + if (!error.is_empty()) { + error_panel->show(); + } else { + error_panel->hide(); } } - if (tidx == -1) { //missing transition, should redraw - state_machine_draw->update(); - break; - } + for (int i = 0; i < transition_lines.size(); i++) { + int tidx = -1; + for (int j = 0; j < state_machine->get_transition_count(); j++) { + if (transition_lines[i].from_node == state_machine->get_transition_from(j) && transition_lines[i].to_node == state_machine->get_transition_to(j)) { + tidx = j; + break; + } + } - if (transition_lines[i].disabled != state_machine->get_transition(tidx)->is_disabled()) { - state_machine_draw->update(); - break; - } + if (tidx == -1) { //missing transition, should redraw + state_machine_draw->update(); + break; + } - if (transition_lines[i].auto_advance != state_machine->get_transition(tidx)->has_auto_advance()) { - state_machine_draw->update(); - break; - } + if (transition_lines[i].disabled != state_machine->get_transition(tidx)->is_disabled()) { + state_machine_draw->update(); + break; + } - if (transition_lines[i].advance_condition_name != state_machine->get_transition(tidx)->get_advance_condition_name()) { - state_machine_draw->update(); - break; - } + if (transition_lines[i].auto_advance != state_machine->get_transition(tidx)->has_auto_advance()) { + state_machine_draw->update(); + break; + } - if (transition_lines[i].mode != state_machine->get_transition(tidx)->get_switch_mode()) { - state_machine_draw->update(); - break; - } + if (transition_lines[i].advance_condition_name != state_machine->get_transition(tidx)->get_advance_condition_name()) { + state_machine_draw->update(); + break; + } - bool acstate = transition_lines[i].advance_condition_name != StringName() && bool(AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + String(transition_lines[i].advance_condition_name))); + if (transition_lines[i].mode != state_machine->get_transition(tidx)->get_switch_mode()) { + state_machine_draw->update(); + break; + } - if (transition_lines[i].advance_condition_state != acstate) { - state_machine_draw->update(); - break; + bool acstate = transition_lines[i].advance_condition_name != StringName() && bool(AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + String(transition_lines[i].advance_condition_name))); + + if (transition_lines[i].advance_condition_state != acstate) { + state_machine_draw->update(); + break; + } } - } - bool same_travel_path = true; - Vector<StringName> tp; - bool is_playing = false; - StringName current_node; - StringName blend_from_node; - play_pos = 0; - current_length = 0; - - if (playback.is_valid()) { - tp = playback->get_travel_path(); - is_playing = playback->is_playing(); - current_node = playback->get_current_node(); - blend_from_node = playback->get_blend_from_node(); - play_pos = playback->get_current_play_pos(); - current_length = playback->get_current_length(); - } + bool same_travel_path = true; + Vector<StringName> tp; + bool is_playing = false; + StringName current_node; + StringName blend_from_node; + play_pos = 0; + current_length = 0; + + if (playback.is_valid()) { + tp = playback->get_travel_path(); + is_playing = playback->is_playing(); + current_node = playback->get_current_node(); + blend_from_node = playback->get_blend_from_node(); + play_pos = playback->get_current_play_pos(); + current_length = playback->get_current_length(); + } - { - if (last_travel_path.size() != tp.size()) { - same_travel_path = false; - } else { - for (int i = 0; i < last_travel_path.size(); i++) { - if (last_travel_path[i] != tp[i]) { - same_travel_path = false; - break; + { + if (last_travel_path.size() != tp.size()) { + same_travel_path = false; + } else { + for (int i = 0; i < last_travel_path.size(); i++) { + if (last_travel_path[i] != tp[i]) { + same_travel_path = false; + break; + } } } } - } - //update if travel state changed - if (!same_travel_path || last_active != is_playing || last_current_node != current_node || last_blend_from_node != blend_from_node) { - state_machine_draw->update(); - last_travel_path = tp; - last_current_node = current_node; - last_active = is_playing; - last_blend_from_node = blend_from_node; - state_machine_play_pos->update(); - } + //update if travel state changed + if (!same_travel_path || last_active != is_playing || last_current_node != current_node || last_blend_from_node != blend_from_node) { + state_machine_draw->update(); + last_travel_path = tp; + last_current_node = current_node; + last_active = is_playing; + last_blend_from_node = blend_from_node; + state_machine_play_pos->update(); + } - { - if (current_node != StringName() && state_machine->has_node(current_node)) { - String next = current_node; - Ref<AnimationNodeStateMachine> anodesm = state_machine->get_node(next); - Ref<AnimationNodeStateMachinePlayback> current_node_playback; - - while (anodesm.is_valid()) { - current_node_playback = AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + next + "/playback"); - next += "/" + current_node_playback->get_current_node(); - anodesm = anodesm->get_node(current_node_playback->get_current_node()); - } + { + if (current_node != StringName() && state_machine->has_node(current_node)) { + String next = current_node; + Ref<AnimationNodeStateMachine> anodesm = state_machine->get_node(next); + Ref<AnimationNodeStateMachinePlayback> current_node_playback; - // when current_node is a state machine, use playback of current_node to set play_pos - if (current_node_playback.is_valid()) { - play_pos = current_node_playback->get_current_play_pos(); - current_length = current_node_playback->get_current_length(); + while (anodesm.is_valid()) { + current_node_playback = AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + next + "/playback"); + next += "/" + current_node_playback->get_current_node(); + anodesm = anodesm->get_node(current_node_playback->get_current_node()); + } + + // when current_node is a state machine, use playback of current_node to set play_pos + if (current_node_playback.is_valid()) { + play_pos = current_node_playback->get_current_play_pos(); + current_length = current_node_playback->get_current_length(); + } } } - } - if (last_play_pos != play_pos) { - last_play_pos = play_pos; - state_machine_play_pos->update(); - } - } + if (last_play_pos != play_pos) { + last_play_pos = play_pos; + state_machine_play_pos->update(); + } + } break; - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - over_node = StringName(); - set_process(is_visible_in_tree()); + case NOTIFICATION_VISIBILITY_CHANGED: { + over_node = StringName(); + set_process(is_visible_in_tree()); + } break; } } @@ -1059,7 +1066,7 @@ void AnimationNodeStateMachineEditor::_removed_from_graph() { void AnimationNodeStateMachineEditor::_name_edited(const String &p_text) { const String &new_name = p_text; - ERR_FAIL_COND(new_name.is_empty() || new_name.find(".") != -1 || new_name.find("/") != -1); + ERR_FAIL_COND(new_name.is_empty() || new_name.contains(".") || new_name.contains("/")); if (new_name == prev_name) { return; // Nothing to do. diff --git a/editor/plugins/animation_state_machine_editor.h b/editor/plugins/animation_state_machine_editor.h index 8970e3e062..208bd27f8e 100644 --- a/editor/plugins/animation_state_machine_editor.h +++ b/editor/plugins/animation_state_machine_editor.h @@ -31,7 +31,6 @@ #ifndef ANIMATION_STATE_MACHINE_EDITOR_H #define ANIMATION_STATE_MACHINE_EDITOR_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/plugins/animation_tree_editor_plugin.h" #include "editor/property_editor.h" @@ -41,6 +40,8 @@ #include "scene/gui/popup.h" #include "scene/gui/tree.h" +class EditorFileDialog; + class AnimationNodeStateMachineEditor : public AnimationTreeNodeEditorPlugin { GDCLASS(AnimationNodeStateMachineEditor, AnimationTreeNodeEditorPlugin); diff --git a/editor/plugins/animation_tree_editor_plugin.cpp b/editor/plugins/animation_tree_editor_plugin.cpp index adfea236d3..7ea6906d72 100644 --- a/editor/plugins/animation_tree_editor_plugin.cpp +++ b/editor/plugins/animation_tree_editor_plugin.cpp @@ -39,6 +39,8 @@ #include "core/io/resource_loader.h" #include "core/math/delaunay_2d.h" #include "core/os/keyboard.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "scene/animation/animation_blend_tree.h" #include "scene/animation/animation_player.h" @@ -143,19 +145,21 @@ void AnimationTreeEditor::enter_editor(const String &p_path) { } void AnimationTreeEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_PROCESS) { - ObjectID root; - if (tree && tree->get_tree_root().is_valid()) { - root = tree->get_tree_root()->get_instance_id(); - } + switch (p_what) { + case NOTIFICATION_PROCESS: { + ObjectID root; + if (tree && tree->get_tree_root().is_valid()) { + root = tree->get_tree_root()->get_instance_id(); + } - if (root != current_root) { - edit_path(Vector<String>()); - } + if (root != current_root) { + edit_path(Vector<String>()); + } - if (button_path.size() != edited_path.size()) { - edit_path(edited_path); - } + if (button_path.size() != edited_path.size()) { + edit_path(edited_path); + } + } break; } } @@ -257,23 +261,22 @@ void AnimationTreeEditorPlugin::make_visible(bool p_visible) { //editor->hide_animation_player_editors(); //editor->animation_panel_make_visible(true); button->show(); - editor->make_bottom_panel_item_visible(anim_tree_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(anim_tree_editor); anim_tree_editor->set_process(true); } else { if (anim_tree_editor->is_visible_in_tree()) { - editor->hide_bottom_panel(); + EditorNode::get_singleton()->hide_bottom_panel(); } button->hide(); anim_tree_editor->set_process(false); } } -AnimationTreeEditorPlugin::AnimationTreeEditorPlugin(EditorNode *p_node) { - editor = p_node; +AnimationTreeEditorPlugin::AnimationTreeEditorPlugin() { anim_tree_editor = memnew(AnimationTreeEditor); anim_tree_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE); - button = editor->add_bottom_panel_item(TTR("AnimationTree"), anim_tree_editor); + button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("AnimationTree"), anim_tree_editor); button->hide(); } diff --git a/editor/plugins/animation_tree_editor_plugin.h b/editor/plugins/animation_tree_editor_plugin.h index 14c5658478..5442584a40 100644 --- a/editor/plugins/animation_tree_editor_plugin.h +++ b/editor/plugins/animation_tree_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef ANIMATION_TREE_EDITOR_PLUGIN_H #define ANIMATION_TREE_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/property_editor.h" #include "scene/animation/animation_tree.h" @@ -40,6 +39,8 @@ #include "scene/gui/popup.h" #include "scene/gui/tree.h" +class EditorFileDialog; + class AnimationTreeNodeEditorPlugin : public VBoxContainer { GDCLASS(AnimationTreeNodeEditorPlugin, VBoxContainer); @@ -96,7 +97,6 @@ class AnimationTreeEditorPlugin : public EditorPlugin { GDCLASS(AnimationTreeEditorPlugin, EditorPlugin); AnimationTreeEditor *anim_tree_editor; - EditorNode *editor; Button *button; public: @@ -106,7 +106,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - AnimationTreeEditorPlugin(EditorNode *p_node); + AnimationTreeEditorPlugin(); ~AnimationTreeEditorPlugin(); }; diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index 7199f69f0b..9e9915cfa4 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -34,7 +34,9 @@ #include "core/io/json.h" #include "core/os/keyboard.h" #include "core/version.h" +#include "editor/editor_file_dialog.h" #include "editor/editor_node.h" +#include "editor/editor_paths.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" #include "editor/project_settings_editor.h" @@ -66,11 +68,13 @@ void EditorAssetLibraryItem::set_image(int p_type, int p_index, const Ref<Textur } void EditorAssetLibraryItem::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - icon->set_normal_texture(get_theme_icon(SNAME("ProjectIconLoading"), SNAME("EditorIcons"))); - category->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5)); - author->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5)); - price->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5)); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + icon->set_normal_texture(get_theme_icon(SNAME("ProjectIconLoading"), SNAME("EditorIcons"))); + category->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5)); + author->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5)); + price->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5)); + } break; } } @@ -404,6 +408,7 @@ void EditorAssetLibraryItemDownload::_notification(int p_what) { status->add_theme_color_override("font_color", get_theme_color(SNAME("status_color"), SNAME("AssetLib"))); dismiss_button->set_normal_texture(get_theme_icon(SNAME("dismiss"), SNAME("AssetLib"))); } break; + case NOTIFICATION_PROCESS: { // Make the progress bar visible again when retrying the download. progress->set_modulate(Color(1, 1, 1, 1)); @@ -574,6 +579,7 @@ void EditorAssetLibrary::_notification(int p_what) { case NOTIFICATION_READY: { error_label->raise(); } break; + case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { error_tr->set_texture(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); @@ -582,6 +588,7 @@ void EditorAssetLibrary::_notification(int p_what) { downloads_scroll->add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); error_label->add_theme_color_override("color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); } break; + case NOTIFICATION_VISIBILITY_CHANGED: { if (is_visible()) { // Focus the search box automatically when switching to the Templates tab (in the Project Manager) @@ -594,6 +601,7 @@ void EditorAssetLibrary::_notification(int p_what) { } } } break; + case NOTIFICATION_PROCESS: { HTTPClient::Status s = request->get_http_client_status(); const bool loading = s != HTTPClient::STATUS_DISCONNECTED; @@ -610,6 +618,7 @@ void EditorAssetLibrary::_notification(int p_what) { } } break; + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { _update_repository_options(); setup_http_request(request); @@ -1561,11 +1570,10 @@ void AssetLibraryEditorPlugin::make_visible(bool p_visible) { } } -AssetLibraryEditorPlugin::AssetLibraryEditorPlugin(EditorNode *p_node) { - editor = p_node; +AssetLibraryEditorPlugin::AssetLibraryEditorPlugin() { addon_library = memnew(EditorAssetLibrary); addon_library->set_v_size_flags(Control::SIZE_EXPAND_FILL); - editor->get_main_control()->add_child(addon_library); + EditorNode::get_singleton()->get_main_control()->add_child(addon_library); addon_library->set_anchors_and_offsets_preset(Control::PRESET_WIDE); addon_library->hide(); } diff --git a/editor/plugins/asset_library_editor_plugin.h b/editor/plugins/asset_library_editor_plugin.h index 29d26411f3..493ffc4033 100644 --- a/editor/plugins/asset_library_editor_plugin.h +++ b/editor/plugins/asset_library_editor_plugin.h @@ -316,7 +316,6 @@ class AssetLibraryEditorPlugin : public EditorPlugin { GDCLASS(AssetLibraryEditorPlugin, EditorPlugin); EditorAssetLibrary *addon_library; - EditorNode *editor; public: virtual String get_name() const override { return "AssetLib"; } @@ -328,7 +327,7 @@ public: //virtual Dictionary get_state() const; //virtual void set_state(const Dictionary& p_state); - AssetLibraryEditorPlugin(EditorNode *p_node); + AssetLibraryEditorPlugin(); ~AssetLibraryEditorPlugin(); }; diff --git a/editor/plugins/audio_stream_editor_plugin.cpp b/editor/plugins/audio_stream_editor_plugin.cpp index 086d5474ba..a60e49ca9d 100644 --- a/editor/plugins/audio_stream_editor_plugin.cpp +++ b/editor/plugins/audio_stream_editor_plugin.cpp @@ -34,33 +34,37 @@ #include "core/io/resource_loader.h" #include "core/os/keyboard.h" #include "editor/audio_stream_preview.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" void AudioStreamEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - AudioStreamPreviewGenerator::get_singleton()->connect("preview_updated", callable_mp(this, &AudioStreamEditor::_preview_changed)); - } - - if (p_what == NOTIFICATION_THEME_CHANGED || p_what == NOTIFICATION_ENTER_TREE) { - _play_button->set_icon(get_theme_icon(SNAME("MainPlay"), SNAME("EditorIcons"))); - _stop_button->set_icon(get_theme_icon(SNAME("Stop"), SNAME("EditorIcons"))); - _preview->set_color(get_theme_color(SNAME("dark_color_2"), SNAME("Editor"))); - set_color(get_theme_color(SNAME("dark_color_1"), SNAME("Editor"))); - - _indicator->update(); - _preview->update(); - } - - if (p_what == NOTIFICATION_PROCESS) { - _current = _player->get_playback_position(); - _indicator->update(); - } - - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (!is_visible_in_tree()) { - _stop(); - } + switch (p_what) { + case NOTIFICATION_READY: { + AudioStreamPreviewGenerator::get_singleton()->connect("preview_updated", callable_mp(this, &AudioStreamEditor::_preview_changed)); + } break; + + case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_ENTER_TREE: { + _play_button->set_icon(get_theme_icon(SNAME("MainPlay"), SNAME("EditorIcons"))); + _stop_button->set_icon(get_theme_icon(SNAME("Stop"), SNAME("EditorIcons"))); + _preview->set_color(get_theme_color(SNAME("dark_color_2"), SNAME("Editor"))); + set_color(get_theme_color(SNAME("dark_color_1"), SNAME("Editor"))); + + _indicator->update(); + _preview->update(); + } break; + + case NOTIFICATION_PROCESS: { + _current = _player->get_playback_position(); + _indicator->update(); + } break; + + case NOTIFICATION_VISIBILITY_CHANGED: { + if (!is_visible_in_tree()) { + _stop(); + } + } break; } } @@ -271,8 +275,7 @@ void AudioStreamEditorPlugin::make_visible(bool p_visible) { audio_editor->set_visible(p_visible); } -AudioStreamEditorPlugin::AudioStreamEditorPlugin(EditorNode *p_node) { - editor = p_node; +AudioStreamEditorPlugin::AudioStreamEditorPlugin() { audio_editor = memnew(AudioStreamEditor); add_control_to_container(CONTAINER_PROPERTY_EDITOR_BOTTOM, audio_editor); audio_editor->hide(); diff --git a/editor/plugins/audio_stream_editor_plugin.h b/editor/plugins/audio_stream_editor_plugin.h index db0e204616..2478210430 100644 --- a/editor/plugins/audio_stream_editor_plugin.h +++ b/editor/plugins/audio_stream_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef AUDIO_STREAM_EDITOR_PLUGIN_H #define AUDIO_STREAM_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/audio/audio_stream_player.h" #include "scene/gui/color_rect.h" @@ -77,7 +76,6 @@ class AudioStreamEditorPlugin : public EditorPlugin { GDCLASS(AudioStreamEditorPlugin, EditorPlugin); AudioStreamEditor *audio_editor; - EditorNode *editor; public: virtual String get_name() const override { return "Audio"; } @@ -86,7 +84,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - AudioStreamEditorPlugin(EditorNode *p_node); + AudioStreamEditorPlugin(); ~AudioStreamEditorPlugin(); }; diff --git a/editor/plugins/audio_stream_randomizer_editor_plugin.cpp b/editor/plugins/audio_stream_randomizer_editor_plugin.cpp new file mode 100644 index 0000000000..9e551ae0ed --- /dev/null +++ b/editor/plugins/audio_stream_randomizer_editor_plugin.cpp @@ -0,0 +1,121 @@ +/*************************************************************************/ +/* audio_stream_randomizer_editor_plugin.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "audio_stream_randomizer_editor_plugin.h" + +#include "editor/editor_node.h" + +void AudioStreamRandomizerEditorPlugin::edit(Object *p_object) { +} + +bool AudioStreamRandomizerEditorPlugin::handles(Object *p_object) const { + return false; +} + +void AudioStreamRandomizerEditorPlugin::make_visible(bool p_visible) { +} + +void AudioStreamRandomizerEditorPlugin::_move_stream_array_element(Object *p_undo_redo, Object *p_edited, String p_array_prefix, int p_from_index, int p_to_pos) { + UndoRedo *undo_redo = Object::cast_to<UndoRedo>(p_undo_redo); + ERR_FAIL_COND(!undo_redo); + + AudioStreamRandomizer *randomizer = Object::cast_to<AudioStreamRandomizer>(p_edited); + if (!randomizer) { + return; + } + + // Compute the array indices to save. + int begin = 0; + int end; + if (p_array_prefix == "stream_") { + end = randomizer->get_streams_count(); + } else { + ERR_FAIL_MSG("Invalid array prefix for AudioStreamRandomizer."); + } + if (p_from_index < 0) { + // Adding new. + if (p_to_pos >= 0) { + begin = p_to_pos; + } else { + end = 0; // Nothing to save when adding at the end. + } + } else if (p_to_pos < 0) { + // Removing. + begin = p_from_index; + } else { + // Moving. + begin = MIN(p_from_index, p_to_pos); + end = MIN(MAX(p_from_index, p_to_pos) + 1, end); + } + +#define ADD_UNDO(obj, property) undo_redo->add_undo_property(obj, property, obj->get(property)); + // Save layers' properties. + if (p_from_index < 0) { + undo_redo->add_undo_method(randomizer, "remove_stream", p_to_pos < 0 ? randomizer->get_streams_count() : p_to_pos); + } else if (p_to_pos < 0) { + undo_redo->add_undo_method(randomizer, "add_stream", p_from_index); + } + + List<PropertyInfo> properties; + randomizer->get_property_list(&properties); + for (PropertyInfo pi : properties) { + if (pi.name.begins_with(p_array_prefix)) { + String str = pi.name.trim_prefix(p_array_prefix); + int to_char_index = 0; + while (to_char_index < str.length()) { + if (str[to_char_index] < '0' || str[to_char_index] > '9') { + break; + } + to_char_index++; + } + if (to_char_index > 0) { + int array_index = str.left(to_char_index).to_int(); + if (array_index >= begin && array_index < end) { + ADD_UNDO(randomizer, pi.name); + } + } + } + } +#undef ADD_UNDO + + if (p_from_index < 0) { + undo_redo->add_do_method(randomizer, "add_stream", p_to_pos); + } else if (p_to_pos < 0) { + undo_redo->add_do_method(randomizer, "remove_stream", p_from_index); + } else { + undo_redo->add_do_method(randomizer, "move_stream", p_from_index, p_to_pos); + } +} + +AudioStreamRandomizerEditorPlugin::AudioStreamRandomizerEditorPlugin() { + EditorNode::get_singleton()->get_editor_data().add_move_array_element_function(SNAME("AudioStreamRandomizer"), callable_mp(this, &AudioStreamRandomizerEditorPlugin::_move_stream_array_element)); +} + +AudioStreamRandomizerEditorPlugin::~AudioStreamRandomizerEditorPlugin() {} diff --git a/editor/plugins/audio_stream_randomizer_editor_plugin.h b/editor/plugins/audio_stream_randomizer_editor_plugin.h new file mode 100644 index 0000000000..7e509dc670 --- /dev/null +++ b/editor/plugins/audio_stream_randomizer_editor_plugin.h @@ -0,0 +1,54 @@ +/*************************************************************************/ +/* audio_stream_randomizer_editor_plugin.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef AUDIO_STREAM_RANDOMIZER_EDITOR_PLUGIN_H +#define AUDIO_STREAM_RANDOMIZER_EDITOR_PLUGIN_H + +#include "editor/editor_plugin.h" +#include "servers/audio/audio_stream.h" + +class AudioStreamRandomizerEditorPlugin : public EditorPlugin { + GDCLASS(AudioStreamRandomizerEditorPlugin, EditorPlugin); + +private: + void _move_stream_array_element(Object *p_undo_redo, Object *p_edited, String p_array_prefix, int p_from_index, int p_to_pos); + +public: + virtual String get_name() const override { return "AudioStreamRandomizer"; } + bool has_main_screen() const override { return false; } + virtual void edit(Object *p_object) override; + virtual bool handles(Object *p_object) const override; + virtual void make_visible(bool p_visible) override; + + AudioStreamRandomizerEditorPlugin(); + ~AudioStreamRandomizerEditorPlugin(); +}; + +#endif // AUDIO_STREAM_RANDOMIZER_EDITOR_PLUGIN_H diff --git a/editor/plugins/camera_3d_editor_plugin.cpp b/editor/plugins/camera_3d_editor_plugin.cpp index 7c920fa15e..141837244a 100644 --- a/editor/plugins/camera_3d_editor_plugin.cpp +++ b/editor/plugins/camera_3d_editor_plugin.cpp @@ -30,6 +30,7 @@ #include "camera_3d_editor_plugin.h" +#include "editor/editor_node.h" #include "node_3d_editor_plugin.h" void Camera3DEditor::_node_removed(Node *p_node) { @@ -95,10 +96,9 @@ void Camera3DEditorPlugin::make_visible(bool p_visible) { } } -Camera3DEditorPlugin::Camera3DEditorPlugin(EditorNode *p_node) { - editor = p_node; +Camera3DEditorPlugin::Camera3DEditorPlugin() { /* camera_editor = memnew( CameraEditor ); - editor->get_main_control()->add_child(camera_editor); + EditorNode::get_singleton()->get_main_control()->add_child(camera_editor); camera_editor->set_anchor(SIDE_LEFT,Control::ANCHOR_END); camera_editor->set_anchor(SIDE_RIGHT,Control::ANCHOR_END); diff --git a/editor/plugins/camera_3d_editor_plugin.h b/editor/plugins/camera_3d_editor_plugin.h index e175a931b0..c1f71d3b1b 100644 --- a/editor/plugins/camera_3d_editor_plugin.h +++ b/editor/plugins/camera_3d_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef CAMERA_EDITOR_PLUGIN_H #define CAMERA_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/3d/camera_3d.h" @@ -57,7 +56,6 @@ class Camera3DEditorPlugin : public EditorPlugin { GDCLASS(Camera3DEditorPlugin, EditorPlugin); //CameraEditor *camera_editor; - EditorNode *editor; public: virtual String get_name() const override { return "Camera3D"; } @@ -66,7 +64,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - Camera3DEditorPlugin(EditorNode *p_node); + Camera3DEditorPlugin(); ~Camera3DEditorPlugin(); }; diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index dff01cbf05..e43d1feb08 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -39,8 +39,10 @@ #include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" +#include "editor/editor_toaster.h" #include "editor/plugins/animation_player_editor_plugin.h" #include "editor/plugins/script_editor_plugin.h" +#include "editor/scene_tree_dock.h" #include "scene/2d/cpu_particles_2d.h" #include "scene/2d/gpu_particles_2d.h" #include "scene/2d/light_2d.h" @@ -623,7 +625,7 @@ void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos, Node *p_no } void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items, bool p_allow_locked) { - Node *scene = editor->get_edited_scene(); + Node *scene = EditorNode::get_singleton()->get_edited_scene(); _find_canvas_items_at_pos(p_pos, scene, r_items); @@ -676,7 +678,7 @@ void CanvasItemEditor::_find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_n } CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node); - Node *scene = editor->get_edited_scene(); + Node *scene = EditorNode::get_singleton()->get_edited_scene(); bool editable = p_node == scene || p_node->get_owner() == scene || p_node == scene->get_deepest_editable_node(p_node); bool lock_children = p_node->has_meta("_edit_group_") && p_node->get_meta("_edit_group_"); @@ -725,7 +727,7 @@ bool CanvasItemEditor::_select_click_on_item(CanvasItem *item, Point2 p_click_po still_selected = false; if (editor_selection->get_selected_node_list().size() == 1) { - editor->push_item(editor_selection->get_selected_node_list()[0]); + EditorNode::get_singleton()->push_item(editor_selection->get_selected_node_list()[0]); } } else { // Add the item to the selection @@ -739,7 +741,7 @@ bool CanvasItemEditor::_select_click_on_item(CanvasItem *item, Point2 p_click_po // Reselect if (Engine::get_singleton()->is_editor_hint()) { selected_from_canvas = true; - editor->call("edit_node", item); + EditorNode::get_singleton()->edit_node(item); } } } @@ -747,11 +749,11 @@ bool CanvasItemEditor::_select_click_on_item(CanvasItem *item, Point2 p_click_po return still_selected; } -List<CanvasItem *> CanvasItemEditor::_get_edited_canvas_items(bool retreive_locked, bool remove_canvas_item_if_parent_in_selection) { +List<CanvasItem *> CanvasItemEditor::_get_edited_canvas_items(bool retrieve_locked, bool remove_canvas_item_if_parent_in_selection) { List<CanvasItem *> selection; for (const KeyValue<Node *, Object *> &E : editor_selection->get_selection()) { CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E.key); - if (canvas_item && canvas_item->is_visible_in_tree() && canvas_item->get_viewport() == EditorNode::get_singleton()->get_scene_root() && (retreive_locked || !_is_node_locked(canvas_item))) { + if (canvas_item && canvas_item->is_visible_in_tree() && canvas_item->get_viewport() == EditorNode::get_singleton()->get_scene_root() && (retrieve_locked || !_is_node_locked(canvas_item))) { CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item); if (se) { selection.push_back(canvas_item); @@ -1161,25 +1163,25 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo if (k.is_valid()) { if (k->is_pressed()) { if (ED_GET_SHORTCUT("canvas_item_editor/zoom_3.125_percent")->matches_event(p_event)) { - _update_zoom((1.0 / 32.0) * MAX(1, EDSCALE)); + _shortcut_zoom_set(1.0 / 32.0); } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_6.25_percent")->matches_event(p_event)) { - _update_zoom((1.0 / 16.0) * MAX(1, EDSCALE)); + _shortcut_zoom_set(1.0 / 16.0); } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_12.5_percent")->matches_event(p_event)) { - _update_zoom((1.0 / 8.0) * MAX(1, EDSCALE)); + _shortcut_zoom_set(1.0 / 8.0); } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_25_percent")->matches_event(p_event)) { - _update_zoom((1.0 / 4.0) * MAX(1, EDSCALE)); + _shortcut_zoom_set(1.0 / 4.0); } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_50_percent")->matches_event(p_event)) { - _update_zoom((1.0 / 2.0) * MAX(1, EDSCALE)); + _shortcut_zoom_set(1.0 / 2.0); } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_100_percent")->matches_event(p_event)) { - _update_zoom(1.0 * MAX(1, EDSCALE)); + _shortcut_zoom_set(1.0); } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_200_percent")->matches_event(p_event)) { - _update_zoom(2.0 * MAX(1, EDSCALE)); + _shortcut_zoom_set(2.0); } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_400_percent")->matches_event(p_event)) { - _update_zoom(4.0 * MAX(1, EDSCALE)); + _shortcut_zoom_set(4.0); } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_800_percent")->matches_event(p_event)) { - _update_zoom(8.0 * MAX(1, EDSCALE)); + _shortcut_zoom_set(8.0); } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_1600_percent")->matches_event(p_event)) { - _update_zoom(16.0 * MAX(1, EDSCALE)); + _shortcut_zoom_set(16.0); } } } @@ -1409,8 +1411,8 @@ bool CanvasItemEditor::_gui_input_open_scene_on_double_click(const Ref<InputEven List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { CanvasItem *canvas_item = selection[0]; - if (!canvas_item->get_scene_file_path().is_empty() && canvas_item != editor->get_edited_scene()) { - editor->open_request(canvas_item->get_scene_file_path()); + if (!canvas_item->get_scene_file_path().is_empty() && canvas_item != EditorNode::get_singleton()->get_edited_scene()) { + EditorNode::get_singleton()->open_request(canvas_item->get_scene_file_path()); return true; } } @@ -1831,7 +1833,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { Point2 drag_to_local = simple_xform.xform(drag_to); Point2 offset = drag_to_local - drag_from_local; - Size2 scale = canvas_item->call("get_scale"); + Size2 scale = canvas_item->_edit_get_scale(); Size2 original_scale = scale; real_t ratio = scale.y / scale.x; if (drag_type == DRAG_SCALE_BOTH) { @@ -1869,7 +1871,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { } } - canvas_item->call("set_scale", scale); + canvas_item->_edit_set_scale(scale); return true; } @@ -2190,7 +2192,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { if (_is_node_locked(item)) { locked = 1; } else { - Node *scene = editor->get_edited_scene(); + Node *scene = EditorNode::get_singleton()->get_edited_scene(); Node *node = item; while (node && node != scene->get_parent()) { @@ -2250,7 +2252,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { // Single item selection Point2 click = transform.affine_inverse().xform(b->get_position()); - Node *scene = editor->get_edited_scene(); + Node *scene = EditorNode::get_singleton()->get_edited_scene(); if (!scene) { return true; } @@ -2324,7 +2326,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() == MouseButton::LEFT) { // Confirms box selection - Node *scene = editor->get_edited_scene(); + Node *scene = EditorNode::get_singleton()->get_edited_scene(); if (scene) { List<CanvasItem *> selitems; @@ -2339,7 +2341,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { _find_canvas_items_in_rect(Rect2(bsfrom, bsto - bsfrom), scene, &selitems); if (selitems.size() == 1 && editor_selection->get_selected_node_list().is_empty()) { - editor->push_item(selitems[0]); + EditorNode::get_singleton()->push_item(selitems[0]); } for (CanvasItem *E : selitems) { editor_selection->add_node(E); @@ -2469,7 +2471,7 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) { if (EditorSettings::get_singleton()->get("editors/panning/simple_panning") || !pan_pressed || release_lmb) { if ((accepted = _gui_input_rulers_and_guides(p_event))) { // print_line("Rulers and guides"); - } else if ((accepted = editor->get_editor_plugins_over()->forward_gui_input(p_event))) { + } else if ((accepted = EditorNode::get_singleton()->get_editor_plugins_over()->forward_gui_input(p_event))) { // print_line("Plugin"); } else if ((accepted = _gui_input_open_scene_on_double_click(p_event))) { // print_line("Open scene on double click"); @@ -2507,7 +2509,7 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) { _update_cursor(); // Grab focus - if (!viewport->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field())) { + if (!viewport->has_focus() && (!get_viewport()->gui_get_focus_owner() || !get_viewport()->gui_get_focus_owner()->is_text_field())) { viewport->call_deferred(SNAME("grab_focus")); } } @@ -3503,12 +3505,12 @@ void CanvasItemEditor::_draw_axis() { void CanvasItemEditor::_draw_invisible_nodes_positions(Node *p_node, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform) { ERR_FAIL_COND(!p_node); - Node *scene = editor->get_edited_scene(); + Node *scene = EditorNode::get_singleton()->get_edited_scene(); if (p_node != scene && p_node->get_owner() != scene && !scene->is_editable_instance(p_node->get_owner())) { return; } CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node); - if (canvas_item && !canvas_item->is_visible()) { + if (canvas_item && !canvas_item->is_visible_in_tree()) { return; } @@ -3573,7 +3575,7 @@ void CanvasItemEditor::_draw_hover() { void CanvasItemEditor::_draw_locks_and_groups(Node *p_node, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform) { ERR_FAIL_COND(!p_node); - Node *scene = editor->get_edited_scene(); + Node *scene = EditorNode::get_singleton()->get_edited_scene(); if (p_node != scene && p_node->get_owner() != scene && !scene->is_editable_instance(p_node->get_owner())) { return; } @@ -3620,7 +3622,7 @@ void CanvasItemEditor::_draw_viewport() { transform = Transform2D(); transform.scale_basis(Size2(zoom, zoom)); transform.elements[2] = -view_offset * zoom; - editor->get_scene_root()->set_global_canvas_transform(transform); + EditorNode::get_singleton()->get_scene_root()->set_global_canvas_transform(transform); // hide/show buttons depending on the selection bool all_locked = true; @@ -3654,20 +3656,20 @@ void CanvasItemEditor::_draw_viewport() { _draw_grid(); _draw_ruler_tool(); _draw_axis(); - if (editor->get_edited_scene()) { - _draw_locks_and_groups(editor->get_edited_scene()); - _draw_invisible_nodes_positions(editor->get_edited_scene()); + if (EditorNode::get_singleton()->get_edited_scene()) { + _draw_locks_and_groups(EditorNode::get_singleton()->get_edited_scene()); + _draw_invisible_nodes_positions(EditorNode::get_singleton()->get_edited_scene()); } _draw_selection(); RID ci = viewport->get_canvas_item(); RenderingServer::get_singleton()->canvas_item_add_set_transform(ci, Transform2D()); - EditorPluginList *over_plugin_list = editor->get_editor_plugins_over(); + EditorPluginList *over_plugin_list = EditorNode::get_singleton()->get_editor_plugins_over(); if (!over_plugin_list->is_empty()) { over_plugin_list->forward_canvas_draw_over_viewport(viewport); } - EditorPluginList *force_over_plugin_list = editor->get_editor_plugins_force_over(); + EditorPluginList *force_over_plugin_list = EditorNode::get_singleton()->get_editor_plugins_force_over(); if (!force_over_plugin_list->is_empty()) { force_over_plugin_list->forward_canvas_force_draw_over_viewport(viewport); } @@ -3692,255 +3694,158 @@ void CanvasItemEditor::set_current_tool(Tool p_tool) { _button_tool_select(p_tool); } -void CanvasItemEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_PHYSICS_PROCESS) { - EditorNode::get_singleton()->get_scene_root()->set_snap_controls_to_pixels(GLOBAL_GET("gui/common/snap_controls_to_pixels")); +void CanvasItemEditor::_update_editor_settings() { + select_button->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); + list_select_button->set_icon(get_theme_icon(SNAME("ListSelect"), SNAME("EditorIcons"))); + move_button->set_icon(get_theme_icon(SNAME("ToolMove"), SNAME("EditorIcons"))); + scale_button->set_icon(get_theme_icon(SNAME("ToolScale"), SNAME("EditorIcons"))); + rotate_button->set_icon(get_theme_icon(SNAME("ToolRotate"), SNAME("EditorIcons"))); + smart_snap_button->set_icon(get_theme_icon(SNAME("Snap"), SNAME("EditorIcons"))); + grid_snap_button->set_icon(get_theme_icon(SNAME("SnapGrid"), SNAME("EditorIcons"))); + snap_config_menu->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); + skeleton_menu->set_icon(get_theme_icon(SNAME("Bone"), SNAME("EditorIcons"))); + override_camera_button->set_icon(get_theme_icon(SNAME("Camera2D"), SNAME("EditorIcons"))); + pan_button->set_icon(get_theme_icon(SNAME("ToolPan"), SNAME("EditorIcons"))); + ruler_button->set_icon(get_theme_icon(SNAME("Ruler"), SNAME("EditorIcons"))); + pivot_button->set_icon(get_theme_icon(SNAME("EditPivot"), SNAME("EditorIcons"))); + select_handle = get_theme_icon(SNAME("EditorHandle"), SNAME("EditorIcons")); + anchor_handle = get_theme_icon(SNAME("EditorControlAnchor"), SNAME("EditorIcons")); + lock_button->set_icon(get_theme_icon(SNAME("Lock"), SNAME("EditorIcons"))); + unlock_button->set_icon(get_theme_icon(SNAME("Unlock"), SNAME("EditorIcons"))); + group_button->set_icon(get_theme_icon(SNAME("Group"), SNAME("EditorIcons"))); + ungroup_button->set_icon(get_theme_icon(SNAME("Ungroup"), SNAME("EditorIcons"))); + key_loc_button->set_icon(get_theme_icon(SNAME("KeyPosition"), SNAME("EditorIcons"))); + key_rot_button->set_icon(get_theme_icon(SNAME("KeyRotation"), SNAME("EditorIcons"))); + key_scale_button->set_icon(get_theme_icon(SNAME("KeyScale"), SNAME("EditorIcons"))); + key_insert_button->set_icon(get_theme_icon(SNAME("Key"), SNAME("EditorIcons"))); + key_auto_insert_button->set_icon(get_theme_icon(SNAME("AutoKey"), SNAME("EditorIcons"))); + // Use a different color for the active autokey icon to make them easier + // to distinguish from the other key icons at the top. On a light theme, + // the icon will be dark, so we need to lighten it before blending it + // with the red color. + const Color key_auto_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25); + key_auto_insert_button->add_theme_color_override("icon_pressed_color", key_auto_color.lerp(Color(1, 0, 0), 0.55)); + animation_menu->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); - bool has_container_parents = false; - int nb_control = 0; - int nb_having_pivot = 0; + _update_context_menu_stylebox(); - // Update the viewport if the canvas_item changes - List<CanvasItem *> selection = _get_edited_canvas_items(true); - for (CanvasItem *canvas_item : selection) { - CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item); + panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/2d_editor_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); + pan_speed = int(EditorSettings::get_singleton()->get("editors/panning/2d_editor_pan_speed")); + warped_panning = bool(EditorSettings::get_singleton()->get("editors/panning/warped_mouse_panning")); +} - Rect2 rect; - if (canvas_item->_edit_use_rect()) { - rect = canvas_item->_edit_get_rect(); - } else { - rect = Rect2(); - } - Transform2D xform = canvas_item->get_transform(); +void CanvasItemEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_PHYSICS_PROCESS: { + EditorNode::get_singleton()->get_scene_root()->set_snap_controls_to_pixels(GLOBAL_GET("gui/common/snap_controls_to_pixels")); - if (rect != se->prev_rect || xform != se->prev_xform) { - viewport->update(); - se->prev_rect = rect; - se->prev_xform = xform; - } + int nb_having_pivot = 0; - Control *control = Object::cast_to<Control>(canvas_item); - if (control) { - real_t anchors[4]; - Vector2 pivot; - - pivot = control->get_pivot_offset(); - anchors[SIDE_LEFT] = control->get_anchor(SIDE_LEFT); - anchors[SIDE_RIGHT] = control->get_anchor(SIDE_RIGHT); - anchors[SIDE_TOP] = control->get_anchor(SIDE_TOP); - anchors[SIDE_BOTTOM] = control->get_anchor(SIDE_BOTTOM); - - if (pivot != se->prev_pivot || anchors[SIDE_LEFT] != se->prev_anchors[SIDE_LEFT] || anchors[SIDE_RIGHT] != se->prev_anchors[SIDE_RIGHT] || anchors[SIDE_TOP] != se->prev_anchors[SIDE_TOP] || anchors[SIDE_BOTTOM] != se->prev_anchors[SIDE_BOTTOM]) { - se->prev_pivot = pivot; - se->prev_anchors[SIDE_LEFT] = anchors[SIDE_LEFT]; - se->prev_anchors[SIDE_RIGHT] = anchors[SIDE_RIGHT]; - se->prev_anchors[SIDE_TOP] = anchors[SIDE_TOP]; - se->prev_anchors[SIDE_BOTTOM] = anchors[SIDE_BOTTOM]; + // Update the viewport if the canvas_item changes + List<CanvasItem *> selection = _get_edited_canvas_items(true); + for (CanvasItem *canvas_item : selection) { + CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item); + + Rect2 rect; + if (canvas_item->_edit_use_rect()) { + rect = canvas_item->_edit_get_rect(); + } else { + rect = Rect2(); + } + Transform2D xform = canvas_item->get_transform(); + + if (rect != se->prev_rect || xform != se->prev_xform) { viewport->update(); + se->prev_rect = rect; + se->prev_xform = xform; } - nb_control++; - if (Object::cast_to<Container>(control->get_parent())) { - has_container_parents = true; + Control *control = Object::cast_to<Control>(canvas_item); + if (control) { + real_t anchors[4]; + Vector2 pivot; + + pivot = control->get_pivot_offset(); + anchors[SIDE_LEFT] = control->get_anchor(SIDE_LEFT); + anchors[SIDE_RIGHT] = control->get_anchor(SIDE_RIGHT); + anchors[SIDE_TOP] = control->get_anchor(SIDE_TOP); + anchors[SIDE_BOTTOM] = control->get_anchor(SIDE_BOTTOM); + + if (pivot != se->prev_pivot || anchors[SIDE_LEFT] != se->prev_anchors[SIDE_LEFT] || anchors[SIDE_RIGHT] != se->prev_anchors[SIDE_RIGHT] || anchors[SIDE_TOP] != se->prev_anchors[SIDE_TOP] || anchors[SIDE_BOTTOM] != se->prev_anchors[SIDE_BOTTOM]) { + se->prev_pivot = pivot; + se->prev_anchors[SIDE_LEFT] = anchors[SIDE_LEFT]; + se->prev_anchors[SIDE_RIGHT] = anchors[SIDE_RIGHT]; + se->prev_anchors[SIDE_TOP] = anchors[SIDE_TOP]; + se->prev_anchors[SIDE_BOTTOM] = anchors[SIDE_BOTTOM]; + viewport->update(); + } } - } - if (canvas_item->_edit_use_pivot()) { - nb_having_pivot++; + if (canvas_item->_edit_use_pivot()) { + nb_having_pivot++; + } } - } - // Activate / Deactivate the pivot tool - pivot_button->set_disabled(nb_having_pivot == 0); + // Activate / Deactivate the pivot tool + pivot_button->set_disabled(nb_having_pivot == 0); - // Show / Hide the layout and anchors mode buttons - if (nb_control > 0 && nb_control == selection.size()) { - presets_menu->set_visible(true); - anchor_mode_button->set_visible(true); + // Update the viewport if bones changes + for (KeyValue<BoneKey, BoneList> &E : bone_list) { + Object *b = ObjectDB::get_instance(E.key.from); + if (!b) { + viewport->update(); + break; + } - // Disable if the selected node is child of a container - if (has_container_parents) { - presets_menu->set_disabled(true); - presets_menu->set_tooltip(TTR("Children of containers have their anchors and margins values overridden by their parent.")); - anchor_mode_button->set_disabled(true); - anchor_mode_button->set_tooltip(TTR("Children of containers have their anchors and margins values overridden by their parent.")); - } else { - presets_menu->set_disabled(false); - presets_menu->set_tooltip(TTR("Presets for the anchors and margins values of a Control node.")); - anchor_mode_button->set_disabled(false); - anchor_mode_button->set_tooltip(TTR("When active, moving Control nodes changes their anchors instead of their margins.")); - } - } else { - presets_menu->set_visible(false); - anchor_mode_button->set_visible(false); - } + Node2D *b2 = Object::cast_to<Node2D>(b); + if (!b2 || !b2->is_inside_tree()) { + continue; + } - // Update the viewport if bones changes - for (KeyValue<BoneKey, BoneList> &E : bone_list) { - Object *b = ObjectDB::get_instance(E.key.from); - if (!b) { - viewport->update(); - break; + Transform2D global_xform = b2->get_global_transform(); + + if (global_xform != E.value.xform) { + E.value.xform = global_xform; + viewport->update(); + } + + Bone2D *bone = Object::cast_to<Bone2D>(b); + if (bone && bone->get_length() != E.value.length) { + E.value.length = bone->get_length(); + viewport->update(); + } } + } break; - Node2D *b2 = Object::cast_to<Node2D>(b); - if (!b2 || !b2->is_inside_tree()) { - continue; + case NOTIFICATION_ENTER_TREE: { + select_sb->set_texture(get_theme_icon(SNAME("EditorRect2D"), SNAME("EditorIcons"))); + for (int i = 0; i < 4; i++) { + select_sb->set_margin_size(Side(i), 4); + select_sb->set_default_margin(Side(i), 4); } - Transform2D global_xform = b2->get_global_transform(); + AnimationPlayerEditor::get_singleton()->get_track_editor()->connect("visibility_changed", callable_mp(this, &CanvasItemEditor::_keying_changed)); + _keying_changed(); + _update_editor_settings(); + } break; + + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + select_sb->set_texture(get_theme_icon(SNAME("EditorRect2D"), SNAME("EditorIcons"))); + _update_editor_settings(); + } break; - if (global_xform != E.value.xform) { - E.value.xform = global_xform; - viewport->update(); - } + case NOTIFICATION_VISIBILITY_CHANGED: { + if (!is_visible() && override_camera_button->is_pressed()) { + EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton(); - Bone2D *bone = Object::cast_to<Bone2D>(b); - if (bone && bone->get_length() != E.value.length) { - E.value.length = bone->get_length(); - viewport->update(); + debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_NONE); + override_camera_button->set_pressed(false); } - } - } - - if (p_what == NOTIFICATION_ENTER_TREE) { - select_sb->set_texture(get_theme_icon(SNAME("EditorRect2D"), SNAME("EditorIcons"))); - for (int i = 0; i < 4; i++) { - select_sb->set_margin_size(Side(i), 4); - select_sb->set_default_margin(Side(i), 4); - } - - AnimationPlayerEditor::get_singleton()->get_track_editor()->connect("visibility_changed", callable_mp(this, &CanvasItemEditor::_keying_changed)); - _keying_changed(); - - } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - select_sb->set_texture(get_theme_icon(SNAME("EditorRect2D"), SNAME("EditorIcons"))); - } - - if (p_what == NOTIFICATION_ENTER_TREE || p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - select_button->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); - list_select_button->set_icon(get_theme_icon(SNAME("ListSelect"), SNAME("EditorIcons"))); - move_button->set_icon(get_theme_icon(SNAME("ToolMove"), SNAME("EditorIcons"))); - scale_button->set_icon(get_theme_icon(SNAME("ToolScale"), SNAME("EditorIcons"))); - rotate_button->set_icon(get_theme_icon(SNAME("ToolRotate"), SNAME("EditorIcons"))); - smart_snap_button->set_icon(get_theme_icon(SNAME("Snap"), SNAME("EditorIcons"))); - grid_snap_button->set_icon(get_theme_icon(SNAME("SnapGrid"), SNAME("EditorIcons"))); - snap_config_menu->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); - skeleton_menu->set_icon(get_theme_icon(SNAME("Bone"), SNAME("EditorIcons"))); - override_camera_button->set_icon(get_theme_icon(SNAME("Camera2D"), SNAME("EditorIcons"))); - pan_button->set_icon(get_theme_icon(SNAME("ToolPan"), SNAME("EditorIcons"))); - ruler_button->set_icon(get_theme_icon(SNAME("Ruler"), SNAME("EditorIcons"))); - pivot_button->set_icon(get_theme_icon(SNAME("EditPivot"), SNAME("EditorIcons"))); - select_handle = get_theme_icon(SNAME("EditorHandle"), SNAME("EditorIcons")); - anchor_handle = get_theme_icon(SNAME("EditorControlAnchor"), SNAME("EditorIcons")); - lock_button->set_icon(get_theme_icon(SNAME("Lock"), SNAME("EditorIcons"))); - unlock_button->set_icon(get_theme_icon(SNAME("Unlock"), SNAME("EditorIcons"))); - group_button->set_icon(get_theme_icon(SNAME("Group"), SNAME("EditorIcons"))); - ungroup_button->set_icon(get_theme_icon(SNAME("Ungroup"), SNAME("EditorIcons"))); - key_loc_button->set_icon(get_theme_icon(SNAME("KeyPosition"), SNAME("EditorIcons"))); - key_rot_button->set_icon(get_theme_icon(SNAME("KeyRotation"), SNAME("EditorIcons"))); - key_scale_button->set_icon(get_theme_icon(SNAME("KeyScale"), SNAME("EditorIcons"))); - key_insert_button->set_icon(get_theme_icon(SNAME("Key"), SNAME("EditorIcons"))); - key_auto_insert_button->set_icon(get_theme_icon(SNAME("AutoKey"), SNAME("EditorIcons"))); - // Use a different color for the active autokey icon to make them easier - // to distinguish from the other key icons at the top. On a light theme, - // the icon will be dark, so we need to lighten it before blending it - // with the red color. - const Color key_auto_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25); - key_auto_insert_button->add_theme_color_override("icon_pressed_color", key_auto_color.lerp(Color(1, 0, 0), 0.55)); - animation_menu->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); - - _update_context_menu_stylebox(); - - presets_menu->set_icon(get_theme_icon(SNAME("ControlLayout"), SNAME("EditorIcons"))); - - PopupMenu *p = presets_menu->get_popup(); - - p->clear(); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignTopLeft"), SNAME("EditorIcons")), TTR("Top Left"), ANCHORS_AND_OFFSETS_PRESET_TOP_LEFT); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignTopRight"), SNAME("EditorIcons")), TTR("Top Right"), ANCHORS_AND_OFFSETS_PRESET_TOP_RIGHT); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomRight"), SNAME("EditorIcons")), TTR("Bottom Right"), ANCHORS_AND_OFFSETS_PRESET_BOTTOM_RIGHT); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomLeft"), SNAME("EditorIcons")), TTR("Bottom Left"), ANCHORS_AND_OFFSETS_PRESET_BOTTOM_LEFT); - p->add_separator(); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignLeftCenter"), SNAME("EditorIcons")), TTR("Center Left"), ANCHORS_AND_OFFSETS_PRESET_CENTER_LEFT); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignTopCenter"), SNAME("EditorIcons")), TTR("Center Top"), ANCHORS_AND_OFFSETS_PRESET_CENTER_TOP); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignRightCenter"), SNAME("EditorIcons")), TTR("Center Right"), ANCHORS_AND_OFFSETS_PRESET_CENTER_RIGHT); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomCenter"), SNAME("EditorIcons")), TTR("Center Bottom"), ANCHORS_AND_OFFSETS_PRESET_CENTER_BOTTOM); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenter"), SNAME("EditorIcons")), TTR("Center"), ANCHORS_AND_OFFSETS_PRESET_CENTER); - p->add_separator(); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignLeftWide"), SNAME("EditorIcons")), TTR("Left Wide"), ANCHORS_AND_OFFSETS_PRESET_LEFT_WIDE); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignTopWide"), SNAME("EditorIcons")), TTR("Top Wide"), ANCHORS_AND_OFFSETS_PRESET_TOP_WIDE); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignRightWide"), SNAME("EditorIcons")), TTR("Right Wide"), ANCHORS_AND_OFFSETS_PRESET_RIGHT_WIDE); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomWide"), SNAME("EditorIcons")), TTR("Bottom Wide"), ANCHORS_AND_OFFSETS_PRESET_BOTTOM_WIDE); - p->add_icon_item(get_theme_icon(SNAME("ControlVcenterWide"), SNAME("EditorIcons")), TTR("VCenter Wide"), ANCHORS_AND_OFFSETS_PRESET_VCENTER_WIDE); - p->add_icon_item(get_theme_icon(SNAME("ControlHcenterWide"), SNAME("EditorIcons")), TTR("HCenter Wide"), ANCHORS_AND_OFFSETS_PRESET_HCENTER_WIDE); - p->add_separator(); - p->add_icon_item(get_theme_icon(SNAME("ControlAlignWide"), SNAME("EditorIcons")), TTR("Full Rect"), ANCHORS_AND_OFFSETS_PRESET_WIDE); - p->add_icon_item(get_theme_icon(SNAME("Anchor"), SNAME("EditorIcons")), TTR("Keep Ratio"), ANCHORS_AND_OFFSETS_PRESET_KEEP_RATIO); - p->add_separator(); - p->add_submenu_item(TTR("Anchors only"), "Anchors"); - p->set_item_icon(21, get_theme_icon(SNAME("Anchor"), SNAME("EditorIcons"))); - - anchors_popup->clear(); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignTopLeft"), SNAME("EditorIcons")), TTR("Top Left"), ANCHORS_PRESET_TOP_LEFT); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignTopRight"), SNAME("EditorIcons")), TTR("Top Right"), ANCHORS_PRESET_TOP_RIGHT); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomRight"), SNAME("EditorIcons")), TTR("Bottom Right"), ANCHORS_PRESET_BOTTOM_RIGHT); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomLeft"), SNAME("EditorIcons")), TTR("Bottom Left"), ANCHORS_PRESET_BOTTOM_LEFT); - anchors_popup->add_separator(); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignLeftCenter"), SNAME("EditorIcons")), TTR("Center Left"), ANCHORS_PRESET_CENTER_LEFT); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignTopCenter"), SNAME("EditorIcons")), TTR("Center Top"), ANCHORS_PRESET_CENTER_TOP); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignRightCenter"), SNAME("EditorIcons")), TTR("Center Right"), ANCHORS_PRESET_CENTER_RIGHT); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomCenter"), SNAME("EditorIcons")), TTR("Center Bottom"), ANCHORS_PRESET_CENTER_BOTTOM); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignCenter"), SNAME("EditorIcons")), TTR("Center"), ANCHORS_PRESET_CENTER); - anchors_popup->add_separator(); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignLeftWide"), SNAME("EditorIcons")), TTR("Left Wide"), ANCHORS_PRESET_LEFT_WIDE); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignTopWide"), SNAME("EditorIcons")), TTR("Top Wide"), ANCHORS_PRESET_TOP_WIDE); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignRightWide"), SNAME("EditorIcons")), TTR("Right Wide"), ANCHORS_PRESET_RIGHT_WIDE); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomWide"), SNAME("EditorIcons")), TTR("Bottom Wide"), ANCHORS_PRESET_BOTTOM_WIDE); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlVcenterWide"), SNAME("EditorIcons")), TTR("VCenter Wide"), ANCHORS_PRESET_VCENTER_WIDE); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlHcenterWide"), SNAME("EditorIcons")), TTR("HCenter Wide"), ANCHORS_PRESET_HCENTER_WIDE); - anchors_popup->add_separator(); - anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignWide"), SNAME("EditorIcons")), TTR("Full Rect"), ANCHORS_PRESET_WIDE); - - anchor_mode_button->set_icon(get_theme_icon(SNAME("Anchor"), SNAME("EditorIcons"))); - - panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/2d_editor_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); - pan_speed = int(EditorSettings::get_singleton()->get("editors/panning/2d_editor_pan_speed")); - warped_panning = bool(EditorSettings::get_singleton()->get("editors/panning/warped_mouse_panning")); - } - - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (!is_visible() && override_camera_button->is_pressed()) { - EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton(); - - debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_NONE); - override_camera_button->set_pressed(false); - } + } break; } } void CanvasItemEditor::_selection_changed() { - // Update the anchors_mode - int nbValidControls = 0; - int nbAnchorsMode = 0; - List<Node *> selection = editor_selection->get_selected_node_list(); - for (Node *E : selection) { - Control *control = Object::cast_to<Control>(E); - if (!control) { - continue; - } - if (Object::cast_to<Container>(control->get_parent())) { - continue; - } - - nbValidControls++; - if (control->has_meta("_edit_use_anchors_") && control->get_meta("_edit_use_anchors_")) { - nbAnchorsMode++; - } - } - anchors_mode = (nbValidControls == nbAnchorsMode); - anchor_mode_button->set_pressed(anchors_mode); - if (!selected_from_canvas) { drag_type = DRAG_NONE; } @@ -3987,8 +3892,8 @@ void CanvasItemEditor::_update_scrollbars() { // Calculate scrollable area. Rect2 canvas_item_rect = Rect2(Point2(), screen_rect); - if (editor->is_inside_tree() && editor->get_edited_scene()) { - Rect2 content_rect = _get_encompassing_rect(editor->get_edited_scene()); + if (EditorNode::get_singleton()->is_inside_tree() && EditorNode::get_singleton()->get_edited_scene()) { + Rect2 content_rect = _get_encompassing_rect(EditorNode::get_singleton()->get_edited_scene()); canvas_item_rect.expand_to(content_rect.position); canvas_item_rect.expand_to(content_rect.position + content_rect.size); } @@ -4072,90 +3977,6 @@ void CanvasItemEditor::_update_scroll(real_t) { viewport->update(); } -void CanvasItemEditor::_set_anchors_and_offsets_preset(Control::LayoutPreset p_preset) { - List<Node *> selection = editor_selection->get_selected_node_list(); - - undo_redo->create_action(TTR("Change Anchors and Offsets")); - - for (Node *E : selection) { - Control *control = Object::cast_to<Control>(E); - if (control) { - undo_redo->add_do_method(control, "set_anchors_preset", p_preset); - switch (p_preset) { - case PRESET_TOP_LEFT: - case PRESET_TOP_RIGHT: - case PRESET_BOTTOM_LEFT: - case PRESET_BOTTOM_RIGHT: - case PRESET_CENTER_LEFT: - case PRESET_CENTER_TOP: - case PRESET_CENTER_RIGHT: - case PRESET_CENTER_BOTTOM: - case PRESET_CENTER: - undo_redo->add_do_method(control, "set_offsets_preset", p_preset, Control::PRESET_MODE_KEEP_SIZE); - break; - case PRESET_LEFT_WIDE: - case PRESET_TOP_WIDE: - case PRESET_RIGHT_WIDE: - case PRESET_BOTTOM_WIDE: - case PRESET_VCENTER_WIDE: - case PRESET_HCENTER_WIDE: - case PRESET_WIDE: - undo_redo->add_do_method(control, "set_offsets_preset", p_preset, Control::PRESET_MODE_MINSIZE); - break; - } - undo_redo->add_undo_method(control, "_edit_set_state", control->_edit_get_state()); - } - } - - undo_redo->commit_action(); - - anchors_mode = false; - anchor_mode_button->set_pressed(anchors_mode); -} - -void CanvasItemEditor::_set_anchors_and_offsets_to_keep_ratio() { - List<Node *> selection = editor_selection->get_selected_node_list(); - - undo_redo->create_action(TTR("Change Anchors and Offsets")); - - for (Node *E : selection) { - Control *control = Object::cast_to<Control>(E); - if (control) { - Point2 top_left_anchor = _position_to_anchor(control, Point2()); - Point2 bottom_right_anchor = _position_to_anchor(control, control->get_size()); - undo_redo->add_do_method(control, "set_anchor", SIDE_LEFT, top_left_anchor.x, false, true); - undo_redo->add_do_method(control, "set_anchor", SIDE_RIGHT, bottom_right_anchor.x, false, true); - undo_redo->add_do_method(control, "set_anchor", SIDE_TOP, top_left_anchor.y, false, true); - undo_redo->add_do_method(control, "set_anchor", SIDE_BOTTOM, bottom_right_anchor.y, false, true); - undo_redo->add_do_method(control, "set_meta", "_edit_use_anchors_", true); - - bool use_anchors = control->has_meta("_edit_use_anchors_") && control->get_meta("_edit_use_anchors_"); - undo_redo->add_undo_method(control, "_edit_set_state", control->_edit_get_state()); - undo_redo->add_undo_method(control, "set_meta", "_edit_use_anchors_", use_anchors); - - anchors_mode = true; - anchor_mode_button->set_pressed(anchors_mode); - } - } - - undo_redo->commit_action(); -} - -void CanvasItemEditor::_set_anchors_preset(Control::LayoutPreset p_preset) { - List<Node *> selection = editor_selection->get_selected_node_list(); - - undo_redo->create_action(TTR("Change Anchors")); - for (Node *E : selection) { - Control *control = Object::cast_to<Control>(E); - if (control) { - undo_redo->add_do_method(control, "set_anchors_preset", p_preset); - undo_redo->add_undo_method(control, "_edit_set_state", control->_edit_get_state()); - } - } - - undo_redo->commit_action(); -} - void CanvasItemEditor::_zoom_on_position(real_t p_zoom, Point2 p_position) { p_zoom = CLAMP(p_zoom, MIN_ZOOM, MAX_ZOOM); @@ -4189,6 +4010,10 @@ void CanvasItemEditor::_update_zoom(real_t p_zoom) { _zoom_on_position(p_zoom, viewport_scrollable->get_size() / 2.0); } +void CanvasItemEditor::_shortcut_zoom_set(real_t p_zoom) { + _zoom_on_position(p_zoom * MAX(1, EDSCALE), viewport->get_local_mouse_position()); +} + void CanvasItemEditor::_button_toggle_smart_snap(bool p_status) { smart_snap_active = p_status; viewport->update(); @@ -4298,21 +4123,6 @@ void CanvasItemEditor::_insert_animation_keys(bool p_location, bool p_rotation, } } -void CanvasItemEditor::_button_toggle_anchor_mode(bool p_status) { - List<CanvasItem *> selection = _get_edited_canvas_items(false, false); - for (CanvasItem *E : selection) { - Control *control = Object::cast_to<Control>(E); - if (!control || Object::cast_to<Container>(control->get_parent())) { - continue; - } - - control->set_meta("_edit_use_anchors_", p_status); - } - - anchors_mode = p_status; - viewport->update(); -} - void CanvasItemEditor::_update_override_camera_button(bool p_game_running) { if (p_game_running) { override_camera_button->set_disabled(false); @@ -4534,106 +4344,6 @@ void CanvasItemEditor::_popup_callback(int p_op) { undo_redo->add_undo_method(viewport, "update", Variant()); undo_redo->commit_action(); } break; - case ANCHORS_AND_OFFSETS_PRESET_TOP_LEFT: { - _set_anchors_and_offsets_preset(PRESET_TOP_LEFT); - } break; - case ANCHORS_AND_OFFSETS_PRESET_TOP_RIGHT: { - _set_anchors_and_offsets_preset(PRESET_TOP_RIGHT); - } break; - case ANCHORS_AND_OFFSETS_PRESET_BOTTOM_LEFT: { - _set_anchors_and_offsets_preset(PRESET_BOTTOM_LEFT); - } break; - case ANCHORS_AND_OFFSETS_PRESET_BOTTOM_RIGHT: { - _set_anchors_and_offsets_preset(PRESET_BOTTOM_RIGHT); - } break; - case ANCHORS_AND_OFFSETS_PRESET_CENTER_LEFT: { - _set_anchors_and_offsets_preset(PRESET_CENTER_LEFT); - } break; - case ANCHORS_AND_OFFSETS_PRESET_CENTER_RIGHT: { - _set_anchors_and_offsets_preset(PRESET_CENTER_RIGHT); - } break; - case ANCHORS_AND_OFFSETS_PRESET_CENTER_TOP: { - _set_anchors_and_offsets_preset(PRESET_CENTER_TOP); - } break; - case ANCHORS_AND_OFFSETS_PRESET_CENTER_BOTTOM: { - _set_anchors_and_offsets_preset(PRESET_CENTER_BOTTOM); - } break; - case ANCHORS_AND_OFFSETS_PRESET_CENTER: { - _set_anchors_and_offsets_preset(PRESET_CENTER); - } break; - case ANCHORS_AND_OFFSETS_PRESET_TOP_WIDE: { - _set_anchors_and_offsets_preset(PRESET_TOP_WIDE); - } break; - case ANCHORS_AND_OFFSETS_PRESET_LEFT_WIDE: { - _set_anchors_and_offsets_preset(PRESET_LEFT_WIDE); - } break; - case ANCHORS_AND_OFFSETS_PRESET_RIGHT_WIDE: { - _set_anchors_and_offsets_preset(PRESET_RIGHT_WIDE); - } break; - case ANCHORS_AND_OFFSETS_PRESET_BOTTOM_WIDE: { - _set_anchors_and_offsets_preset(PRESET_BOTTOM_WIDE); - } break; - case ANCHORS_AND_OFFSETS_PRESET_VCENTER_WIDE: { - _set_anchors_and_offsets_preset(PRESET_VCENTER_WIDE); - } break; - case ANCHORS_AND_OFFSETS_PRESET_HCENTER_WIDE: { - _set_anchors_and_offsets_preset(PRESET_HCENTER_WIDE); - } break; - case ANCHORS_AND_OFFSETS_PRESET_WIDE: { - _set_anchors_and_offsets_preset(Control::PRESET_WIDE); - } break; - case ANCHORS_AND_OFFSETS_PRESET_KEEP_RATIO: { - _set_anchors_and_offsets_to_keep_ratio(); - } break; - - case ANCHORS_PRESET_TOP_LEFT: { - _set_anchors_preset(PRESET_TOP_LEFT); - } break; - case ANCHORS_PRESET_TOP_RIGHT: { - _set_anchors_preset(PRESET_TOP_RIGHT); - } break; - case ANCHORS_PRESET_BOTTOM_LEFT: { - _set_anchors_preset(PRESET_BOTTOM_LEFT); - } break; - case ANCHORS_PRESET_BOTTOM_RIGHT: { - _set_anchors_preset(PRESET_BOTTOM_RIGHT); - } break; - case ANCHORS_PRESET_CENTER_LEFT: { - _set_anchors_preset(PRESET_CENTER_LEFT); - } break; - case ANCHORS_PRESET_CENTER_RIGHT: { - _set_anchors_preset(PRESET_CENTER_RIGHT); - } break; - case ANCHORS_PRESET_CENTER_TOP: { - _set_anchors_preset(PRESET_CENTER_TOP); - } break; - case ANCHORS_PRESET_CENTER_BOTTOM: { - _set_anchors_preset(PRESET_CENTER_BOTTOM); - } break; - case ANCHORS_PRESET_CENTER: { - _set_anchors_preset(PRESET_CENTER); - } break; - case ANCHORS_PRESET_TOP_WIDE: { - _set_anchors_preset(PRESET_TOP_WIDE); - } break; - case ANCHORS_PRESET_LEFT_WIDE: { - _set_anchors_preset(PRESET_LEFT_WIDE); - } break; - case ANCHORS_PRESET_RIGHT_WIDE: { - _set_anchors_preset(PRESET_RIGHT_WIDE); - } break; - case ANCHORS_PRESET_BOTTOM_WIDE: { - _set_anchors_preset(PRESET_BOTTOM_WIDE); - } break; - case ANCHORS_PRESET_VCENTER_WIDE: { - _set_anchors_preset(PRESET_VCENTER_WIDE); - } break; - case ANCHORS_PRESET_HCENTER_WIDE: { - _set_anchors_preset(PRESET_HCENTER_WIDE); - } break; - case ANCHORS_PRESET_WIDE: { - _set_anchors_preset(Control::PRESET_WIDE); - } break; case ANIM_INSERT_KEY: case ANIM_INSERT_KEY_EXISTING: { @@ -4854,7 +4564,7 @@ void CanvasItemEditor::_focus_selection(int p_op) { if (p_op == VIEW_CENTER_TO_SELECTION) { center = rect.get_center(); - Vector2 offset = viewport->get_size() / 2 - editor->get_scene_root()->get_global_canvas_transform().xform(center); + Vector2 offset = viewport->get_size() / 2 - EditorNode::get_singleton()->get_scene_root()->get_global_canvas_transform().xform(center); view_offset -= (offset / zoom).round(); update_viewport(); @@ -5127,67 +4837,24 @@ void CanvasItemEditor::focus_selection() { _focus_selection(VIEW_CENTER_TO_SELECTION); } -CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { - key_pos = true; - key_rot = true; - key_scale = false; - - show_grid = false; - show_origin = true; - show_viewport = true; - show_helpers = false; - show_rulers = true; - show_guides = true; - show_transformation_gizmos = true; - show_edit_locks = true; +CanvasItemEditor::CanvasItemEditor() { zoom = 1.0 / MAX(1, EDSCALE); view_offset = Point2(-150 - RULER_WIDTH, -95 - RULER_WIDTH); previous_update_view_offset = view_offset; // Moves the view a little bit to the left so that (0,0) is visible. The values a relative to a 16/10 screen + grid_offset = Point2(); grid_step = Point2(8, 8); // A power-of-two value works better as a default primary_grid_steps = 8; // A power-of-two value works better as a default grid_step_multiplier = 0; + snap_rotation_offset = 0; snap_rotation_step = Math::deg2rad(15.0); snap_scale_step = 0.1f; - smart_snap_active = false; - grid_snap_active = false; - snap_node_parent = true; - snap_node_anchors = true; - snap_node_sides = true; - snap_node_center = true; - snap_other_nodes = true; - snap_guides = true; - snap_rotation = false; - snap_scale = false; - snap_relative = false; - // Enable pixel snapping even if pixel snap rendering is disabled in the Project Settings. - // This results in crisper visuals by preventing 2D nodes from being placed at subpixel coordinates. - snap_pixel = true; snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; - selected_from_canvas = false; - anchors_mode = false; - - drag_type = DRAG_NONE; - drag_from = Vector2(); - drag_to = Vector2(); - dragged_guide_pos = Point2(); - dragged_guide_index = -1; - is_hovering_h_guide = false; - is_hovering_v_guide = false; - pan_pressed = false; - - ruler_tool_active = false; - ruler_tool_origin = Point2(); - - bone_last_frame = 0; - - tool = TOOL_SELECT; - undo_redo = p_editor->get_undo_redo(); - editor = p_editor; - editor_selection = p_editor->get_editor_selection(); + undo_redo = EditorNode::get_singleton()->get_undo_redo(); + editor_selection = EditorNode::get_singleton()->get_editor_selection(); editor_selection->add_editor_plugin(this); editor_selection->connect("selection_changed", callable_mp((CanvasItem *)this, &CanvasItem::update)); editor_selection->connect("selection_changed", callable_mp(this, &CanvasItemEditor::_selection_changed)); @@ -5195,8 +4862,8 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { SceneTreeDock::get_singleton()->connect("node_created", callable_mp(this, &CanvasItemEditor::_node_created)); SceneTreeDock::get_singleton()->connect("add_node_used", callable_mp(this, &CanvasItemEditor::_reset_create_position)); - editor->call_deferred(SNAME("connect"), "play_pressed", Callable(this, "_update_override_camera_button"), make_binds(true)); - editor->call_deferred(SNAME("connect"), "stop_pressed", Callable(this, "_update_override_camera_button"), make_binds(false)); + EditorNode::get_singleton()->call_deferred(SNAME("connect"), "play_pressed", Callable(this, "_update_override_camera_button"), make_binds(true)); + EditorNode::get_singleton()->call_deferred(SNAME("connect"), "stop_pressed", Callable(this, "_update_override_camera_button"), make_binds(false)); hb = memnew(HBoxContainer); add_child(hb); @@ -5226,7 +4893,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { viewport_scrollable->add_child(scene_tree); scene_tree->set_stretch(true); scene_tree->set_anchors_and_offsets_preset(Control::PRESET_WIDE); - scene_tree->add_child(p_editor->get_scene_root()); + scene_tree->add_child(EditorNode::get_singleton()->get_scene_root()); controls_vb = memnew(VBoxContainer); controls_vb->set_begin(Point2(5, 5)); @@ -5239,7 +4906,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { panner.instantiate(); panner->set_callbacks(callable_mp(this, &CanvasItemEditor::_scroll_callback), callable_mp(this, &CanvasItemEditor::_pan_callback), callable_mp(this, &CanvasItemEditor::_zoom_callback)); - viewport = memnew(CanvasItemEditorViewport(p_editor, this)); + viewport = memnew(CanvasItemEditorViewport(this)); viewport_scrollable->add_child(viewport); viewport->set_mouse_filter(MOUSE_FILTER_PASS); viewport->set_anchors_and_offsets_preset(Control::PRESET_WIDE); @@ -5261,8 +4928,6 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { viewport->add_child(controls_vb); - updating_scroll = false; - // Add some margin to the left for better aesthetics. // This prevents the first button's hover/pressed effect from "touching" the panel's border, // which looks ugly. @@ -5492,28 +5157,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { hb->add_child(context_menu_container); _update_context_menu_stylebox(); - presets_menu = memnew(MenuButton); - presets_menu->set_shortcut_context(this); - presets_menu->set_text(TTR("Layout")); - hbc_context_menu->add_child(presets_menu); - presets_menu->hide(); - presets_menu->set_switch_on_hover(true); - - p = presets_menu->get_popup(); - p->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback)); - - anchors_popup = memnew(PopupMenu); - p->add_child(anchors_popup); - anchors_popup->set_name("Anchors"); - anchors_popup->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback)); - - anchor_mode_button = memnew(Button); - anchor_mode_button->set_flat(true); - hbc_context_menu->add_child(anchor_mode_button); - anchor_mode_button->set_toggle_mode(true); - anchor_mode_button->hide(); - anchor_mode_button->connect("toggled", callable_mp(this, &CanvasItemEditor::_button_toggle_anchor_mode)); - + // Animation controls. animation_hb = memnew(HBoxContainer); hbc_context_menu->add_child(animation_hb); animation_hb->add_child(memnew(VSeparator)); @@ -5599,6 +5243,8 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { divide_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/divide_grid_step", TTR("Divide grid step by 2"), Key::KP_DIVIDE); skeleton_menu->get_popup()->set_item_checked(skeleton_menu->get_popup()->get_item_index(SKELETON_SHOW_BONES), true); + + // Store the singleton instance. singleton = this; // To ensure that scripts can parse the list of shortcuts correctly, we have to define @@ -5637,12 +5283,12 @@ void CanvasItemEditorPlugin::make_visible(bool p_visible) { if (p_visible) { canvas_item_editor->show(); canvas_item_editor->set_physics_process(true); - RenderingServer::get_singleton()->viewport_set_disable_2d(editor->get_scene_root()->get_viewport_rid(), false); + RenderingServer::get_singleton()->viewport_set_disable_2d(EditorNode::get_singleton()->get_scene_root()->get_viewport_rid(), false); } else { canvas_item_editor->hide(); canvas_item_editor->set_physics_process(false); - RenderingServer::get_singleton()->viewport_set_disable_2d(editor->get_scene_root()->get_viewport_rid(), true); + RenderingServer::get_singleton()->viewport_set_disable_2d(EditorNode::get_singleton()->get_scene_root()->get_viewport_rid(), true); } } @@ -5654,11 +5300,10 @@ void CanvasItemEditorPlugin::set_state(const Dictionary &p_state) { canvas_item_editor->set_state(p_state); } -CanvasItemEditorPlugin::CanvasItemEditorPlugin(EditorNode *p_node) { - editor = p_node; - canvas_item_editor = memnew(CanvasItemEditor(editor)); +CanvasItemEditorPlugin::CanvasItemEditorPlugin() { + canvas_item_editor = memnew(CanvasItemEditor); canvas_item_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); - editor->get_main_control()->add_child(canvas_item_editor); + EditorNode::get_singleton()->get_main_control()->add_child(canvas_item_editor); canvas_item_editor->set_anchors_and_offsets_preset(Control::PRESET_WIDE); canvas_item_editor->hide(); } @@ -5726,7 +5371,7 @@ void CanvasItemEditorViewport::_create_preview(const Vector<String> &files) cons } if (add_preview) { - editor->get_scene_root()->add_child(preview_node); + EditorNode::get_singleton()->get_scene_root()->add_child(preview_node); } } @@ -5737,7 +5382,7 @@ void CanvasItemEditorViewport::_remove_preview() { node->queue_delete(); preview_node->remove_child(node); } - editor->get_scene_root()->remove_child(preview_node); + EditorNode::get_singleton()->get_scene_root()->remove_child(preview_node); label->hide(); label_desc->hide(); @@ -5780,39 +5425,34 @@ void CanvasItemEditorViewport::_create_nodes(Node *parent, Node *child, String & if (parent) { editor_data->get_undo_redo().add_do_method(parent, "add_child", child, true); - editor_data->get_undo_redo().add_do_method(child, "set_owner", editor->get_edited_scene()); + editor_data->get_undo_redo().add_do_method(child, "set_owner", EditorNode::get_singleton()->get_edited_scene()); editor_data->get_undo_redo().add_do_reference(child); editor_data->get_undo_redo().add_undo_method(parent, "remove_child", child); } else { // If no parent is selected, set as root node of the scene. - editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", child); - editor_data->get_undo_redo().add_do_method(child, "set_owner", editor->get_edited_scene()); + editor_data->get_undo_redo().add_do_method(EditorNode::get_singleton(), "set_edited_scene", child); + editor_data->get_undo_redo().add_do_method(child, "set_owner", EditorNode::get_singleton()->get_edited_scene()); editor_data->get_undo_redo().add_do_reference(child); - editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)nullptr); + editor_data->get_undo_redo().add_undo_method(EditorNode::get_singleton(), "set_edited_scene", (Object *)nullptr); } if (parent) { String new_name = parent->validate_child_name(child); EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton(); - editor_data->get_undo_redo().add_do_method(ed, "live_debug_create_node", editor->get_edited_scene()->get_path_to(parent), child->get_class(), new_name); - editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(editor->get_edited_scene()->get_path_to(parent)) + "/" + new_name)); + editor_data->get_undo_redo().add_do_method(ed, "live_debug_create_node", EditorNode::get_singleton()->get_edited_scene()->get_path_to(parent), child->get_class(), new_name); + editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(EditorNode::get_singleton()->get_edited_scene()->get_path_to(parent)) + "/" + new_name)); } - String node_class = child->get_class(); - if (node_class == "Polygon2D") { - editor_data->get_undo_redo().add_do_property(child, "texture/texture", texture); - } else if (node_class == "TouchScreenButton") { - editor_data->get_undo_redo().add_do_property(child, "normal", texture); - } else if (node_class == "TextureButton") { - editor_data->get_undo_redo().add_do_property(child, "texture_button", texture); + if (Object::cast_to<TouchScreenButton>(child) || Object::cast_to<TextureButton>(child)) { + editor_data->get_undo_redo().add_do_property(child, "texture_normal", texture); } else { editor_data->get_undo_redo().add_do_property(child, "texture", texture); } // make visible for certain node type - if (ClassDB::is_parent_class(node_class, "Control")) { + if (Object::cast_to<Control>(child)) { Size2 texture_size = texture->get_size(); editor_data->get_undo_redo().add_do_property(child, "rect_size", texture_size); - } else if (node_class == "Polygon2D") { + } else if (Object::cast_to<Polygon2D>(child)) { Size2 texture_size = texture->get_size(); Vector<Vector2> list = { Vector2(0, 0), @@ -5843,8 +5483,10 @@ bool CanvasItemEditorViewport::_create_instance(Node *parent, String &path, cons return false; } - if (!editor->get_edited_scene()->get_scene_file_path().is_empty()) { // cyclical instancing - if (_cyclical_dependency_exists(editor->get_edited_scene()->get_scene_file_path(), instantiated_scene)) { + Node *edited_scene = EditorNode::get_singleton()->get_edited_scene(); + + if (!edited_scene->get_scene_file_path().is_empty()) { // cyclical instancing + if (_cyclical_dependency_exists(edited_scene->get_scene_file_path(), instantiated_scene)) { memdelete(instantiated_scene); return false; } @@ -5853,25 +5495,27 @@ bool CanvasItemEditorViewport::_create_instance(Node *parent, String &path, cons instantiated_scene->set_scene_file_path(ProjectSettings::get_singleton()->localize_path(path)); editor_data->get_undo_redo().add_do_method(parent, "add_child", instantiated_scene, true); - editor_data->get_undo_redo().add_do_method(instantiated_scene, "set_owner", editor->get_edited_scene()); + editor_data->get_undo_redo().add_do_method(instantiated_scene, "set_owner", edited_scene); editor_data->get_undo_redo().add_do_reference(instantiated_scene); editor_data->get_undo_redo().add_undo_method(parent, "remove_child", instantiated_scene); String new_name = parent->validate_child_name(instantiated_scene); EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton(); - editor_data->get_undo_redo().add_do_method(ed, "live_debug_instance_node", editor->get_edited_scene()->get_path_to(parent), path, new_name); - editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(editor->get_edited_scene()->get_path_to(parent)) + "/" + new_name)); + editor_data->get_undo_redo().add_do_method(ed, "live_debug_instance_node", edited_scene->get_path_to(parent), path, new_name); + editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(parent)) + "/" + new_name)); - CanvasItem *parent_ci = Object::cast_to<CanvasItem>(parent); - if (parent_ci) { + CanvasItem *instance_ci = Object::cast_to<CanvasItem>(instantiated_scene); + if (instance_ci) { Vector2 target_pos = canvas_item_editor->get_canvas_transform().affine_inverse().xform(p_point); target_pos = canvas_item_editor->snap_point(target_pos); - target_pos = parent_ci->get_global_transform_with_canvas().affine_inverse().xform(target_pos); - // Preserve instance position of the original scene. - CanvasItem *instance_ci = Object::cast_to<CanvasItem>(instantiated_scene); - if (instance_ci) { - target_pos += instance_ci->_edit_get_position(); + + CanvasItem *parent_ci = Object::cast_to<CanvasItem>(parent); + if (parent_ci) { + target_pos = parent_ci->get_global_transform_with_canvas().affine_inverse().xform(target_pos); } + // Preserve instance position of the original scene. + target_pos += instance_ci->_edit_get_position(); + editor_data->get_undo_redo().add_do_method(instantiated_scene, "set_position", target_pos); } @@ -5940,29 +5584,30 @@ bool CanvasItemEditorViewport::can_drop_data(const Point2 &p_point, const Varian if (String(d["type"]) == "files") { Vector<String> files = d["files"]; bool can_instantiate = false; - for (int i = 0; i < files.size(); i++) { // check if dragged files contain resource or scene can be created at least once - RES res = ResourceLoader::load(files[i]); - if (res.is_null()) { - continue; - } - String type = res->get_class(); - if (type == "PackedScene") { - Ref<PackedScene> sdata = Ref<PackedScene>(Object::cast_to<PackedScene>(*res)); - Node *instantiated_scene = sdata->instantiate(PackedScene::GEN_EDIT_STATE_INSTANCE); - if (!instantiated_scene) { + + List<String> scene_extensions; + ResourceLoader::get_recognized_extensions_for_type("PackedScene", &scene_extensions); + List<String> texture_extensions; + ResourceLoader::get_recognized_extensions_for_type("Texture2D", &texture_extensions); + + for (int i = 0; i < files.size(); i++) { + // Check if dragged files with texture or scene extension can be created at least once. + if (texture_extensions.find(files[i].get_extension()) || scene_extensions.find(files[i].get_extension())) { + RES res = ResourceLoader::load(files[i]); + if (res.is_null()) { continue; } - memdelete(instantiated_scene); - } else if (ClassDB::is_parent_class(type, "Texture2D")) { - Ref<Texture2D> texture = Ref<Texture2D>(Object::cast_to<Texture2D>(*res)); - if (!texture.is_valid()) { - continue; + Ref<PackedScene> scn = res; + if (scn.is_valid()) { + Node *instantiated_scene = scn->instantiate(PackedScene::GEN_EDIT_STATE_INSTANCE); + if (!instantiated_scene) { + continue; + } + memdelete(instantiated_scene); } - } else { - continue; + can_instantiate = true; + break; } - can_instantiate = true; - break; } if (can_instantiate) { if (!preview_node->get_parent()) { // create preview only once @@ -6016,8 +5661,8 @@ void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p return; } - List<Node *> selected_nodes = editor->get_editor_selection()->get_selected_node_list(); - Node *root_node = editor->get_edited_scene(); + List<Node *> selected_nodes = EditorNode::get_singleton()->get_editor_selection()->get_selected_node_list(); + Node *root_node = EditorNode::get_singleton()->get_edited_scene(); if (selected_nodes.size() > 0) { Node *selected_node = selected_nodes[0]; target_node = root_node; @@ -6068,25 +5713,39 @@ Node *CanvasItemEditorViewport::_make_texture_node_type(String texture_node_type return node; } +void CanvasItemEditorViewport::_update_theme() { + List<BaseButton *> btn_list; + button_group->get_buttons(&btn_list); + + for (int i = 0; i < btn_list.size(); i++) { + CheckBox *check = Object::cast_to<CheckBox>(btn_list[i]); + check->set_icon(get_theme_icon(check->get_text(), SNAME("EditorIcons"))); + } + + label->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); +} + void CanvasItemEditorViewport::_notification(int p_what) { switch (p_what) { + case NOTIFICATION_THEME_CHANGED: { + _update_theme(); + } break; + case NOTIFICATION_ENTER_TREE: { + _update_theme(); connect("mouse_exited", callable_mp(this, &CanvasItemEditorViewport::_on_mouse_exit)); - label->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); } break; + case NOTIFICATION_EXIT_TREE: { disconnect("mouse_exited", callable_mp(this, &CanvasItemEditorViewport::_on_mouse_exit)); } break; - - default: - break; } } void CanvasItemEditorViewport::_bind_methods() { } -CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasItemEditor *p_canvas_item_editor) { +CanvasItemEditorViewport::CanvasItemEditorViewport(CanvasItemEditor *p_canvas_item_editor) { default_texture_node_type = "Sprite2D"; // Node2D texture_node_types.push_back("Sprite2D"); @@ -6101,16 +5760,15 @@ CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasIte texture_node_types.push_back("NinePatchRect"); target_node = nullptr; - editor = p_node; editor_data = SceneTreeDock::get_singleton()->get_editor_data(); canvas_item_editor = p_canvas_item_editor; preview_node = memnew(Control); accept = memnew(AcceptDialog); - editor->get_gui_base()->add_child(accept); + EditorNode::get_singleton()->get_gui_base()->add_child(accept); selector = memnew(AcceptDialog); - editor->get_gui_base()->add_child(selector); + EditorNode::get_singleton()->get_gui_base()->add_child(selector); selector->set_title(TTR("Change Default Type")); selector->connect("confirmed", callable_mp(this, &CanvasItemEditorViewport::_on_change_type_confirmed)); selector->connect("cancelled", callable_mp(this, &CanvasItemEditorViewport::_on_change_type_closed)); @@ -6123,7 +5781,7 @@ CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasIte btn_group = memnew(VBoxContainer); vbc->add_child(btn_group); - btn_group->set_h_size_flags(0); + btn_group->set_h_size_flags(SIZE_EXPAND_FILL); button_group.instantiate(); for (int i = 0; i < texture_node_types.size(); i++) { diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 9fa44bfb25..e7c265ee02 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -28,10 +28,9 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef CONTROL_EDITOR_PLUGIN_H -#define CONTROL_EDITOR_PLUGIN_H +#ifndef CANVAS_ITEM_EDITOR_PLUGIN_H +#define CANVAS_ITEM_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/editor_zoom_widget.h" #include "scene/gui/box_container.h" @@ -39,8 +38,11 @@ #include "scene/gui/label.h" #include "scene/gui/panel_container.h" #include "scene/gui/spin_box.h" +#include "scene/gui/split_container.h" +#include "scene/gui/texture_rect.h" #include "scene/main/canvas_item.h" +class EditorData; class CanvasItemEditorViewport; class ViewPanner; @@ -89,8 +91,6 @@ public: }; private: - EditorNode *editor; - enum SnapTarget { SNAP_TARGET_NONE = 0, SNAP_TARGET_PARENT, @@ -128,55 +128,6 @@ private: UNLOCK_SELECTED, GROUP_SELECTED, UNGROUP_SELECTED, - ANCHORS_AND_OFFSETS_PRESET_TOP_LEFT, - ANCHORS_AND_OFFSETS_PRESET_TOP_RIGHT, - ANCHORS_AND_OFFSETS_PRESET_BOTTOM_LEFT, - ANCHORS_AND_OFFSETS_PRESET_BOTTOM_RIGHT, - ANCHORS_AND_OFFSETS_PRESET_CENTER_LEFT, - ANCHORS_AND_OFFSETS_PRESET_CENTER_RIGHT, - ANCHORS_AND_OFFSETS_PRESET_CENTER_TOP, - ANCHORS_AND_OFFSETS_PRESET_CENTER_BOTTOM, - ANCHORS_AND_OFFSETS_PRESET_CENTER, - ANCHORS_AND_OFFSETS_PRESET_TOP_WIDE, - ANCHORS_AND_OFFSETS_PRESET_LEFT_WIDE, - ANCHORS_AND_OFFSETS_PRESET_RIGHT_WIDE, - ANCHORS_AND_OFFSETS_PRESET_BOTTOM_WIDE, - ANCHORS_AND_OFFSETS_PRESET_VCENTER_WIDE, - ANCHORS_AND_OFFSETS_PRESET_HCENTER_WIDE, - ANCHORS_AND_OFFSETS_PRESET_WIDE, - ANCHORS_AND_OFFSETS_PRESET_KEEP_RATIO, - ANCHORS_PRESET_TOP_LEFT, - ANCHORS_PRESET_TOP_RIGHT, - ANCHORS_PRESET_BOTTOM_LEFT, - ANCHORS_PRESET_BOTTOM_RIGHT, - ANCHORS_PRESET_CENTER_LEFT, - ANCHORS_PRESET_CENTER_RIGHT, - ANCHORS_PRESET_CENTER_TOP, - ANCHORS_PRESET_CENTER_BOTTOM, - ANCHORS_PRESET_CENTER, - ANCHORS_PRESET_TOP_WIDE, - ANCHORS_PRESET_LEFT_WIDE, - ANCHORS_PRESET_RIGHT_WIDE, - ANCHORS_PRESET_BOTTOM_WIDE, - ANCHORS_PRESET_VCENTER_WIDE, - ANCHORS_PRESET_HCENTER_WIDE, - ANCHORS_PRESET_WIDE, - OFFSETS_PRESET_TOP_LEFT, - OFFSETS_PRESET_TOP_RIGHT, - OFFSETS_PRESET_BOTTOM_LEFT, - OFFSETS_PRESET_BOTTOM_RIGHT, - OFFSETS_PRESET_CENTER_LEFT, - OFFSETS_PRESET_CENTER_RIGHT, - OFFSETS_PRESET_CENTER_TOP, - OFFSETS_PRESET_CENTER_BOTTOM, - OFFSETS_PRESET_CENTER, - OFFSETS_PRESET_TOP_WIDE, - OFFSETS_PRESET_LEFT_WIDE, - OFFSETS_PRESET_RIGHT_WIDE, - OFFSETS_PRESET_BOTTOM_WIDE, - OFFSETS_PRESET_VCENTER_WIDE, - OFFSETS_PRESET_HCENTER_WIDE, - OFFSETS_PRESET_WIDE, ANIM_INSERT_KEY, ANIM_INSERT_KEY_EXISTING, ANIM_INSERT_POS, @@ -226,7 +177,7 @@ private: bool selection_menu_additive_selection; - Tool tool; + Tool tool = TOOL_SELECT; Control *viewport; Control *viewport_scrollable; @@ -239,21 +190,20 @@ private: HBoxContainer *hbc_context_menu; Transform2D transform; - bool show_grid; - bool show_rulers; - bool show_guides; - bool show_origin; - bool show_viewport; - bool show_helpers; - bool show_edit_locks; - bool show_transformation_gizmos; + bool show_grid = false; + bool show_rulers = true; + bool show_guides = true; + bool show_origin = true; + bool show_viewport = true; + bool show_helpers = false; + bool show_edit_locks = true; + bool show_transformation_gizmos = true; real_t zoom; Point2 view_offset; Point2 previous_update_view_offset; - bool selected_from_canvas; - bool anchors_mode; + bool selected_from_canvas = false; Point2 grid_offset; Point2 grid_step; @@ -263,26 +213,30 @@ private: real_t snap_rotation_step; real_t snap_rotation_offset; real_t snap_scale_step; - bool smart_snap_active; - bool grid_snap_active; - - bool snap_node_parent; - bool snap_node_anchors; - bool snap_node_sides; - bool snap_node_center; - bool snap_other_nodes; - bool snap_guides; - bool snap_rotation; - bool snap_scale; - bool snap_relative; - bool snap_pixel; - bool key_pos; - bool key_rot; - bool key_scale; - bool pan_pressed; - - bool ruler_tool_active; - Point2 ruler_tool_origin; + bool smart_snap_active = false; + bool grid_snap_active = false; + + bool snap_node_parent = true; + bool snap_node_anchors = true; + bool snap_node_sides = true; + bool snap_node_center = true; + bool snap_other_nodes = true; + bool snap_guides = true; + bool snap_rotation = false; + bool snap_scale = false; + bool snap_relative = false; + // Enable pixel snapping even if pixel snap rendering is disabled in the Project Settings. + // This results in crisper visuals by preventing 2D nodes from being placed at subpixel coordinates. + bool snap_pixel = true; + + bool key_pos = true; + bool key_rot = true; + bool key_scale = false; + + bool pan_pressed = false; + + bool ruler_tool_active = false; + Point2 ruler_tool_origin = Point2(); Point2 node_create_position; MenuOption last_option; @@ -310,7 +264,7 @@ private: uint64_t last_pass = 0; }; - uint64_t bone_last_frame; + uint64_t bone_last_frame = 0; struct BoneKey { ObjectID from; @@ -363,12 +317,6 @@ private: HBoxContainer *animation_hb; MenuButton *animation_menu; - MenuButton *presets_menu; - PopupMenu *anchors_and_margins_popup; - PopupMenu *anchors_popup; - - Button *anchor_mode_button; - Button *key_loc_button; Button *key_rot_button; Button *key_scale_button; @@ -382,15 +330,15 @@ private: Control *left_ruler; Point2 drag_start_origin; - DragType drag_type; - Point2 drag_from; - Point2 drag_to; + DragType drag_type = DRAG_NONE; + Point2 drag_from = Vector2(); + Point2 drag_to = Vector2(); Point2 drag_rotation_center; List<CanvasItem *> drag_selection; - int dragged_guide_index; - Point2 dragged_guide_pos; - bool is_hovering_h_guide; - bool is_hovering_v_guide; + int dragged_guide_index = -1; + Point2 dragged_guide_pos = Point2(); + bool is_hovering_h_guide = false; + bool is_hovering_v_guide = false; bool updating_value_dialog; @@ -432,7 +380,7 @@ private: Vector2 _position_to_anchor(const Control *p_control, Vector2 position); void _popup_callback(int p_op); - bool updating_scroll; + bool updating_scroll = false; void _update_scroll(real_t); void _update_scrollbars(); void _snap_changed(); @@ -441,10 +389,11 @@ private: void _add_node_pressed(int p_result); void _node_created(Node *p_node); void _reset_create_position(); + void _update_editor_settings(); UndoRedo *undo_redo; - List<CanvasItem *> _get_edited_canvas_items(bool retreive_locked = false, bool remove_canvas_item_if_parent_in_selection = true); + List<CanvasItem *> _get_edited_canvas_items(bool retrieve_locked = false, bool remove_canvas_item_if_parent_in_selection = true); Rect2 _get_encompassing_rect_from_list(List<CanvasItem *> p_list); void _expand_encompassing_rect_using_children(Rect2 &r_rect, const Node *p_node, bool &r_first, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D(), bool include_locked_nodes = true); Rect2 _get_encompassing_rect(const Node *p_node); @@ -518,15 +467,10 @@ private: const SnapTarget p_snap_target, List<const CanvasItem *> p_exceptions, const Node *p_current); - void _set_anchors_preset(Control::LayoutPreset p_preset); - void _set_anchors_and_offsets_preset(Control::LayoutPreset p_preset); - void _set_anchors_and_offsets_to_keep_ratio(); - - void _button_toggle_anchor_mode(bool p_status); - VBoxContainer *controls_vb; EditorZoomWidget *zoom_widget; void _update_zoom(real_t p_zoom); + void _shortcut_zoom_set(real_t p_zoom); void _zoom_on_position(real_t p_zoom, Point2 p_position = Point2()); void _button_toggle_smart_snap(bool p_status); void _button_toggle_grid_snap(bool p_status); @@ -602,18 +546,15 @@ public: void focus_selection(); - bool is_anchors_mode_enabled() { return anchors_mode; }; - EditorSelection *editor_selection; - CanvasItemEditor(EditorNode *p_editor); + CanvasItemEditor(); }; class CanvasItemEditorPlugin : public EditorPlugin { GDCLASS(CanvasItemEditorPlugin, EditorPlugin); CanvasItemEditor *canvas_item_editor; - EditorNode *editor; public: virtual String get_name() const override { return "2D"; } @@ -626,7 +567,7 @@ public: CanvasItemEditor *get_canvas_item_editor() { return canvas_item_editor; } - CanvasItemEditorPlugin(EditorNode *p_node); + CanvasItemEditorPlugin(); ~CanvasItemEditorPlugin(); }; @@ -642,7 +583,6 @@ class CanvasItemEditorViewport : public Control { Node *target_node; Point2 drop_pos; - EditorNode *editor; EditorData *editor_data; CanvasItemEditor *canvas_item_editor; Control *preview_node; @@ -669,6 +609,7 @@ class CanvasItemEditorViewport : public Control { bool _create_instance(Node *parent, String &path, const Point2 &p_point); void _perform_drop_data(); void _show_resource_type_selector(); + void _update_theme(); static void _bind_methods(); @@ -679,8 +620,8 @@ public: virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const override; virtual void drop_data(const Point2 &p_point, const Variant &p_data) override; - CanvasItemEditorViewport(EditorNode *p_node, CanvasItemEditor *p_canvas_item_editor); + CanvasItemEditorViewport(CanvasItemEditor *p_canvas_item_editor); ~CanvasItemEditorViewport(); }; -#endif +#endif //CANVAS_ITEM_EDITOR_PLUGIN_H diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.cpp b/editor/plugins/collision_polygon_2d_editor_plugin.cpp index 22d3768a97..5d769e7987 100644 --- a/editor/plugins/collision_polygon_2d_editor_plugin.cpp +++ b/editor/plugins/collision_polygon_2d_editor_plugin.cpp @@ -38,11 +38,11 @@ void CollisionPolygon2DEditor::_set_node(Node *p_polygon) { node = Object::cast_to<CollisionPolygon2D>(p_polygon); } -CollisionPolygon2DEditor::CollisionPolygon2DEditor(EditorNode *p_editor) : - AbstractPolygon2DEditor(p_editor) { +CollisionPolygon2DEditor::CollisionPolygon2DEditor() : + AbstractPolygon2DEditor() { node = nullptr; } -CollisionPolygon2DEditorPlugin::CollisionPolygon2DEditorPlugin(EditorNode *p_node) : - AbstractPolygon2DEditorPlugin(p_node, memnew(CollisionPolygon2DEditor(p_node)), "CollisionPolygon2D") { +CollisionPolygon2DEditorPlugin::CollisionPolygon2DEditorPlugin() : + AbstractPolygon2DEditorPlugin(memnew(CollisionPolygon2DEditor), "CollisionPolygon2D") { } diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.h b/editor/plugins/collision_polygon_2d_editor_plugin.h index cf2e452937..bdd4228b3b 100644 --- a/editor/plugins/collision_polygon_2d_editor_plugin.h +++ b/editor/plugins/collision_polygon_2d_editor_plugin.h @@ -44,14 +44,14 @@ protected: virtual void _set_node(Node *p_polygon) override; public: - CollisionPolygon2DEditor(EditorNode *p_editor); + CollisionPolygon2DEditor(); }; class CollisionPolygon2DEditorPlugin : public AbstractPolygon2DEditorPlugin { GDCLASS(CollisionPolygon2DEditorPlugin, AbstractPolygon2DEditorPlugin); public: - CollisionPolygon2DEditorPlugin(EditorNode *p_node); + CollisionPolygon2DEditorPlugin(); }; #endif // COLLISION_POLYGON_2D_EDITOR_PLUGIN_H diff --git a/editor/plugins/collision_shape_2d_editor_plugin.cpp b/editor/plugins/collision_shape_2d_editor_plugin.cpp index 8a5df6ac50..af20064a8d 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.cpp +++ b/editor/plugins/collision_shape_2d_editor_plugin.cpp @@ -32,6 +32,7 @@ #include "canvas_item_editor_plugin.h" #include "core/os/keyboard.h" +#include "editor/editor_node.h" #include "scene/resources/capsule_shape_2d.h" #include "scene/resources/circle_shape_2d.h" #include "scene/resources/concave_polygon_shape_2d.h" @@ -323,6 +324,10 @@ bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_e return false; } + if (!node->is_visible_in_tree()) { + return false; + } + if (shape_type == -1) { return false; } @@ -445,6 +450,10 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla return; } + if (!node->is_visible_in_tree()) { + return; + } + _get_current_shape_type(); if (shape_type == -1) { @@ -574,12 +583,11 @@ void CollisionShape2DEditor::_bind_methods() { ClassDB::bind_method("_get_current_shape_type", &CollisionShape2DEditor::_get_current_shape_type); } -CollisionShape2DEditor::CollisionShape2DEditor(EditorNode *p_editor) { +CollisionShape2DEditor::CollisionShape2DEditor() { node = nullptr; canvas_item_editor = nullptr; - editor = p_editor; - undo_redo = p_editor->get_undo_redo(); + undo_redo = EditorNode::get_singleton()->get_undo_redo(); edit_handle = -1; pressed = false; @@ -601,11 +609,9 @@ void CollisionShape2DEditorPlugin::make_visible(bool visible) { } } -CollisionShape2DEditorPlugin::CollisionShape2DEditorPlugin(EditorNode *p_editor) { - editor = p_editor; - - collision_shape_2d_editor = memnew(CollisionShape2DEditor(p_editor)); - p_editor->get_gui_base()->add_child(collision_shape_2d_editor); +CollisionShape2DEditorPlugin::CollisionShape2DEditorPlugin() { + collision_shape_2d_editor = memnew(CollisionShape2DEditor); + EditorNode::get_singleton()->get_gui_base()->add_child(collision_shape_2d_editor); } CollisionShape2DEditorPlugin::~CollisionShape2DEditorPlugin() { diff --git a/editor/plugins/collision_shape_2d_editor_plugin.h b/editor/plugins/collision_shape_2d_editor_plugin.h index 1c01b7019f..033ea3db93 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.h +++ b/editor/plugins/collision_shape_2d_editor_plugin.h @@ -31,9 +31,7 @@ #ifndef COLLISION_SHAPE_2D_EDITOR_PLUGIN_H #define COLLISION_SHAPE_2D_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" - #include "scene/2d/collision_shape_2d.h" class CanvasItemEditor; @@ -63,7 +61,6 @@ class CollisionShape2DEditor : public Control { Point2(1, -1), }; - EditorNode *editor; UndoRedo *undo_redo; CanvasItemEditor *canvas_item_editor; CollisionShape2D *node; @@ -93,14 +90,13 @@ public: void forward_canvas_draw_over_viewport(Control *p_overlay); void edit(Node *p_node); - CollisionShape2DEditor(EditorNode *p_editor); + CollisionShape2DEditor(); }; class CollisionShape2DEditorPlugin : public EditorPlugin { GDCLASS(CollisionShape2DEditorPlugin, EditorPlugin); CollisionShape2DEditor *collision_shape_2d_editor; - EditorNode *editor; public: virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override { return collision_shape_2d_editor->forward_canvas_gui_input(p_event); } @@ -112,7 +108,7 @@ public: virtual bool handles(Object *p_obj) const override; virtual void make_visible(bool visible) override; - CollisionShape2DEditorPlugin(EditorNode *p_editor); + CollisionShape2DEditorPlugin(); ~CollisionShape2DEditorPlugin(); }; diff --git a/editor/plugins/control_editor_plugin.cpp b/editor/plugins/control_editor_plugin.cpp new file mode 100644 index 0000000000..7b85fea1e9 --- /dev/null +++ b/editor/plugins/control_editor_plugin.cpp @@ -0,0 +1,1034 @@ +/*************************************************************************/ +/* control_editor_plugin.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "control_editor_plugin.h" + +#include "editor/editor_node.h" +#include "editor/plugins/canvas_item_editor_plugin.h" + +void ControlPositioningWarning::_update_warning() { + if (!control_node) { + title_icon->set_texture(nullptr); + title_label->set_text(""); + hint_label->set_text(""); + return; + } + + Node *parent_node = control_node->get_parent_control(); + if (!parent_node) { + title_icon->set_texture(get_theme_icon(SNAME("SubViewport"), SNAME("EditorIcons"))); + title_label->set_text(TTR("This node doesn't have a control parent.")); + hint_label->set_text(TTR("Use the appropriate layout properties depending on where you are going to put it.")); + } else if (Object::cast_to<Container>(parent_node)) { + title_icon->set_texture(get_theme_icon(SNAME("Container"), SNAME("EditorIcons"))); + title_label->set_text(TTR("This node is a child of a container.")); + hint_label->set_text(TTR("Use container properties for positioning.")); + } else { + title_icon->set_texture(get_theme_icon(SNAME("ControlLayout"), SNAME("EditorIcons"))); + title_label->set_text(TTR("This node is a child of a regular control.")); + hint_label->set_text(TTR("Use anchors and the rectangle for positioning.")); + } + + bg_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg_group_note"), SNAME("EditorProperty"))); +} + +void ControlPositioningWarning::_update_toggler() { + Ref<Texture2D> arrow; + if (hint_label->is_visible()) { + arrow = get_theme_icon(SNAME("arrow"), SNAME("Tree")); + set_tooltip(TTR("Collapse positioning hint.")); + } else { + if (is_layout_rtl()) { + arrow = get_theme_icon(SNAME("arrow_collapsed"), SNAME("Tree")); + } else { + arrow = get_theme_icon(SNAME("arrow_collapsed_mirrored"), SNAME("Tree")); + } + set_tooltip(TTR("Expand positioning hint.")); + } + + hint_icon->set_texture(arrow); +} + +void ControlPositioningWarning::set_control(Control *p_node) { + control_node = p_node; + _update_warning(); +} + +void ControlPositioningWarning::gui_input(const Ref<InputEvent> &p_event) { + Ref<InputEventMouseButton> mb = p_event; + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { + bool state = !hint_label->is_visible(); + + hint_filler_left->set_visible(state); + hint_label->set_visible(state); + hint_filler_right->set_visible(state); + + _update_toggler(); + } +} + +void ControlPositioningWarning::_notification(int p_notification) { + switch (p_notification) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: + _update_warning(); + _update_toggler(); + break; + } +} + +ControlPositioningWarning::ControlPositioningWarning() { + set_mouse_filter(MOUSE_FILTER_STOP); + + bg_panel = memnew(PanelContainer); + bg_panel->set_mouse_filter(MOUSE_FILTER_IGNORE); + add_child(bg_panel); + + grid = memnew(GridContainer); + grid->set_columns(3); + bg_panel->add_child(grid); + + title_icon = memnew(TextureRect); + title_icon->set_stretch_mode(TextureRect::StretchMode::STRETCH_KEEP_CENTERED); + grid->add_child(title_icon); + + title_label = memnew(Label); + title_label->set_autowrap_mode(Label::AutowrapMode::AUTOWRAP_WORD); + title_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); + title_label->set_vertical_alignment(VerticalAlignment::VERTICAL_ALIGNMENT_CENTER); + grid->add_child(title_label); + + hint_icon = memnew(TextureRect); + hint_icon->set_stretch_mode(TextureRect::StretchMode::STRETCH_KEEP_CENTERED); + grid->add_child(hint_icon); + + // Filler. + hint_filler_left = memnew(Control); + hint_filler_left->hide(); + grid->add_child(hint_filler_left); + + hint_label = memnew(Label); + hint_label->set_autowrap_mode(Label::AutowrapMode::AUTOWRAP_WORD); + hint_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); + hint_label->set_vertical_alignment(VerticalAlignment::VERTICAL_ALIGNMENT_CENTER); + hint_label->hide(); + grid->add_child(hint_label); + + // Filler. + hint_filler_right = memnew(Control); + hint_filler_right->hide(); + grid->add_child(hint_filler_right); +} + +void EditorPropertyAnchorsPreset::_set_read_only(bool p_read_only) { + options->set_disabled(p_read_only); +}; + +void EditorPropertyAnchorsPreset::_option_selected(int p_which) { + int64_t val = options->get_item_metadata(p_which); + emit_changed(get_edited_property(), val); +} + +void EditorPropertyAnchorsPreset::update_property() { + int64_t which = get_edited_object()->get(get_edited_property()); + + for (int i = 0; i < options->get_item_count(); i++) { + Variant val = options->get_item_metadata(i); + if (val != Variant() && which == (int64_t)val) { + options->select(i); + return; + } + } +} + +void EditorPropertyAnchorsPreset::setup(const Vector<String> &p_options) { + options->clear(); + + Vector<String> split_after; + split_after.append("Custom"); + split_after.append("PresetWide"); + split_after.append("PresetBottomLeft"); + split_after.append("PresetCenter"); + + for (int i = 0, j = 0; i < p_options.size(); i++, j++) { + Vector<String> text_split = p_options[i].split(":"); + int64_t current_val = text_split[1].to_int(); + + String humanized_name = text_split[0]; + if (humanized_name.begins_with("Preset")) { + if (humanized_name == "PresetWide") { + humanized_name = "Full Rect"; + } else { + humanized_name = humanized_name.trim_prefix("Preset"); + humanized_name = humanized_name.capitalize(); + } + + String icon_name = text_split[0].trim_prefix("Preset"); + icon_name = "ControlAlign" + icon_name; + options->add_icon_item(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(icon_name, "EditorIcons"), humanized_name); + } else { + options->add_item(humanized_name); + } + + options->set_item_metadata(j, current_val); + if (split_after.has(text_split[0])) { + options->add_separator(); + j++; + } + } +} + +EditorPropertyAnchorsPreset::EditorPropertyAnchorsPreset() { + options = memnew(OptionButton); + options->set_clip_text(true); + options->set_flat(true); + add_child(options); + add_focusable(options); + options->connect("item_selected", callable_mp(this, &EditorPropertyAnchorsPreset::_option_selected)); +} + +void EditorPropertySizeFlags::_set_read_only(bool p_read_only) { + for (CheckBox *check : flag_checks) { + check->set_disabled(p_read_only); + } + flag_presets->set_disabled(p_read_only); +}; + +void EditorPropertySizeFlags::_preset_selected(int p_which) { + int preset = flag_presets->get_item_id(p_which); + if (preset == SIZE_FLAGS_PRESET_CUSTOM) { + flag_options->set_visible(true); + return; + } + flag_options->set_visible(false); + + uint32_t value = 0; + switch (preset) { + case SIZE_FLAGS_PRESET_FILL: + value = Control::SIZE_FILL; + break; + case SIZE_FLAGS_PRESET_SHRINK_BEGIN: + value = Control::SIZE_SHRINK_BEGIN; + break; + case SIZE_FLAGS_PRESET_SHRINK_CENTER: + value = Control::SIZE_SHRINK_CENTER; + break; + case SIZE_FLAGS_PRESET_SHRINK_END: + value = Control::SIZE_SHRINK_END; + break; + } + + bool is_expand = flag_expand->is_visible() && flag_expand->is_pressed(); + if (is_expand) { + value |= Control::SIZE_EXPAND; + } + + emit_changed(get_edited_property(), value); +} + +void EditorPropertySizeFlags::_expand_toggled() { + uint32_t value = get_edited_object()->get(get_edited_property()); + + if (flag_expand->is_visible() && flag_expand->is_pressed()) { + value |= Control::SIZE_EXPAND; + } else { + value ^= Control::SIZE_EXPAND; + } + + // Keep the custom preset selected as we toggle individual flags. + keep_selected_preset = true; + emit_changed(get_edited_property(), value); +} + +void EditorPropertySizeFlags::_flag_toggled() { + uint32_t value = 0; + for (int i = 0; i < flag_checks.size(); i++) { + if (flag_checks[i]->is_pressed()) { + int flag_value = flag_checks[i]->get_meta("_value"); + value |= flag_value; + } + } + + bool is_expand = flag_expand->is_visible() && flag_expand->is_pressed(); + if (is_expand) { + value |= Control::SIZE_EXPAND; + } + + // Keep the custom preset selected as we toggle individual flags. + keep_selected_preset = true; + emit_changed(get_edited_property(), value); +} + +void EditorPropertySizeFlags::update_property() { + uint32_t value = get_edited_object()->get(get_edited_property()); + + for (int i = 0; i < flag_checks.size(); i++) { + int flag_value = flag_checks[i]->get_meta("_value"); + if (value & flag_value) { + flag_checks[i]->set_pressed(true); + } else { + flag_checks[i]->set_pressed(false); + } + } + + bool is_expand = value & Control::SIZE_EXPAND; + flag_expand->set_pressed(is_expand); + + if (keep_selected_preset) { + keep_selected_preset = false; + return; + } + + FlagPreset preset = SIZE_FLAGS_PRESET_CUSTOM; + if (value == Control::SIZE_FILL || value == (Control::SIZE_FILL | Control::SIZE_EXPAND)) { + preset = SIZE_FLAGS_PRESET_FILL; + } else if (value == Control::SIZE_SHRINK_BEGIN || value == (Control::SIZE_SHRINK_BEGIN | Control::SIZE_EXPAND)) { + preset = SIZE_FLAGS_PRESET_SHRINK_BEGIN; + } else if (value == Control::SIZE_SHRINK_CENTER || value == (Control::SIZE_SHRINK_CENTER | Control::SIZE_EXPAND)) { + preset = SIZE_FLAGS_PRESET_SHRINK_CENTER; + } else if (value == Control::SIZE_SHRINK_END || value == (Control::SIZE_SHRINK_END | Control::SIZE_EXPAND)) { + preset = SIZE_FLAGS_PRESET_SHRINK_END; + } + + int preset_idx = flag_presets->get_item_index(preset); + if (preset_idx >= 0) { + flag_presets->select(preset_idx); + } + flag_options->set_visible(preset == SIZE_FLAGS_PRESET_CUSTOM); +} + +void EditorPropertySizeFlags::setup(const Vector<String> &p_options, bool p_vertical) { + vertical = p_vertical; + + if (p_options.size() == 0) { + flag_presets->clear(); + flag_presets->add_item(TTR("Container Default")); + flag_presets->set_disabled(true); + flag_expand->set_visible(false); + return; + } + + Map<int, String> flags; + for (int i = 0, j = 0; i < p_options.size(); i++, j++) { + Vector<String> text_split = p_options[i].split(":"); + int64_t current_val = text_split[1].to_int(); + flags[current_val] = text_split[0]; + + if (current_val == SIZE_EXPAND) { + continue; + } + + CheckBox *cb = memnew(CheckBox); + cb->set_text(text_split[0]); + cb->set_clip_text(true); + cb->set_meta("_value", current_val); + cb->connect("pressed", callable_mp(this, &EditorPropertySizeFlags::_flag_toggled)); + add_focusable(cb); + + flag_options->add_child(cb); + flag_checks.append(cb); + } + + Control *gui_base = EditorNode::get_singleton()->get_gui_base(); + String wide_preset_icon = SNAME("ControlAlignHCenterWide"); + String begin_preset_icon = SNAME("ControlAlignCenterLeft"); + String end_preset_icon = SNAME("ControlAlignCenterRight"); + if (vertical) { + wide_preset_icon = SNAME("ControlAlignVCenterWide"); + begin_preset_icon = SNAME("ControlAlignCenterTop"); + end_preset_icon = SNAME("ControlAlignCenterBottom"); + } + + flag_presets->clear(); + if (flags.has(SIZE_FILL)) { + flag_presets->add_icon_item(gui_base->get_theme_icon(wide_preset_icon, SNAME("EditorIcons")), TTR("Fill"), SIZE_FLAGS_PRESET_FILL); + } + // Shrink Begin is the same as no flags at all, as such it cannot be disabled. + flag_presets->add_icon_item(gui_base->get_theme_icon(begin_preset_icon, SNAME("EditorIcons")), TTR("Shrink Begin"), SIZE_FLAGS_PRESET_SHRINK_BEGIN); + if (flags.has(SIZE_SHRINK_CENTER)) { + flag_presets->add_icon_item(gui_base->get_theme_icon(SNAME("ControlAlignCenter"), SNAME("EditorIcons")), TTR("Shrink Center"), SIZE_FLAGS_PRESET_SHRINK_CENTER); + } + if (flags.has(SIZE_SHRINK_END)) { + flag_presets->add_icon_item(gui_base->get_theme_icon(end_preset_icon, SNAME("EditorIcons")), TTR("Shrink End"), SIZE_FLAGS_PRESET_SHRINK_END); + } + flag_presets->add_separator(); + flag_presets->add_item(TTR("Custom"), SIZE_FLAGS_PRESET_CUSTOM); + + flag_expand->set_visible(flags.has(SIZE_EXPAND)); +} + +EditorPropertySizeFlags::EditorPropertySizeFlags() { + VBoxContainer *vb = memnew(VBoxContainer); + add_child(vb); + + flag_presets = memnew(OptionButton); + flag_presets->set_clip_text(true); + flag_presets->set_flat(true); + vb->add_child(flag_presets); + add_focusable(flag_presets); + set_label_reference(flag_presets); + flag_presets->connect("item_selected", callable_mp(this, &EditorPropertySizeFlags::_preset_selected)); + + flag_options = memnew(VBoxContainer); + flag_options->hide(); + vb->add_child(flag_options); + + flag_expand = memnew(CheckBox); + flag_expand->set_text(TTR("Expand")); + vb->add_child(flag_expand); + add_focusable(flag_expand); + flag_expand->connect("pressed", callable_mp(this, &EditorPropertySizeFlags::_expand_toggled)); +} + +bool EditorInspectorPluginControl::can_handle(Object *p_object) { + return Object::cast_to<Control>(p_object) != nullptr; +} + +void EditorInspectorPluginControl::parse_group(Object *p_object, const String &p_group) { + Control *control = Object::cast_to<Control>(p_object); + if (!control || p_group != "Layout") { + return; + } + + ControlPositioningWarning *pos_warning = memnew(ControlPositioningWarning); + pos_warning->set_control(control); + add_custom_control(pos_warning); +} + +bool EditorInspectorPluginControl::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { + Control *control = Object::cast_to<Control>(p_object); + if (!control) { + return false; + } + + if (p_path == "anchors_preset") { + EditorPropertyAnchorsPreset *prop_editor = memnew(EditorPropertyAnchorsPreset); + Vector<String> options = p_hint_text.split(","); + prop_editor->setup(options); + add_property_editor(p_path, prop_editor); + + return true; + } + + if (p_path == "size_flags_horizontal" || p_path == "size_flags_vertical") { + EditorPropertySizeFlags *prop_editor = memnew(EditorPropertySizeFlags); + Vector<String> options; + if (!p_hint_text.is_empty()) { + options = p_hint_text.split(","); + } + prop_editor->setup(options, p_path == "size_flags_vertical"); + add_property_editor(p_path, prop_editor); + + return true; + } + + return false; +} + +void ControlEditorToolbar::_set_anchors_and_offsets_preset(Control::LayoutPreset p_preset) { + List<Node *> selection = editor_selection->get_selected_node_list(); + + undo_redo->create_action(TTR("Change Anchors and Offsets")); + + for (Node *E : selection) { + Control *control = Object::cast_to<Control>(E); + if (control) { + undo_redo->add_do_method(control, "set_anchors_preset", p_preset); + switch (p_preset) { + case PRESET_TOP_LEFT: + case PRESET_TOP_RIGHT: + case PRESET_BOTTOM_LEFT: + case PRESET_BOTTOM_RIGHT: + case PRESET_CENTER_LEFT: + case PRESET_CENTER_TOP: + case PRESET_CENTER_RIGHT: + case PRESET_CENTER_BOTTOM: + case PRESET_CENTER: + undo_redo->add_do_method(control, "set_offsets_preset", p_preset, Control::PRESET_MODE_KEEP_SIZE); + break; + case PRESET_LEFT_WIDE: + case PRESET_TOP_WIDE: + case PRESET_RIGHT_WIDE: + case PRESET_BOTTOM_WIDE: + case PRESET_VCENTER_WIDE: + case PRESET_HCENTER_WIDE: + case PRESET_WIDE: + undo_redo->add_do_method(control, "set_offsets_preset", p_preset, Control::PRESET_MODE_MINSIZE); + break; + } + undo_redo->add_undo_method(control, "_edit_set_state", control->_edit_get_state()); + } + } + + undo_redo->commit_action(); + + anchors_mode = false; + anchor_mode_button->set_pressed(anchors_mode); +} + +void ControlEditorToolbar::_set_anchors_and_offsets_to_keep_ratio() { + List<Node *> selection = editor_selection->get_selected_node_list(); + + undo_redo->create_action(TTR("Change Anchors and Offsets")); + + for (Node *E : selection) { + Control *control = Object::cast_to<Control>(E); + if (control) { + Point2 top_left_anchor = _position_to_anchor(control, Point2()); + Point2 bottom_right_anchor = _position_to_anchor(control, control->get_size()); + undo_redo->add_do_method(control, "set_anchor", SIDE_LEFT, top_left_anchor.x, false, true); + undo_redo->add_do_method(control, "set_anchor", SIDE_RIGHT, bottom_right_anchor.x, false, true); + undo_redo->add_do_method(control, "set_anchor", SIDE_TOP, top_left_anchor.y, false, true); + undo_redo->add_do_method(control, "set_anchor", SIDE_BOTTOM, bottom_right_anchor.y, false, true); + undo_redo->add_do_method(control, "set_meta", "_edit_use_anchors_", true); + + const bool use_anchors = control->has_meta("_edit_use_anchors_") && control->get_meta("_edit_use_anchors_"); + undo_redo->add_undo_method(control, "_edit_set_state", control->_edit_get_state()); + if (use_anchors) { + undo_redo->add_undo_method(control, "set_meta", "_edit_use_anchors_", true); + } else { + undo_redo->add_undo_method(control, "remove_meta", "_edit_use_anchors_"); + } + + anchors_mode = true; + anchor_mode_button->set_pressed(anchors_mode); + } + } + + undo_redo->commit_action(); +} + +void ControlEditorToolbar::_set_anchors_preset(Control::LayoutPreset p_preset) { + List<Node *> selection = editor_selection->get_selected_node_list(); + + undo_redo->create_action(TTR("Change Anchors")); + for (Node *E : selection) { + Control *control = Object::cast_to<Control>(E); + if (control) { + undo_redo->add_do_method(control, "set_anchors_preset", p_preset); + undo_redo->add_undo_method(control, "_edit_set_state", control->_edit_get_state()); + } + } + + undo_redo->commit_action(); +} + +void ControlEditorToolbar::_set_container_h_preset(Control::SizeFlags p_preset) { + List<Node *> selection = editor_selection->get_selected_node_list(); + + undo_redo->create_action(TTR("Change Horizontal Size Flags")); + for (Node *E : selection) { + Control *control = Object::cast_to<Control>(E); + if (control) { + undo_redo->add_do_method(control, "set_h_size_flags", p_preset); + undo_redo->add_undo_method(control, "_edit_set_state", control->_edit_get_state()); + } + } + + undo_redo->commit_action(); +} + +void ControlEditorToolbar::_set_container_v_preset(Control::SizeFlags p_preset) { + List<Node *> selection = editor_selection->get_selected_node_list(); + + undo_redo->create_action(TTR("Change Horizontal Size Flags")); + for (Node *E : selection) { + Control *control = Object::cast_to<Control>(E); + if (control) { + undo_redo->add_do_method(control, "set_v_size_flags", p_preset); + undo_redo->add_undo_method(control, "_edit_set_state", control->_edit_get_state()); + } + } + + undo_redo->commit_action(); +} + +Vector2 ControlEditorToolbar::_anchor_to_position(const Control *p_control, Vector2 anchor) { + ERR_FAIL_COND_V(!p_control, Vector2()); + + Transform2D parent_transform = p_control->get_transform().affine_inverse(); + Rect2 parent_rect = p_control->get_parent_anchorable_rect(); + + if (p_control->is_layout_rtl()) { + return parent_transform.xform(parent_rect.position + Vector2(parent_rect.size.x - parent_rect.size.x * anchor.x, parent_rect.size.y * anchor.y)); + } else { + return parent_transform.xform(parent_rect.position + Vector2(parent_rect.size.x * anchor.x, parent_rect.size.y * anchor.y)); + } +} + +Vector2 ControlEditorToolbar::_position_to_anchor(const Control *p_control, Vector2 position) { + ERR_FAIL_COND_V(!p_control, Vector2()); + + Rect2 parent_rect = p_control->get_parent_anchorable_rect(); + + Vector2 output = Vector2(); + if (p_control->is_layout_rtl()) { + output.x = (parent_rect.size.x == 0) ? 0.0 : (parent_rect.size.x - p_control->get_transform().xform(position).x - parent_rect.position.x) / parent_rect.size.x; + } else { + output.x = (parent_rect.size.x == 0) ? 0.0 : (p_control->get_transform().xform(position).x - parent_rect.position.x) / parent_rect.size.x; + } + output.y = (parent_rect.size.y == 0) ? 0.0 : (p_control->get_transform().xform(position).y - parent_rect.position.y) / parent_rect.size.y; + return output; +} + +void ControlEditorToolbar::_button_toggle_anchor_mode(bool p_status) { + List<Control *> selection = _get_edited_controls(false, false); + for (Control *E : selection) { + if (Object::cast_to<Container>(E->get_parent())) { + continue; + } + + if (p_status) { + E->set_meta("_edit_use_anchors_", true); + } else { + E->remove_meta("_edit_use_anchors_"); + } + } + + anchors_mode = p_status; + CanvasItemEditor::get_singleton()->update_viewport(); +} + +bool ControlEditorToolbar::_is_node_locked(const Node *p_node) { + return p_node->has_meta("_edit_lock_") && p_node->get_meta("_edit_lock_"); +} + +List<Control *> ControlEditorToolbar::_get_edited_controls(bool retrieve_locked, bool remove_controls_if_parent_in_selection) { + List<Control *> selection; + for (const KeyValue<Node *, Object *> &E : editor_selection->get_selection()) { + Control *control = Object::cast_to<Control>(E.key); + if (control && control->is_visible_in_tree() && control->get_viewport() == EditorNode::get_singleton()->get_scene_root() && (retrieve_locked || !_is_node_locked(control))) { + selection.push_back(control); + } + } + + if (remove_controls_if_parent_in_selection) { + List<Control *> filtered_selection; + for (Control *E : selection) { + if (!selection.find(E->get_parent())) { + filtered_selection.push_back(E); + } + } + return filtered_selection; + } + + return selection; +} + +void ControlEditorToolbar::_popup_callback(int p_op) { + switch (p_op) { + case ANCHORS_AND_OFFSETS_PRESET_TOP_LEFT: { + _set_anchors_and_offsets_preset(PRESET_TOP_LEFT); + } break; + case ANCHORS_AND_OFFSETS_PRESET_TOP_RIGHT: { + _set_anchors_and_offsets_preset(PRESET_TOP_RIGHT); + } break; + case ANCHORS_AND_OFFSETS_PRESET_BOTTOM_LEFT: { + _set_anchors_and_offsets_preset(PRESET_BOTTOM_LEFT); + } break; + case ANCHORS_AND_OFFSETS_PRESET_BOTTOM_RIGHT: { + _set_anchors_and_offsets_preset(PRESET_BOTTOM_RIGHT); + } break; + case ANCHORS_AND_OFFSETS_PRESET_CENTER_LEFT: { + _set_anchors_and_offsets_preset(PRESET_CENTER_LEFT); + } break; + case ANCHORS_AND_OFFSETS_PRESET_CENTER_RIGHT: { + _set_anchors_and_offsets_preset(PRESET_CENTER_RIGHT); + } break; + case ANCHORS_AND_OFFSETS_PRESET_CENTER_TOP: { + _set_anchors_and_offsets_preset(PRESET_CENTER_TOP); + } break; + case ANCHORS_AND_OFFSETS_PRESET_CENTER_BOTTOM: { + _set_anchors_and_offsets_preset(PRESET_CENTER_BOTTOM); + } break; + case ANCHORS_AND_OFFSETS_PRESET_CENTER: { + _set_anchors_and_offsets_preset(PRESET_CENTER); + } break; + case ANCHORS_AND_OFFSETS_PRESET_TOP_WIDE: { + _set_anchors_and_offsets_preset(PRESET_TOP_WIDE); + } break; + case ANCHORS_AND_OFFSETS_PRESET_LEFT_WIDE: { + _set_anchors_and_offsets_preset(PRESET_LEFT_WIDE); + } break; + case ANCHORS_AND_OFFSETS_PRESET_RIGHT_WIDE: { + _set_anchors_and_offsets_preset(PRESET_RIGHT_WIDE); + } break; + case ANCHORS_AND_OFFSETS_PRESET_BOTTOM_WIDE: { + _set_anchors_and_offsets_preset(PRESET_BOTTOM_WIDE); + } break; + case ANCHORS_AND_OFFSETS_PRESET_VCENTER_WIDE: { + _set_anchors_and_offsets_preset(PRESET_VCENTER_WIDE); + } break; + case ANCHORS_AND_OFFSETS_PRESET_HCENTER_WIDE: { + _set_anchors_and_offsets_preset(PRESET_HCENTER_WIDE); + } break; + case ANCHORS_AND_OFFSETS_PRESET_WIDE: { + _set_anchors_and_offsets_preset(Control::PRESET_WIDE); + } break; + case ANCHORS_AND_OFFSETS_PRESET_KEEP_RATIO: { + _set_anchors_and_offsets_to_keep_ratio(); + } break; + + case ANCHORS_PRESET_TOP_LEFT: { + _set_anchors_preset(PRESET_TOP_LEFT); + } break; + case ANCHORS_PRESET_TOP_RIGHT: { + _set_anchors_preset(PRESET_TOP_RIGHT); + } break; + case ANCHORS_PRESET_BOTTOM_LEFT: { + _set_anchors_preset(PRESET_BOTTOM_LEFT); + } break; + case ANCHORS_PRESET_BOTTOM_RIGHT: { + _set_anchors_preset(PRESET_BOTTOM_RIGHT); + } break; + case ANCHORS_PRESET_CENTER_LEFT: { + _set_anchors_preset(PRESET_CENTER_LEFT); + } break; + case ANCHORS_PRESET_CENTER_RIGHT: { + _set_anchors_preset(PRESET_CENTER_RIGHT); + } break; + case ANCHORS_PRESET_CENTER_TOP: { + _set_anchors_preset(PRESET_CENTER_TOP); + } break; + case ANCHORS_PRESET_CENTER_BOTTOM: { + _set_anchors_preset(PRESET_CENTER_BOTTOM); + } break; + case ANCHORS_PRESET_CENTER: { + _set_anchors_preset(PRESET_CENTER); + } break; + case ANCHORS_PRESET_TOP_WIDE: { + _set_anchors_preset(PRESET_TOP_WIDE); + } break; + case ANCHORS_PRESET_LEFT_WIDE: { + _set_anchors_preset(PRESET_LEFT_WIDE); + } break; + case ANCHORS_PRESET_RIGHT_WIDE: { + _set_anchors_preset(PRESET_RIGHT_WIDE); + } break; + case ANCHORS_PRESET_BOTTOM_WIDE: { + _set_anchors_preset(PRESET_BOTTOM_WIDE); + } break; + case ANCHORS_PRESET_VCENTER_WIDE: { + _set_anchors_preset(PRESET_VCENTER_WIDE); + } break; + case ANCHORS_PRESET_HCENTER_WIDE: { + _set_anchors_preset(PRESET_HCENTER_WIDE); + } break; + case ANCHORS_PRESET_WIDE: { + _set_anchors_preset(Control::PRESET_WIDE); + } break; + + case CONTAINERS_H_PRESET_FILL: { + _set_container_h_preset(Control::SIZE_FILL); + } break; + case CONTAINERS_H_PRESET_FILL_EXPAND: { + _set_container_h_preset(Control::SIZE_EXPAND_FILL); + } break; + case CONTAINERS_H_PRESET_SHRINK_BEGIN: { + _set_container_h_preset(Control::SIZE_SHRINK_BEGIN); + } break; + case CONTAINERS_H_PRESET_SHRINK_CENTER: { + _set_container_h_preset(Control::SIZE_SHRINK_CENTER); + } break; + case CONTAINERS_H_PRESET_SHRINK_END: { + _set_container_h_preset(Control::SIZE_SHRINK_END); + } break; + + case CONTAINERS_V_PRESET_FILL: { + _set_container_v_preset(Control::SIZE_FILL); + } break; + case CONTAINERS_V_PRESET_FILL_EXPAND: { + _set_container_v_preset(Control::SIZE_EXPAND_FILL); + } break; + case CONTAINERS_V_PRESET_SHRINK_BEGIN: { + _set_container_v_preset(Control::SIZE_SHRINK_BEGIN); + } break; + case CONTAINERS_V_PRESET_SHRINK_CENTER: { + _set_container_v_preset(Control::SIZE_SHRINK_CENTER); + } break; + case CONTAINERS_V_PRESET_SHRINK_END: { + _set_container_v_preset(Control::SIZE_SHRINK_END); + } break; + } +} + +void ControlEditorToolbar::_selection_changed() { + // Update the anchors_mode. + int nb_controls = 0; + int nb_valid_controls = 0; + int nb_anchors_mode = 0; + + List<Node *> selection = editor_selection->get_selected_node_list(); + for (Node *E : selection) { + Control *control = Object::cast_to<Control>(E); + if (!control) { + continue; + } + + nb_controls++; + if (Object::cast_to<Container>(control->get_parent())) { + continue; + } + + nb_valid_controls++; + if (control->has_meta("_edit_use_anchors_") && control->get_meta("_edit_use_anchors_")) { + nb_anchors_mode++; + } + } + + anchors_mode = (nb_valid_controls == nb_anchors_mode); + anchor_mode_button->set_pressed(anchors_mode); + + if (nb_controls > 0) { + set_physics_process(true); + } else { + set_physics_process(false); + set_visible(false); + } +} + +void ControlEditorToolbar::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + anchor_layouts_icon->set_texture(get_theme_icon(SNAME("ControlLayout"), SNAME("EditorIcons"))); + + PopupMenu *p = anchor_presets_menu->get_popup(); + p->clear(); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignTopLeft"), SNAME("EditorIcons")), TTR("Top Left"), ANCHORS_AND_OFFSETS_PRESET_TOP_LEFT); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignTopRight"), SNAME("EditorIcons")), TTR("Top Right"), ANCHORS_AND_OFFSETS_PRESET_TOP_RIGHT); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomRight"), SNAME("EditorIcons")), TTR("Bottom Right"), ANCHORS_AND_OFFSETS_PRESET_BOTTOM_RIGHT); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomLeft"), SNAME("EditorIcons")), TTR("Bottom Left"), ANCHORS_AND_OFFSETS_PRESET_BOTTOM_LEFT); + p->add_separator(); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterLeft"), SNAME("EditorIcons")), TTR("Center Left"), ANCHORS_AND_OFFSETS_PRESET_CENTER_LEFT); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterTop"), SNAME("EditorIcons")), TTR("Center Top"), ANCHORS_AND_OFFSETS_PRESET_CENTER_TOP); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterRight"), SNAME("EditorIcons")), TTR("Center Right"), ANCHORS_AND_OFFSETS_PRESET_CENTER_RIGHT); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterBottom"), SNAME("EditorIcons")), TTR("Center Bottom"), ANCHORS_AND_OFFSETS_PRESET_CENTER_BOTTOM); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenter"), SNAME("EditorIcons")), TTR("Center"), ANCHORS_AND_OFFSETS_PRESET_CENTER); + p->add_separator(); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignLeftWide"), SNAME("EditorIcons")), TTR("Left Wide"), ANCHORS_AND_OFFSETS_PRESET_LEFT_WIDE); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignTopWide"), SNAME("EditorIcons")), TTR("Top Wide"), ANCHORS_AND_OFFSETS_PRESET_TOP_WIDE); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignRightWide"), SNAME("EditorIcons")), TTR("Right Wide"), ANCHORS_AND_OFFSETS_PRESET_RIGHT_WIDE); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomWide"), SNAME("EditorIcons")), TTR("Bottom Wide"), ANCHORS_AND_OFFSETS_PRESET_BOTTOM_WIDE); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignVCenterWide"), SNAME("EditorIcons")), TTR("VCenter Wide"), ANCHORS_AND_OFFSETS_PRESET_VCENTER_WIDE); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignHCenterWide"), SNAME("EditorIcons")), TTR("HCenter Wide"), ANCHORS_AND_OFFSETS_PRESET_HCENTER_WIDE); + p->add_separator(); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignWide"), SNAME("EditorIcons")), TTR("Full Rect"), ANCHORS_AND_OFFSETS_PRESET_WIDE); + p->add_icon_item(get_theme_icon(SNAME("Anchor"), SNAME("EditorIcons")), TTR("Keep Current Ratio"), ANCHORS_AND_OFFSETS_PRESET_KEEP_RATIO); + p->set_item_tooltip(19, TTR("Adjust anchors and offsets to match the current rect size.")); + + p->add_separator(); + p->add_submenu_item(TTR("Anchors only"), "Anchors"); + p->set_item_icon(21, get_theme_icon(SNAME("Anchor"), SNAME("EditorIcons"))); + + anchors_popup->clear(); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignTopLeft"), SNAME("EditorIcons")), TTR("Top Left"), ANCHORS_PRESET_TOP_LEFT); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignTopRight"), SNAME("EditorIcons")), TTR("Top Right"), ANCHORS_PRESET_TOP_RIGHT); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomRight"), SNAME("EditorIcons")), TTR("Bottom Right"), ANCHORS_PRESET_BOTTOM_RIGHT); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomLeft"), SNAME("EditorIcons")), TTR("Bottom Left"), ANCHORS_PRESET_BOTTOM_LEFT); + anchors_popup->add_separator(); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterLeft"), SNAME("EditorIcons")), TTR("Center Left"), ANCHORS_PRESET_CENTER_LEFT); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterTop"), SNAME("EditorIcons")), TTR("Center Top"), ANCHORS_PRESET_CENTER_TOP); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterRight"), SNAME("EditorIcons")), TTR("Center Right"), ANCHORS_PRESET_CENTER_RIGHT); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterBottom"), SNAME("EditorIcons")), TTR("Center Bottom"), ANCHORS_PRESET_CENTER_BOTTOM); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignCenter"), SNAME("EditorIcons")), TTR("Center"), ANCHORS_PRESET_CENTER); + anchors_popup->add_separator(); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignLeftWide"), SNAME("EditorIcons")), TTR("Left Wide"), ANCHORS_PRESET_LEFT_WIDE); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignTopWide"), SNAME("EditorIcons")), TTR("Top Wide"), ANCHORS_PRESET_TOP_WIDE); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignRightWide"), SNAME("EditorIcons")), TTR("Right Wide"), ANCHORS_PRESET_RIGHT_WIDE); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignBottomWide"), SNAME("EditorIcons")), TTR("Bottom Wide"), ANCHORS_PRESET_BOTTOM_WIDE); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignVCenterWide"), SNAME("EditorIcons")), TTR("VCenter Wide"), ANCHORS_PRESET_VCENTER_WIDE); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignHCenterWide"), SNAME("EditorIcons")), TTR("HCenter Wide"), ANCHORS_PRESET_HCENTER_WIDE); + anchors_popup->add_separator(); + anchors_popup->add_icon_item(get_theme_icon(SNAME("ControlAlignWide"), SNAME("EditorIcons")), TTR("Full Rect"), ANCHORS_PRESET_WIDE); + + anchor_mode_button->set_icon(get_theme_icon(SNAME("Anchor"), SNAME("EditorIcons"))); + + container_layouts_icon->set_texture(get_theme_icon(SNAME("Container"), SNAME("EditorIcons"))); + + p = container_h_presets_menu->get_popup(); + p->clear(); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignHCenterWide"), SNAME("EditorIcons")), TTR("Fill"), CONTAINERS_H_PRESET_FILL); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignHCenterWide"), SNAME("EditorIcons")), TTR("Fill & Expand"), CONTAINERS_H_PRESET_FILL_EXPAND); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterLeft"), SNAME("EditorIcons")), TTR("Shrink Begin"), CONTAINERS_H_PRESET_SHRINK_BEGIN); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenter"), SNAME("EditorIcons")), TTR("Shrink Center"), CONTAINERS_H_PRESET_SHRINK_CENTER); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterRight"), SNAME("EditorIcons")), TTR("Shrink End"), CONTAINERS_H_PRESET_SHRINK_END); + + p = container_v_presets_menu->get_popup(); + p->clear(); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignVCenterWide"), SNAME("EditorIcons")), TTR("Fill"), CONTAINERS_V_PRESET_FILL); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignVCenterWide"), SNAME("EditorIcons")), TTR("Fill & Expand"), CONTAINERS_V_PRESET_FILL_EXPAND); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterTop"), SNAME("EditorIcons")), TTR("Shrink Begin"), CONTAINERS_V_PRESET_SHRINK_BEGIN); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenter"), SNAME("EditorIcons")), TTR("Shrink Center"), CONTAINERS_V_PRESET_SHRINK_CENTER); + p->add_icon_item(get_theme_icon(SNAME("ControlAlignCenterBottom"), SNAME("EditorIcons")), TTR("Shrink End"), CONTAINERS_V_PRESET_SHRINK_END); + } break; + + case NOTIFICATION_PHYSICS_PROCESS: { + bool has_control_parents = false; + bool has_container_parents = false; + + // Update the viewport if the canvas_item changes + List<Control *> selection = _get_edited_controls(true); + for (Control *control : selection) { + if (Object::cast_to<Control>(control->get_parent())) { + has_control_parents = true; + } + if (Object::cast_to<Container>(control->get_parent())) { + has_container_parents = true; + } + } + + // Show / Hide the control layout buttons. + if (selection.size() > 0) { + set_visible(true); + + // Toggle anchor and container layout buttons depending on parents of the selected nodes. + // - If there are no control parents, enable everything. + // - If there are container parents, then enable only container buttons. + // - If there are NO container parents, then enable only anchor buttons. + bool enable_anchors = false; + bool enable_containers = false; + if (!has_control_parents) { + enable_anchors = true; + enable_containers = true; + } else if (has_container_parents) { + enable_containers = true; + } else { + enable_anchors = true; + } + + if (enable_anchors) { + anchor_presets_menu->set_disabled(false); + anchor_presets_menu->set_tooltip(TTR("Presets for the anchor and offset values of a Control node.")); + anchor_mode_button->set_disabled(false); + anchor_mode_button->set_tooltip(TTR("When active, moving Control nodes changes their anchors instead of their offsets.")); + } else { + anchor_presets_menu->set_disabled(true); + anchor_presets_menu->set_tooltip(TTR("Children of containers have their anchors and offsets values controlled by their parent.")); + anchor_mode_button->set_disabled(true); + anchor_mode_button->set_tooltip(TTR("Children of containers have their anchors and offsets values controlled by their parent.")); + } + + if (enable_containers) { + container_h_presets_menu->set_disabled(false); + container_h_presets_menu->set_tooltip(TTR("Horizontal sizing setting for children of a Container node.")); + container_v_presets_menu->set_disabled(false); + container_v_presets_menu->set_tooltip(TTR("Vertical sizing setting for children of a Container node.")); + } else { + container_h_presets_menu->set_disabled(true); + container_h_presets_menu->set_tooltip(TTR("Children of regular controls are controlled by their anchors and offsets.")); + container_v_presets_menu->set_disabled(true); + container_v_presets_menu->set_tooltip(TTR("Children of regular controls are controlled by their anchors and offsets.")); + } + } else { + set_visible(false); + } + } break; + } +} + +ControlEditorToolbar::ControlEditorToolbar() { + anchor_layouts_icon = memnew(TextureRect); + anchor_layouts_icon->set_stretch_mode(TextureRect::StretchMode::STRETCH_KEEP_CENTERED); + add_child(anchor_layouts_icon); + + Label *l = memnew(Label); + l->set_text(TTR("Anchors")); + l->set_vertical_alignment(VerticalAlignment::VERTICAL_ALIGNMENT_CENTER); + add_child(l); + + anchor_presets_menu = memnew(MenuButton); + anchor_presets_menu->set_shortcut_context(this); + anchor_presets_menu->set_text(TTR("Preset")); + add_child(anchor_presets_menu); + anchor_presets_menu->set_switch_on_hover(true); + + PopupMenu *p = anchor_presets_menu->get_popup(); + p->connect("id_pressed", callable_mp(this, &ControlEditorToolbar::_popup_callback)); + + anchors_popup = memnew(PopupMenu); + p->add_child(anchors_popup); + anchors_popup->set_name("Anchors"); + anchors_popup->connect("id_pressed", callable_mp(this, &ControlEditorToolbar::_popup_callback)); + + anchor_mode_button = memnew(Button); + anchor_mode_button->set_flat(true); + anchor_mode_button->set_toggle_mode(true); + add_child(anchor_mode_button); + anchor_mode_button->connect("toggled", callable_mp(this, &ControlEditorToolbar::_button_toggle_anchor_mode)); + + add_child(memnew(VSeparator)); + + container_layouts_icon = memnew(TextureRect); + container_layouts_icon->set_stretch_mode(TextureRect::StretchMode::STRETCH_KEEP_CENTERED); + add_child(container_layouts_icon); + + l = memnew(Label); + l->set_text(TTR("Containers")); + l->set_vertical_alignment(VerticalAlignment::VERTICAL_ALIGNMENT_CENTER); + add_child(l); + + container_h_presets_menu = memnew(MenuButton); + container_h_presets_menu->set_shortcut_context(this); + container_h_presets_menu->set_text(TTR("Horizontal")); + add_child(container_h_presets_menu); + container_h_presets_menu->set_switch_on_hover(true); + + p = container_h_presets_menu->get_popup(); + p->connect("id_pressed", callable_mp(this, &ControlEditorToolbar::_popup_callback)); + + container_v_presets_menu = memnew(MenuButton); + container_v_presets_menu->set_shortcut_context(this); + container_v_presets_menu->set_text(TTR("Vertical")); + add_child(container_v_presets_menu); + container_v_presets_menu->set_switch_on_hover(true); + + p = container_v_presets_menu->get_popup(); + p->connect("id_pressed", callable_mp(this, &ControlEditorToolbar::_popup_callback)); + + undo_redo = EditorNode::get_singleton()->get_undo_redo(); + editor_selection = EditorNode::get_singleton()->get_editor_selection(); + editor_selection->add_editor_plugin(this); + editor_selection->connect("selection_changed", callable_mp(this, &ControlEditorToolbar::_selection_changed)); + + singleton = this; +} + +ControlEditorToolbar *ControlEditorToolbar::singleton = nullptr; + +ControlEditorPlugin::ControlEditorPlugin() { + toolbar = memnew(ControlEditorToolbar); + toolbar->hide(); + add_control_to_container(CONTAINER_CANVAS_EDITOR_MENU, toolbar); + + Ref<EditorInspectorPluginControl> plugin; + plugin.instantiate(); + add_inspector_plugin(plugin); +} diff --git a/editor/plugins/control_editor_plugin.h b/editor/plugins/control_editor_plugin.h new file mode 100644 index 0000000000..bbbada2b3f --- /dev/null +++ b/editor/plugins/control_editor_plugin.h @@ -0,0 +1,252 @@ +/*************************************************************************/ +/* control_editor_plugin.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef CONTROL_EDITOR_PLUGIN_H +#define CONTROL_EDITOR_PLUGIN_H + +#include "editor/editor_plugin.h" +#include "scene/gui/box_container.h" +#include "scene/gui/check_box.h" +#include "scene/gui/control.h" +#include "scene/gui/label.h" +#include "scene/gui/margin_container.h" +#include "scene/gui/option_button.h" +#include "scene/gui/panel_container.h" +#include "scene/gui/texture_rect.h" + +class ControlPositioningWarning : public MarginContainer { + GDCLASS(ControlPositioningWarning, MarginContainer); + + Control *control_node = nullptr; + + PanelContainer *bg_panel = nullptr; + GridContainer *grid = nullptr; + TextureRect *title_icon = nullptr; + TextureRect *hint_icon = nullptr; + Label *title_label = nullptr; + Label *hint_label = nullptr; + Control *hint_filler_left = nullptr; + Control *hint_filler_right = nullptr; + + void _update_warning(); + void _update_toggler(); + virtual void gui_input(const Ref<InputEvent> &p_event) override; + +protected: + void _notification(int p_notification); + +public: + void set_control(Control *p_node); + + ControlPositioningWarning(); +}; + +class EditorPropertyAnchorsPreset : public EditorProperty { + GDCLASS(EditorPropertyAnchorsPreset, EditorProperty); + OptionButton *options; + + void _option_selected(int p_which); + +protected: + virtual void _set_read_only(bool p_read_only) override; + +public: + void setup(const Vector<String> &p_options); + virtual void update_property() override; + EditorPropertyAnchorsPreset(); +}; + +class EditorPropertySizeFlags : public EditorProperty { + GDCLASS(EditorPropertySizeFlags, EditorProperty); + + enum FlagPreset { + SIZE_FLAGS_PRESET_FILL, + SIZE_FLAGS_PRESET_SHRINK_BEGIN, + SIZE_FLAGS_PRESET_SHRINK_CENTER, + SIZE_FLAGS_PRESET_SHRINK_END, + SIZE_FLAGS_PRESET_CUSTOM, + }; + + OptionButton *flag_presets; + CheckBox *flag_expand; + VBoxContainer *flag_options; + Vector<CheckBox *> flag_checks; + + bool vertical = false; + + bool keep_selected_preset = false; + + void _preset_selected(int p_which); + void _expand_toggled(); + void _flag_toggled(); + +protected: + virtual void _set_read_only(bool p_read_only) override; + +public: + void setup(const Vector<String> &p_options, bool p_vertical); + virtual void update_property() override; + EditorPropertySizeFlags(); +}; + +class EditorInspectorPluginControl : public EditorInspectorPlugin { + GDCLASS(EditorInspectorPluginControl, EditorInspectorPlugin); + +public: + virtual bool can_handle(Object *p_object) override; + virtual void parse_group(Object *p_object, const String &p_group) override; + virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; +}; + +class ControlEditorToolbar : public HBoxContainer { + GDCLASS(ControlEditorToolbar, HBoxContainer); + + UndoRedo *undo_redo; + EditorSelection *editor_selection; + + enum MenuOption { + ANCHORS_AND_OFFSETS_PRESET_TOP_LEFT, + ANCHORS_AND_OFFSETS_PRESET_TOP_RIGHT, + ANCHORS_AND_OFFSETS_PRESET_BOTTOM_LEFT, + ANCHORS_AND_OFFSETS_PRESET_BOTTOM_RIGHT, + ANCHORS_AND_OFFSETS_PRESET_CENTER_LEFT, + ANCHORS_AND_OFFSETS_PRESET_CENTER_RIGHT, + ANCHORS_AND_OFFSETS_PRESET_CENTER_TOP, + ANCHORS_AND_OFFSETS_PRESET_CENTER_BOTTOM, + ANCHORS_AND_OFFSETS_PRESET_CENTER, + ANCHORS_AND_OFFSETS_PRESET_TOP_WIDE, + ANCHORS_AND_OFFSETS_PRESET_LEFT_WIDE, + ANCHORS_AND_OFFSETS_PRESET_RIGHT_WIDE, + ANCHORS_AND_OFFSETS_PRESET_BOTTOM_WIDE, + ANCHORS_AND_OFFSETS_PRESET_VCENTER_WIDE, + ANCHORS_AND_OFFSETS_PRESET_HCENTER_WIDE, + ANCHORS_AND_OFFSETS_PRESET_WIDE, + + ANCHORS_AND_OFFSETS_PRESET_KEEP_RATIO, + + ANCHORS_PRESET_TOP_LEFT, + ANCHORS_PRESET_TOP_RIGHT, + ANCHORS_PRESET_BOTTOM_LEFT, + ANCHORS_PRESET_BOTTOM_RIGHT, + ANCHORS_PRESET_CENTER_LEFT, + ANCHORS_PRESET_CENTER_RIGHT, + ANCHORS_PRESET_CENTER_TOP, + ANCHORS_PRESET_CENTER_BOTTOM, + ANCHORS_PRESET_CENTER, + ANCHORS_PRESET_TOP_WIDE, + ANCHORS_PRESET_LEFT_WIDE, + ANCHORS_PRESET_RIGHT_WIDE, + ANCHORS_PRESET_BOTTOM_WIDE, + ANCHORS_PRESET_VCENTER_WIDE, + ANCHORS_PRESET_HCENTER_WIDE, + ANCHORS_PRESET_WIDE, + + // Offsets Presets are not currently in use. + OFFSETS_PRESET_TOP_LEFT, + OFFSETS_PRESET_TOP_RIGHT, + OFFSETS_PRESET_BOTTOM_LEFT, + OFFSETS_PRESET_BOTTOM_RIGHT, + OFFSETS_PRESET_CENTER_LEFT, + OFFSETS_PRESET_CENTER_RIGHT, + OFFSETS_PRESET_CENTER_TOP, + OFFSETS_PRESET_CENTER_BOTTOM, + OFFSETS_PRESET_CENTER, + OFFSETS_PRESET_TOP_WIDE, + OFFSETS_PRESET_LEFT_WIDE, + OFFSETS_PRESET_RIGHT_WIDE, + OFFSETS_PRESET_BOTTOM_WIDE, + OFFSETS_PRESET_VCENTER_WIDE, + OFFSETS_PRESET_HCENTER_WIDE, + OFFSETS_PRESET_WIDE, + + CONTAINERS_H_PRESET_FILL, + CONTAINERS_H_PRESET_FILL_EXPAND, + CONTAINERS_H_PRESET_SHRINK_BEGIN, + CONTAINERS_H_PRESET_SHRINK_CENTER, + CONTAINERS_H_PRESET_SHRINK_END, + CONTAINERS_V_PRESET_FILL, + CONTAINERS_V_PRESET_FILL_EXPAND, + CONTAINERS_V_PRESET_SHRINK_BEGIN, + CONTAINERS_V_PRESET_SHRINK_CENTER, + CONTAINERS_V_PRESET_SHRINK_END, + }; + + TextureRect *anchor_layouts_icon; + MenuButton *anchor_presets_menu; + PopupMenu *anchors_popup; + TextureRect *container_layouts_icon; + MenuButton *container_h_presets_menu; + MenuButton *container_v_presets_menu; + + Button *anchor_mode_button; + + bool anchors_mode = false; + + void _set_anchors_preset(Control::LayoutPreset p_preset); + void _set_anchors_and_offsets_preset(Control::LayoutPreset p_preset); + void _set_anchors_and_offsets_to_keep_ratio(); + void _set_container_h_preset(Control::SizeFlags p_preset); + void _set_container_v_preset(Control::SizeFlags p_preset); + + Vector2 _anchor_to_position(const Control *p_control, Vector2 anchor); + Vector2 _position_to_anchor(const Control *p_control, Vector2 position); + + void _button_toggle_anchor_mode(bool p_status); + + bool _is_node_locked(const Node *p_node); + List<Control *> _get_edited_controls(bool retrieve_locked = false, bool remove_controls_if_parent_in_selection = true); + void _popup_callback(int p_op); + void _selection_changed(); + +protected: + void _notification(int p_notification); + + static ControlEditorToolbar *singleton; + +public: + bool is_anchors_mode_enabled() { return anchors_mode; }; + + static ControlEditorToolbar *get_singleton() { return singleton; } + + ControlEditorToolbar(); +}; + +class ControlEditorPlugin : public EditorPlugin { + GDCLASS(ControlEditorPlugin, EditorPlugin); + + ControlEditorToolbar *toolbar; + +public: + virtual String get_name() const override { return "Control"; } + + ControlEditorPlugin(); +}; + +#endif //CONTROL_EDITOR_PLUGIN_H diff --git a/editor/plugins/cpu_particles_2d_editor_plugin.cpp b/editor/plugins/cpu_particles_2d_editor_plugin.cpp index e0364dc952..79025041d3 100644 --- a/editor/plugins/cpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/cpu_particles_2d_editor_plugin.cpp @@ -32,6 +32,8 @@ #include "canvas_item_editor_plugin.h" #include "core/io/image_loader.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "scene/2d/cpu_particles_2d.h" #include "scene/gui/separator.h" #include "scene/resources/particles_material.h" @@ -222,20 +224,21 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() { } void CPUParticles2DEditorPlugin::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - menu->get_popup()->connect("id_pressed", callable_mp(this, &CPUParticles2DEditorPlugin::_menu_callback)); - menu->set_icon(epoints->get_theme_icon(SNAME("CPUParticles2D"), SNAME("EditorIcons"))); - file->connect("file_selected", callable_mp(this, &CPUParticles2DEditorPlugin::_file_selected)); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + menu->get_popup()->connect("id_pressed", callable_mp(this, &CPUParticles2DEditorPlugin::_menu_callback)); + menu->set_icon(epoints->get_theme_icon(SNAME("CPUParticles2D"), SNAME("EditorIcons"))); + file->connect("file_selected", callable_mp(this, &CPUParticles2DEditorPlugin::_file_selected)); + } break; } } void CPUParticles2DEditorPlugin::_bind_methods() { } -CPUParticles2DEditorPlugin::CPUParticles2DEditorPlugin(EditorNode *p_node) { +CPUParticles2DEditorPlugin::CPUParticles2DEditorPlugin() { particles = nullptr; - editor = p_node; - undo_redo = editor->get_undo_redo(); + undo_redo = EditorNode::get_singleton()->get_undo_redo(); toolbar = memnew(HBoxContainer); add_control_to_container(CONTAINER_CANVAS_EDITOR_MENU, toolbar); diff --git a/editor/plugins/cpu_particles_2d_editor_plugin.h b/editor/plugins/cpu_particles_2d_editor_plugin.h index e54e1651bd..b10ed73e38 100644 --- a/editor/plugins/cpu_particles_2d_editor_plugin.h +++ b/editor/plugins/cpu_particles_2d_editor_plugin.h @@ -31,12 +31,14 @@ #ifndef CPU_PARTICLES_2D_EDITOR_PLUGIN_H #define CPU_PARTICLES_2D_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/2d/collision_polygon_2d.h" #include "scene/2d/cpu_particles_2d.h" #include "scene/gui/box_container.h" -#include "scene/gui/file_dialog.h" + +class EditorPlugin; +class SpinBox; +class EditorFileDialog; class CPUParticles2DEditorPlugin : public EditorPlugin { GDCLASS(CPUParticles2DEditorPlugin, EditorPlugin); @@ -56,7 +58,6 @@ class CPUParticles2DEditorPlugin : public EditorPlugin { CPUParticles2D *particles; EditorFileDialog *file; - EditorNode *editor; HBoxContainer *toolbar; MenuButton *menu; @@ -85,7 +86,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - CPUParticles2DEditorPlugin(EditorNode *p_node); + CPUParticles2DEditorPlugin(); ~CPUParticles2DEditorPlugin(); }; diff --git a/editor/plugins/cpu_particles_3d_editor_plugin.cpp b/editor/plugins/cpu_particles_3d_editor_plugin.cpp index bb10c04e8f..775c2dbb2a 100644 --- a/editor/plugins/cpu_particles_3d_editor_plugin.cpp +++ b/editor/plugins/cpu_particles_3d_editor_plugin.cpp @@ -30,7 +30,10 @@ #include "cpu_particles_3d_editor_plugin.h" +#include "editor/editor_node.h" #include "editor/plugins/node_3d_editor_plugin.h" +#include "editor/scene_tree_editor.h" +#include "scene/gui/menu_button.h" void CPUParticles3DEditor::_node_removed(Node *p_node) { if (p_node == node) { @@ -40,8 +43,10 @@ void CPUParticles3DEditor::_node_removed(Node *p_node) { } void CPUParticles3DEditor::_notification(int p_notification) { - if (p_notification == NOTIFICATION_ENTER_TREE) { - options->set_icon(get_theme_icon(SNAME("CPUParticles3D"), SNAME("EditorIcons"))); + switch (p_notification) { + case NOTIFICATION_ENTER_TREE: { + options->set_icon(get_theme_icon(SNAME("CPUParticles3D"), SNAME("EditorIcons"))); + } break; } } @@ -119,10 +124,9 @@ void CPUParticles3DEditorPlugin::make_visible(bool p_visible) { } } -CPUParticles3DEditorPlugin::CPUParticles3DEditorPlugin(EditorNode *p_node) { - editor = p_node; +CPUParticles3DEditorPlugin::CPUParticles3DEditorPlugin() { particles_editor = memnew(CPUParticles3DEditor); - editor->get_main_control()->add_child(particles_editor); + EditorNode::get_singleton()->get_main_control()->add_child(particles_editor); particles_editor->hide(); } diff --git a/editor/plugins/cpu_particles_3d_editor_plugin.h b/editor/plugins/cpu_particles_3d_editor_plugin.h index 67cc156680..0501936574 100644 --- a/editor/plugins/cpu_particles_3d_editor_plugin.h +++ b/editor/plugins/cpu_particles_3d_editor_plugin.h @@ -66,7 +66,6 @@ class CPUParticles3DEditorPlugin : public EditorPlugin { GDCLASS(CPUParticles3DEditorPlugin, EditorPlugin); CPUParticles3DEditor *particles_editor; - EditorNode *editor; public: virtual String get_name() const override { return "CPUParticles3D"; } @@ -75,7 +74,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - CPUParticles3DEditorPlugin(EditorNode *p_node); + CPUParticles3DEditorPlugin(); ~CPUParticles3DEditorPlugin(); }; diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp index a9a276fc18..6d1a86765a 100644 --- a/editor/plugins/curve_editor_plugin.cpp +++ b/editor/plugins/curve_editor_plugin.cpp @@ -34,6 +34,7 @@ #include "core/core_string_names.h" #include "core/input/input.h" #include "core/os/keyboard.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" CurveEditor::CurveEditor() { @@ -96,8 +97,10 @@ Size2 CurveEditor::get_minimum_size() const { } void CurveEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - _draw(); + switch (p_what) { + case NOTIFICATION_DRAW: { + _draw(); + } break; } } @@ -773,7 +776,7 @@ void EditorInspectorPluginCurve::parse_begin(Object *p_object) { add_custom_control(editor); } -CurveEditorPlugin::CurveEditorPlugin(EditorNode *p_node) { +CurveEditorPlugin::CurveEditorPlugin() { Ref<EditorInspectorPluginCurve> curve_plugin; curve_plugin.instantiate(); EditorInspector::add_inspector_plugin(curve_plugin); diff --git a/editor/plugins/curve_editor_plugin.h b/editor/plugins/curve_editor_plugin.h index c7e8dea75a..4aba2fffd0 100644 --- a/editor/plugins/curve_editor_plugin.h +++ b/editor/plugins/curve_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef CURVE_EDITOR_PLUGIN_H #define CURVE_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/editor_resource_preview.h" #include "scene/resources/curve.h" @@ -129,7 +128,7 @@ class CurveEditorPlugin : public EditorPlugin { GDCLASS(CurveEditorPlugin, EditorPlugin); public: - CurveEditorPlugin(EditorNode *p_node); + CurveEditorPlugin(); virtual String get_name() const override { return "Curve"; } }; diff --git a/editor/plugins/debugger_editor_plugin.cpp b/editor/plugins/debugger_editor_plugin.cpp index 6e43130a92..501becac57 100644 --- a/editor/plugins/debugger_editor_plugin.cpp +++ b/editor/plugins/debugger_editor_plugin.cpp @@ -36,9 +36,10 @@ #include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/fileserver/editor_file_server.h" +#include "editor/plugins/script_editor_plugin.h" #include "scene/gui/menu_button.h" -DebuggerEditorPlugin::DebuggerEditorPlugin(EditorNode *p_editor, MenuButton *p_debug_menu) { +DebuggerEditorPlugin::DebuggerEditorPlugin(MenuButton *p_debug_menu) { EditorDebuggerServer::initialize(); ED_SHORTCUT("debugger/step_into", TTR("Step Into"), Key::F11); @@ -176,8 +177,10 @@ void DebuggerEditorPlugin::_menu_option(int p_option) { } void DebuggerEditorPlugin::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - _update_debug_options(); + switch (p_what) { + case NOTIFICATION_READY: { + _update_debug_options(); + } break; } } diff --git a/editor/plugins/debugger_editor_plugin.h b/editor/plugins/debugger_editor_plugin.h index 6fc83cd438..c024526285 100644 --- a/editor/plugins/debugger_editor_plugin.h +++ b/editor/plugins/debugger_editor_plugin.h @@ -33,7 +33,6 @@ #include "editor/editor_plugin.h" -class EditorNode; class EditorFileServer; class MenuButton; class PopupMenu; @@ -64,7 +63,7 @@ public: virtual String get_name() const override { return "Debugger"; } bool has_main_screen() const override { return false; } - DebuggerEditorPlugin(EditorNode *p_node, MenuButton *p_menu); + DebuggerEditorPlugin(MenuButton *p_menu); ~DebuggerEditorPlugin(); }; diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp index cef505181a..b8556220d2 100644 --- a/editor/plugins/editor_preview_plugins.cpp +++ b/editor/plugins/editor_preview_plugins.cpp @@ -30,10 +30,11 @@ #include "editor_preview_plugins.h" +#include "core/config/project_settings.h" #include "core/io/file_access_memory.h" #include "core/io/resource_loader.h" #include "core/os/os.h" -#include "editor/editor_node.h" +#include "editor/editor_paths.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" #include "scene/resources/bit_map.h" @@ -188,7 +189,7 @@ bool EditorImagePreviewPlugin::generate_small_preview_automatically() const { } //////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////// + bool EditorBitmapPreviewPlugin::handles(const String &p_type) const { return ClassDB::is_parent_class(p_type, "BitMap"); } @@ -308,7 +309,7 @@ void EditorMaterialPreviewPlugin::_preview_done() { } bool EditorMaterialPreviewPlugin::handles(const String &p_type) const { - return ClassDB::is_parent_class(p_type, "Material"); //any material + return ClassDB::is_parent_class(p_type, "Material"); // Any material. } bool EditorMaterialPreviewPlugin::generate_small_preview_automatically() const { @@ -462,10 +463,6 @@ EditorMaterialPreviewPlugin::~EditorMaterialPreviewPlugin() { /////////////////////////////////////////////////////////////////////////// -static bool _is_text_char(char32_t c) { - return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'; -} - bool EditorScriptPreviewPlugin::handles(const String &p_type) const { return ClassDB::is_parent_class(p_type, "Script"); } @@ -538,15 +535,15 @@ Ref<Texture2D> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size if (in_comment) { color = comment_color; } else { - if (c != '_' && ((c >= '!' && c <= '/') || (c >= ':' && c <= '@') || (c >= '[' && c <= '`') || (c >= '{' && c <= '~') || c == '\t')) { + if (is_symbol(c)) { //make symbol a little visible color = symbol_color; in_control_flow_keyword = false; in_keyword = false; - } else if (!prev_is_text && _is_text_char(c)) { + } else if (!prev_is_text && is_ascii_identifier_char(c)) { int pos = i; - while (_is_text_char(code[pos])) { + while (is_ascii_identifier_char(code[pos])) { pos++; } String word = code.substr(i, pos - i); @@ -556,7 +553,7 @@ Ref<Texture2D> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size in_keyword = true; } - } else if (!_is_text_char(c)) { + } else if (!is_ascii_identifier_char(c)) { in_keyword = false; } @@ -571,7 +568,7 @@ Ref<Texture2D> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size img->set_pixel(col, y0 + line * 2, bg_color.blend(ul)); img->set_pixel(col, y0 + line * 2 + 1, color); - prev_is_text = _is_text_char(c); + prev_is_text = is_ascii_identifier_char(c); } col++; } else { @@ -703,7 +700,7 @@ void EditorMeshPreviewPlugin::_preview_done() { } bool EditorMeshPreviewPlugin::handles(const String &p_type) const { - return ClassDB::is_parent_class(p_type, "Mesh"); //any Mesh + return ClassDB::is_parent_class(p_type, "Mesh"); // Any mesh. } Ref<Texture2D> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const { diff --git a/editor/plugins/editor_preview_plugins.h b/editor/plugins/editor_preview_plugins.h index dd64918d41..803f03f17e 100644 --- a/editor/plugins/editor_preview_plugins.h +++ b/editor/plugins/editor_preview_plugins.h @@ -31,9 +31,8 @@ #ifndef EDITORPREVIEWPLUGINS_H #define EDITORPREVIEWPLUGINS_H -#include "editor/editor_resource_preview.h" - #include "core/templates/safe_refcount.h" +#include "editor/editor_resource_preview.h" void post_process_preview(Ref<Image> p_image); diff --git a/editor/plugins/font_editor_plugin.cpp b/editor/plugins/font_editor_plugin.cpp index 73a6781774..b9de621bcb 100644 --- a/editor/plugins/font_editor_plugin.cpp +++ b/editor/plugins/font_editor_plugin.cpp @@ -33,14 +33,16 @@ #include "editor/editor_scale.h" void FontDataPreview::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - Color text_color = get_theme_color(SNAME("font_color"), SNAME("Label")); - Color line_color = text_color; - line_color.a *= 0.6; - Vector2 pos = (get_size() - line->get_size()) / 2; - line->draw(get_canvas_item(), pos, text_color); - draw_line(Vector2(0, pos.y + line->get_line_ascent()), Vector2(pos.x - 5, pos.y + line->get_line_ascent()), line_color); - draw_line(Vector2(pos.x + line->get_size().x + 5, pos.y + line->get_line_ascent()), Vector2(get_size().x, pos.y + line->get_line_ascent()), line_color); + switch (p_what) { + case NOTIFICATION_DRAW: { + Color text_color = get_theme_color(SNAME("font_color"), SNAME("Label")); + Color line_color = text_color; + line_color.a *= 0.6; + Vector2 pos = (get_size() - line->get_size()) / 2; + line->draw(get_canvas_item(), pos, text_color); + draw_line(Vector2(0, pos.y + line->get_line_ascent()), Vector2(pos.x - 5, pos.y + line->get_line_ascent()), line_color); + draw_line(Vector2(pos.x + line->get_size().x + 5, pos.y + line->get_line_ascent()), Vector2(get_size().x, pos.y + line->get_line_ascent()), line_color); + } break; } } @@ -97,7 +99,7 @@ bool EditorInspectorPluginFont::parse_property(Object *p_object, const Variant:: /*************************************************************************/ -FontEditorPlugin::FontEditorPlugin(EditorNode *p_node) { +FontEditorPlugin::FontEditorPlugin() { Ref<EditorInspectorPluginFont> fd_plugin; fd_plugin.instantiate(); EditorInspector::add_inspector_plugin(fd_plugin); diff --git a/editor/plugins/font_editor_plugin.h b/editor/plugins/font_editor_plugin.h index 736137121a..3f0700d880 100644 --- a/editor/plugins/font_editor_plugin.h +++ b/editor/plugins/font_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef FONT_EDITOR_PLUGIN_H #define FONT_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/resources/font.h" #include "scene/resources/text_line.h" @@ -70,7 +69,7 @@ class FontEditorPlugin : public EditorPlugin { GDCLASS(FontEditorPlugin, EditorPlugin); public: - FontEditorPlugin(EditorNode *p_node); + FontEditorPlugin(); virtual String get_name() const override { return "Font"; } }; diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.cpp b/editor/plugins/gpu_particles_2d_editor_plugin.cpp index 06be9d678f..b15aec87d9 100644 --- a/editor/plugins/gpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_2d_editor_plugin.cpp @@ -32,6 +32,9 @@ #include "canvas_item_editor_plugin.h" #include "core/io/image_loader.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" +#include "editor/scene_tree_dock.h" #include "scene/2d/cpu_particles_2d.h" #include "scene/gui/separator.h" #include "scene/resources/particles_material.h" @@ -58,7 +61,7 @@ void GPUParticles2DEditorPlugin::_file_selected(const String &p_file) { } void GPUParticles2DEditorPlugin::_selection_changed() { - List<Node *> selected_nodes = editor->get_editor_selection()->get_selected_node_list(); + List<Node *> selected_nodes = EditorNode::get_singleton()->get_editor_selection()->get_selected_node_list(); if (selected_particles.is_empty() && selected_nodes.is_empty()) { return; @@ -351,21 +354,22 @@ void GPUParticles2DEditorPlugin::_generate_emission_mask() { } void GPUParticles2DEditorPlugin::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - menu->get_popup()->connect("id_pressed", callable_mp(this, &GPUParticles2DEditorPlugin::_menu_callback)); - menu->set_icon(menu->get_theme_icon(SNAME("GPUParticles2D"), SNAME("EditorIcons"))); - file->connect("file_selected", callable_mp(this, &GPUParticles2DEditorPlugin::_file_selected)); - EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", callable_mp(this, &GPUParticles2DEditorPlugin::_selection_changed)); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + menu->get_popup()->connect("id_pressed", callable_mp(this, &GPUParticles2DEditorPlugin::_menu_callback)); + menu->set_icon(menu->get_theme_icon(SNAME("GPUParticles2D"), SNAME("EditorIcons"))); + file->connect("file_selected", callable_mp(this, &GPUParticles2DEditorPlugin::_file_selected)); + EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", callable_mp(this, &GPUParticles2DEditorPlugin::_selection_changed)); + } break; } } void GPUParticles2DEditorPlugin::_bind_methods() { } -GPUParticles2DEditorPlugin::GPUParticles2DEditorPlugin(EditorNode *p_node) { +GPUParticles2DEditorPlugin::GPUParticles2DEditorPlugin() { particles = nullptr; - editor = p_node; - undo_redo = editor->get_undo_redo(); + undo_redo = EditorNode::get_singleton()->get_undo_redo(); toolbar = memnew(HBoxContainer); add_control_to_container(CONTAINER_CANVAS_EDITOR_MENU, toolbar); diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.h b/editor/plugins/gpu_particles_2d_editor_plugin.h index 55e455e252..f94ce632e9 100644 --- a/editor/plugins/gpu_particles_2d_editor_plugin.h +++ b/editor/plugins/gpu_particles_2d_editor_plugin.h @@ -31,12 +31,13 @@ #ifndef PARTICLES_2D_EDITOR_PLUGIN_H #define PARTICLES_2D_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/2d/collision_polygon_2d.h" #include "scene/2d/gpu_particles_2d.h" #include "scene/gui/box_container.h" -#include "scene/gui/file_dialog.h" +#include "scene/gui/spin_box.h" + +class EditorFileDialog; class GPUParticles2DEditorPlugin : public EditorPlugin { GDCLASS(GPUParticles2DEditorPlugin, EditorPlugin); @@ -59,7 +60,6 @@ class GPUParticles2DEditorPlugin : public EditorPlugin { List<GPUParticles2D *> selected_particles; EditorFileDialog *file; - EditorNode *editor; HBoxContainer *toolbar; MenuButton *menu; @@ -93,7 +93,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - GPUParticles2DEditorPlugin(EditorNode *p_node); + GPUParticles2DEditorPlugin(); ~GPUParticles2DEditorPlugin(); }; diff --git a/editor/plugins/gpu_particles_3d_editor_plugin.cpp b/editor/plugins/gpu_particles_3d_editor_plugin.cpp index 087b0a26b7..293d1c3913 100644 --- a/editor/plugins/gpu_particles_3d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_3d_editor_plugin.cpp @@ -31,7 +31,9 @@ #include "gpu_particles_3d_editor_plugin.h" #include "core/io/resource_loader.h" +#include "editor/editor_node.h" #include "editor/plugins/node_3d_editor_plugin.h" +#include "editor/scene_tree_dock.h" #include "scene/3d/cpu_particles_3d.h" #include "scene/resources/particles_material.h" @@ -229,9 +231,11 @@ void GPUParticles3DEditor::_node_removed(Node *p_node) { } void GPUParticles3DEditor::_notification(int p_notification) { - if (p_notification == NOTIFICATION_ENTER_TREE) { - options->set_icon(options->get_popup()->get_theme_icon(SNAME("GPUParticles3D"), SNAME("EditorIcons"))); - get_tree()->connect("node_removed", callable_mp(this, &GPUParticles3DEditor::_node_removed)); + switch (p_notification) { + case NOTIFICATION_ENTER_TREE: { + options->set_icon(options->get_popup()->get_theme_icon(SNAME("GPUParticles3D"), SNAME("EditorIcons"))); + get_tree()->connect("node_removed", callable_mp(this, &GPUParticles3DEditor::_node_removed)); + } break; } } @@ -455,10 +459,9 @@ void GPUParticles3DEditorPlugin::make_visible(bool p_visible) { } } -GPUParticles3DEditorPlugin::GPUParticles3DEditorPlugin(EditorNode *p_node) { - editor = p_node; +GPUParticles3DEditorPlugin::GPUParticles3DEditorPlugin() { particles_editor = memnew(GPUParticles3DEditor); - editor->get_main_control()->add_child(particles_editor); + EditorNode::get_singleton()->get_main_control()->add_child(particles_editor); particles_editor->hide(); } diff --git a/editor/plugins/gpu_particles_3d_editor_plugin.h b/editor/plugins/gpu_particles_3d_editor_plugin.h index f7e4244ba4..39aa596ece 100644 --- a/editor/plugins/gpu_particles_3d_editor_plugin.h +++ b/editor/plugins/gpu_particles_3d_editor_plugin.h @@ -31,11 +31,12 @@ #ifndef PARTICLES_EDITOR_PLUGIN_H #define PARTICLES_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/3d/gpu_particles_3d.h" #include "scene/gui/spin_box.h" +class SceneTreeDialog; + class GPUParticles3DEditorBase : public Control { GDCLASS(GPUParticles3DEditorBase, Control); @@ -101,7 +102,6 @@ class GPUParticles3DEditorPlugin : public EditorPlugin { GDCLASS(GPUParticles3DEditorPlugin, EditorPlugin); GPUParticles3DEditor *particles_editor; - EditorNode *editor; public: virtual String get_name() const override { return "GPUParticles3D"; } @@ -110,7 +110,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - GPUParticles3DEditorPlugin(EditorNode *p_node); + GPUParticles3DEditorPlugin(); ~GPUParticles3DEditorPlugin(); }; diff --git a/editor/plugins/gpu_particles_collision_sdf_editor_plugin.cpp b/editor/plugins/gpu_particles_collision_sdf_editor_plugin.cpp index 1b4c944876..affe10a01d 100644 --- a/editor/plugins/gpu_particles_collision_sdf_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_collision_sdf_editor_plugin.cpp @@ -30,6 +30,9 @@ #include "gpu_particles_collision_sdf_editor_plugin.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" + void GPUParticlesCollisionSDF3DEditorPlugin::_bake() { if (col_sdf) { if (col_sdf->get_texture().is_null() || !col_sdf->get_texture()->get_path().is_resource_file()) { @@ -63,41 +66,43 @@ bool GPUParticlesCollisionSDF3DEditorPlugin::handles(Object *p_object) const { } void GPUParticlesCollisionSDF3DEditorPlugin::_notification(int p_what) { - if (p_what == NOTIFICATION_PROCESS) { - if (!col_sdf) { - return; - } + switch (p_what) { + case NOTIFICATION_PROCESS: { + if (!col_sdf) { + return; + } - // Set information tooltip on the Bake button. This information is useful - // to optimize performance (video RAM size) and reduce collision tunneling (individual cell size). + // Set information tooltip on the Bake button. This information is useful + // to optimize performance (video RAM size) and reduce collision tunneling (individual cell size). - const Vector3i size = col_sdf->get_estimated_cell_size(); + const Vector3i size = col_sdf->get_estimated_cell_size(); - const Vector3 extents = col_sdf->get_extents(); + const Vector3 extents = col_sdf->get_extents(); - int data_size = 2; - const double size_mb = size.x * size.y * size.z * data_size / (1024.0 * 1024.0); - // Add a qualitative measurement to help the user assess whether a GPUParticlesCollisionSDF3D node is using a lot of VRAM. - String size_quality; - if (size_mb < 8.0) { - size_quality = TTR("Low"); - } else if (size_mb < 32.0) { - size_quality = TTR("Moderate"); - } else { - size_quality = TTR("High"); - } + int data_size = 2; + const double size_mb = size.x * size.y * size.z * data_size / (1024.0 * 1024.0); + // Add a qualitative measurement to help the user assess whether a GPUParticlesCollisionSDF3D node is using a lot of VRAM. + String size_quality; + if (size_mb < 8.0) { + size_quality = TTR("Low"); + } else if (size_mb < 32.0) { + size_quality = TTR("Moderate"); + } else { + size_quality = TTR("High"); + } - String text; - text += vformat(TTR("Subdivisions: %s"), vformat(String::utf8("%d × %d × %d"), size.x, size.y, size.z)) + "\n"; - text += vformat(TTR("Cell size: %s"), vformat(String::utf8("%.3f × %.3f × %.3f"), extents.x / size.x, extents.y / size.y, extents.z / size.z)) + "\n"; - text += vformat(TTR("Video RAM size: %s MB (%s)"), String::num(size_mb, 2), size_quality); + String text; + text += vformat(TTR("Subdivisions: %s"), vformat(String::utf8("%d × %d × %d"), size.x, size.y, size.z)) + "\n"; + text += vformat(TTR("Cell size: %s"), vformat(String::utf8("%.3f × %.3f × %.3f"), extents.x / size.x, extents.y / size.y, extents.z / size.z)) + "\n"; + text += vformat(TTR("Video RAM size: %s MB (%s)"), String::num(size_mb, 2), size_quality); - // Only update the tooltip when needed to avoid constant redrawing. - if (bake->get_tooltip(Point2()) == text) { - return; - } + // Only update the tooltip when needed to avoid constant redrawing. + if (bake->get_tooltip(Point2()) == text) { + return; + } - bake->set_tooltip(text); + bake->set_tooltip(text); + } break; } } @@ -171,14 +176,13 @@ void GPUParticlesCollisionSDF3DEditorPlugin::_sdf_save_path_and_bake(const Strin void GPUParticlesCollisionSDF3DEditorPlugin::_bind_methods() { } -GPUParticlesCollisionSDF3DEditorPlugin::GPUParticlesCollisionSDF3DEditorPlugin(EditorNode *p_node) { - editor = p_node; +GPUParticlesCollisionSDF3DEditorPlugin::GPUParticlesCollisionSDF3DEditorPlugin() { bake_hb = memnew(HBoxContainer); bake_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL); bake_hb->hide(); bake = memnew(Button); bake->set_flat(true); - bake->set_icon(editor->get_gui_base()->get_theme_icon(SNAME("Bake"), SNAME("EditorIcons"))); + bake->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Bake"), SNAME("EditorIcons"))); bake->set_text(TTR("Bake SDF")); bake->connect("pressed", callable_mp(this, &GPUParticlesCollisionSDF3DEditorPlugin::_bake)); bake_hb->add_child(bake); diff --git a/editor/plugins/gpu_particles_collision_sdf_editor_plugin.h b/editor/plugins/gpu_particles_collision_sdf_editor_plugin.h index d74986f22b..f6e4fd3dec 100644 --- a/editor/plugins/gpu_particles_collision_sdf_editor_plugin.h +++ b/editor/plugins/gpu_particles_collision_sdf_editor_plugin.h @@ -31,11 +31,13 @@ #ifndef GPU_PARTICLES_COLLISION_SDF_EDITOR_PLUGIN_H #define GPU_PARTICLES_COLLISION_SDF_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/3d/gpu_particles_collision_3d.h" #include "scene/resources/material.h" +struct EditorProgress; +class EditorFileDialog; + class GPUParticlesCollisionSDF3DEditorPlugin : public EditorPlugin { GDCLASS(GPUParticlesCollisionSDF3DEditorPlugin, EditorPlugin); @@ -43,7 +45,6 @@ class GPUParticlesCollisionSDF3DEditorPlugin : public EditorPlugin { HBoxContainer *bake_hb; Button *bake; - EditorNode *editor; EditorFileDialog *probe_file; @@ -66,7 +67,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - GPUParticlesCollisionSDF3DEditorPlugin(EditorNode *p_node); + GPUParticlesCollisionSDF3DEditorPlugin(); ~GPUParticlesCollisionSDF3DEditorPlugin(); }; diff --git a/editor/plugins/gradient_editor_plugin.cpp b/editor/plugins/gradient_editor_plugin.cpp index 5e300d3de9..e9d7808684 100644 --- a/editor/plugins/gradient_editor_plugin.cpp +++ b/editor/plugins/gradient_editor_plugin.cpp @@ -31,6 +31,7 @@ #include "gradient_editor_plugin.h" #include "canvas_item_editor_plugin.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "node_3d_editor_plugin.h" @@ -90,13 +91,15 @@ GradientEditor::GradientEditor() { /////////////////////// void GradientReverseButton::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - Ref<Texture2D> icon = get_theme_icon(SNAME("ReverseGradient"), SNAME("EditorIcons")); - if (is_pressed()) { - draw_texture_rect(icon, Rect2(margin, margin, icon->get_width(), icon->get_height()), false, get_theme_color(SNAME("icon_pressed_color"), SNAME("Button"))); - } else { - draw_texture_rect(icon, Rect2(margin, margin, icon->get_width(), icon->get_height())); - } + switch (p_what) { + case NOTIFICATION_DRAW: { + Ref<Texture2D> icon = get_theme_icon(SNAME("ReverseGradient"), SNAME("EditorIcons")); + if (is_pressed()) { + draw_texture_rect(icon, Rect2(margin, margin, icon->get_width(), icon->get_height()), false, get_theme_color(SNAME("icon_pressed_color"), SNAME("Button"))); + } else { + draw_texture_rect(icon, Rect2(margin, margin, icon->get_width(), icon->get_height())); + } + } break; } } @@ -136,7 +139,7 @@ void EditorInspectorPluginGradient::_reverse_button_pressed() { editor->reverse_gradient(); } -GradientEditorPlugin::GradientEditorPlugin(EditorNode *p_node) { +GradientEditorPlugin::GradientEditorPlugin() { Ref<EditorInspectorPluginGradient> plugin; plugin.instantiate(); add_inspector_plugin(plugin); diff --git a/editor/plugins/gradient_editor_plugin.h b/editor/plugins/gradient_editor_plugin.h index 8239711667..9857ea018d 100644 --- a/editor/plugins/gradient_editor_plugin.h +++ b/editor/plugins/gradient_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef GRADIENT_EDITOR_PLUGIN_H #define GRADIENT_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/gui/gradient_edit.h" @@ -83,7 +82,7 @@ class GradientEditorPlugin : public EditorPlugin { public: virtual String get_name() const override { return "Gradient"; } - GradientEditorPlugin(EditorNode *p_node); + GradientEditorPlugin(); }; #endif // GRADIENT_EDITOR_PLUGIN_H diff --git a/editor/plugins/input_event_editor_plugin.cpp b/editor/plugins/input_event_editor_plugin.cpp index b0ee88479a..b4a7081ebc 100644 --- a/editor/plugins/input_event_editor_plugin.cpp +++ b/editor/plugins/input_event_editor_plugin.cpp @@ -115,7 +115,7 @@ void EditorInspectorPluginInputEvent::parse_begin(Object *p_object) { add_custom_control(picker_controls); } -InputEventEditorPlugin::InputEventEditorPlugin(EditorNode *p_node) { +InputEventEditorPlugin::InputEventEditorPlugin() { Ref<EditorInspectorPluginInputEvent> plugin; plugin.instantiate(); add_inspector_plugin(plugin); diff --git a/editor/plugins/input_event_editor_plugin.h b/editor/plugins/input_event_editor_plugin.h index ed26890229..ab948462ab 100644 --- a/editor/plugins/input_event_editor_plugin.h +++ b/editor/plugins/input_event_editor_plugin.h @@ -33,7 +33,7 @@ #include "editor/action_map_editor.h" #include "editor/editor_inspector.h" -#include "editor/editor_node.h" +#include "editor/editor_plugin.h" class InputEventConfigContainer : public HBoxContainer { GDCLASS(InputEventConfigContainer, HBoxContainer); @@ -73,7 +73,7 @@ class InputEventEditorPlugin : public EditorPlugin { public: virtual String get_name() const override { return "InputEvent"; } - InputEventEditorPlugin(EditorNode *p_node); + InputEventEditorPlugin(); }; #endif // INPUT_EVENT_EDITOR_PLUGIN_H diff --git a/editor/plugins/light_occluder_2d_editor_plugin.cpp b/editor/plugins/light_occluder_2d_editor_plugin.cpp index 94ab89e2f6..6a5ead58d0 100644 --- a/editor/plugins/light_occluder_2d_editor_plugin.cpp +++ b/editor/plugins/light_occluder_2d_editor_plugin.cpp @@ -102,11 +102,11 @@ void LightOccluder2DEditor::_create_resource() { _menu_option(MODE_CREATE); } -LightOccluder2DEditor::LightOccluder2DEditor(EditorNode *p_editor) : - AbstractPolygon2DEditor(p_editor) { +LightOccluder2DEditor::LightOccluder2DEditor() : + AbstractPolygon2DEditor() { node = nullptr; } -LightOccluder2DEditorPlugin::LightOccluder2DEditorPlugin(EditorNode *p_node) : - AbstractPolygon2DEditorPlugin(p_node, memnew(LightOccluder2DEditor(p_node)), "LightOccluder2D") { +LightOccluder2DEditorPlugin::LightOccluder2DEditorPlugin() : + AbstractPolygon2DEditorPlugin(memnew(LightOccluder2DEditor), "LightOccluder2D") { } diff --git a/editor/plugins/light_occluder_2d_editor_plugin.h b/editor/plugins/light_occluder_2d_editor_plugin.h index 1a0cd3514b..557e8bf292 100644 --- a/editor/plugins/light_occluder_2d_editor_plugin.h +++ b/editor/plugins/light_occluder_2d_editor_plugin.h @@ -56,14 +56,14 @@ protected: virtual void _create_resource() override; public: - LightOccluder2DEditor(EditorNode *p_editor); + LightOccluder2DEditor(); }; class LightOccluder2DEditorPlugin : public AbstractPolygon2DEditorPlugin { GDCLASS(LightOccluder2DEditorPlugin, AbstractPolygon2DEditorPlugin); public: - LightOccluder2DEditorPlugin(EditorNode *p_node); + LightOccluder2DEditorPlugin(); }; #endif // LIGHT_OCCLUDER_2D_EDITOR_PLUGIN_H diff --git a/editor/plugins/lightmap_gi_editor_plugin.cpp b/editor/plugins/lightmap_gi_editor_plugin.cpp index 2126ca1bc9..5992e52162 100644 --- a/editor/plugins/lightmap_gi_editor_plugin.cpp +++ b/editor/plugins/lightmap_gi_editor_plugin.cpp @@ -30,6 +30,9 @@ #include "lightmap_gi_editor_plugin.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" + void LightmapGIEditorPlugin::_bake_select_file(const String &p_file) { if (lightmap) { LightmapGI::BakeError err; @@ -123,11 +126,10 @@ void LightmapGIEditorPlugin::_bind_methods() { ClassDB::bind_method("_bake", &LightmapGIEditorPlugin::_bake); } -LightmapGIEditorPlugin::LightmapGIEditorPlugin(EditorNode *p_node) { - editor = p_node; +LightmapGIEditorPlugin::LightmapGIEditorPlugin() { bake = memnew(Button); bake->set_flat(true); - bake->set_icon(editor->get_gui_base()->get_theme_icon(SNAME("Bake"), SNAME("EditorIcons"))); + bake->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Bake"), SNAME("EditorIcons"))); bake->set_text(TTR("Bake Lightmaps")); bake->hide(); bake->connect("pressed", Callable(this, "_bake")); diff --git a/editor/plugins/lightmap_gi_editor_plugin.h b/editor/plugins/lightmap_gi_editor_plugin.h index 5eec972228..e658230181 100644 --- a/editor/plugins/lightmap_gi_editor_plugin.h +++ b/editor/plugins/lightmap_gi_editor_plugin.h @@ -31,18 +31,19 @@ #ifndef BAKED_LIGHTMAP_EDITOR_PLUGIN_H #define BAKED_LIGHTMAP_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/3d/lightmap_gi.h" #include "scene/resources/material.h" +struct EditorProgress; +class EditorFileDialog; + class LightmapGIEditorPlugin : public EditorPlugin { GDCLASS(LightmapGIEditorPlugin, EditorPlugin); LightmapGI *lightmap; Button *bake; - EditorNode *editor; EditorFileDialog *file_dialog; static EditorProgress *tmp_progress; @@ -62,7 +63,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - LightmapGIEditorPlugin(EditorNode *p_node); + LightmapGIEditorPlugin(); ~LightmapGIEditorPlugin(); }; diff --git a/editor/plugins/line_2d_editor_plugin.cpp b/editor/plugins/line_2d_editor_plugin.cpp index 9d7e22278e..0f81b17cb3 100644 --- a/editor/plugins/line_2d_editor_plugin.cpp +++ b/editor/plugins/line_2d_editor_plugin.cpp @@ -56,11 +56,11 @@ void Line2DEditor::_action_set_polygon(int p_idx, const Variant &p_previous, con undo_redo->add_undo_method(node, "set_points", p_previous); } -Line2DEditor::Line2DEditor(EditorNode *p_editor) : - AbstractPolygon2DEditor(p_editor) { +Line2DEditor::Line2DEditor() : + AbstractPolygon2DEditor() { node = nullptr; } -Line2DEditorPlugin::Line2DEditorPlugin(EditorNode *p_node) : - AbstractPolygon2DEditorPlugin(p_node, memnew(Line2DEditor(p_node)), "Line2D") { +Line2DEditorPlugin::Line2DEditorPlugin() : + AbstractPolygon2DEditorPlugin(memnew(Line2DEditor), "Line2D") { } diff --git a/editor/plugins/line_2d_editor_plugin.h b/editor/plugins/line_2d_editor_plugin.h index 4497307747..307cf11207 100644 --- a/editor/plugins/line_2d_editor_plugin.h +++ b/editor/plugins/line_2d_editor_plugin.h @@ -49,14 +49,14 @@ protected: virtual void _action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) override; public: - Line2DEditor(EditorNode *p_editor); + Line2DEditor(); }; class Line2DEditorPlugin : public AbstractPolygon2DEditorPlugin { GDCLASS(Line2DEditorPlugin, AbstractPolygon2DEditorPlugin); public: - Line2DEditorPlugin(EditorNode *p_node); + Line2DEditorPlugin(); }; #endif // LINE_2D_EDITOR_PLUGIN_H diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp index 9d45c365a8..daa864cfa1 100644 --- a/editor/plugins/material_editor_plugin.cpp +++ b/editor/plugins/material_editor_plugin.cpp @@ -30,6 +30,7 @@ #include "material_editor_plugin.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "scene/gui/subviewport_container.h" #include "scene/resources/fog_material.h" @@ -37,31 +38,33 @@ #include "scene/resources/sky_material.h" void MaterialEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - //get_scene()->connect("node_removed",this,"_node_removed"); + switch (p_what) { + case NOTIFICATION_READY: { + //get_scene()->connect("node_removed",this,"_node_removed"); - if (first_enter) { - //it's in propertyeditor so.. could be moved around + if (first_enter) { + //it's in propertyeditor so.. could be moved around - light_1_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewLight1"), SNAME("EditorIcons"))); - light_1_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewLight1Off"), SNAME("EditorIcons"))); - light_2_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewLight2"), SNAME("EditorIcons"))); - light_2_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewLight2Off"), SNAME("EditorIcons"))); + light_1_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewLight1"), SNAME("EditorIcons"))); + light_1_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewLight1Off"), SNAME("EditorIcons"))); + light_2_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewLight2"), SNAME("EditorIcons"))); + light_2_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewLight2Off"), SNAME("EditorIcons"))); - sphere_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewSphereOff"), SNAME("EditorIcons"))); - sphere_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewSphere"), SNAME("EditorIcons"))); - box_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewCubeOff"), SNAME("EditorIcons"))); - box_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewCube"), SNAME("EditorIcons"))); + sphere_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewSphereOff"), SNAME("EditorIcons"))); + sphere_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewSphere"), SNAME("EditorIcons"))); + box_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewCubeOff"), SNAME("EditorIcons"))); + box_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewCube"), SNAME("EditorIcons"))); - first_enter = false; - } - } + first_enter = false; + } + } break; - if (p_what == NOTIFICATION_DRAW) { - Ref<Texture2D> checkerboard = get_theme_icon(SNAME("Checkerboard"), SNAME("EditorIcons")); - Size2 size = get_size(); + case NOTIFICATION_DRAW: { + Ref<Texture2D> checkerboard = get_theme_icon(SNAME("Checkerboard"), SNAME("EditorIcons")); + Size2 size = get_size(); - draw_texture_rect(checkerboard, Rect2(Point2(), size), true); + draw_texture_rect(checkerboard, Rect2(Point2(), size), true); + } break; } } @@ -302,7 +305,7 @@ EditorInspectorPluginMaterial::EditorInspectorPluginMaterial() { EditorNode::get_singleton()->get_editor_data().add_undo_redo_inspector_hook_callback(callable_mp(this, &EditorInspectorPluginMaterial::_undo_redo_inspector_callback)); } -MaterialEditorPlugin::MaterialEditorPlugin(EditorNode *p_node) { +MaterialEditorPlugin::MaterialEditorPlugin() { Ref<EditorInspectorPluginMaterial> plugin; plugin.instantiate(); add_inspector_plugin(plugin); diff --git a/editor/plugins/material_editor_plugin.h b/editor/plugins/material_editor_plugin.h index 53f4513396..9c6247d59b 100644 --- a/editor/plugins/material_editor_plugin.h +++ b/editor/plugins/material_editor_plugin.h @@ -31,16 +31,14 @@ #ifndef MATERIAL_EDITOR_PLUGIN_H #define MATERIAL_EDITOR_PLUGIN_H -#include "editor/property_editor.h" -#include "scene/resources/primitive_meshes.h" - -#include "editor/editor_node.h" #include "editor/editor_plugin.h" +#include "editor/property_editor.h" #include "scene/3d/camera_3d.h" #include "scene/3d/light_3d.h" #include "scene/3d/mesh_instance_3d.h" #include "scene/gui/color_rect.h" #include "scene/resources/material.h" +#include "scene/resources/primitive_meshes.h" class SubViewportContainer; @@ -103,7 +101,7 @@ class MaterialEditorPlugin : public EditorPlugin { public: virtual String get_name() const override { return "Material"; } - MaterialEditorPlugin(EditorNode *p_node); + MaterialEditorPlugin(); }; class StandardMaterial3DConversionPlugin : public EditorResourceConversionPlugin { diff --git a/editor/plugins/mesh_editor_plugin.cpp b/editor/plugins/mesh_editor_plugin.cpp index daf68f247d..4760b61dc8 100644 --- a/editor/plugins/mesh_editor_plugin.cpp +++ b/editor/plugins/mesh_editor_plugin.cpp @@ -49,18 +49,20 @@ void MeshEditor::gui_input(const Ref<InputEvent> &p_event) { } void MeshEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - //get_scene()->connect("node_removed",this,"_node_removed"); - - if (first_enter) { - //it's in propertyeditor so. could be moved around - - light_1_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewLight1"), SNAME("EditorIcons"))); - light_1_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewLight1Off"), SNAME("EditorIcons"))); - light_2_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewLight2"), SNAME("EditorIcons"))); - light_2_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewLight2Off"), SNAME("EditorIcons"))); - first_enter = false; - } + switch (p_what) { + case NOTIFICATION_READY: { + //get_scene()->connect("node_removed",this,"_node_removed"); + + if (first_enter) { + //it's in propertyeditor so. could be moved around + + light_1_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewLight1"), SNAME("EditorIcons"))); + light_1_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewLight1Off"), SNAME("EditorIcons"))); + light_2_switch->set_normal_texture(get_theme_icon(SNAME("MaterialPreviewLight2"), SNAME("EditorIcons"))); + light_2_switch->set_pressed_texture(get_theme_icon(SNAME("MaterialPreviewLight2Off"), SNAME("EditorIcons"))); + first_enter = false; + } + } break; } } @@ -176,7 +178,7 @@ void EditorInspectorPluginMesh::parse_begin(Object *p_object) { add_custom_control(editor); } -MeshEditorPlugin::MeshEditorPlugin(EditorNode *p_node) { +MeshEditorPlugin::MeshEditorPlugin() { Ref<EditorInspectorPluginMesh> plugin; plugin.instantiate(); add_inspector_plugin(plugin); diff --git a/editor/plugins/mesh_editor_plugin.h b/editor/plugins/mesh_editor_plugin.h index 613680e870..37464c98fe 100644 --- a/editor/plugins/mesh_editor_plugin.h +++ b/editor/plugins/mesh_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef MESH_EDITOR_PLUGIN_H #define MESH_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/3d/camera_3d.h" #include "scene/3d/light_3d.h" @@ -85,7 +84,7 @@ class MeshEditorPlugin : public EditorPlugin { public: virtual String get_name() const override { return "Mesh"; } - MeshEditorPlugin(EditorNode *p_node); + MeshEditorPlugin(); }; #endif diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.cpp b/editor/plugins/mesh_instance_3d_editor_plugin.cpp index 75e9cc23a1..64540ac157 100644 --- a/editor/plugins/mesh_instance_3d_editor_plugin.cpp +++ b/editor/plugins/mesh_instance_3d_editor_plugin.cpp @@ -30,6 +30,7 @@ #include "mesh_instance_3d_editor_plugin.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "node_3d_editor_plugin.h" #include "scene/3d/collision_shape_3d.h" @@ -515,10 +516,9 @@ void MeshInstance3DEditorPlugin::make_visible(bool p_visible) { } } -MeshInstance3DEditorPlugin::MeshInstance3DEditorPlugin(EditorNode *p_node) { - editor = p_node; +MeshInstance3DEditorPlugin::MeshInstance3DEditorPlugin() { mesh_editor = memnew(MeshInstance3DEditor); - editor->get_main_control()->add_child(mesh_editor); + EditorNode::get_singleton()->get_main_control()->add_child(mesh_editor); mesh_editor->options->hide(); } diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.h b/editor/plugins/mesh_instance_3d_editor_plugin.h index 1df72d107c..9c59c5fb9f 100644 --- a/editor/plugins/mesh_instance_3d_editor_plugin.h +++ b/editor/plugins/mesh_instance_3d_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef MESH_INSTANCE_EDITOR_PLUGIN_H #define MESH_INSTANCE_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/3d/mesh_instance_3d.h" #include "scene/gui/spin_box.h" @@ -86,7 +85,6 @@ class MeshInstance3DEditorPlugin : public EditorPlugin { GDCLASS(MeshInstance3DEditorPlugin, EditorPlugin); MeshInstance3DEditor *mesh_editor; - EditorNode *editor; public: virtual String get_name() const override { return "MeshInstance3D"; } @@ -95,7 +93,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - MeshInstance3DEditorPlugin(EditorNode *p_node); + MeshInstance3DEditorPlugin(); ~MeshInstance3DEditorPlugin(); }; diff --git a/editor/plugins/mesh_library_editor_plugin.cpp b/editor/plugins/mesh_library_editor_plugin.cpp index e47381b8a0..3d40755b7a 100644 --- a/editor/plugins/mesh_library_editor_plugin.cpp +++ b/editor/plugins/mesh_library_editor_plugin.cpp @@ -30,6 +30,7 @@ #include "mesh_library_editor_plugin.h" +#include "editor/editor_file_dialog.h" #include "editor/editor_node.h" #include "editor/editor_settings.h" #include "main/main.h" @@ -253,7 +254,7 @@ void MeshLibraryEditor::_menu_cbk(int p_option) { void MeshLibraryEditor::_bind_methods() { } -MeshLibraryEditor::MeshLibraryEditor(EditorNode *p_editor) { +MeshLibraryEditor::MeshLibraryEditor() { file = memnew(EditorFileDialog); file->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); //not for now? @@ -282,7 +283,6 @@ MeshLibraryEditor::MeshLibraryEditor(EditorNode *p_editor) { menu->get_popup()->connect("id_pressed", callable_mp(this, &MeshLibraryEditor::_menu_cbk)); menu->hide(); - editor = p_editor; cd_remove = memnew(ConfirmationDialog); add_child(cd_remove); cd_remove->get_ok_button()->connect("pressed", callable_mp(this, &MeshLibraryEditor::_menu_remove_confirm)); @@ -316,14 +316,12 @@ void MeshLibraryEditorPlugin::make_visible(bool p_visible) { } } -MeshLibraryEditorPlugin::MeshLibraryEditorPlugin(EditorNode *p_node) { +MeshLibraryEditorPlugin::MeshLibraryEditorPlugin() { EDITOR_DEF("editors/grid_map/preview_size", 64); - mesh_library_editor = memnew(MeshLibraryEditor(p_node)); + mesh_library_editor = memnew(MeshLibraryEditor); - p_node->get_main_control()->add_child(mesh_library_editor); + EditorNode::get_singleton()->get_main_control()->add_child(mesh_library_editor); mesh_library_editor->set_anchors_and_offsets_preset(Control::PRESET_TOP_WIDE); mesh_library_editor->set_end(Point2(0, 22)); mesh_library_editor->hide(); - - editor = nullptr; } diff --git a/editor/plugins/mesh_library_editor_plugin.h b/editor/plugins/mesh_library_editor_plugin.h index 7144f87ba6..6bc992869b 100644 --- a/editor/plugins/mesh_library_editor_plugin.h +++ b/editor/plugins/mesh_library_editor_plugin.h @@ -31,15 +31,18 @@ #ifndef MESH_LIBRARY_EDITOR_PLUGIN_H #define MESH_LIBRARY_EDITOR_PLUGIN_H -#include "editor/editor_node.h" +#include "editor/editor_plugin.h" #include "scene/resources/mesh_library.h" +class EditorFileDialog; +class ConfirmationDialog; +class MenuButton; + class MeshLibraryEditor : public Control { GDCLASS(MeshLibraryEditor, Control); Ref<MeshLibrary> mesh_library; - EditorNode *editor; MenuButton *menu; ConfirmationDialog *cd_remove; ConfirmationDialog *cd_update; @@ -72,14 +75,13 @@ public: void edit(const Ref<MeshLibrary> &p_mesh_library); static Error update_library_file(Node *p_base_scene, Ref<MeshLibrary> ml, bool p_merge = true, bool p_apply_xforms = false); - MeshLibraryEditor(EditorNode *p_editor); + MeshLibraryEditor(); }; class MeshLibraryEditorPlugin : public EditorPlugin { GDCLASS(MeshLibraryEditorPlugin, EditorPlugin); MeshLibraryEditor *mesh_library_editor; - EditorNode *editor; public: virtual String get_name() const override { return "MeshLibrary"; } @@ -88,7 +90,7 @@ public: virtual bool handles(Object *p_node) const override; virtual void make_visible(bool p_visible) override; - MeshLibraryEditorPlugin(EditorNode *p_node); + MeshLibraryEditorPlugin(); }; #endif // MESH_LIBRARY_EDITOR_PLUGIN_H diff --git a/editor/plugins/multimesh_editor_plugin.cpp b/editor/plugins/multimesh_editor_plugin.cpp index 4ec65ea257..72f3b6a06e 100644 --- a/editor/plugins/multimesh_editor_plugin.cpp +++ b/editor/plugins/multimesh_editor_plugin.cpp @@ -30,6 +30,8 @@ #include "multimesh_editor_plugin.h" +#include "editor/editor_node.h" +#include "editor/scene_tree_editor.h" #include "node_3d_editor_plugin.h" #include "scene/3d/mesh_instance_3d.h" #include "scene/gui/box_container.h" @@ -375,10 +377,9 @@ void MultiMeshEditorPlugin::make_visible(bool p_visible) { } } -MultiMeshEditorPlugin::MultiMeshEditorPlugin(EditorNode *p_node) { - editor = p_node; +MultiMeshEditorPlugin::MultiMeshEditorPlugin() { multimesh_editor = memnew(MultiMeshEditor); - editor->get_main_control()->add_child(multimesh_editor); + EditorNode::get_singleton()->get_main_control()->add_child(multimesh_editor); multimesh_editor->options->hide(); } diff --git a/editor/plugins/multimesh_editor_plugin.h b/editor/plugins/multimesh_editor_plugin.h index ae18edd90a..846e6d17f3 100644 --- a/editor/plugins/multimesh_editor_plugin.h +++ b/editor/plugins/multimesh_editor_plugin.h @@ -31,11 +31,13 @@ #ifndef MULTIMESH_EDITOR_PLUGIN_H #define MULTIMESH_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/3d/multimesh_instance_3d.h" +#include "scene/gui/slider.h" #include "scene/gui/spin_box.h" +class SceneTreeDialog; + class MultiMeshEditor : public Control { GDCLASS(MultiMeshEditor, Control); @@ -84,7 +86,6 @@ class MultiMeshEditorPlugin : public EditorPlugin { GDCLASS(MultiMeshEditorPlugin, EditorPlugin); MultiMeshEditor *multimesh_editor; - EditorNode *editor; public: virtual String get_name() const override { return "MultiMesh"; } @@ -93,7 +94,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - MultiMeshEditorPlugin(EditorNode *p_node); + MultiMeshEditorPlugin(); ~MultiMeshEditorPlugin(); }; diff --git a/editor/plugins/navigation_polygon_editor_plugin.cpp b/editor/plugins/navigation_polygon_editor_plugin.cpp index e9e2a843cd..fe31f254df 100644 --- a/editor/plugins/navigation_polygon_editor_plugin.cpp +++ b/editor/plugins/navigation_polygon_editor_plugin.cpp @@ -112,11 +112,11 @@ void NavigationPolygonEditor::_create_resource() { _menu_option(MODE_CREATE); } -NavigationPolygonEditor::NavigationPolygonEditor(EditorNode *p_editor) : - AbstractPolygon2DEditor(p_editor) { +NavigationPolygonEditor::NavigationPolygonEditor() : + AbstractPolygon2DEditor() { node = nullptr; } -NavigationPolygonEditorPlugin::NavigationPolygonEditorPlugin(EditorNode *p_node) : - AbstractPolygon2DEditorPlugin(p_node, memnew(NavigationPolygonEditor(p_node)), "NavigationRegion2D") { +NavigationPolygonEditorPlugin::NavigationPolygonEditorPlugin() : + AbstractPolygon2DEditorPlugin(memnew(NavigationPolygonEditor), "NavigationRegion2D") { } diff --git a/editor/plugins/navigation_polygon_editor_plugin.h b/editor/plugins/navigation_polygon_editor_plugin.h index 446083902c..16fbb241e9 100644 --- a/editor/plugins/navigation_polygon_editor_plugin.h +++ b/editor/plugins/navigation_polygon_editor_plugin.h @@ -57,14 +57,14 @@ protected: virtual void _create_resource() override; public: - NavigationPolygonEditor(EditorNode *p_editor); + NavigationPolygonEditor(); }; class NavigationPolygonEditorPlugin : public AbstractPolygon2DEditorPlugin { GDCLASS(NavigationPolygonEditorPlugin, AbstractPolygon2DEditorPlugin); public: - NavigationPolygonEditorPlugin(EditorNode *p_node); + NavigationPolygonEditorPlugin(); }; #endif // NAVIGATIONPOLYGONEDITORPLUGIN_H diff --git a/editor/plugins/node_3d_editor_gizmos.cpp b/editor/plugins/node_3d_editor_gizmos.cpp index 59ba49232e..23f3087553 100644 --- a/editor/plugins/node_3d_editor_gizmos.cpp +++ b/editor/plugins/node_3d_editor_gizmos.cpp @@ -33,6 +33,8 @@ #include "core/math/convex_hull.h" #include "core/math/geometry_2d.h" #include "core/math/geometry_3d.h" +#include "editor/editor_node.h" +#include "editor/editor_settings.h" #include "editor/plugins/node_3d_editor_plugin.h" #include "scene/3d/audio_listener_3d.h" #include "scene/3d/audio_stream_player_3d.h" @@ -1067,7 +1069,6 @@ void EditorNode3DGizmoPlugin::_bind_methods() { GDVIRTUAL_BIND(_get_subgizmo_transform, "gizmo", "subgizmo_id"); GDVIRTUAL_BIND(_set_subgizmo_transform, "gizmo", "subgizmo_id", "transform"); GDVIRTUAL_BIND(_commit_subgizmos, "gizmo", "ids", "restores", "cancel"); - ; } bool EditorNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { @@ -1627,7 +1628,7 @@ void AudioStreamPlayer3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { ////// AudioListener3DGizmoPlugin::AudioListener3DGizmoPlugin() { - create_icon_material("audio_listener_3d_icon", Node3DEditor::get_singleton()->get_theme_icon("GizmoAudioListener3D", "EditorIcons")); + create_icon_material("audio_listener_3d_icon", Node3DEditor::get_singleton()->get_theme_icon(SNAME("GizmoAudioListener3D"), SNAME("EditorIcons"))); } bool AudioListener3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { @@ -1889,6 +1890,7 @@ void MeshInstance3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { OccluderInstance3DGizmoPlugin::OccluderInstance3DGizmoPlugin() { create_material("line_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/occluder", Color(0.8, 0.5, 1))); + create_handle_material("handles"); } bool OccluderInstance3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { @@ -1903,6 +1905,189 @@ int OccluderInstance3DGizmoPlugin::get_priority() const { return -1; } +String OccluderInstance3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_id, bool p_secondary) const { + const OccluderInstance3D *cs = Object::cast_to<OccluderInstance3D>(p_gizmo->get_spatial_node()); + + Ref<Occluder3D> o = cs->get_occluder(); + if (o.is_null()) { + return ""; + } + + if (Object::cast_to<SphereOccluder3D>(*o)) { + return "Radius"; + } + + if (Object::cast_to<BoxOccluder3D>(*o) || Object::cast_to<QuadOccluder3D>(*o)) { + return "Size"; + } + + return ""; +} + +Variant OccluderInstance3DGizmoPlugin::get_handle_value(const EditorNode3DGizmo *p_gizmo, int p_id, bool p_secondary) const { + OccluderInstance3D *oi = Object::cast_to<OccluderInstance3D>(p_gizmo->get_spatial_node()); + + Ref<Occluder3D> o = oi->get_occluder(); + if (o.is_null()) { + return Variant(); + } + + if (Object::cast_to<SphereOccluder3D>(*o)) { + Ref<SphereOccluder3D> so = o; + return so->get_radius(); + } + + if (Object::cast_to<BoxOccluder3D>(*o)) { + Ref<BoxOccluder3D> bo = o; + return bo->get_size(); + } + + if (Object::cast_to<QuadOccluder3D>(*o)) { + Ref<QuadOccluder3D> qo = o; + return qo->get_size(); + } + + return Variant(); +} + +void OccluderInstance3DGizmoPlugin::set_handle(const EditorNode3DGizmo *p_gizmo, int p_id, bool p_secondary, Camera3D *p_camera, const Point2 &p_point) { + OccluderInstance3D *oi = Object::cast_to<OccluderInstance3D>(p_gizmo->get_spatial_node()); + + Ref<Occluder3D> o = oi->get_occluder(); + if (o.is_null()) { + return; + } + + Transform3D gt = oi->get_global_transform(); + Transform3D gi = gt.affine_inverse(); + + Vector3 ray_from = p_camera->project_ray_origin(p_point); + Vector3 ray_dir = p_camera->project_ray_normal(p_point); + + Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 4096) }; + + bool snap_enabled = Node3DEditor::get_singleton()->is_snap_enabled(); + float snap = Node3DEditor::get_singleton()->get_translate_snap(); + + if (Object::cast_to<SphereOccluder3D>(*o)) { + Ref<SphereOccluder3D> so = o; + Vector3 ra, rb; + Geometry3D::get_closest_points_between_segments(Vector3(), Vector3(4096, 0, 0), sg[0], sg[1], ra, rb); + float d = ra.x; + if (snap_enabled) { + d = Math::snapped(d, snap); + } + + if (d < 0.001) { + d = 0.001; + } + + so->set_radius(d); + } + + if (Object::cast_to<BoxOccluder3D>(*o)) { + Vector3 axis; + axis[p_id] = 1.0; + Ref<BoxOccluder3D> bo = o; + Vector3 ra, rb; + Geometry3D::get_closest_points_between_segments(Vector3(), axis * 4096, sg[0], sg[1], ra, rb); + float d = ra[p_id]; + if (snap_enabled) { + d = Math::snapped(d, snap); + } + + if (d < 0.001) { + d = 0.001; + } + + Vector3 he = bo->get_size(); + he[p_id] = d * 2; + bo->set_size(he); + } + + if (Object::cast_to<QuadOccluder3D>(*o)) { + Ref<QuadOccluder3D> qo = o; + Plane p = Plane(Vector3(0.0f, 0.0f, 1.0f), 0.0f); + Vector3 intersection; + if (!p.intersects_segment(sg[0], sg[1], &intersection)) { + return; + } + + if (p_id == 2) { + Vector2 s = Vector2(intersection.x, intersection.y) * 2.0f; + if (snap_enabled) { + s = s.snapped(Vector2(snap, snap)); + } + s = s.max(Vector2(0.001, 0.001)); + qo->set_size(s); + } else { + float d = intersection[p_id]; + if (snap_enabled) { + d = Math::snapped(d, snap); + } + + if (d < 0.001) { + d = 0.001; + } + + Vector2 he = qo->get_size(); + he[p_id] = d * 2.0f; + qo->set_size(he); + } + } +} + +void OccluderInstance3DGizmoPlugin::commit_handle(const EditorNode3DGizmo *p_gizmo, int p_id, bool p_secondary, const Variant &p_restore, bool p_cancel) { + OccluderInstance3D *oi = Object::cast_to<OccluderInstance3D>(p_gizmo->get_spatial_node()); + + Ref<Occluder3D> o = oi->get_occluder(); + if (o.is_null()) { + return; + } + + if (Object::cast_to<SphereOccluder3D>(*o)) { + Ref<SphereOccluder3D> so = o; + if (p_cancel) { + so->set_radius(p_restore); + return; + } + + UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo(); + ur->create_action(TTR("Change Sphere Shape Radius")); + ur->add_do_method(so.ptr(), "set_radius", so->get_radius()); + ur->add_undo_method(so.ptr(), "set_radius", p_restore); + ur->commit_action(); + } + + if (Object::cast_to<BoxOccluder3D>(*o)) { + Ref<BoxOccluder3D> bo = o; + if (p_cancel) { + bo->set_size(p_restore); + return; + } + + UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo(); + ur->create_action(TTR("Change Box Shape Size")); + ur->add_do_method(bo.ptr(), "set_size", bo->get_size()); + ur->add_undo_method(bo.ptr(), "set_size", p_restore); + ur->commit_action(); + } + + if (Object::cast_to<QuadOccluder3D>(*o)) { + Ref<QuadOccluder3D> qo = o; + if (p_cancel) { + qo->set_size(p_restore); + return; + } + + UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo(); + ur->create_action(TTR("Change Box Shape Size")); + ur->add_do_method(qo.ptr(), "set_size", qo->get_size()); + ur->add_undo_method(qo.ptr(), "set_size", p_restore); + ur->commit_action(); + } +} + void OccluderInstance3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { OccluderInstance3D *occluder_instance = Object::cast_to<OccluderInstance3D>(p_gizmo->get_spatial_node()); @@ -1920,6 +2105,35 @@ void OccluderInstance3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { p_gizmo->add_lines(lines, material); p_gizmo->add_collision_segments(lines); } + + Ref<Material> handles_material = get_material("handles"); + if (Object::cast_to<SphereOccluder3D>(*o)) { + Ref<SphereOccluder3D> so = o; + float r = so->get_radius(); + Vector<Vector3> handles = { Vector3(r, 0, 0) }; + p_gizmo->add_handles(handles, handles_material); + } + + if (Object::cast_to<BoxOccluder3D>(*o)) { + Ref<BoxOccluder3D> bo = o; + + Vector<Vector3> handles; + for (int i = 0; i < 3; i++) { + Vector3 ax; + ax[i] = bo->get_size()[i] / 2; + handles.push_back(ax); + } + + p_gizmo->add_handles(handles, handles_material); + } + + if (Object::cast_to<QuadOccluder3D>(*o)) { + Ref<QuadOccluder3D> qo = o; + Vector2 size = qo->get_size(); + Vector3 s = Vector3(size.x, size.y, 0.0f) / 2.0f; + Vector<Vector3> handles = { Vector3(s.x, 0.0f, 0.0f), Vector3(0.0f, s.y, 0.0f), Vector3(s.x, s.y, 0.0f) }; + p_gizmo->add_handles(handles, handles_material); + } } ///// @@ -3455,13 +3669,8 @@ void VoxelGIGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { continue; } - Vector2 dir; - dir[j] = 1.0; - Vector2 ta, tb; int j_n1 = (j + 1) % 3; int j_n2 = (j + 2) % 3; - ta[j_n1] = 1.0; - tb[j_n2] = 1.0; for (int k = 0; k < 4; k++) { Vector3 from = aabb.position, to = aabb.position; diff --git a/editor/plugins/node_3d_editor_gizmos.h b/editor/plugins/node_3d_editor_gizmos.h index 66b3f02fcf..fa55651d26 100644 --- a/editor/plugins/node_3d_editor_gizmos.h +++ b/editor/plugins/node_3d_editor_gizmos.h @@ -300,6 +300,11 @@ public: int get_priority() const override; void redraw(EditorNode3DGizmo *p_gizmo) override; + String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_id, bool p_secondary) const override; + Variant get_handle_value(const EditorNode3DGizmo *p_gizmo, int p_id, bool p_secondary) const override; + void set_handle(const EditorNode3DGizmo *p_gizmo, int p_id, bool p_secondary, Camera3D *p_camera, const Point2 &p_point) override; + void commit_handle(const EditorNode3DGizmo *p_gizmo, int p_id, bool p_secondary, const Variant &p_restore, bool p_cancel = false) override; + OccluderInstance3DGizmoPlugin(); }; diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 4610171d68..002c879cdc 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -32,6 +32,7 @@ #include "core/config/project_settings.h" #include "core/input/input.h" +#include "core/input/input_map.h" #include "core/math/camera_matrix.h" #include "core/math/math_funcs.h" #include "core/os/keyboard.h" @@ -42,6 +43,7 @@ #include "editor/plugins/animation_player_editor_plugin.h" #include "editor/plugins/node_3d_editor_gizmos.h" #include "editor/plugins/script_editor_plugin.h" +#include "editor/scene_tree_dock.h" #include "scene/3d/camera_3d.h" #include "scene/3d/collision_shape_3d.h" #include "scene/3d/light_3d.h" @@ -81,28 +83,32 @@ #define MAX_FOV 179 void ViewportRotationControl::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - axis_menu_options.clear(); - axis_menu_options.push_back(Node3DEditorViewport::VIEW_RIGHT); - axis_menu_options.push_back(Node3DEditorViewport::VIEW_TOP); - axis_menu_options.push_back(Node3DEditorViewport::VIEW_REAR); - axis_menu_options.push_back(Node3DEditorViewport::VIEW_LEFT); - axis_menu_options.push_back(Node3DEditorViewport::VIEW_BOTTOM); - axis_menu_options.push_back(Node3DEditorViewport::VIEW_FRONT); - - axis_colors.clear(); - axis_colors.push_back(get_theme_color(SNAME("axis_x_color"), SNAME("Editor"))); - axis_colors.push_back(get_theme_color(SNAME("axis_y_color"), SNAME("Editor"))); - axis_colors.push_back(get_theme_color(SNAME("axis_z_color"), SNAME("Editor"))); - update(); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + axis_menu_options.clear(); + axis_menu_options.push_back(Node3DEditorViewport::VIEW_RIGHT); + axis_menu_options.push_back(Node3DEditorViewport::VIEW_TOP); + axis_menu_options.push_back(Node3DEditorViewport::VIEW_REAR); + axis_menu_options.push_back(Node3DEditorViewport::VIEW_LEFT); + axis_menu_options.push_back(Node3DEditorViewport::VIEW_BOTTOM); + axis_menu_options.push_back(Node3DEditorViewport::VIEW_FRONT); + + axis_colors.clear(); + axis_colors.push_back(get_theme_color(SNAME("axis_x_color"), SNAME("Editor"))); + axis_colors.push_back(get_theme_color(SNAME("axis_y_color"), SNAME("Editor"))); + axis_colors.push_back(get_theme_color(SNAME("axis_z_color"), SNAME("Editor"))); + update(); - if (!is_connected("mouse_exited", callable_mp(this, &ViewportRotationControl::_on_mouse_exited))) { - connect("mouse_exited", callable_mp(this, &ViewportRotationControl::_on_mouse_exited)); - } - } + if (!is_connected("mouse_exited", callable_mp(this, &ViewportRotationControl::_on_mouse_exited))) { + connect("mouse_exited", callable_mp(this, &ViewportRotationControl::_on_mouse_exited)); + } + } break; - if (p_what == NOTIFICATION_DRAW && viewport != nullptr) { - _draw(); + case NOTIFICATION_DRAW: { + if (viewport != nullptr) { + _draw(); + } + } break; } } @@ -384,6 +390,27 @@ int Node3DEditorViewport::get_selected_count() const { return count; } +void Node3DEditorViewport::cancel_transform() { + List<Node *> &selection = editor_selection->get_selected_node_list(); + + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + Node3D *sp = Object::cast_to<Node3D>(E->get()); + if (!sp) { + continue; + } + + Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); + if (!se) { + continue; + } + + sp->set_global_transform(se->original); + } + + finish_transform(); + set_message(TTR("Transform Aborted."), 3); +} + float Node3DEditorViewport::get_znear() const { return CLAMP(spatial_editor->get_znear(), MIN_Z, MAX_Z); } @@ -451,7 +478,7 @@ void Node3DEditorViewport::_select_clicked(bool p_allow_locked) { if (!p_allow_locked) { // Replace the node by the group if grouped - while (node && node != editor->get_edited_scene()->get_parent()) { + while (node && node != EditorNode::get_singleton()->get_edited_scene()->get_parent()) { Node3D *selected_tmp = Object::cast_to<Node3D>(node); if (selected_tmp && node->has_meta("_edit_group_")) { selected = selected_tmp; @@ -471,12 +498,12 @@ void Node3DEditorViewport::_select_clicked(bool p_allow_locked) { if (!editor_selection->is_selected(selected)) { editor_selection->clear(); editor_selection->add_node(selected); - editor->edit_node(selected); + EditorNode::get_singleton()->edit_node(selected); } } if (editor_selection->get_selected_node_list().size() == 1) { - editor->edit_node(editor_selection->get_selected_node_list()[0]); + EditorNode::get_singleton()->edit_node(editor_selection->get_selected_node_list()[0]); } } } @@ -762,7 +789,7 @@ void Node3DEditorViewport::_select_region() { // Replace the node by the group if grouped if (item->is_class("Node3D")) { Node3D *sel = Object::cast_to<Node3D>(item); - while (item && item != editor->get_edited_scene()->get_parent()) { + while (item && item != EditorNode::get_singleton()->get_edited_scene()->get_parent()) { Node3D *selected_tmp = Object::cast_to<Node3D>(item); if (selected_tmp && item->has_meta("_edit_group_")) { sel = selected_tmp; @@ -796,7 +823,7 @@ void Node3DEditorViewport::_select_region() { } if (editor_selection->get_selected_node_list().size() == 1) { - editor->edit_node(editor_selection->get_selected_node_list()[0]); + EditorNode::get_singleton()->edit_node(editor_selection->get_selected_node_list()[0]); } } @@ -865,6 +892,7 @@ void Node3DEditorViewport::_update_name() { } void Node3DEditorViewport::_compute_edit(const Point2 &p_point) { + _edit.original_local = spatial_editor->are_local_coords_enabled(); _edit.click_ray = _get_ray(p_point); _edit.click_ray_pos = _get_ray_pos(p_point); _edit.plane = TRANSFORM_VIEW; @@ -1018,24 +1046,40 @@ bool Node3DEditorViewport::_transform_gizmo_select(const Vector2 &p_screenpos, b if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE) { int col_axis = -1; - float col_d = 1e20; - for (int i = 0; i < 3; i++) { - Plane plane(gt.basis.get_axis(i).normalized(), gt.origin); - Vector3 r; - if (!plane.intersects_ray(ray_pos, ray, &r)) { - continue; + Vector3 hit_position; + Vector3 hit_normal; + real_t ray_length = gt.origin.distance_to(ray_pos) + (GIZMO_CIRCLE_SIZE * gizmo_scale) * 4.0f; + if (Geometry3D::segment_intersects_sphere(ray_pos, ray_pos + ray * ray_length, gt.origin, gizmo_scale * (GIZMO_CIRCLE_SIZE), &hit_position, &hit_normal)) { + if (hit_normal.dot(_get_camera_normal()) < 0.05) { + hit_position = gt.xform_inv(hit_position).abs(); + int min_axis = hit_position.min_axis_index(); + if (hit_position[min_axis] < gizmo_scale * GIZMO_RING_HALF_WIDTH) { + col_axis = min_axis; + } } + } + + if (col_axis == -1) { + float col_d = 1e20; + + for (int i = 0; i < 3; i++) { + Plane plane(gt.basis.get_axis(i).normalized(), gt.origin); + Vector3 r; + if (!plane.intersects_ray(ray_pos, ray, &r)) { + continue; + } - const real_t dist = r.distance_to(gt.origin); - const Vector3 r_dir = (r - gt.origin).normalized(); + const real_t dist = r.distance_to(gt.origin); + const Vector3 r_dir = (r - gt.origin).normalized(); - if (_get_camera_normal().dot(r_dir) <= 0.005) { - if (dist > gizmo_scale * (GIZMO_CIRCLE_SIZE - GIZMO_RING_HALF_WIDTH) && dist < gizmo_scale * (GIZMO_CIRCLE_SIZE + GIZMO_RING_HALF_WIDTH)) { - const real_t d = ray_pos.distance_to(r); - if (d < col_d) { - col_d = d; - col_axis = i; + if (_get_camera_normal().dot(r_dir) <= 0.005) { + if (dist > gizmo_scale * (GIZMO_CIRCLE_SIZE - GIZMO_RING_HALF_WIDTH) && dist < gizmo_scale * (GIZMO_CIRCLE_SIZE + GIZMO_RING_HALF_WIDTH)) { + const real_t d = ray_pos.distance_to(r); + if (d < col_d) { + col_d = d; + col_axis = i; + } } } } @@ -1203,7 +1247,7 @@ Transform3D Node3DEditorViewport::_compute_transform(TransformMode p_mode, const } void Node3DEditorViewport::_surface_mouse_enter() { - if (!surface->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field())) { + if (!surface->has_focus() && (!get_viewport()->gui_get_focus_owner() || !get_viewport()->gui_get_focus_owner()->is_text_field())) { surface->grab_focus(); } } @@ -1227,7 +1271,7 @@ bool Node3DEditorViewport ::_is_node_locked(const Node *p_node) { void Node3DEditorViewport::_list_select(Ref<InputEventMouseButton> b) { _find_items_at_pos(b->get_position(), selection_results, spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT); - Node *scene = editor->get_edited_scene(); + Node *scene = EditorNode::get_singleton()->get_edited_scene(); for (int i = 0; i < selection_results.size(); i++) { Node3D *item = selection_results[i].item; @@ -1262,7 +1306,7 @@ void Node3DEditorViewport::_list_select(Ref<InputEventMouseButton> b) { if (_is_node_locked(spat)) { locked = 1; } else { - Node *ed_scene = editor->get_edited_scene(); + Node *ed_scene = EditorNode::get_singleton()->get_edited_scene(); Node *node = spat; while (node && node != ed_scene->get_parent()) { @@ -1299,7 +1343,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { EditorPlugin::AfterGUIInput after = EditorPlugin::AFTER_GUI_INPUT_PASS; { - EditorNode *en = editor; + EditorNode *en = EditorNode::get_singleton(); EditorPluginList *force_input_forwarding_list = en->get_editor_plugins_force_input_forwarding(); if (!force_input_forwarding_list->is_empty()) { EditorPlugin::AfterGUIInput discard = force_input_forwarding_list->forward_spatial_gui_input(camera, p_event, true); @@ -1312,7 +1356,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } { - EditorNode *en = editor; + EditorNode *en = EditorNode::get_singleton(); EditorPluginList *over_plugin_list = en->get_editor_plugins_over(); if (!over_plugin_list->is_empty()) { EditorPlugin::AfterGUIInput discard = over_plugin_list->forward_spatial_gui_input(camera, p_event, false); @@ -1375,39 +1419,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } if (_edit.mode != TRANSFORM_NONE && b->is_pressed()) { - //cancel motion - _edit.mode = TRANSFORM_NONE; - - List<Node *> &selection = editor_selection->get_selected_node_list(); - - for (Node *E : selection) { - Node3D *sp = Object::cast_to<Node3D>(E); - if (!sp) { - continue; - } - - Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); - if (!se) { - continue; - } - - if (se->gizmo.is_valid()) { - Vector<int> ids; - Vector<Transform3D> restore; - - for (const KeyValue<int, Transform3D> &GE : se->subgizmos) { - ids.push_back(GE.key); - restore.push_back(GE.value); - } - - se->gizmo->commit_subgizmos(ids, restore, true); - spatial_editor->update_transform_gizmo(); - } else { - sp->set_global_transform(se->original); - } - } - surface->update(); - set_message(TTR("Transform Aborted."), 3); + cancel_transform(); } if (b->is_pressed()) { @@ -1461,6 +1473,12 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } break; case MouseButton::LEFT: { if (b->is_pressed()) { + clicked_wants_append = b->is_shift_pressed(); + + if (_edit.mode != TRANSFORM_NONE && _edit.instant) { + commit_transform(); + break; // just commit the edit, stop processing the event so we don't deselect the object + } NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int(); if ((nav_scheme == NAVIGATION_MAYA || nav_scheme == NAVIGATION_MODO) && b->is_alt_pressed()) { break; @@ -1567,42 +1585,24 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { clicked = ObjectID(); if ((spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT && b->is_command_pressed()) || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE) { - /* HANDLE ROTATION */ - if (get_selected_count() == 0) { - break; //bye - } - //handle rotate - _edit.mode = TRANSFORM_ROTATE; - _compute_edit(b->get_position()); + begin_transform(TRANSFORM_ROTATE, false); break; } if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE) { - if (get_selected_count() == 0) { - break; //bye - } - //handle translate - _edit.mode = TRANSFORM_TRANSLATE; - _compute_edit(b->get_position()); + begin_transform(TRANSFORM_TRANSLATE, false); break; } if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE) { - if (get_selected_count() == 0) { - break; //bye - } - //handle scale - _edit.mode = TRANSFORM_SCALE; - _compute_edit(b->get_position()); + begin_transform(TRANSFORM_SCALE, false); break; } if (after != EditorPlugin::AFTER_GUI_INPUT_DESELECT) { - clicked = _select_ray(b->get_position()); - //clicking is always deferred to either move or release - - clicked_wants_append = b->is_shift_pressed(); + clicked = _select_ray(b->get_position()); + selection_in_progress = true; if (clicked.is_null()) { //default to regionselect @@ -1621,6 +1621,8 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } if (after != EditorPlugin::AFTER_GUI_INPUT_DESELECT) { + selection_in_progress = false; + if (clicked.is_valid()) { _select_clicked(false); } @@ -1648,32 +1650,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { se->gizmo->commit_subgizmos(ids, restore, false); spatial_editor->update_transform_gizmo(); } else { - static const char *_transform_name[4] = { - TTRC("None"), - TTRC("Rotate"), - // TRANSLATORS: This refers to the movement that changes the position of an object. - TTRC("Translate"), - TTRC("Scale"), - }; - undo_redo->create_action(TTRGET(_transform_name[_edit.mode])); - - List<Node *> &selection = editor_selection->get_selected_node_list(); - - for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { - Node3D *sp = Object::cast_to<Node3D>(E->get()); - if (!sp) { - continue; - } - - Node3DEditorSelectedItem *sel_item = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); - if (!sel_item) { - continue; - } - - undo_redo->add_do_method(sp, "set_global_transform", sp->get_global_gizmo_transform()); - undo_redo->add_undo_method(sp, "set_global_transform", sel_item->original); - } - undo_redo->commit_action(); + commit_transform(); } _edit.mode = TRANSFORM_NONE; set_message(""); @@ -1739,7 +1716,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { String n = _edit.gizmo->get_handle_name(_edit.gizmo_handle, _edit.gizmo_handle_secondary); set_message(n + ": " + String(v)); - } else if ((m->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { + } else if ((m->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE || _edit.instant) { if (nav_scheme == NAVIGATION_MAYA && m->is_alt_pressed()) { nav_mode = NAVIGATION_ORBIT; } else if (nav_scheme == NAVIGATION_MODO && m->is_alt_pressed() && m->is_shift_pressed()) { @@ -1750,11 +1727,14 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { nav_mode = NAVIGATION_ORBIT; } else { const bool movement_threshold_passed = _edit.original_mouse_pos.distance_to(_edit.mouse_pos) > 8 * EDSCALE; - if (clicked.is_valid() && movement_threshold_passed) { - _compute_edit(_edit.original_mouse_pos); - clicked = ObjectID(); - _edit.mode = TRANSFORM_TRANSLATE; + // enable region-select if nothing has been selected yet or multi-select (shift key) is active + if (selection_in_progress && movement_threshold_passed) { + if (get_selected_count() == 0 || clicked_wants_append) { + cursor.region_select = true; + cursor.region_begin = _edit.original_mouse_pos; + clicked = ObjectID(); + } } if (cursor.region_select) { @@ -1763,328 +1743,17 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { return; } + if (clicked.is_valid() && movement_threshold_passed) { + _compute_edit(_edit.original_mouse_pos); + clicked = ObjectID(); + _edit.mode = TRANSFORM_TRANSLATE; + } + if (_edit.mode == TRANSFORM_NONE) { return; } - Vector3 ray_pos = _get_ray_pos(m->get_position()); - Vector3 ray = _get_ray(m->get_position()); - double snap = EDITOR_GET("interface/inspector/default_float_step"); - int snap_step_decimals = Math::range_step_decimals(snap); - - switch (_edit.mode) { - case TRANSFORM_SCALE: { - Vector3 motion_mask; - Plane plane; - bool plane_mv = false; - - switch (_edit.plane) { - case TRANSFORM_VIEW: - motion_mask = Vector3(0, 0, 0); - plane = Plane(_get_camera_normal(), _edit.center); - break; - case TRANSFORM_X_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_Y_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_Z_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_YZ: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(), _edit.center); - plane_mv = true; - break; - case TRANSFORM_XZ: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(), _edit.center); - plane_mv = true; - break; - case TRANSFORM_XY: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(), _edit.center); - plane_mv = true; - break; - } - - Vector3 intersection; - if (!plane.intersects_ray(ray_pos, ray, &intersection)) { - break; - } - - Vector3 click; - if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { - break; - } - - Vector3 motion = intersection - click; - if (_edit.plane != TRANSFORM_VIEW) { - if (!plane_mv) { - motion = motion_mask.dot(motion) * motion_mask; - - } else { - // Alternative planar scaling mode - if (_get_key_modifier(m) != Key::SHIFT) { - motion = motion_mask.dot(motion) * motion_mask; - } - } - - } else { - const real_t center_click_dist = click.distance_to(_edit.center); - const real_t center_inters_dist = intersection.distance_to(_edit.center); - if (center_click_dist == 0) { - break; - } - - const real_t scale = center_inters_dist - center_click_dist; - motion = Vector3(scale, scale, scale); - } - - motion /= click.distance_to(_edit.center); - - // Disable local transformation for TRANSFORM_VIEW - bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); - - if (_edit.snap || spatial_editor->is_snap_enabled()) { - snap = spatial_editor->get_scale_snap() / 100; - } - Vector3 motion_snapped = motion; - motion_snapped.snap(Vector3(snap, snap, snap)); - // This might not be necessary anymore after issue #288 is solved (in 4.0?). - set_message(TTR("Scaling: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + - String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); - motion = _edit.original.basis.inverse().xform(motion); - - List<Node *> &selection = editor_selection->get_selected_node_list(); - for (Node *E : selection) { - Node3D *sp = Object::cast_to<Node3D>(E); - if (!sp) { - continue; - } - - Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); - if (!se) { - continue; - } - - if (sp->has_meta("_edit_lock_")) { - continue; - } - - if (se->gizmo.is_valid()) { - for (KeyValue<int, Transform3D> &GE : se->subgizmos) { - Transform3D xform = GE.value; - Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original * xform, xform, motion, snap, local_coords, true); // Force orthogonal with subgizmo. - if (!local_coords) { - new_xform = se->original.affine_inverse() * new_xform; - } - se->gizmo->set_subgizmo_transform(GE.key, new_xform); - } - } else { - Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original, se->original_local, motion, snap, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); - _transform_gizmo_apply(se->sp, new_xform, local_coords); - } - } - - spatial_editor->update_transform_gizmo(); - surface->update(); - - } break; - - case TRANSFORM_TRANSLATE: { - Vector3 motion_mask; - Plane plane; - bool plane_mv = false; - - switch (_edit.plane) { - case TRANSFORM_VIEW: - plane = Plane(_get_camera_normal(), _edit.center); - break; - case TRANSFORM_X_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_Y_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_Z_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_YZ: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(), _edit.center); - plane_mv = true; - break; - case TRANSFORM_XZ: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(), _edit.center); - plane_mv = true; - break; - case TRANSFORM_XY: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(), _edit.center); - plane_mv = true; - break; - } - - Vector3 intersection; - if (!plane.intersects_ray(ray_pos, ray, &intersection)) { - break; - } - - Vector3 click; - if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { - break; - } - - Vector3 motion = intersection - click; - if (_edit.plane != TRANSFORM_VIEW) { - if (!plane_mv) { - motion = motion_mask.dot(motion) * motion_mask; - } - } - - // Disable local transformation for TRANSFORM_VIEW - bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); - - if (_edit.snap || spatial_editor->is_snap_enabled()) { - snap = spatial_editor->get_translate_snap(); - } - Vector3 motion_snapped = motion; - motion_snapped.snap(Vector3(snap, snap, snap)); - set_message(TTR("Translating: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + - String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); - motion = spatial_editor->get_gizmo_transform().basis.inverse().xform(motion); - - List<Node *> &selection = editor_selection->get_selected_node_list(); - for (Node *E : selection) { - Node3D *sp = Object::cast_to<Node3D>(E); - if (!sp) { - continue; - } - - Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); - if (!se) { - continue; - } - - if (sp->has_meta("_edit_lock_")) { - continue; - } - - if (se->gizmo.is_valid()) { - for (KeyValue<int, Transform3D> &GE : se->subgizmos) { - Transform3D xform = GE.value; - Transform3D new_xform = _compute_transform(TRANSFORM_TRANSLATE, se->original * xform, xform, motion, snap, local_coords, true); // Force orthogonal with subgizmo. - new_xform = se->original.affine_inverse() * new_xform; - se->gizmo->set_subgizmo_transform(GE.key, new_xform); - } - } else { - Transform3D new_xform = _compute_transform(TRANSFORM_TRANSLATE, se->original, se->original_local, motion, snap, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); - _transform_gizmo_apply(se->sp, new_xform, false); - } - } - - spatial_editor->update_transform_gizmo(); - surface->update(); - - } break; - - case TRANSFORM_ROTATE: { - Plane plane; - Vector3 axis; - - switch (_edit.plane) { - case TRANSFORM_VIEW: - plane = Plane(_get_camera_normal(), _edit.center); - break; - case TRANSFORM_X_AXIS: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(), _edit.center); - axis = Vector3(1, 0, 0); - break; - case TRANSFORM_Y_AXIS: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(), _edit.center); - axis = Vector3(0, 1, 0); - break; - case TRANSFORM_Z_AXIS: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(), _edit.center); - axis = Vector3(0, 0, 1); - break; - case TRANSFORM_YZ: - case TRANSFORM_XZ: - case TRANSFORM_XY: - break; - } - - Vector3 intersection; - if (!plane.intersects_ray(ray_pos, ray, &intersection)) { - break; - } - - Vector3 click; - if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { - break; - } - - Vector3 y_axis = (click - _edit.center).normalized(); - Vector3 x_axis = plane.normal.cross(y_axis).normalized(); - - double angle = Math::atan2(x_axis.dot(intersection - _edit.center), y_axis.dot(intersection - _edit.center)); - - if (_edit.snap || spatial_editor->is_snap_enabled()) { - snap = spatial_editor->get_rotate_snap(); - } - angle = Math::rad2deg(angle) + snap * 0.5; //else it won't reach +180 - angle -= Math::fmod(angle, snap); - set_message(vformat(TTR("Rotating %s degrees."), String::num(angle, snap_step_decimals))); - angle = Math::deg2rad(angle); - - bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); // Disable local transformation for TRANSFORM_VIEW - - List<Node *> &selection = editor_selection->get_selected_node_list(); - for (Node *E : selection) { - Node3D *sp = Object::cast_to<Node3D>(E); - if (!sp) { - continue; - } - - Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); - if (!se) { - continue; - } - - if (sp->has_meta("_edit_lock_")) { - continue; - } - - Vector3 compute_axis = local_coords ? axis : plane.normal; - if (se->gizmo.is_valid()) { - for (KeyValue<int, Transform3D> &GE : se->subgizmos) { - Transform3D xform = GE.value; - - Transform3D new_xform = _compute_transform(TRANSFORM_ROTATE, se->original * xform, xform, compute_axis, angle, local_coords, true); // Force orthogonal with subgizmo. - if (!local_coords) { - new_xform = se->original.affine_inverse() * new_xform; - } - se->gizmo->set_subgizmo_transform(GE.key, new_xform); - } - } else { - Transform3D new_xform = _compute_transform(TRANSFORM_ROTATE, se->original, se->original_local, compute_axis, angle, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); - _transform_gizmo_apply(se->sp, new_xform, local_coords); - } - } - - spatial_editor->update_transform_gizmo(); - surface->update(); - - } break; - default: { - } - } + update_transform(m->get_position(), _get_key_modifier(m) == Key::SHIFT); } } else if ((m->get_button_mask() & MouseButton::MASK_RIGHT) != MouseButton::NONE || freelook_active) { if (nav_scheme == NAVIGATION_MAYA && m->is_alt_pressed()) { @@ -2225,6 +1894,56 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } + if (_edit.mode == TRANSFORM_NONE) { + if (k->get_keycode() == Key::ESCAPE && !cursor.region_select) { + _clear_selected(); + return; + } + } else { + // We're actively transforming, handle keys specially + TransformPlane new_plane = TRANSFORM_VIEW; + String new_message; + if (ED_IS_SHORTCUT("spatial_editor/lock_transform_x", p_event)) { + new_plane = TRANSFORM_X_AXIS; + new_message = TTR("X-Axis Transform."); + } else if (ED_IS_SHORTCUT("spatial_editor/lock_transform_y", p_event)) { + new_plane = TRANSFORM_Y_AXIS; + new_message = TTR("Y-Axis Transform."); + } else if (ED_IS_SHORTCUT("spatial_editor/lock_transform_z", p_event)) { + new_plane = TRANSFORM_Z_AXIS; + new_message = TTR("Z-Axis Transform."); + } else if (_edit.mode != TRANSFORM_ROTATE) { // rotating on a plane doesn't make sense + if (ED_IS_SHORTCUT("spatial_editor/lock_transform_yz", p_event)) { + new_plane = TRANSFORM_YZ; + new_message = TTR("YZ-Plane Transform."); + } else if (ED_IS_SHORTCUT("spatial_editor/lock_transform_xz", p_event)) { + new_plane = TRANSFORM_XZ; + new_message = TTR("XZ-Plane Transform."); + } else if (ED_IS_SHORTCUT("spatial_editor/lock_transform_xy", p_event)) { + new_plane = TRANSFORM_XY; + new_message = TTR("XY-Plane Transform."); + } + } + + if (new_plane != TRANSFORM_VIEW) { + if (new_plane != _edit.plane) { + // lock me once and get a global constraint + _edit.plane = new_plane; + spatial_editor->set_local_coords_enabled(false); + } else if (!spatial_editor->are_local_coords_enabled()) { + // lock me twice and get a local constraint + spatial_editor->set_local_coords_enabled(true); + } else { + // lock me thrice and we're back where we started + _edit.plane = TRANSFORM_VIEW; + spatial_editor->set_local_coords_enabled(false); + } + update_transform(_edit.mouse_pos, Input::get_singleton()->is_key_pressed(Key::SHIFT)); + set_message(new_message, 2); + accept_event(); + return; + } + } if (ED_IS_SHORTCUT("spatial_editor/snap", p_event)) { if (_edit.mode != TRANSFORM_NONE) { _edit.snap = !_edit.snap; @@ -2315,6 +2034,18 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { set_message(TTR("Animation Key Inserted.")); } + if (ED_IS_SHORTCUT("spatial_editor/cancel_transform", p_event) && _edit.mode != TRANSFORM_NONE) { + cancel_transform(); + } + if (ED_IS_SHORTCUT("spatial_editor/instant_translate", p_event)) { + begin_transform(TRANSFORM_TRANSLATE, true); + } + if (ED_IS_SHORTCUT("spatial_editor/instant_rotate", p_event)) { + begin_transform(TRANSFORM_ROTATE, true); + } + if (ED_IS_SHORTCUT("spatial_editor/instant_scale", p_event)) { + begin_transform(TRANSFORM_SCALE, true); + } // Freelook doesn't work in orthogonal mode. if (!orthogonal && ED_IS_SHORTCUT("spatial_editor/freelook_toggle", p_event)) { @@ -2561,26 +2292,6 @@ Point2i Node3DEditorViewport::_get_warped_mouse_motion(const Ref<InputEventMouse return relative; } -static bool is_shortcut_pressed(const String &p_path) { - Ref<Shortcut> shortcut = ED_GET_SHORTCUT(p_path); - if (shortcut.is_null()) { - return false; - } - - const Array shortcuts = shortcut->get_events(); - Ref<InputEventKey> k; - if (shortcuts.size() > 0) { - k = shortcuts.front(); - } - - if (k.is_null()) { - return false; - } - const Input &input = *Input::get_singleton(); - Key keycode = k->get_keycode(); - return input.is_key_pressed(keycode); -} - void Node3DEditorViewport::_update_freelook(real_t delta) { if (!is_freelook_active()) { return; @@ -2610,31 +2321,34 @@ void Node3DEditorViewport::_update_freelook(real_t delta) { Vector3 direction; - if (is_shortcut_pressed("spatial_editor/freelook_left")) { + // Use actions from the inputmap, as this is the only way to reliably detect input in this method. + // See #54469 for more discussion and explanation. + Input *inp = Input::get_singleton(); + if (inp->is_action_pressed("spatial_editor/freelook_left")) { direction -= right; } - if (is_shortcut_pressed("spatial_editor/freelook_right")) { + if (inp->is_action_pressed("spatial_editor/freelook_right")) { direction += right; } - if (is_shortcut_pressed("spatial_editor/freelook_forward")) { + if (inp->is_action_pressed("spatial_editor/freelook_forward")) { direction += forward; } - if (is_shortcut_pressed("spatial_editor/freelook_backwards")) { + if (inp->is_action_pressed("spatial_editor/freelook_backwards")) { direction -= forward; } - if (is_shortcut_pressed("spatial_editor/freelook_up")) { + if (inp->is_action_pressed("spatial_editor/freelook_up")) { direction += up; } - if (is_shortcut_pressed("spatial_editor/freelook_down")) { + if (inp->is_action_pressed("spatial_editor/freelook_down")) { direction -= up; } real_t speed = freelook_speed; - if (is_shortcut_pressed("spatial_editor/freelook_speed_modifier")) { + if (inp->is_action_pressed("spatial_editor/freelook_speed_modifier")) { speed *= 3.0; } - if (is_shortcut_pressed("spatial_editor/freelook_slow_modifier")) { + if (inp->is_action_pressed("spatial_editor/freelook_slow_modifier")) { speed *= 0.333333; } @@ -2696,278 +2410,281 @@ void Node3DEditorViewport::_project_settings_changed() { } void Node3DEditorViewport::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - EditorNode::get_singleton()->connect("project_settings_changed", callable_mp(this, &Node3DEditorViewport::_project_settings_changed)); - } + switch (p_what) { + case NOTIFICATION_READY: { + EditorNode::get_singleton()->connect("project_settings_changed", callable_mp(this, &Node3DEditorViewport::_project_settings_changed)); + } break; - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - bool visible = is_visible_in_tree(); + case NOTIFICATION_VISIBILITY_CHANGED: { + bool visible = is_visible_in_tree(); - set_process(visible); + set_process(visible); - if (visible) { - orthogonal = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_ORTHOGONAL)); - _update_name(); - _update_camera(0); - } else { - set_freelook_active(false); - } - call_deferred(SNAME("update_transform_gizmo_view")); - rotation_control->set_visible(EditorSettings::get_singleton()->get("editors/3d/navigation/show_viewport_rotation_gizmo")); - } + if (visible) { + orthogonal = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_ORTHOGONAL)); + _update_name(); + _update_camera(0); + } else { + set_freelook_active(false); + } + call_deferred(SNAME("update_transform_gizmo_view")); + rotation_control->set_visible(EditorSettings::get_singleton()->get("editors/3d/navigation/show_viewport_rotation_gizmo")); + } break; - if (p_what == NOTIFICATION_RESIZED) { - call_deferred(SNAME("update_transform_gizmo_view")); - } + case NOTIFICATION_RESIZED: { + call_deferred(SNAME("update_transform_gizmo_view")); + } break; - if (p_what == NOTIFICATION_PROCESS) { - real_t delta = get_process_delta_time(); + case NOTIFICATION_PROCESS: { + real_t delta = get_process_delta_time(); - if (zoom_indicator_delay > 0) { - zoom_indicator_delay -= delta; - if (zoom_indicator_delay <= 0) { - surface->update(); - zoom_limit_label->hide(); + if (zoom_indicator_delay > 0) { + zoom_indicator_delay -= delta; + if (zoom_indicator_delay <= 0) { + surface->update(); + zoom_limit_label->hide(); + } } - } - _update_freelook(delta); + _update_freelook(delta); - Node *scene_root = SceneTreeDock::get_singleton()->get_editor_data()->get_edited_scene_root(); - if (previewing_cinema && scene_root != nullptr) { - Camera3D *cam = scene_root->get_viewport()->get_camera_3d(); - if (cam != nullptr && cam != previewing) { - //then switch the viewport's camera to the scene's viewport camera - if (previewing != nullptr) { - previewing->disconnect("tree_exited", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); + Node *scene_root = SceneTreeDock::get_singleton()->get_editor_data()->get_edited_scene_root(); + if (previewing_cinema && scene_root != nullptr) { + Camera3D *cam = scene_root->get_viewport()->get_camera_3d(); + if (cam != nullptr && cam != previewing) { + //then switch the viewport's camera to the scene's viewport camera + if (previewing != nullptr) { + previewing->disconnect("tree_exited", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); + } + previewing = cam; + previewing->connect("tree_exited", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); + RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), cam->get_camera()); + surface->update(); } - previewing = cam; - previewing->connect("tree_exited", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); - RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), cam->get_camera()); - surface->update(); } - } - _update_camera(delta); + _update_camera(delta); - Map<Node *, Object *> &selection = editor_selection->get_selection(); + Map<Node *, Object *> &selection = editor_selection->get_selection(); - bool changed = false; - bool exist = false; + bool changed = false; + bool exist = false; - for (const KeyValue<Node *, Object *> &E : selection) { - Node3D *sp = Object::cast_to<Node3D>(E.key); - if (!sp) { - continue; - } + for (const KeyValue<Node *, Object *> &E : selection) { + Node3D *sp = Object::cast_to<Node3D>(E.key); + if (!sp) { + continue; + } - Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); - if (!se) { - continue; - } + Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); + if (!se) { + continue; + } - Transform3D t = sp->get_global_gizmo_transform(); - VisualInstance3D *vi = Object::cast_to<VisualInstance3D>(sp); - AABB new_aabb = vi ? vi->get_aabb() : _calculate_spatial_bounds(sp); + Transform3D t = sp->get_global_gizmo_transform(); + VisualInstance3D *vi = Object::cast_to<VisualInstance3D>(sp); + AABB new_aabb = vi ? vi->get_aabb() : _calculate_spatial_bounds(sp); - exist = true; - if (se->last_xform == t && se->aabb == new_aabb && !se->last_xform_dirty) { - continue; - } - changed = true; - se->last_xform_dirty = false; - se->last_xform = t; + exist = true; + if (se->last_xform == t && se->aabb == new_aabb && !se->last_xform_dirty) { + continue; + } + changed = true; + se->last_xform_dirty = false; + se->last_xform = t; - se->aabb = new_aabb; + se->aabb = new_aabb; - Transform3D t_offset = t; + Transform3D t_offset = t; - // apply AABB scaling before item's global transform - { - const Vector3 offset(0.005, 0.005, 0.005); - Basis aabb_s; - aabb_s.scale(se->aabb.size + offset); - t.translate(se->aabb.position - offset / 2); - t.basis = t.basis * aabb_s; - } - { - const Vector3 offset(0.01, 0.01, 0.01); - Basis aabb_s; - aabb_s.scale(se->aabb.size + offset); - t_offset.translate(se->aabb.position - offset / 2); - t_offset.basis = t_offset.basis * aabb_s; + // apply AABB scaling before item's global transform + { + const Vector3 offset(0.005, 0.005, 0.005); + Basis aabb_s; + aabb_s.scale(se->aabb.size + offset); + t.translate(se->aabb.position - offset / 2); + t.basis = t.basis * aabb_s; + } + { + const Vector3 offset(0.01, 0.01, 0.01); + Basis aabb_s; + aabb_s.scale(se->aabb.size + offset); + t_offset.translate(se->aabb.position - offset / 2); + t_offset.basis = t_offset.basis * aabb_s; + } + + RenderingServer::get_singleton()->instance_set_transform(se->sbox_instance, t); + RenderingServer::get_singleton()->instance_set_transform(se->sbox_instance_offset, t_offset); + RenderingServer::get_singleton()->instance_set_transform(se->sbox_instance_xray, t); + RenderingServer::get_singleton()->instance_set_transform(se->sbox_instance_xray_offset, t_offset); } - RenderingServer::get_singleton()->instance_set_transform(se->sbox_instance, t); - RenderingServer::get_singleton()->instance_set_transform(se->sbox_instance_offset, t_offset); - RenderingServer::get_singleton()->instance_set_transform(se->sbox_instance_xray, t); - RenderingServer::get_singleton()->instance_set_transform(se->sbox_instance_xray_offset, t_offset); - } + if (changed || (spatial_editor->is_gizmo_visible() && !exist)) { + spatial_editor->update_transform_gizmo(); + } - if (changed || (spatial_editor->is_gizmo_visible() && !exist)) { - spatial_editor->update_transform_gizmo(); - } + if (message_time > 0) { + if (message != last_message) { + surface->update(); + last_message = message; + } - if (message_time > 0) { - if (message != last_message) { - surface->update(); - last_message = message; + message_time -= get_physics_process_delta_time(); + if (message_time < 0) { + surface->update(); + } } - message_time -= get_physics_process_delta_time(); - if (message_time < 0) { - surface->update(); + bool show_info = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION)); + if (show_info != info_label->is_visible()) { + info_label->set_visible(show_info); } - } - bool show_info = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION)); - if (show_info != info_label->is_visible()) { - info_label->set_visible(show_info); - } + Camera3D *current_camera; - Camera3D *current_camera; - - if (previewing) { - current_camera = previewing; - } else { - current_camera = camera; - } - - if (show_info) { - const String viewport_size = vformat(String::utf8("%d × %d"), viewport->get_size().x, viewport->get_size().y); - String text; - text += vformat(TTR("X: %s\n"), rtos(current_camera->get_position().x).pad_decimals(1)); - text += vformat(TTR("Y: %s\n"), rtos(current_camera->get_position().y).pad_decimals(1)); - text += vformat(TTR("Z: %s\n"), rtos(current_camera->get_position().z).pad_decimals(1)); - text += "\n"; - text += vformat( - TTR("Size: %s (%.1fMP)\n"), - viewport_size, - viewport->get_size().x * viewport->get_size().y * 0.000001); - - text += "\n"; - text += vformat(TTR("Objects: %d\n"), viewport->get_render_info(Viewport::RENDER_INFO_TYPE_VISIBLE, Viewport::RENDER_INFO_OBJECTS_IN_FRAME)); - text += vformat(TTR("Primitives: %d\n"), viewport->get_render_info(Viewport::RENDER_INFO_TYPE_VISIBLE, Viewport::RENDER_INFO_PRIMITIVES_IN_FRAME)); - text += vformat(TTR("Draw Calls: %d"), viewport->get_render_info(Viewport::RENDER_INFO_TYPE_VISIBLE, Viewport::RENDER_INFO_DRAW_CALLS_IN_FRAME)); - - info_label->set_text(text); - } - - // FPS Counter. - bool show_fps = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME)); - - if (show_fps != fps_label->is_visible()) { - cpu_time_label->set_visible(show_fps); - gpu_time_label->set_visible(show_fps); - fps_label->set_visible(show_fps); - RS::get_singleton()->viewport_set_measure_render_time(viewport->get_viewport_rid(), show_fps); - for (int i = 0; i < FRAME_TIME_HISTORY; i++) { - cpu_time_history[i] = 0; - gpu_time_history[i] = 0; - } - cpu_time_history_index = 0; - gpu_time_history_index = 0; - } - if (show_fps) { - cpu_time_history[cpu_time_history_index] = RS::get_singleton()->viewport_get_measured_render_time_cpu(viewport->get_viewport_rid()); - cpu_time_history_index = (cpu_time_history_index + 1) % FRAME_TIME_HISTORY; - double cpu_time = 0.0; - for (int i = 0; i < FRAME_TIME_HISTORY; i++) { - cpu_time += cpu_time_history[i]; - } - cpu_time /= FRAME_TIME_HISTORY; - // Prevent unrealistically low values. - cpu_time = MAX(0.01, cpu_time); - - gpu_time_history[gpu_time_history_index] = RS::get_singleton()->viewport_get_measured_render_time_gpu(viewport->get_viewport_rid()); - gpu_time_history_index = (gpu_time_history_index + 1) % FRAME_TIME_HISTORY; - double gpu_time = 0.0; - for (int i = 0; i < FRAME_TIME_HISTORY; i++) { - gpu_time += gpu_time_history[i]; - } - gpu_time /= FRAME_TIME_HISTORY; - // Prevent division by zero for the FPS counter (and unrealistically low values). - // This limits the reported FPS to 100000. - gpu_time = MAX(0.01, gpu_time); - - // Color labels depending on performance level ("good" = green, "OK" = yellow, "bad" = red). - // Middle point is at 15 ms. - cpu_time_label->set_text(vformat(TTR("CPU Time: %s ms"), rtos(cpu_time).pad_decimals(2))); - cpu_time_label->add_theme_color_override( - "font_color", - frame_time_gradient->get_color_at_offset( - Math::range_lerp(cpu_time, 0, 30, 0, 1))); - - gpu_time_label->set_text(vformat(TTR("GPU Time: %s ms"), rtos(gpu_time).pad_decimals(2))); - // Middle point is at 15 ms. - gpu_time_label->add_theme_color_override( - "font_color", - frame_time_gradient->get_color_at_offset( - Math::range_lerp(gpu_time, 0, 30, 0, 1))); - - const double fps = 1000.0 / gpu_time; - fps_label->set_text(vformat(TTR("FPS: %d"), fps)); - // Middle point is at 60 FPS. - fps_label->add_theme_color_override( - "font_color", - frame_time_gradient->get_color_at_offset( - Math::range_lerp(fps, 110, 10, 0, 1))); - } - - bool show_cinema = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW)); - cinema_label->set_visible(show_cinema); - if (show_cinema) { - float cinema_half_width = cinema_label->get_size().width / 2.0f; - cinema_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -cinema_half_width); - } - - if (lock_rotation) { - float locked_half_width = locked_label->get_size().width / 2.0f; - locked_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -locked_half_width); - } - } - - if (p_what == NOTIFICATION_ENTER_TREE) { - surface->connect("draw", callable_mp(this, &Node3DEditorViewport::_draw)); - surface->connect("gui_input", callable_mp(this, &Node3DEditorViewport::_sinput)); - surface->connect("mouse_entered", callable_mp(this, &Node3DEditorViewport::_surface_mouse_enter)); - surface->connect("mouse_exited", callable_mp(this, &Node3DEditorViewport::_surface_mouse_exit)); - surface->connect("focus_entered", callable_mp(this, &Node3DEditorViewport::_surface_focus_enter)); - surface->connect("focus_exited", callable_mp(this, &Node3DEditorViewport::_surface_focus_exit)); - - _init_gizmo_instance(index); - } - - if (p_what == NOTIFICATION_EXIT_TREE) { - _finish_gizmo_instances(); - } + if (previewing) { + current_camera = previewing; + } else { + current_camera = camera; + } + + if (show_info) { + const String viewport_size = vformat(String::utf8("%d × %d"), viewport->get_size().x, viewport->get_size().y); + String text; + text += vformat(TTR("X: %s\n"), rtos(current_camera->get_position().x).pad_decimals(1)); + text += vformat(TTR("Y: %s\n"), rtos(current_camera->get_position().y).pad_decimals(1)); + text += vformat(TTR("Z: %s\n"), rtos(current_camera->get_position().z).pad_decimals(1)); + text += "\n"; + text += vformat( + TTR("Size: %s (%.1fMP)\n"), + viewport_size, + viewport->get_size().x * viewport->get_size().y * 0.000001); + + text += "\n"; + text += vformat(TTR("Objects: %d\n"), viewport->get_render_info(Viewport::RENDER_INFO_TYPE_VISIBLE, Viewport::RENDER_INFO_OBJECTS_IN_FRAME)); + text += vformat(TTR("Primitives: %d\n"), viewport->get_render_info(Viewport::RENDER_INFO_TYPE_VISIBLE, Viewport::RENDER_INFO_PRIMITIVES_IN_FRAME)); + text += vformat(TTR("Draw Calls: %d"), viewport->get_render_info(Viewport::RENDER_INFO_TYPE_VISIBLE, Viewport::RENDER_INFO_DRAW_CALLS_IN_FRAME)); + + info_label->set_text(text); + } + + // FPS Counter. + bool show_fps = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME)); + + if (show_fps != fps_label->is_visible()) { + cpu_time_label->set_visible(show_fps); + gpu_time_label->set_visible(show_fps); + fps_label->set_visible(show_fps); + RS::get_singleton()->viewport_set_measure_render_time(viewport->get_viewport_rid(), show_fps); + for (int i = 0; i < FRAME_TIME_HISTORY; i++) { + cpu_time_history[i] = 0; + gpu_time_history[i] = 0; + } + cpu_time_history_index = 0; + gpu_time_history_index = 0; + } + if (show_fps) { + cpu_time_history[cpu_time_history_index] = RS::get_singleton()->viewport_get_measured_render_time_cpu(viewport->get_viewport_rid()); + cpu_time_history_index = (cpu_time_history_index + 1) % FRAME_TIME_HISTORY; + double cpu_time = 0.0; + for (int i = 0; i < FRAME_TIME_HISTORY; i++) { + cpu_time += cpu_time_history[i]; + } + cpu_time /= FRAME_TIME_HISTORY; + // Prevent unrealistically low values. + cpu_time = MAX(0.01, cpu_time); + + gpu_time_history[gpu_time_history_index] = RS::get_singleton()->viewport_get_measured_render_time_gpu(viewport->get_viewport_rid()); + gpu_time_history_index = (gpu_time_history_index + 1) % FRAME_TIME_HISTORY; + double gpu_time = 0.0; + for (int i = 0; i < FRAME_TIME_HISTORY; i++) { + gpu_time += gpu_time_history[i]; + } + gpu_time /= FRAME_TIME_HISTORY; + // Prevent division by zero for the FPS counter (and unrealistically low values). + // This limits the reported FPS to 100000. + gpu_time = MAX(0.01, gpu_time); + + // Color labels depending on performance level ("good" = green, "OK" = yellow, "bad" = red). + // Middle point is at 15 ms. + cpu_time_label->set_text(vformat(TTR("CPU Time: %s ms"), rtos(cpu_time).pad_decimals(2))); + cpu_time_label->add_theme_color_override( + "font_color", + frame_time_gradient->get_color_at_offset( + Math::range_lerp(cpu_time, 0, 30, 0, 1))); + + gpu_time_label->set_text(vformat(TTR("GPU Time: %s ms"), rtos(gpu_time).pad_decimals(2))); + // Middle point is at 15 ms. + gpu_time_label->add_theme_color_override( + "font_color", + frame_time_gradient->get_color_at_offset( + Math::range_lerp(gpu_time, 0, 30, 0, 1))); + + const double fps = 1000.0 / gpu_time; + fps_label->set_text(vformat(TTR("FPS: %d"), fps)); + // Middle point is at 60 FPS. + fps_label->add_theme_color_override( + "font_color", + frame_time_gradient->get_color_at_offset( + Math::range_lerp(fps, 110, 10, 0, 1))); + } + + bool show_cinema = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW)); + cinema_label->set_visible(show_cinema); + if (show_cinema) { + float cinema_half_width = cinema_label->get_size().width / 2.0f; + cinema_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -cinema_half_width); + } - if (p_what == NOTIFICATION_THEME_CHANGED) { - view_menu->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); - preview_camera->set_icon(get_theme_icon(SNAME("Camera3D"), SNAME("EditorIcons"))); + if (lock_rotation) { + float locked_half_width = locked_label->get_size().width / 2.0f; + locked_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -locked_half_width); + } + } break; - view_menu->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - view_menu->add_theme_style_override("hover", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - view_menu->add_theme_style_override("pressed", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - view_menu->add_theme_style_override("focus", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - view_menu->add_theme_style_override("disabled", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + case NOTIFICATION_ENTER_TREE: { + surface->connect("draw", callable_mp(this, &Node3DEditorViewport::_draw)); + surface->connect("gui_input", callable_mp(this, &Node3DEditorViewport::_sinput)); + surface->connect("mouse_entered", callable_mp(this, &Node3DEditorViewport::_surface_mouse_enter)); + surface->connect("mouse_exited", callable_mp(this, &Node3DEditorViewport::_surface_mouse_exit)); + surface->connect("focus_entered", callable_mp(this, &Node3DEditorViewport::_surface_focus_enter)); + surface->connect("focus_exited", callable_mp(this, &Node3DEditorViewport::_surface_focus_exit)); + + _init_gizmo_instance(index); + } break; - preview_camera->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - preview_camera->add_theme_style_override("hover", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - preview_camera->add_theme_style_override("pressed", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - preview_camera->add_theme_style_override("focus", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - preview_camera->add_theme_style_override("disabled", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - - frame_time_gradient->set_color(0, get_theme_color(SNAME("success_color"), SNAME("Editor"))); - frame_time_gradient->set_color(1, get_theme_color(SNAME("warning_color"), SNAME("Editor"))); - frame_time_gradient->set_color(2, get_theme_color(SNAME("error_color"), SNAME("Editor"))); + case NOTIFICATION_EXIT_TREE: { + _finish_gizmo_instances(); + } break; - info_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - cpu_time_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - gpu_time_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - fps_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - cinema_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - locked_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + case NOTIFICATION_THEME_CHANGED: { + view_menu->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); + preview_camera->set_icon(get_theme_icon(SNAME("Camera3D"), SNAME("EditorIcons"))); + Control *gui_base = EditorNode::get_singleton()->get_gui_base(); + + view_menu->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + view_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + view_menu->add_theme_style_override("pressed", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + view_menu->add_theme_style_override("focus", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + view_menu->add_theme_style_override("disabled", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + + preview_camera->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + preview_camera->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + preview_camera->add_theme_style_override("pressed", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + preview_camera->add_theme_style_override("focus", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + preview_camera->add_theme_style_override("disabled", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + + frame_time_gradient->set_color(0, get_theme_color(SNAME("success_color"), SNAME("Editor"))); + frame_time_gradient->set_color(1, get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + frame_time_gradient->set_color(2, get_theme_color(SNAME("error_color"), SNAME("Editor"))); + + info_label->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + cpu_time_label->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + gpu_time_label->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + fps_label->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + cinema_label->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + locked_label->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + } break; } } @@ -3000,7 +2717,7 @@ void Node3DEditorViewport::_draw() { over_plugin_list->forward_spatial_draw_over_viewport(surface); } - EditorPluginList *force_over_plugin_list = editor->get_editor_plugins_force_over(); + EditorPluginList *force_over_plugin_list = EditorNode::get_singleton()->get_editor_plugins_force_over(); if (!force_over_plugin_list->is_empty()) { force_over_plugin_list->forward_spatial_force_draw_over_viewport(surface); } @@ -3036,7 +2753,7 @@ void Node3DEditorViewport::_draw() { font->draw_string(ci, msgpos, message, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, Color(1, 1, 1, 1)); } - if (_edit.mode == TRANSFORM_ROTATE) { + if (_edit.mode == TRANSFORM_ROTATE && _edit.show_rotation_line) { Point2 center = _point_to_screen(_edit.center); Color handle_color; @@ -3544,6 +3261,13 @@ void Node3DEditorViewport::_init_gizmo_instance(int p_idx) { RS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_plane_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF); RS::get_singleton()->instance_set_layer_mask(scale_plane_gizmo_instance[i], layer); RS::get_singleton()->instance_geometry_set_flag(scale_plane_gizmo_instance[i], RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true); + + axis_gizmo_instance[i] = RS::get_singleton()->instance_create(); + RS::get_singleton()->instance_set_base(axis_gizmo_instance[i], spatial_editor->get_axis_gizmo(i)->get_rid()); + RS::get_singleton()->instance_set_scenario(axis_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario()); + RS::get_singleton()->instance_set_visible(axis_gizmo_instance[i], true); + RS::get_singleton()->instance_geometry_set_cast_shadows_setting(axis_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF); + RS::get_singleton()->instance_set_layer_mask(axis_gizmo_instance[i], layer); } // Rotation white outline @@ -3563,6 +3287,7 @@ void Node3DEditorViewport::_finish_gizmo_instances() { RS::get_singleton()->free(rotate_gizmo_instance[i]); RS::get_singleton()->free(scale_gizmo_instance[i]); RS::get_singleton()->free(scale_plane_gizmo_instance[i]); + RS::get_singleton()->free(axis_gizmo_instance[i]); } // Rotation white outline RS::get_singleton()->free(rotate_gizmo_instance[3]); @@ -3655,6 +3380,7 @@ void Node3DEditorViewport::update_transform_gizmo_view() { RenderingServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], false); RenderingServer::get_singleton()->instance_set_visible(scale_gizmo_instance[i], false); RenderingServer::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], false); + RenderingServer::get_singleton()->instance_set_visible(axis_gizmo_instance[i], false); } // Rotation white outline RenderingServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[3], false); @@ -3711,7 +3437,15 @@ void Node3DEditorViewport::update_transform_gizmo_view() { RenderingServer::get_singleton()->instance_set_visible(scale_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE)); RenderingServer::get_singleton()->instance_set_transform(scale_plane_gizmo_instance[i], axis_angle); RenderingServer::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE)); + RenderingServer::get_singleton()->instance_set_transform(axis_gizmo_instance[i], xform); } + + bool show_axes = spatial_editor->is_gizmo_visible() && _edit.mode != TRANSFORM_NONE; + RenderingServer *rs = RenderingServer::get_singleton(); + rs->instance_set_visible(axis_gizmo_instance[0], show_axes && (_edit.plane == TRANSFORM_X_AXIS || _edit.plane == TRANSFORM_XY || _edit.plane == TRANSFORM_XZ)); + rs->instance_set_visible(axis_gizmo_instance[1], show_axes && (_edit.plane == TRANSFORM_Y_AXIS || _edit.plane == TRANSFORM_XY || _edit.plane == TRANSFORM_YZ)); + rs->instance_set_visible(axis_gizmo_instance[2], show_axes && (_edit.plane == TRANSFORM_Z_AXIS || _edit.plane == TRANSFORM_XZ || _edit.plane == TRANSFORM_YZ)); + // Rotation white outline xform.orthonormalize(); xform.basis.scale(scale); @@ -3978,7 +3712,7 @@ AABB Node3DEditorViewport::_calculate_spatial_bounds(const Node3D *p_parent, boo if (child) { AABB child_bounds = _calculate_spatial_bounds(child, false); - if (bounds.size == Vector3() && p_parent->get_class_name() == StringName("Node3D")) { + if (bounds.size == Vector3() && Object::cast_to<Node3D>(p_parent)) { bounds = child_bounds; } else { bounds.merge_with(child_bounds); @@ -3986,7 +3720,7 @@ AABB Node3DEditorViewport::_calculate_spatial_bounds(const Node3D *p_parent, boo } } - if (bounds.size == Vector3() && p_parent->get_class_name() != StringName("Node3D")) { + if (bounds.size == Vector3() && !Object::cast_to<Node3D>(p_parent)) { bounds = AABB(Vector3(-0.2, -0.2, -0.2), Vector3(0.4, 0.4, 0.4)); } @@ -4049,7 +3783,7 @@ void Node3DEditorViewport::_create_preview(const Vector<String> &files) const { } } } - editor->get_scene_root()->add_child(preview_node); + EditorNode::get_singleton()->get_scene_root()->add_child(preview_node); } } *preview_bounds = _calculate_spatial_bounds(preview_node); @@ -4062,7 +3796,7 @@ void Node3DEditorViewport::_remove_preview() { node->queue_delete(); preview_node->remove_child(node); } - editor->get_scene_root()->remove_child(preview_node); + EditorNode::get_singleton()->get_scene_root()->remove_child(preview_node); } } @@ -4125,8 +3859,8 @@ bool Node3DEditorViewport::_create_instance(Node *parent, String &path, const Po return false; } - if (!editor->get_edited_scene()->get_scene_file_path().is_empty()) { // cyclical instancing - if (_cyclical_dependency_exists(editor->get_edited_scene()->get_scene_file_path(), instantiated_scene)) { + if (!EditorNode::get_singleton()->get_edited_scene()->get_scene_file_path().is_empty()) { // cyclical instancing + if (_cyclical_dependency_exists(EditorNode::get_singleton()->get_edited_scene()->get_scene_file_path(), instantiated_scene)) { memdelete(instantiated_scene); return false; } @@ -4137,14 +3871,14 @@ bool Node3DEditorViewport::_create_instance(Node *parent, String &path, const Po } editor_data->get_undo_redo().add_do_method(parent, "add_child", instantiated_scene, true); - editor_data->get_undo_redo().add_do_method(instantiated_scene, "set_owner", editor->get_edited_scene()); + editor_data->get_undo_redo().add_do_method(instantiated_scene, "set_owner", EditorNode::get_singleton()->get_edited_scene()); editor_data->get_undo_redo().add_do_reference(instantiated_scene); editor_data->get_undo_redo().add_undo_method(parent, "remove_child", instantiated_scene); String new_name = parent->validate_child_name(instantiated_scene); EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton(); - editor_data->get_undo_redo().add_do_method(ed, "live_debug_instance_node", editor->get_edited_scene()->get_path_to(parent), path, new_name); - editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(editor->get_edited_scene()->get_path_to(parent)) + "/" + new_name)); + editor_data->get_undo_redo().add_do_method(ed, "live_debug_instance_node", EditorNode::get_singleton()->get_edited_scene()->get_path_to(parent), path, new_name); + editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(EditorNode::get_singleton()->get_edited_scene()->get_path_to(parent)) + "/" + new_name)); Node3D *node3d = Object::cast_to<Node3D>(instantiated_scene); if (node3d) { @@ -4213,27 +3947,19 @@ bool Node3DEditorViewport::can_drop_data_fw(const Point2 &p_point, const Variant ResourceLoader::get_recognized_extensions_for_type("Mesh", &mesh_extensions); for (int i = 0; i < files.size(); i++) { + // Check if dragged files with mesh or scene extension can be created at least once. if (mesh_extensions.find(files[i].get_extension()) || scene_extensions.find(files[i].get_extension())) { RES res = ResourceLoader::load(files[i]); if (res.is_null()) { continue; } - - String type = res->get_class(); - if (type == "PackedScene") { - Ref<PackedScene> sdata = ResourceLoader::load(files[i]); - Node *instantiated_scene = sdata->instantiate(PackedScene::GEN_EDIT_STATE_INSTANCE); + Ref<PackedScene> scn = res; + if (scn.is_valid()) { + Node *instantiated_scene = scn->instantiate(PackedScene::GEN_EDIT_STATE_INSTANCE); if (!instantiated_scene) { continue; } memdelete(instantiated_scene); - } else if (ClassDB::is_parent_class(type, "Mesh")) { - Ref<Mesh> mesh = ResourceLoader::load(files[i]); - if (!mesh.is_valid()) { - continue; - } - } else { - continue; } can_instantiate = true; break; @@ -4269,8 +3995,8 @@ void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_ selected_files = d["files"]; } - List<Node *> selected_nodes = editor->get_editor_selection()->get_selected_node_list(); - Node *root_node = editor->get_edited_scene(); + List<Node *> selected_nodes = EditorNode::get_singleton()->get_editor_selection()->get_selected_node_list(); + Node *root_node = EditorNode::get_singleton()->get_edited_scene(); if (selected_nodes.size() == 1) { Node *selected_node = selected_nodes[0]; target_node = root_node; @@ -4299,21 +4025,430 @@ void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_ _perform_drop_data(); } -Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, EditorNode *p_editor, int p_index) { +void Node3DEditorViewport::begin_transform(TransformMode p_mode, bool instant) { + if (get_selected_count() > 0) { + _edit.mode = p_mode; + _compute_edit(_edit.mouse_pos); + _edit.instant = instant; + _edit.snap = spatial_editor->is_snap_enabled(); + } +} + +void Node3DEditorViewport::commit_transform() { + ERR_FAIL_COND(_edit.mode == TRANSFORM_NONE); + static const char *_transform_name[4] = { + TTRC("None"), + TTRC("Rotate"), + // TRANSLATORS: This refers to the movement that changes the position of an object. + TTRC("Translate"), + TTRC("Scale"), + }; + undo_redo->create_action(_transform_name[_edit.mode]); + + List<Node *> &selection = editor_selection->get_selected_node_list(); + + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + Node3D *sp = Object::cast_to<Node3D>(E->get()); + if (!sp) { + continue; + } + + Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); + if (!se) { + continue; + } + + undo_redo->add_do_method(sp, "set_global_transform", sp->get_global_gizmo_transform()); + undo_redo->add_undo_method(sp, "set_global_transform", se->original); + } + undo_redo->commit_action(); + + finish_transform(); + set_message(""); +} + +void Node3DEditorViewport::update_transform(Point2 p_mousepos, bool p_shift) { + Vector3 ray_pos = _get_ray_pos(p_mousepos); + Vector3 ray = _get_ray(p_mousepos); + double snap = EDITOR_GET("interface/inspector/default_float_step"); + int snap_step_decimals = Math::range_step_decimals(snap); + + switch (_edit.mode) { + case TRANSFORM_SCALE: { + Vector3 motion_mask; + Plane plane; + bool plane_mv = false; + + switch (_edit.plane) { + case TRANSFORM_VIEW: + motion_mask = Vector3(0, 0, 0); + plane = Plane(_get_camera_normal(), _edit.center); + break; + case TRANSFORM_X_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_Y_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_Z_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_YZ: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(), _edit.center); + plane_mv = true; + break; + case TRANSFORM_XZ: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(), _edit.center); + plane_mv = true; + break; + case TRANSFORM_XY: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(), _edit.center); + plane_mv = true; + break; + } + + Vector3 intersection; + if (!plane.intersects_ray(ray_pos, ray, &intersection)) { + break; + } + + Vector3 click; + if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { + break; + } + + Vector3 motion = intersection - click; + if (_edit.plane != TRANSFORM_VIEW) { + if (!plane_mv) { + motion = motion_mask.dot(motion) * motion_mask; + + } else { + // Alternative planar scaling mode + if (p_shift) { + motion = motion_mask.dot(motion) * motion_mask; + } + } + + } else { + const real_t center_click_dist = click.distance_to(_edit.center); + const real_t center_inters_dist = intersection.distance_to(_edit.center); + if (center_click_dist == 0) { + break; + } + + const real_t scale = center_inters_dist - center_click_dist; + motion = Vector3(scale, scale, scale); + } + + motion /= click.distance_to(_edit.center); + + // Disable local transformation for TRANSFORM_VIEW + bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); + + if (_edit.snap || spatial_editor->is_snap_enabled()) { + snap = spatial_editor->get_scale_snap() / 100; + } + Vector3 motion_snapped = motion; + motion_snapped.snap(Vector3(snap, snap, snap)); + // This might not be necessary anymore after issue #288 is solved (in 4.0?). + set_message(TTR("Scaling: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + + String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); + motion = _edit.original.basis.inverse().xform(motion); + + List<Node *> &selection = editor_selection->get_selected_node_list(); + for (Node *E : selection) { + Node3D *sp = Object::cast_to<Node3D>(E); + if (!sp) { + continue; + } + + Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); + if (!se) { + continue; + } + + if (sp->has_meta("_edit_lock_")) { + continue; + } + + if (se->gizmo.is_valid()) { + for (KeyValue<int, Transform3D> &GE : se->subgizmos) { + Transform3D xform = GE.value; + Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original * xform, xform, motion, snap, local_coords, true); // Force orthogonal with subgizmo. + if (!local_coords) { + new_xform = se->original.affine_inverse() * new_xform; + } + se->gizmo->set_subgizmo_transform(GE.key, new_xform); + } + } else { + Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original, se->original_local, motion, snap, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); + _transform_gizmo_apply(se->sp, new_xform, local_coords); + } + } + + spatial_editor->update_transform_gizmo(); + surface->update(); + + } break; + + case TRANSFORM_TRANSLATE: { + Vector3 motion_mask; + Plane plane; + bool plane_mv = false; + + switch (_edit.plane) { + case TRANSFORM_VIEW: + plane = Plane(_get_camera_normal(), _edit.center); + break; + case TRANSFORM_X_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_Y_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_Z_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_YZ: + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(), _edit.center); + plane_mv = true; + break; + case TRANSFORM_XZ: + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(), _edit.center); + plane_mv = true; + break; + case TRANSFORM_XY: + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(), _edit.center); + plane_mv = true; + break; + } + + Vector3 intersection; + if (!plane.intersects_ray(ray_pos, ray, &intersection)) { + break; + } + + Vector3 click; + if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { + break; + } + + Vector3 motion = intersection - click; + if (_edit.plane != TRANSFORM_VIEW) { + if (!plane_mv) { + motion = motion_mask.dot(motion) * motion_mask; + } + } + + // Disable local transformation for TRANSFORM_VIEW + bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); + + if (_edit.snap || spatial_editor->is_snap_enabled()) { + snap = spatial_editor->get_translate_snap(); + } + Vector3 motion_snapped = motion; + motion_snapped.snap(Vector3(snap, snap, snap)); + set_message(TTR("Translating: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + + String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); + motion = spatial_editor->get_gizmo_transform().basis.inverse().xform(motion); + + List<Node *> &selection = editor_selection->get_selected_node_list(); + for (Node *E : selection) { + Node3D *sp = Object::cast_to<Node3D>(E); + if (!sp) { + continue; + } + + Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); + if (!se) { + continue; + } + + if (sp->has_meta("_edit_lock_")) { + continue; + } + + if (se->gizmo.is_valid()) { + for (KeyValue<int, Transform3D> &GE : se->subgizmos) { + Transform3D xform = GE.value; + Transform3D new_xform = _compute_transform(TRANSFORM_TRANSLATE, se->original * xform, xform, motion, snap, local_coords, true); // Force orthogonal with subgizmo. + new_xform = se->original.affine_inverse() * new_xform; + se->gizmo->set_subgizmo_transform(GE.key, new_xform); + } + } else { + Transform3D new_xform = _compute_transform(TRANSFORM_TRANSLATE, se->original, se->original_local, motion, snap, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); + _transform_gizmo_apply(se->sp, new_xform, false); + } + } + + spatial_editor->update_transform_gizmo(); + surface->update(); + + } break; + + case TRANSFORM_ROTATE: { + Plane plane = Plane(_get_camera_normal(), _edit.center); + + Vector3 local_axis; + Vector3 global_axis; + switch (_edit.plane) { + case TRANSFORM_VIEW: + // local_axis unused + global_axis = _get_camera_normal(); + break; + case TRANSFORM_X_AXIS: + local_axis = Vector3(1, 0, 0); + break; + case TRANSFORM_Y_AXIS: + local_axis = Vector3(0, 1, 0); + break; + case TRANSFORM_Z_AXIS: + local_axis = Vector3(0, 0, 1); + break; + case TRANSFORM_YZ: + case TRANSFORM_XZ: + case TRANSFORM_XY: + break; + } + + if (_edit.plane != TRANSFORM_VIEW) { + global_axis = spatial_editor->get_gizmo_transform().basis.xform(local_axis).normalized(); + } + + Vector3 intersection; + if (!plane.intersects_ray(ray_pos, ray, &intersection)) { + break; + } + + Vector3 click; + if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { + break; + } + + static const float orthogonal_threshold = Math::cos(Math::deg2rad(87.0f)); + bool axis_is_orthogonal = ABS(plane.normal.dot(global_axis)) < orthogonal_threshold; + + double angle = 0.0f; + if (axis_is_orthogonal) { + _edit.show_rotation_line = false; + Vector3 projection_axis = plane.normal.cross(global_axis); + Vector3 delta = intersection - click; + float projection = delta.dot(projection_axis); + angle = (projection * (Math_PI / 2.0f)) / (gizmo_scale * GIZMO_CIRCLE_SIZE); + } else { + _edit.show_rotation_line = true; + Vector3 click_axis = (click - _edit.center).normalized(); + Vector3 current_axis = (intersection - _edit.center).normalized(); + angle = click_axis.signed_angle_to(current_axis, global_axis); + } + + if (_edit.snap || spatial_editor->is_snap_enabled()) { + snap = spatial_editor->get_rotate_snap(); + } + angle = Math::rad2deg(angle) + snap * 0.5; //else it won't reach +180 + angle -= Math::fmod(angle, snap); + set_message(vformat(TTR("Rotating %s degrees."), String::num(angle, snap_step_decimals))); + angle = Math::deg2rad(angle); + + bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); // Disable local transformation for TRANSFORM_VIEW + + List<Node *> &selection = editor_selection->get_selected_node_list(); + for (Node *E : selection) { + Node3D *sp = Object::cast_to<Node3D>(E); + if (!sp) { + continue; + } + + Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); + if (!se) { + continue; + } + + if (sp->has_meta("_edit_lock_")) { + continue; + } + + Vector3 compute_axis = local_coords ? local_axis : global_axis; + if (se->gizmo.is_valid()) { + for (KeyValue<int, Transform3D> &GE : se->subgizmos) { + Transform3D xform = GE.value; + + Transform3D new_xform = _compute_transform(TRANSFORM_ROTATE, se->original * xform, xform, compute_axis, angle, local_coords, true); // Force orthogonal with subgizmo. + if (!local_coords) { + new_xform = se->original.affine_inverse() * new_xform; + } + se->gizmo->set_subgizmo_transform(GE.key, new_xform); + } + } else { + Transform3D new_xform = _compute_transform(TRANSFORM_ROTATE, se->original, se->original_local, compute_axis, angle, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); + _transform_gizmo_apply(se->sp, new_xform, local_coords); + } + } + + spatial_editor->update_transform_gizmo(); + surface->update(); + + } break; + default: { + } + } +} + +void Node3DEditorViewport::finish_transform() { + spatial_editor->set_local_coords_enabled(_edit.original_local); + spatial_editor->update_transform_gizmo(); + _edit.mode = TRANSFORM_NONE; + _edit.instant = false; + surface->update(); +} + +// Register a shortcut and also add it as an input action with the same events. +void Node3DEditorViewport::register_shortcut_action(const String &p_path, const String &p_name, Key p_keycode) { + Ref<Shortcut> sc = ED_SHORTCUT(p_path, p_name, p_keycode); + shortcut_changed_callback(sc, p_path); + // Connect to the change event on the shortcut so the input binding can be updated. + sc->connect("changed", callable_mp(this, &Node3DEditorViewport::shortcut_changed_callback), varray(sc, p_path)); +} + +// Update the action in the InputMap to the provided shortcut events. +void Node3DEditorViewport::shortcut_changed_callback(const Ref<Shortcut> p_shortcut, const String &p_shortcut_path) { + InputMap *im = InputMap::get_singleton(); + if (im->has_action(p_shortcut_path)) { + im->action_erase_events(p_shortcut_path); + } else { + im->add_action(p_shortcut_path); + } + + for (int i = 0; i < p_shortcut->get_events().size(); i++) { + im->action_add_event(p_shortcut_path, p_shortcut->get_events()[i]); + } +} + +Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p_index) { cpu_time_history_index = 0; gpu_time_history_index = 0; _edit.mode = TRANSFORM_NONE; _edit.plane = TRANSFORM_VIEW; _edit.snap = true; + _edit.show_rotation_line = true; + _edit.instant = false; _edit.gizmo_handle = -1; _edit.gizmo_handle_secondary = false; index = p_index; - editor = p_editor; editor_data = SceneTreeDock::get_singleton()->get_editor_data(); - editor_selection = editor->get_editor_selection(); - undo_redo = editor->get_undo_redo(); + editor_selection = EditorNode::get_singleton()->get_editor_selection(); + undo_redo = EditorNode::get_singleton()->get_undo_redo(); orthogonal = false; auto_orthogonal = false; @@ -4383,7 +4518,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito display_submenu->add_radio_check_item(TTR("Normal Buffer"), VIEW_DISPLAY_NORMAL_BUFFER); display_submenu->add_separator(); display_submenu->add_radio_check_item(TTR("Shadow Atlas"), VIEW_DISPLAY_DEBUG_SHADOW_ATLAS); - display_submenu->add_radio_check_item(TTR("Directional Shadow"), VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS); + display_submenu->add_radio_check_item(TTR("Directional Shadow Map"), VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS); display_submenu->add_separator(); display_submenu->add_radio_check_item(TTR("Decal Atlas"), VIEW_DISPLAY_DEBUG_DECAL_ATLAS); display_submenu->add_separator(); @@ -4399,14 +4534,14 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito display_submenu->add_radio_check_item(TTR("SSAO"), VIEW_DISPLAY_DEBUG_SSAO); display_submenu->add_radio_check_item(TTR("SSIL"), VIEW_DISPLAY_DEBUG_SSIL); display_submenu->add_separator(); - display_submenu->add_radio_check_item(TTR("GI Buffer"), VIEW_DISPLAY_DEBUG_GI_BUFFER); + display_submenu->add_radio_check_item(TTR("VoxelGI/SDFGI Buffer"), VIEW_DISPLAY_DEBUG_GI_BUFFER); display_submenu->add_separator(); - display_submenu->add_radio_check_item(TTR("Disable LOD"), VIEW_DISPLAY_DEBUG_DISABLE_LOD); + display_submenu->add_radio_check_item(TTR("Disable Mesh LOD"), VIEW_DISPLAY_DEBUG_DISABLE_LOD); display_submenu->add_separator(); - display_submenu->add_radio_check_item(TTR("Omni Light Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_OMNI_LIGHTS); - display_submenu->add_radio_check_item(TTR("Spot Light Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_SPOT_LIGHTS); + display_submenu->add_radio_check_item(TTR("OmniLight3D Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_OMNI_LIGHTS); + display_submenu->add_radio_check_item(TTR("SpotLight3D Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_SPOT_LIGHTS); display_submenu->add_radio_check_item(TTR("Decal Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_DECALS); - display_submenu->add_radio_check_item(TTR("Reflection Probe Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_REFLECTION_PROBES); + display_submenu->add_radio_check_item(TTR("ReflectionProbe Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_REFLECTION_PROBES); display_submenu->add_radio_check_item(TTR("Occlusion Culling Buffer"), VIEW_DISPLAY_DEBUG_OCCLUDERS); display_submenu->set_name("display_advanced"); @@ -4457,14 +4592,25 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito view_menu->get_popup()->set_item_tooltip(shadeless_idx, unsupported_tooltip); } - ED_SHORTCUT("spatial_editor/freelook_left", TTR("Freelook Left"), Key::A); - ED_SHORTCUT("spatial_editor/freelook_right", TTR("Freelook Right"), Key::D); - ED_SHORTCUT("spatial_editor/freelook_forward", TTR("Freelook Forward"), Key::W); - ED_SHORTCUT("spatial_editor/freelook_backwards", TTR("Freelook Backwards"), Key::S); - ED_SHORTCUT("spatial_editor/freelook_up", TTR("Freelook Up"), Key::E); - ED_SHORTCUT("spatial_editor/freelook_down", TTR("Freelook Down"), Key::Q); - ED_SHORTCUT("spatial_editor/freelook_speed_modifier", TTR("Freelook Speed Modifier"), Key::SHIFT); - ED_SHORTCUT("spatial_editor/freelook_slow_modifier", TTR("Freelook Slow Modifier"), Key::ALT); + register_shortcut_action("spatial_editor/freelook_left", TTR("Freelook Left"), Key::A); + register_shortcut_action("spatial_editor/freelook_right", TTR("Freelook Right"), Key::D); + register_shortcut_action("spatial_editor/freelook_forward", TTR("Freelook Forward"), Key::W); + register_shortcut_action("spatial_editor/freelook_backwards", TTR("Freelook Backwards"), Key::S); + register_shortcut_action("spatial_editor/freelook_up", TTR("Freelook Up"), Key::E); + register_shortcut_action("spatial_editor/freelook_down", TTR("Freelook Down"), Key::Q); + register_shortcut_action("spatial_editor/freelook_speed_modifier", TTR("Freelook Speed Modifier"), Key::SHIFT); + register_shortcut_action("spatial_editor/freelook_slow_modifier", TTR("Freelook Slow Modifier"), Key::ALT); + + ED_SHORTCUT("spatial_editor/lock_transform_x", TTR("Lock Transformation to X axis"), Key::X); + ED_SHORTCUT("spatial_editor/lock_transform_y", TTR("Lock Transformation to Y axis"), Key::Y); + ED_SHORTCUT("spatial_editor/lock_transform_z", TTR("Lock Transformation to Z axis"), Key::Z); + ED_SHORTCUT("spatial_editor/lock_transform_yz", TTR("Lock Transformation to YZ plane"), KeyModifierMask::SHIFT | Key::X); + ED_SHORTCUT("spatial_editor/lock_transform_xz", TTR("Lock Transformation to XZ plane"), KeyModifierMask::SHIFT | Key::Y); + ED_SHORTCUT("spatial_editor/lock_transform_xy", TTR("Lock Transformation to XY plane"), KeyModifierMask::SHIFT | Key::Z); + ED_SHORTCUT("spatial_editor/cancel_transform", TTR("Cancel Transformation"), Key::ESCAPE); + ED_SHORTCUT("spatial_editor/instant_translate", TTR("Begin Translate Transformation")); + ED_SHORTCUT("spatial_editor/instant_rotate", TTR("Begin Rotate Transformation")); + ED_SHORTCUT("spatial_editor/instant_scale", TTR("Begin Scale Transformation")); preview_camera = memnew(CheckBox); preview_camera->set_text(TTR("Preview")); @@ -4666,197 +4812,202 @@ void Node3DEditorViewportContainer::gui_input(const Ref<InputEvent> &p_event) { } void Node3DEditorViewportContainer::_notification(int p_what) { - if (p_what == NOTIFICATION_MOUSE_ENTER || p_what == NOTIFICATION_MOUSE_EXIT) { - mouseover = (p_what == NOTIFICATION_MOUSE_ENTER); - update(); - } + switch (p_what) { + case NOTIFICATION_MOUSE_ENTER: + case NOTIFICATION_MOUSE_EXIT: { + mouseover = (p_what == NOTIFICATION_MOUSE_ENTER); + update(); + } break; - if (p_what == NOTIFICATION_DRAW && mouseover) { - Ref<Texture2D> h_grabber = get_theme_icon(SNAME("grabber"), SNAME("HSplitContainer")); - Ref<Texture2D> v_grabber = get_theme_icon(SNAME("grabber"), SNAME("VSplitContainer")); + case NOTIFICATION_DRAW: { + if (mouseover) { + Ref<Texture2D> h_grabber = get_theme_icon(SNAME("grabber"), SNAME("HSplitContainer")); + Ref<Texture2D> v_grabber = get_theme_icon(SNAME("grabber"), SNAME("VSplitContainer")); - Ref<Texture2D> hdiag_grabber = get_theme_icon(SNAME("GuiViewportHdiagsplitter"), SNAME("EditorIcons")); - Ref<Texture2D> vdiag_grabber = get_theme_icon(SNAME("GuiViewportVdiagsplitter"), SNAME("EditorIcons")); - Ref<Texture2D> vh_grabber = get_theme_icon(SNAME("GuiViewportVhsplitter"), SNAME("EditorIcons")); + Ref<Texture2D> hdiag_grabber = get_theme_icon(SNAME("GuiViewportHdiagsplitter"), SNAME("EditorIcons")); + Ref<Texture2D> vdiag_grabber = get_theme_icon(SNAME("GuiViewportVdiagsplitter"), SNAME("EditorIcons")); + Ref<Texture2D> vh_grabber = get_theme_icon(SNAME("GuiViewportVhsplitter"), SNAME("EditorIcons")); - Vector2 size = get_size(); + Vector2 size = get_size(); - int h_sep = get_theme_constant(SNAME("separation"), SNAME("HSplitContainer")); + int h_sep = get_theme_constant(SNAME("separation"), SNAME("HSplitContainer")); - int v_sep = get_theme_constant(SNAME("separation"), SNAME("VSplitContainer")); + int v_sep = get_theme_constant(SNAME("separation"), SNAME("VSplitContainer")); - int mid_w = size.width * ratio_h; - int mid_h = size.height * ratio_v; + int mid_w = size.width * ratio_h; + int mid_h = size.height * ratio_v; - int size_left = mid_w - h_sep / 2; - int size_bottom = size.height - mid_h - v_sep / 2; + int size_left = mid_w - h_sep / 2; + int size_bottom = size.height - mid_h - v_sep / 2; - switch (view) { - case VIEW_USE_1_VIEWPORT: { - // Nothing to show. + switch (view) { + case VIEW_USE_1_VIEWPORT: { + // Nothing to show. - } break; - case VIEW_USE_2_VIEWPORTS: { - draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2)); - set_default_cursor_shape(CURSOR_VSPLIT); + } break; + case VIEW_USE_2_VIEWPORTS: { + draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2)); + set_default_cursor_shape(CURSOR_VSPLIT); - } break; - case VIEW_USE_2_VIEWPORTS_ALT: { - draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2)); - set_default_cursor_shape(CURSOR_HSPLIT); + } break; + case VIEW_USE_2_VIEWPORTS_ALT: { + draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2)); + set_default_cursor_shape(CURSOR_HSPLIT); - } break; - case VIEW_USE_3_VIEWPORTS: { - if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) { - draw_texture(hdiag_grabber, Vector2(mid_w - hdiag_grabber->get_width() / 2, mid_h - v_grabber->get_height() / 4)); - set_default_cursor_shape(CURSOR_DRAG); - } else if ((hovering_v && !dragging_h) || dragging_v) { - draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2)); - set_default_cursor_shape(CURSOR_VSPLIT); - } else if (hovering_h || dragging_h) { - draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, mid_h + v_grabber->get_height() / 2 + (size_bottom - h_grabber->get_height()) / 2)); - set_default_cursor_shape(CURSOR_HSPLIT); - } + } break; + case VIEW_USE_3_VIEWPORTS: { + if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) { + draw_texture(hdiag_grabber, Vector2(mid_w - hdiag_grabber->get_width() / 2, mid_h - v_grabber->get_height() / 4)); + set_default_cursor_shape(CURSOR_DRAG); + } else if ((hovering_v && !dragging_h) || dragging_v) { + draw_texture(v_grabber, Vector2((size.width - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2)); + set_default_cursor_shape(CURSOR_VSPLIT); + } else if (hovering_h || dragging_h) { + draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, mid_h + v_grabber->get_height() / 2 + (size_bottom - h_grabber->get_height()) / 2)); + set_default_cursor_shape(CURSOR_HSPLIT); + } - } break; - case VIEW_USE_3_VIEWPORTS_ALT: { - if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) { - draw_texture(vdiag_grabber, Vector2(mid_w - vdiag_grabber->get_width() + v_grabber->get_height() / 4, mid_h - vdiag_grabber->get_height() / 2)); - set_default_cursor_shape(CURSOR_DRAG); - } else if ((hovering_v && !dragging_h) || dragging_v) { - draw_texture(v_grabber, Vector2((size_left - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2)); - set_default_cursor_shape(CURSOR_VSPLIT); - } else if (hovering_h || dragging_h) { - draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2)); - set_default_cursor_shape(CURSOR_HSPLIT); - } + } break; + case VIEW_USE_3_VIEWPORTS_ALT: { + if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) { + draw_texture(vdiag_grabber, Vector2(mid_w - vdiag_grabber->get_width() + v_grabber->get_height() / 4, mid_h - vdiag_grabber->get_height() / 2)); + set_default_cursor_shape(CURSOR_DRAG); + } else if ((hovering_v && !dragging_h) || dragging_v) { + draw_texture(v_grabber, Vector2((size_left - v_grabber->get_width()) / 2, mid_h - v_grabber->get_height() / 2)); + set_default_cursor_shape(CURSOR_VSPLIT); + } else if (hovering_h || dragging_h) { + draw_texture(h_grabber, Vector2(mid_w - h_grabber->get_width() / 2, (size.height - h_grabber->get_height()) / 2)); + set_default_cursor_shape(CURSOR_HSPLIT); + } - } break; - case VIEW_USE_4_VIEWPORTS: { - Vector2 half(mid_w, mid_h); - if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) { - draw_texture(vh_grabber, half - vh_grabber->get_size() / 2.0); - set_default_cursor_shape(CURSOR_DRAG); - } else if ((hovering_v && !dragging_h) || dragging_v) { - draw_texture(v_grabber, half - v_grabber->get_size() / 2.0); - set_default_cursor_shape(CURSOR_VSPLIT); - } else if (hovering_h || dragging_h) { - draw_texture(h_grabber, half - h_grabber->get_size() / 2.0); - set_default_cursor_shape(CURSOR_HSPLIT); - } + } break; + case VIEW_USE_4_VIEWPORTS: { + Vector2 half(mid_w, mid_h); + if ((hovering_v && hovering_h && !dragging_v && !dragging_h) || (dragging_v && dragging_h)) { + draw_texture(vh_grabber, half - vh_grabber->get_size() / 2.0); + set_default_cursor_shape(CURSOR_DRAG); + } else if ((hovering_v && !dragging_h) || dragging_v) { + draw_texture(v_grabber, half - v_grabber->get_size() / 2.0); + set_default_cursor_shape(CURSOR_VSPLIT); + } else if (hovering_h || dragging_h) { + draw_texture(h_grabber, half - h_grabber->get_size() / 2.0); + set_default_cursor_shape(CURSOR_HSPLIT); + } - } break; - } - } + } break; + } + } + } break; - if (p_what == NOTIFICATION_SORT_CHILDREN) { - Node3DEditorViewport *viewports[4]; - int vc = 0; - for (int i = 0; i < get_child_count(); i++) { - viewports[vc] = Object::cast_to<Node3DEditorViewport>(get_child(i)); - if (viewports[vc]) { - vc++; + case NOTIFICATION_SORT_CHILDREN: { + Node3DEditorViewport *viewports[4]; + int vc = 0; + for (int i = 0; i < get_child_count(); i++) { + viewports[vc] = Object::cast_to<Node3DEditorViewport>(get_child(i)); + if (viewports[vc]) { + vc++; + } } - } - ERR_FAIL_COND(vc != 4); + ERR_FAIL_COND(vc != 4); - Size2 size = get_size(); + Size2 size = get_size(); - if (size.x < 10 || size.y < 10) { - for (int i = 0; i < 4; i++) { - viewports[i]->hide(); + if (size.x < 10 || size.y < 10) { + for (int i = 0; i < 4; i++) { + viewports[i]->hide(); + } + return; } - return; - } - int h_sep = get_theme_constant(SNAME("separation"), SNAME("HSplitContainer")); + int h_sep = get_theme_constant(SNAME("separation"), SNAME("HSplitContainer")); - int v_sep = get_theme_constant(SNAME("separation"), SNAME("VSplitContainer")); + int v_sep = get_theme_constant(SNAME("separation"), SNAME("VSplitContainer")); - int mid_w = size.width * ratio_h; - int mid_h = size.height * ratio_v; + int mid_w = size.width * ratio_h; + int mid_h = size.height * ratio_v; - int size_left = mid_w - h_sep / 2; - int size_right = size.width - mid_w - h_sep / 2; + int size_left = mid_w - h_sep / 2; + int size_right = size.width - mid_w - h_sep / 2; - int size_top = mid_h - v_sep / 2; - int size_bottom = size.height - mid_h - v_sep / 2; + int size_top = mid_h - v_sep / 2; + int size_bottom = size.height - mid_h - v_sep / 2; - switch (view) { - case VIEW_USE_1_VIEWPORT: { - viewports[0]->show(); - for (int i = 1; i < 4; i++) { - viewports[i]->hide(); - } + switch (view) { + case VIEW_USE_1_VIEWPORT: { + viewports[0]->show(); + for (int i = 1; i < 4; i++) { + viewports[i]->hide(); + } - fit_child_in_rect(viewports[0], Rect2(Vector2(), size)); + fit_child_in_rect(viewports[0], Rect2(Vector2(), size)); - } break; - case VIEW_USE_2_VIEWPORTS: { - for (int i = 0; i < 4; i++) { - if (i == 1 || i == 3) { - viewports[i]->hide(); - } else { - viewports[i]->show(); + } break; + case VIEW_USE_2_VIEWPORTS: { + for (int i = 0; i < 4; i++) { + if (i == 1 || i == 3) { + viewports[i]->hide(); + } else { + viewports[i]->show(); + } } - } - fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size.width, size_top))); - fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size.width, size_bottom))); + fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size.width, size_top))); + fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size.width, size_bottom))); - } break; - case VIEW_USE_2_VIEWPORTS_ALT: { - for (int i = 0; i < 4; i++) { - if (i == 1 || i == 3) { - viewports[i]->hide(); - } else { - viewports[i]->show(); + } break; + case VIEW_USE_2_VIEWPORTS_ALT: { + for (int i = 0; i < 4; i++) { + if (i == 1 || i == 3) { + viewports[i]->hide(); + } else { + viewports[i]->show(); + } } - } - fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size.height))); - fit_child_in_rect(viewports[2], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size.height))); + fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size.height))); + fit_child_in_rect(viewports[2], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size.height))); - } break; - case VIEW_USE_3_VIEWPORTS: { - for (int i = 0; i < 4; i++) { - if (i == 1) { - viewports[i]->hide(); - } else { - viewports[i]->show(); + } break; + case VIEW_USE_3_VIEWPORTS: { + for (int i = 0; i < 4; i++) { + if (i == 1) { + viewports[i]->hide(); + } else { + viewports[i]->show(); + } } - } - fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size.width, size_top))); - fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom))); - fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, mid_h + v_sep / 2), Vector2(size_right, size_bottom))); + fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size.width, size_top))); + fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom))); + fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, mid_h + v_sep / 2), Vector2(size_right, size_bottom))); - } break; - case VIEW_USE_3_VIEWPORTS_ALT: { - for (int i = 0; i < 4; i++) { - if (i == 1) { - viewports[i]->hide(); - } else { - viewports[i]->show(); + } break; + case VIEW_USE_3_VIEWPORTS_ALT: { + for (int i = 0; i < 4; i++) { + if (i == 1) { + viewports[i]->hide(); + } else { + viewports[i]->show(); + } } - } - fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size_top))); - fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom))); - fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size.height))); + fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size_top))); + fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom))); + fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size.height))); - } break; - case VIEW_USE_4_VIEWPORTS: { - for (int i = 0; i < 4; i++) { - viewports[i]->show(); - } + } break; + case VIEW_USE_4_VIEWPORTS: { + for (int i = 0; i < 4; i++) { + viewports[i]->show(); + } - fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size_top))); - fit_child_in_rect(viewports[1], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size_top))); - fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom))); - fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, mid_h + v_sep / 2), Vector2(size_right, size_bottom))); + fit_child_in_rect(viewports[0], Rect2(Vector2(), Vector2(size_left, size_top))); + fit_child_in_rect(viewports[1], Rect2(Vector2(mid_w + h_sep / 2, 0), Vector2(size_right, size_top))); + fit_child_in_rect(viewports[2], Rect2(Vector2(0, mid_h + v_sep / 2), Vector2(size_left, size_bottom))); + fit_child_in_rect(viewports[3], Rect2(Vector2(mid_w + h_sep / 2, mid_h + v_sep / 2), Vector2(size_right, size_bottom))); - } break; - } + } break; + } + } break; } } @@ -5854,6 +6005,7 @@ void fragment() { rotate_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); scale_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); scale_plane_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); + axis_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); Ref<StandardMaterial3D> mat = memnew(StandardMaterial3D); mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); @@ -6175,6 +6327,22 @@ void fragment() { plane_mat_hl->set_albedo(col.from_hsv(col.get_h(), 0.25, 1.0, 1)); plane_gizmo_color_hl[i] = plane_mat_hl; // needed, so we can draw planes from both sides } + + // Lines to visualize transforms locked to an axis/plane + { + Ref<SurfaceTool> surftool = memnew(SurfaceTool); + surftool->begin(Mesh::PRIMITIVE_LINE_STRIP); + + Vector3 vec; + vec[i] = 1; + + // line extending through infinity(ish) + surftool->add_vertex(vec * -1048576); + surftool->add_vertex(Vector3()); + surftool->add_vertex(vec * 1048576); + surftool->set_material(mat_hl); + surftool->commit(axis_gizmo[i]); + } } } @@ -6793,14 +6961,15 @@ void Node3DEditor::_notification(int p_what) { SceneTreeDock::get_singleton()->get_tree_editor()->connect("node_changed", callable_mp(this, &Node3DEditor::_refresh_menu_icons)); editor_selection->connect("selection_changed", callable_mp(this, &Node3DEditor::_selection_changed)); - editor->connect("stop_pressed", callable_mp(this, &Node3DEditor::_update_camera_override_button), make_binds(false)); - editor->connect("play_pressed", callable_mp(this, &Node3DEditor::_update_camera_override_button), make_binds(true)); + EditorNode::get_singleton()->connect("stop_pressed", callable_mp(this, &Node3DEditor::_update_camera_override_button), make_binds(false)); + EditorNode::get_singleton()->connect("play_pressed", callable_mp(this, &Node3DEditor::_update_camera_override_button), make_binds(true)); _update_preview_environment(); sun_state->set_custom_minimum_size(sun_vb->get_combined_minimum_size()); environ_state->set_custom_minimum_size(environ_vb->get_combined_minimum_size()); } break; + case NOTIFICATION_ENTER_TREE: { _update_theme(); _register_all_gizmos(); @@ -6808,9 +6977,11 @@ void Node3DEditor::_notification(int p_what) { _init_indicators(); update_all_gizmos(); } break; + case NOTIFICATION_EXIT_TREE: { _finish_indicators(); } break; + case NOTIFICATION_THEME_CHANGED: { _update_theme(); _update_gizmos_menu_theme(); @@ -6818,11 +6989,13 @@ void Node3DEditor::_notification(int p_what) { sun_title->add_theme_font_override("font", get_theme_font(SNAME("title_font"), SNAME("Window"))); environ_title->add_theme_font_override("font", get_theme_font(SNAME("title_font"), SNAME("Window"))); } break; + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { // Update grid color by rebuilding grid. _finish_grid(); _init_grid(); } break; + case NOTIFICATION_VISIBILITY_CHANGED: { if (!is_visible() && tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->is_pressed()) { EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton(); @@ -6930,7 +7103,8 @@ void Node3DEditor::_request_gizmo(Object *p_obj) { bool is_selected = (sp == selected); - if (editor->get_edited_scene() && (sp == editor->get_edited_scene() || (sp->get_owner() && editor->get_edited_scene()->is_ancestor_of(sp)))) { + Node *edited_scene = EditorNode::get_singleton()->get_edited_scene(); + if (edited_scene && (sp == edited_scene || (sp->get_owner() && edited_scene->is_ancestor_of(sp)))) { for (int i = 0; i < gizmo_plugins_by_priority.size(); ++i) { Ref<EditorNode3DGizmo> seg = gizmo_plugins_by_priority.write[i]->get_gizmo(sp); @@ -7210,8 +7384,8 @@ void Node3DEditor::_load_default_preview_settings() { sun_angle_altitude->set_value(-Math::rad2deg(sun_rotation.x)); sun_angle_azimuth->set_value(180.0 - Math::rad2deg(sun_rotation.y)); sun_direction->update(); - environ_sky_color->set_pick_color(Color::hex(0x91b2ceff)); - environ_ground_color->set_pick_color(Color::hex(0x1f1f21ff)); + environ_sky_color->set_pick_color(Color(0.385, 0.454, 0.55)); + environ_ground_color->set_pick_color(Color(0.2, 0.169, 0.133)); environ_energy->set_value(1.0); environ_glow_button->set_pressed(true); environ_tonemap_button->set_pressed(true); @@ -7297,18 +7471,17 @@ void Node3DEditor::_sun_direction_angle_set() { _preview_settings_changed(); } -Node3DEditor::Node3DEditor(EditorNode *p_editor) { +Node3DEditor::Node3DEditor() { gizmo.visible = true; gizmo.scale = 1.0; viewport_environment = Ref<Environment>(memnew(Environment)); - undo_redo = p_editor->get_undo_redo(); + undo_redo = EditorNode::get_singleton()->get_undo_redo(); VBoxContainer *vbc = this; custom_camera = nullptr; singleton = this; - editor = p_editor; - editor_selection = editor->get_editor_selection(); + editor_selection = EditorNode::get_singleton()->get_editor_selection(); editor_selection->add_editor_plugin(this); snap_enabled = false; @@ -7540,7 +7713,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { p->set_hide_on_checkable_item_selection(false); accept = memnew(AcceptDialog); - editor->get_gui_base()->add_child(accept); + EditorNode::get_singleton()->get_gui_base()->add_child(accept); p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/1_viewport", TTR("1 Viewport"), KeyModifierMask::CMD + Key::KEY_1), MENU_VIEW_USE_1_VIEWPORT); p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports", TTR("2 Viewports"), KeyModifierMask::CMD + Key::KEY_2), MENU_VIEW_USE_2_VIEWPORTS); @@ -7587,7 +7760,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { shader_split->add_child(viewport_base); viewport_base->set_v_size_flags(SIZE_EXPAND_FILL); for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) { - viewports[i] = memnew(Node3DEditorViewport(this, editor, i)); + viewports[i] = memnew(Node3DEditorViewport(this, i)); viewports[i]->connect("toggle_maximize_view", callable_mp(this, &Node3DEditor::_toggle_maximize_view)); viewports[i]->connect("clicked", callable_mp(this, &Node3DEditor::_update_camera_override_viewport)); viewports[i]->assign_pending_data_pointers(preview_node, &preview_bounds, accept); @@ -8036,11 +8209,10 @@ void Node3DEditor::remove_gizmo_plugin(Ref<EditorNode3DGizmoPlugin> p_plugin) { _update_gizmos_menu(); } -Node3DEditorPlugin::Node3DEditorPlugin(EditorNode *p_node) { - editor = p_node; - spatial_editor = memnew(Node3DEditor(p_node)); +Node3DEditorPlugin::Node3DEditorPlugin() { + spatial_editor = memnew(Node3DEditor); spatial_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); - editor->get_main_control()->add_child(spatial_editor); + EditorNode::get_singleton()->get_main_control()->add_child(spatial_editor); spatial_editor->hide(); } diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index 20a782c8a8..5c0bfab34e 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -31,19 +31,23 @@ #ifndef NODE_3D_EDITOR_PLUGIN_H #define NODE_3D_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/editor_scale.h" +#include "editor/editor_spin_slider.h" #include "editor/plugins/node_3d_editor_gizmos.h" #include "scene/3d/camera_3d.h" #include "scene/3d/light_3d.h" #include "scene/3d/visual_instance_3d.h" #include "scene/3d/world_environment.h" +#include "scene/gui/color_picker.h" #include "scene/gui/panel_container.h" +#include "scene/gui/spin_box.h" +#include "scene/gui/split_container.h" #include "scene/resources/environment.h" #include "scene/resources/fog_material.h" #include "scene/resources/sky_material.h" +class EditorData; class Node3DEditor; class Node3DEditorViewport; class SubViewportContainer; @@ -194,7 +198,6 @@ private: Node *target_node; Point2 drop_pos; - EditorNode *editor; EditorData *editor_data; EditorSelection *editor_selection; UndoRedo *undo_redo; @@ -247,6 +250,7 @@ private: Point2 _point_to_screen(const Vector3 &p_point); Transform3D _get_camera_transform() const; int get_selected_count() const; + void cancel_transform(); Vector3 _get_camera_position() const; Vector3 _get_camera_normal() const; @@ -268,6 +272,7 @@ private: ObjectID clicked; Vector<_RayResult> selection_results; bool clicked_wants_append; + bool selection_in_progress = false; PopupMenu *selection_menu; @@ -310,10 +315,13 @@ private: Point2 mouse_pos; Point2 original_mouse_pos; bool snap = false; + bool show_rotation_line = false; Ref<EditorNode3DGizmo> gizmo; int gizmo_handle = 0; bool gizmo_handle_secondary = false; Variant gizmo_initial_value; + bool original_local; + bool instant; } _edit; struct Cursor { @@ -347,7 +355,7 @@ private: real_t zoom_indicator_delay; int zoom_failed_attempts_count = 0; - RID move_gizmo_instance[3], move_plane_gizmo_instance[3], rotate_gizmo_instance[4], scale_gizmo_instance[3], scale_plane_gizmo_instance[3]; + RID move_gizmo_instance[3], move_plane_gizmo_instance[3], rotate_gizmo_instance[4], scale_gizmo_instance[3], scale_plane_gizmo_instance[3], axis_gizmo_instance[3]; String last_message; String message; @@ -370,7 +378,7 @@ private: Node3DEditor *spatial_editor; Camera3D *previewing; - Camera3D *preview; + Camera3D *preview = nullptr; bool previewing_cinema; bool _is_node_locked(const Node *p_node); @@ -402,6 +410,14 @@ private: Transform3D _compute_transform(TransformMode p_mode, const Transform3D &p_original, const Transform3D &p_original_local, Vector3 p_motion, double p_extra, bool p_local, bool p_orthogonal); + void begin_transform(TransformMode p_mode, bool instant); + void commit_transform(); + void update_transform(Point2 p_mousepos, bool p_shift); + void finish_transform(); + + void register_shortcut_action(const String &p_path, const String &p_name, Key p_keycode); + void shortcut_changed_callback(const Ref<Shortcut> p_shortcut, const String &p_shortcut_path); + protected: void _notification(int p_what); static void _bind_methods(); @@ -426,7 +442,7 @@ public: SubViewport *get_viewport_node() { return viewport; } Camera3D *get_camera_3d() { return camera; } // return the default camera object. - Node3DEditorViewport(Node3DEditor *p_spatial_editor, EditorNode *p_editor, int p_index); + Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p_index); ~Node3DEditorViewport(); }; @@ -521,7 +537,6 @@ public: }; private: - EditorNode *editor; EditorSelection *editor_selection; Node3DEditorViewportContainer *viewport_base; @@ -546,7 +561,7 @@ private: Camera3D::Projection grid_camera_last_update_perspective = Camera3D::PROJECTION_PERSPECTIVE; Vector3 grid_camera_last_update_position = Vector3(); - Ref<ArrayMesh> move_gizmo[3], move_plane_gizmo[3], rotate_gizmo[4], scale_gizmo[3], scale_plane_gizmo[3]; + Ref<ArrayMesh> move_gizmo[3], move_plane_gizmo[3], rotate_gizmo[4], scale_gizmo[3], scale_plane_gizmo[3], axis_gizmo[3]; Ref<StandardMaterial3D> gizmo_color[3]; Ref<StandardMaterial3D> plane_gizmo_color[3]; Ref<ShaderMaterial> rotate_gizmo_color[3]; @@ -773,12 +788,14 @@ public: ToolMode get_tool_mode() const { return tool_mode; } bool are_local_coords_enabled() const { return tool_option_button[Node3DEditor::TOOL_OPT_LOCAL_COORDS]->is_pressed(); } + void set_local_coords_enabled(bool on) const { tool_option_button[Node3DEditor::TOOL_OPT_LOCAL_COORDS]->set_pressed(on); } bool is_snap_enabled() const { return snap_enabled ^ snap_key_enabled; } double get_translate_snap() const; double get_rotate_snap() const; double get_scale_snap() const; Ref<ArrayMesh> get_move_gizmo(int idx) const { return move_gizmo[idx]; } + Ref<ArrayMesh> get_axis_gizmo(int idx) const { return axis_gizmo[idx]; } Ref<ArrayMesh> get_move_plane_gizmo(int idx) const { return move_plane_gizmo[idx]; } Ref<ArrayMesh> get_rotate_gizmo(int idx) const { return rotate_gizmo[idx]; } Ref<ArrayMesh> get_scale_gizmo(int idx) const { return scale_gizmo[idx]; } @@ -844,7 +861,7 @@ public: void edit(Node3D *p_spatial); void clear(); - Node3DEditor(EditorNode *p_editor); + Node3DEditor(); ~Node3DEditor(); }; @@ -852,7 +869,6 @@ class Node3DEditorPlugin : public EditorPlugin { GDCLASS(Node3DEditorPlugin, EditorPlugin); Node3DEditor *spatial_editor; - EditorNode *editor; public: Node3DEditor *get_spatial_editor() { return spatial_editor; } @@ -868,7 +884,7 @@ public: virtual void edited_scene_changed() override; - Node3DEditorPlugin(EditorNode *p_node); + Node3DEditorPlugin(); ~Node3DEditorPlugin(); }; diff --git a/editor/plugins/occluder_instance_3d_editor_plugin.cpp b/editor/plugins/occluder_instance_3d_editor_plugin.cpp index 2dd760275e..79cf4c394e 100644 --- a/editor/plugins/occluder_instance_3d_editor_plugin.cpp +++ b/editor/plugins/occluder_instance_3d_editor_plugin.cpp @@ -30,13 +30,16 @@ #include "occluder_instance_3d_editor_plugin.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" + void OccluderInstance3DEditorPlugin::_bake_select_file(const String &p_file) { if (occluder_instance) { OccluderInstance3D::BakeError err; if (get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root() == occluder_instance) { - err = occluder_instance->bake(occluder_instance, p_file); + err = occluder_instance->bake_scene(occluder_instance, p_file); } else { - err = occluder_instance->bake(occluder_instance->get_parent(), p_file); + err = occluder_instance->bake_scene(occluder_instance->get_parent(), p_file); } switch (err) { @@ -59,6 +62,10 @@ void OccluderInstance3DEditorPlugin::_bake_select_file(const String &p_file) { EditorNode::get_singleton()->show_warning(TTR("No meshes to bake.\nMake sure there is at least one MeshInstance3D node in the scene whose visual layers are part of the OccluderInstance3D's Bake Mask property.")); break; } + case OccluderInstance3D::BAKE_ERROR_CANT_SAVE: { + EditorNode::get_singleton()->show_warning(TTR("Could not save the new occluder at the specified path: ") + p_file); + break; + } default: { } } @@ -94,11 +101,10 @@ void OccluderInstance3DEditorPlugin::_bind_methods() { ClassDB::bind_method("_bake", &OccluderInstance3DEditorPlugin::_bake); } -OccluderInstance3DEditorPlugin::OccluderInstance3DEditorPlugin(EditorNode *p_node) { - editor = p_node; +OccluderInstance3DEditorPlugin::OccluderInstance3DEditorPlugin() { bake = memnew(Button); bake->set_flat(true); - bake->set_icon(editor->get_gui_base()->get_theme_icon(SNAME("Bake"), SNAME("EditorIcons"))); + bake->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Bake"), SNAME("EditorIcons"))); bake->set_text(TTR("Bake Occluders")); bake->hide(); bake->connect("pressed", Callable(this, "_bake")); diff --git a/editor/plugins/occluder_instance_3d_editor_plugin.h b/editor/plugins/occluder_instance_3d_editor_plugin.h index a9aa0b74e3..24f31b2ea8 100644 --- a/editor/plugins/occluder_instance_3d_editor_plugin.h +++ b/editor/plugins/occluder_instance_3d_editor_plugin.h @@ -31,18 +31,18 @@ #ifndef OCCLUDER_INSTANCE_3D_EDITOR_PLUGIN_H #define OCCLUDER_INSTANCE_3D_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/3d/occluder_instance_3d.h" #include "scene/resources/material.h" +class EditorFileDialog; + class OccluderInstance3DEditorPlugin : public EditorPlugin { GDCLASS(OccluderInstance3DEditorPlugin, EditorPlugin); OccluderInstance3D *occluder_instance; Button *bake; - EditorNode *editor; EditorFileDialog *file_dialog; @@ -59,7 +59,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - OccluderInstance3DEditorPlugin(EditorNode *p_node); + OccluderInstance3DEditorPlugin(); ~OccluderInstance3DEditorPlugin(); }; diff --git a/editor/plugins/ot_features_plugin.cpp b/editor/plugins/ot_features_plugin.cpp index d2daa4fa8d..f8e6054848 100644 --- a/editor/plugins/ot_features_plugin.cpp +++ b/editor/plugins/ot_features_plugin.cpp @@ -30,8 +30,6 @@ #include "ot_features_plugin.h" -#include "editor/editor_scale.h" - void OpenTypeFeaturesEditor::_value_changed(double val) { if (setting) { return; @@ -48,12 +46,15 @@ void OpenTypeFeaturesEditor::update_property() { } void OpenTypeFeaturesEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - Color base = get_theme_color(SNAME("accent_color"), SNAME("Editor")); - - button->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); - button->set_size(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))->get_size()); - spin->set_custom_label_color(true, base); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + Color base = get_theme_color(SNAME("accent_color"), SNAME("Editor")); + + button->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); + button->set_size(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))->get_size()); + spin->set_custom_label_color(true, base); + } break; } } @@ -141,10 +142,13 @@ void OpenTypeFeaturesAdd::_features_menu() { } void OpenTypeFeaturesAdd::_notification(int p_what) { - if (p_what == NOTIFICATION_THEME_CHANGED || p_what == NOTIFICATION_ENTER_TREE) { - set_label(""); - button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); - button->set_size(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))->get_size()); + switch (p_what) { + case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_ENTER_TREE: { + set_label(""); + button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + button->set_size(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))->get_size()); + } break; } } @@ -201,7 +205,7 @@ bool EditorInspectorPluginOpenTypeFeatures::parse_property(Object *p_object, con /*************************************************************************/ -OpenTypeFeaturesEditorPlugin::OpenTypeFeaturesEditorPlugin(EditorNode *p_node) { +OpenTypeFeaturesEditorPlugin::OpenTypeFeaturesEditorPlugin() { Ref<EditorInspectorPluginOpenTypeFeatures> ftr_plugin; ftr_plugin.instantiate(); EditorInspector::add_inspector_plugin(ftr_plugin); diff --git a/editor/plugins/ot_features_plugin.h b/editor/plugins/ot_features_plugin.h index 073fe53a52..8c38d888de 100644 --- a/editor/plugins/ot_features_plugin.h +++ b/editor/plugins/ot_features_plugin.h @@ -31,7 +31,6 @@ #ifndef OT_FEATURES_PLUGIN_H #define OT_FEATURES_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/editor_properties.h" @@ -95,7 +94,7 @@ class OpenTypeFeaturesEditorPlugin : public EditorPlugin { GDCLASS(OpenTypeFeaturesEditorPlugin, EditorPlugin); public: - OpenTypeFeaturesEditorPlugin(EditorNode *p_node); + OpenTypeFeaturesEditorPlugin(); virtual String get_name() const override { return "OpenTypeFeatures"; } }; diff --git a/editor/plugins/packed_scene_translation_parser_plugin.cpp b/editor/plugins/packed_scene_translation_parser_plugin.cpp index b492c27f41..9a8584f4a2 100644 --- a/editor/plugins/packed_scene_translation_parser_plugin.cpp +++ b/editor/plugins/packed_scene_translation_parser_plugin.cpp @@ -132,10 +132,7 @@ PackedSceneEditorTranslationParserPlugin::PackedSceneEditorTranslationParserPlug lookup_properties.insert("script"); // Exception list (to prevent false positives). - exception_list.insert("LineEdit", Vector<StringName>()); - exception_list["LineEdit"].append("text"); - exception_list.insert("TextEdit", Vector<StringName>()); - exception_list["TextEdit"].append("text"); - exception_list.insert("CodeEdit", Vector<StringName>()); - exception_list["CodeEdit"].append("text"); + exception_list.insert("LineEdit", { "text" }); + exception_list.insert("TextEdit", { "text" }); + exception_list.insert("CodeEdit", { "text" }); } diff --git a/editor/plugins/packed_scene_translation_parser_plugin.h b/editor/plugins/packed_scene_translation_parser_plugin.h index fc19496eb6..ecd090b31b 100644 --- a/editor/plugins/packed_scene_translation_parser_plugin.h +++ b/editor/plugins/packed_scene_translation_parser_plugin.h @@ -37,9 +37,9 @@ class PackedSceneEditorTranslationParserPlugin : public EditorTranslationParserP GDCLASS(PackedSceneEditorTranslationParserPlugin, EditorTranslationParserPlugin); // Scene Node's properties that contain translation strings. - Set<StringName> lookup_properties; + Set<String> lookup_properties; // Properties from specific Nodes that should be ignored. - Map<StringName, Vector<StringName>> exception_list; + Map<String, Vector<String>> exception_list; public: virtual Error parse_file(const String &p_path, Vector<String> *r_ids, Vector<Vector<String>> *r_ids_ctx_plural) override; diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp index 702bc4a8ce..9e666ef70a 100644 --- a/editor/plugins/path_2d_editor_plugin.cpp +++ b/editor/plugins/path_2d_editor_plugin.cpp @@ -33,6 +33,7 @@ #include "canvas_item_editor_plugin.h" #include "core/io/file_access.h" #include "core/os/keyboard.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" @@ -515,10 +516,9 @@ void Path2DEditor::_handle_option_pressed(int p_option) { } } -Path2DEditor::Path2DEditor(EditorNode *p_editor) { +Path2DEditor::Path2DEditor() { canvas_item_editor = nullptr; - editor = p_editor; - undo_redo = editor->get_undo_redo(); + undo_redo = EditorNode::get_singleton()->get_undo_redo(); mirror_handle_angle = true; mirror_handle_length = true; on_edge = false; @@ -609,9 +609,8 @@ void Path2DEditorPlugin::make_visible(bool p_visible) { } } -Path2DEditorPlugin::Path2DEditorPlugin(EditorNode *p_node) { - editor = p_node; - path2d_editor = memnew(Path2DEditor(p_node)); +Path2DEditorPlugin::Path2DEditorPlugin() { + path2d_editor = memnew(Path2DEditor); CanvasItemEditor::get_singleton()->add_control_to_menu_panel(path2d_editor); path2d_editor->hide(); } diff --git a/editor/plugins/path_2d_editor_plugin.h b/editor/plugins/path_2d_editor_plugin.h index 210a5a140d..926a859f8b 100644 --- a/editor/plugins/path_2d_editor_plugin.h +++ b/editor/plugins/path_2d_editor_plugin.h @@ -31,9 +31,9 @@ #ifndef PATH_2D_EDITOR_PLUGIN_H #define PATH_2D_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/2d/path_2d.h" +#include "scene/gui/separator.h" class CanvasItemEditor; @@ -43,7 +43,6 @@ class Path2DEditor : public HBoxContainer { UndoRedo *undo_redo; CanvasItemEditor *canvas_item_editor; - EditorNode *editor; Panel *panel; Path2D *node; @@ -105,14 +104,13 @@ public: bool forward_gui_input(const Ref<InputEvent> &p_event); void forward_canvas_draw_over_viewport(Control *p_overlay); void edit(Node *p_path2d); - Path2DEditor(EditorNode *p_editor); + Path2DEditor(); }; class Path2DEditorPlugin : public EditorPlugin { GDCLASS(Path2DEditorPlugin, EditorPlugin); Path2DEditor *path2d_editor; - EditorNode *editor; public: virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) override { return path2d_editor->forward_gui_input(p_event); } @@ -124,7 +122,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - Path2DEditorPlugin(EditorNode *p_node); + Path2DEditorPlugin(); ~Path2DEditorPlugin(); }; diff --git a/editor/plugins/path_3d_editor_plugin.cpp b/editor/plugins/path_3d_editor_plugin.cpp index 7cc926f06c..e52b274908 100644 --- a/editor/plugins/path_3d_editor_plugin.cpp +++ b/editor/plugins/path_3d_editor_plugin.cpp @@ -33,6 +33,7 @@ #include "core/math/geometry_2d.h" #include "core/math/geometry_3d.h" #include "core/os/keyboard.h" +#include "editor/editor_node.h" #include "node_3d_editor_plugin.h" #include "scene/resources/curve.h" @@ -378,7 +379,7 @@ EditorPlugin::AfterGUIInput Path3DEditorPlugin::forward_spatial_gui_input(Camera } } - UndoRedo *ur = editor->get_undo_redo(); + UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); if (closest_seg != -1) { //subdivide @@ -420,21 +421,21 @@ EditorPlugin::AfterGUIInput Path3DEditorPlugin::forward_spatial_gui_input(Camera // Find the offset and point index of the place to break up. // Also check for the control points. if (dist_to_p < click_dist) { - UndoRedo *ur = editor->get_undo_redo(); + UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Remove Path Point")); ur->add_do_method(c.ptr(), "remove_point", i); ur->add_undo_method(c.ptr(), "add_point", c->get_point_position(i), c->get_point_in(i), c->get_point_out(i), i); ur->commit_action(); return EditorPlugin::AFTER_GUI_INPUT_STOP; } else if (dist_to_p_out < click_dist) { - UndoRedo *ur = editor->get_undo_redo(); + UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Remove Out-Control Point")); ur->add_do_method(c.ptr(), "set_point_out", i, Vector3()); ur->add_undo_method(c.ptr(), "set_point_out", i, c->get_point_out(i)); ur->commit_action(); return EditorPlugin::AFTER_GUI_INPUT_STOP; } else if (dist_to_p_in < click_dist) { - UndoRedo *ur = editor->get_undo_redo(); + UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Remove In-Control Point")); ur->add_do_method(c.ptr(), "set_point_in", i, Vector3()); ur->add_undo_method(c.ptr(), "set_point_in", i, c->get_point_in(i)); @@ -513,7 +514,7 @@ void Path3DEditorPlugin::_close_curve() { if (c->get_point_position(0) == c->get_point_position(c->get_point_count() - 1)) { return; } - UndoRedo *ur = editor->get_undo_redo(); + UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Close Curve")); ur->add_do_method(c.ptr(), "add_point", c->get_point_position(0), c->get_point_in(0), c->get_point_out(0), -1); ur->add_undo_method(c.ptr(), "remove_point", c->get_point_count()); @@ -570,9 +571,8 @@ void Path3DEditorPlugin::_bind_methods() { Path3DEditorPlugin *Path3DEditorPlugin::singleton = nullptr; -Path3DEditorPlugin::Path3DEditorPlugin(EditorNode *p_node) { +Path3DEditorPlugin::Path3DEditorPlugin() { path = nullptr; - editor = p_node; singleton = this; mirror_handle_angle = true; mirror_handle_length = true; diff --git a/editor/plugins/path_3d_editor_plugin.h b/editor/plugins/path_3d_editor_plugin.h index b877e2ae17..3c6ca65437 100644 --- a/editor/plugins/path_3d_editor_plugin.h +++ b/editor/plugins/path_3d_editor_plugin.h @@ -35,6 +35,7 @@ #include "editor/plugins/node_3d_editor_gizmos.h" #include "scene/3d/camera_3d.h" #include "scene/3d/path_3d.h" +#include "scene/gui/separator.h" class Path3DGizmo : public EditorNode3DGizmo { GDCLASS(Path3DGizmo, EditorNode3DGizmo); @@ -76,8 +77,6 @@ class Path3DEditorPlugin : public EditorPlugin { Button *curve_close; MenuButton *handle_menu; - EditorNode *editor; - Path3D *path; void _update_theme(); @@ -115,7 +114,7 @@ public: bool is_handle_clicked() { return handle_clicked; } void set_handle_clicked(bool clicked) { handle_clicked = clicked; } - Path3DEditorPlugin(EditorNode *p_node); + Path3DEditorPlugin(); ~Path3DEditorPlugin(); }; diff --git a/editor/plugins/physical_bone_3d_editor_plugin.cpp b/editor/plugins/physical_bone_3d_editor_plugin.cpp index 9d69bbaa0b..e815a9c9f6 100644 --- a/editor/plugins/physical_bone_3d_editor_plugin.cpp +++ b/editor/plugins/physical_bone_3d_editor_plugin.cpp @@ -31,7 +31,6 @@ #include "physical_bone_3d_editor_plugin.h" #include "editor/plugins/node_3d_editor_plugin.h" -#include "scene/3d/physics_body_3d.h" void PhysicalBone3DEditor::_bind_methods() { } @@ -47,8 +46,7 @@ void PhysicalBone3DEditor::_set_move_joint() { } } -PhysicalBone3DEditor::PhysicalBone3DEditor(EditorNode *p_editor) : - editor(p_editor) { +PhysicalBone3DEditor::PhysicalBone3DEditor() { spatial_editor_hb = memnew(HBoxContainer); spatial_editor_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL); spatial_editor_hb->set_alignment(BoxContainer::ALIGNMENT_BEGIN); @@ -84,9 +82,8 @@ void PhysicalBone3DEditor::show() { spatial_editor_hb->show(); } -PhysicalBone3DEditorPlugin::PhysicalBone3DEditorPlugin(EditorNode *p_editor) : - editor(p_editor), - physical_bone_editor(editor) {} +PhysicalBone3DEditorPlugin::PhysicalBone3DEditorPlugin() : + physical_bone_editor() {} void PhysicalBone3DEditorPlugin::make_visible(bool p_visible) { if (p_visible) { diff --git a/editor/plugins/physical_bone_3d_editor_plugin.h b/editor/plugins/physical_bone_3d_editor_plugin.h index d30222d7e6..4051644b54 100644 --- a/editor/plugins/physical_bone_3d_editor_plugin.h +++ b/editor/plugins/physical_bone_3d_editor_plugin.h @@ -31,12 +31,14 @@ #ifndef PHYSICAL_BONE_PLUGIN_H #define PHYSICAL_BONE_PLUGIN_H -#include "editor/editor_node.h" +#include "editor/editor_plugin.h" +#include "scene/3d/physics_body_3d.h" +#include "scene/gui/box_container.h" +#include "scene/gui/button.h" class PhysicalBone3DEditor : public Object { GDCLASS(PhysicalBone3DEditor, Object); - EditorNode *editor; HBoxContainer *spatial_editor_hb; Button *button_transform_joint; @@ -50,7 +52,7 @@ private: void _set_move_joint(); public: - PhysicalBone3DEditor(EditorNode *p_editor); + PhysicalBone3DEditor(); ~PhysicalBone3DEditor() {} void set_selected(PhysicalBone3D *p_pb); @@ -62,7 +64,6 @@ public: class PhysicalBone3DEditorPlugin : public EditorPlugin { GDCLASS(PhysicalBone3DEditorPlugin, EditorPlugin); - EditorNode *editor; PhysicalBone3D *selected = nullptr; PhysicalBone3DEditor physical_bone_editor; @@ -72,7 +73,7 @@ public: virtual void make_visible(bool p_visible) override; virtual void edit(Object *p_node) override; - PhysicalBone3DEditorPlugin(EditorNode *p_editor); + PhysicalBone3DEditorPlugin(); }; #endif diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index 7a96e6eced..f096b2abb1 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -30,15 +30,16 @@ #include "polygon_2d_editor_plugin.h" -#include "canvas_item_editor_plugin.h" -#include "core/input/input.h" -#include "core/io/file_access.h" +#include "core/input/input_event.h" #include "core/math/geometry_2d.h" -#include "core/os/keyboard.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" +#include "editor/plugins/canvas_item_editor_plugin.h" #include "scene/2d/skeleton_2d.h" +#include "scene/gui/menu_button.h" #include "scene/gui/scroll_container.h" +#include "scene/gui/separator.h" +#include "scene/gui/slider.h" #include "scene/gui/view_panner.h" Node2D *Polygon2DEditor::_get_node() const { @@ -68,6 +69,7 @@ void Polygon2DEditor::_notification(int p_what) { case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { uv_panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); } break; + case NOTIFICATION_READY: { button_uv->set_icon(get_theme_icon(SNAME("Uv"), SNAME("EditorIcons"))); @@ -95,6 +97,7 @@ void Polygon2DEditor::_notification(int p_what) { uv_edit_draw->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); bone_scroll->add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); } break; + case NOTIFICATION_VISIBILITY_CHANGED: { if (!is_visible()) { uv_edit->hide(); @@ -473,7 +476,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { uv_move_current = uv_mode; if (uv_move_current == UV_MODE_CREATE) { if (!uv_create) { - points_prev.resize(0); + points_prev.clear(); Vector2 tuv = mtx.affine_inverse().xform(snap_point(mb->get_position())); points_prev.push_back(tuv); uv_create_to = tuv; @@ -682,7 +685,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { } polygon_create.clear(); - } else if (polygon_create.find(closest) == -1) { + } else if (!polygon_create.has(closest)) { //add temporarily if not exists polygon_create.push_back(closest); } @@ -1067,7 +1070,7 @@ void Polygon2DEditor::_uv_draw() { if (uv_create && i == uvs.size() - 1) { next_point = uv_create_to; } - if (i < uv_draw_max /*&& polygons.size() == 0 && polygon_create.size() == 0*/) { //if using or creating polygons, do not show outline (will show polygons instead) + if (i < uv_draw_max) { // If using or creating polygons, do not show outline (will show polygons instead). uv_edit_draw->draw_line(mtx.xform(uvs[i]), mtx.xform(next_point), poly_line_color, Math::round(EDSCALE)); } } @@ -1225,8 +1228,8 @@ Vector2 Polygon2DEditor::snap_point(Vector2 p_target) const { return p_target; } -Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) : - AbstractPolygon2DEditor(p_editor) { +Polygon2DEditor::Polygon2DEditor() : + AbstractPolygon2DEditor() { node = nullptr; snap_offset = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_offset", Vector2()); snap_step = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_step", Vector2(10, 10)); @@ -1486,6 +1489,6 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) : uv_edit_draw->set_clip_contents(true); } -Polygon2DEditorPlugin::Polygon2DEditorPlugin(EditorNode *p_node) : - AbstractPolygon2DEditorPlugin(p_node, memnew(Polygon2DEditor(p_node)), "Polygon2D") { +Polygon2DEditorPlugin::Polygon2DEditorPlugin() : + AbstractPolygon2DEditorPlugin(memnew(Polygon2DEditor), "Polygon2D") { } diff --git a/editor/plugins/polygon_2d_editor_plugin.h b/editor/plugins/polygon_2d_editor_plugin.h index 0f10b6b645..0a5def902c 100644 --- a/editor/plugins/polygon_2d_editor_plugin.h +++ b/editor/plugins/polygon_2d_editor_plugin.h @@ -33,8 +33,11 @@ #include "editor/plugins/abstract_polygon_2d_editor.h" -class ViewPanner; +class HSlider; +class Panel; class ScrollContainer; +class SpinBox; +class ViewPanner; class Polygon2DEditor : public AbstractPolygon2DEditor { GDCLASS(Polygon2DEditor, AbstractPolygon2DEditor); @@ -167,14 +170,14 @@ protected: Vector2 snap_point(Vector2 p_target) const; public: - Polygon2DEditor(EditorNode *p_editor); + Polygon2DEditor(); }; class Polygon2DEditorPlugin : public AbstractPolygon2DEditorPlugin { GDCLASS(Polygon2DEditorPlugin, AbstractPolygon2DEditorPlugin); public: - Polygon2DEditorPlugin(EditorNode *p_node); + Polygon2DEditorPlugin(); }; #endif // POLYGON_2D_EDITOR_PLUGIN_H diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.cpp b/editor/plugins/polygon_3d_editor_plugin.cpp index 52651ae380..2d4812c55b 100644 --- a/editor/plugins/collision_polygon_3d_editor_plugin.cpp +++ b/editor/plugins/polygon_3d_editor_plugin.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* collision_polygon_3d_editor_plugin.cpp */ +/* polygon_3d_editor_plugin.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,26 +28,29 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "collision_polygon_3d_editor_plugin.h" +#include "polygon_3d_editor_plugin.h" #include "canvas_item_editor_plugin.h" +#include "core/core_string_names.h" #include "core/input/input.h" #include "core/io/file_access.h" #include "core/math/geometry_2d.h" #include "core/os/keyboard.h" +#include "editor/editor_node.h" #include "editor/editor_settings.h" #include "node_3d_editor_plugin.h" #include "scene/3d/camera_3d.h" -void CollisionPolygon3DEditor::_notification(int p_what) { +void Polygon3DEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: { button_create->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); button_edit->set_icon(get_theme_icon(SNAME("MovePoint"), SNAME("EditorIcons"))); button_edit->set_pressed(true); - get_tree()->connect("node_removed", callable_mp(this, &CollisionPolygon3DEditor::_node_removed)); + get_tree()->connect("node_removed", callable_mp(this, &Polygon3DEditor::_node_removed)); } break; + case NOTIFICATION_PROCESS: { if (!node) { return; @@ -62,7 +65,7 @@ void CollisionPolygon3DEditor::_notification(int p_what) { } } -void CollisionPolygon3DEditor::_node_removed(Node *p_node) { +void Polygon3DEditor::_node_removed(Node *p_node) { if (p_node == node) { node = nullptr; if (imgeom->get_parent() == p_node) { @@ -73,7 +76,7 @@ void CollisionPolygon3DEditor::_node_removed(Node *p_node) { } } -void CollisionPolygon3DEditor::_menu_option(int p_option) { +void Polygon3DEditor::_menu_option(int p_option) { switch (p_option) { case MODE_CREATE: { mode = MODE_CREATE; @@ -88,10 +91,12 @@ void CollisionPolygon3DEditor::_menu_option(int p_option) { } } -void CollisionPolygon3DEditor::_wip_close() { +void Polygon3DEditor::_wip_close() { + Object *obj = node_resource.is_valid() ? (Object *)node_resource.ptr() : node; + ERR_FAIL_COND_MSG(!obj, "Edited object is not valid."); undo_redo->create_action(TTR("Create Polygon3D")); - undo_redo->add_undo_method(node, "set_polygon", node->call("get_polygon")); - undo_redo->add_do_method(node, "set_polygon", wip); + undo_redo->add_undo_method(obj, "set_polygon", obj->call("get_polygon")); + undo_redo->add_do_method(obj, "set_polygon", wip); undo_redo->add_do_method(this, "_polygon_draw"); undo_redo->add_undo_method(this, "_polygon_draw"); wip.clear(); @@ -103,11 +108,12 @@ void CollisionPolygon3DEditor::_wip_close() { undo_redo->commit_action(); } -EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event) { +EditorPlugin::AfterGUIInput Polygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event) { if (!node) { return EditorPlugin::AFTER_GUI_INPUT_PASS; } + Object *obj = node_resource.is_valid() ? (Object *)node_resource.ptr() : node; Transform3D gt = node->get_global_transform(); Transform3D gi = gt.affine_inverse(); float depth = _get_depth() * 0.5; @@ -135,7 +141,7 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( //Let the snap happen when the point is being moved, instead. //cpoint = CanvasItemEditor::get_singleton()->snap_point(cpoint); - Vector<Vector2> poly = node->call("get_polygon"); + PackedVector2Array poly = _get_polygon(); //first check if a point is to be added (segment split) real_t grab_threshold = EDITOR_GET("editors/polygon_editor/point_grab_radius"); @@ -178,9 +184,9 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( if (mb->is_ctrl_pressed()) { if (poly.size() < 3) { undo_redo->create_action(TTR("Edit Poly")); - undo_redo->add_undo_method(node, "set_polygon", poly); + undo_redo->add_undo_method(obj, "set_polygon", poly); poly.push_back(cpoint); - undo_redo->add_do_method(node, "set_polygon", poly); + undo_redo->add_do_method(obj, "set_polygon", poly); undo_redo->add_do_method(this, "_polygon_draw"); undo_redo->add_undo_method(this, "_polygon_draw"); undo_redo->commit_action(); @@ -215,7 +221,7 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( poly.insert(closest_idx + 1, cpoint); edited_point = closest_idx + 1; edited_point_pos = cpoint; - node->call("set_polygon", poly); + _set_polygon(poly); _polygon_draw(); snap_ignore = true; @@ -256,8 +262,8 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( ERR_FAIL_INDEX_V(edited_point, poly.size(), EditorPlugin::AFTER_GUI_INPUT_PASS); poly.write[edited_point] = edited_point_pos; undo_redo->create_action(TTR("Edit Poly")); - undo_redo->add_do_method(node, "set_polygon", poly); - undo_redo->add_undo_method(node, "set_polygon", pre_move_edit); + undo_redo->add_do_method(obj, "set_polygon", poly); + undo_redo->add_undo_method(obj, "set_polygon", pre_move_edit); undo_redo->add_do_method(this, "_polygon_draw"); undo_redo->add_undo_method(this, "_polygon_draw"); undo_redo->commit_action(); @@ -284,9 +290,9 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( if (closest_idx >= 0) { undo_redo->create_action(TTR("Edit Poly (Remove Point)")); - undo_redo->add_undo_method(node, "set_polygon", poly); + undo_redo->add_undo_method(obj, "set_polygon", poly); poly.remove_at(closest_idx); - undo_redo->add_do_method(node, "set_polygon", poly); + undo_redo->add_do_method(obj, "set_polygon", poly); undo_redo->add_do_method(this, "_polygon_draw"); undo_redo->add_undo_method(this, "_polygon_draw"); undo_redo->commit_action(); @@ -335,25 +341,40 @@ EditorPlugin::AfterGUIInput CollisionPolygon3DEditor::forward_spatial_gui_input( return EditorPlugin::AFTER_GUI_INPUT_PASS; } -float CollisionPolygon3DEditor::_get_depth() { - if (bool(node->call("_has_editable_3d_polygon_no_depth"))) { - return 0; +float Polygon3DEditor::_get_depth() { + Object *obj = node_resource.is_valid() ? (Object *)node_resource.ptr() : node; + ERR_FAIL_COND_V_MSG(!obj, 0.0f, "Edited object is not valid."); + + if (bool(obj->call("_has_editable_3d_polygon_no_depth"))) { + return 0.0f; } - return float(node->call("get_depth")); + return float(obj->call("get_depth")); } -void CollisionPolygon3DEditor::_polygon_draw() { +PackedVector2Array Polygon3DEditor::_get_polygon() { + Object *obj = node_resource.is_valid() ? (Object *)node_resource.ptr() : node; + ERR_FAIL_COND_V_MSG(!obj, PackedVector2Array(), "Edited object is not valid."); + return PackedVector2Array(obj->call("get_polygon")); +} + +void Polygon3DEditor::_set_polygon(PackedVector2Array p_poly) { + Object *obj = node_resource.is_valid() ? (Object *)node_resource.ptr() : node; + ERR_FAIL_COND_MSG(!obj, "Edited object is not valid."); + obj->call("set_polygon", p_poly); +} + +void Polygon3DEditor::_polygon_draw() { if (!node) { return; } - Vector<Vector2> poly; + PackedVector2Array poly; if (wip_active) { poly = wip; } else { - poly = node->call("get_polygon"); + poly = _get_polygon(); } float depth = _get_depth() * 0.5; @@ -464,23 +485,32 @@ void CollisionPolygon3DEditor::_polygon_draw() { m->surface_set_material(0, handle_material); } -void CollisionPolygon3DEditor::edit(Node *p_collision_polygon) { - if (p_collision_polygon) { - node = Object::cast_to<Node3D>(p_collision_polygon); +void Polygon3DEditor::edit(Node *p_node) { + if (p_node) { + node = Object::cast_to<Node3D>(p_node); + node_resource = node->call("_get_editable_3d_polygon_resource"); + + if (node_resource.is_valid()) { + node_resource->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Polygon3DEditor::_polygon_draw)); + } //Enable the pencil tool if the polygon is empty - if (Vector<Vector2>(node->call("get_polygon")).size() == 0) { + if (_get_polygon().is_empty()) { _menu_option(MODE_CREATE); } wip.clear(); wip_active = false; edited_point = -1; - p_collision_polygon->add_child(imgeom); + p_node->add_child(imgeom); _polygon_draw(); set_process(true); prev_depth = -1; } else { node = nullptr; + if (node_resource.is_valid()) { + node_resource->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Polygon3DEditor::_polygon_draw)); + } + node_resource.unref(); if (imgeom->get_parent()) { imgeom->get_parent()->remove_child(imgeom); @@ -490,26 +520,25 @@ void CollisionPolygon3DEditor::edit(Node *p_collision_polygon) { } } -void CollisionPolygon3DEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_polygon_draw"), &CollisionPolygon3DEditor::_polygon_draw); +void Polygon3DEditor::_bind_methods() { + ClassDB::bind_method(D_METHOD("_polygon_draw"), &Polygon3DEditor::_polygon_draw); } -CollisionPolygon3DEditor::CollisionPolygon3DEditor(EditorNode *p_editor) { +Polygon3DEditor::Polygon3DEditor() { node = nullptr; - editor = p_editor; undo_redo = EditorNode::get_undo_redo(); add_child(memnew(VSeparator)); button_create = memnew(Button); button_create->set_flat(true); add_child(button_create); - button_create->connect("pressed", callable_mp(this, &CollisionPolygon3DEditor::_menu_option), varray(MODE_CREATE)); + button_create->connect("pressed", callable_mp(this, &Polygon3DEditor::_menu_option), varray(MODE_CREATE)); button_create->set_toggle_mode(true); button_edit = memnew(Button); button_edit->set_flat(true); add_child(button_edit); - button_edit->connect("pressed", callable_mp(this, &CollisionPolygon3DEditor::_menu_option), varray(MODE_EDIT)); + button_edit->connect("pressed", callable_mp(this, &Polygon3DEditor::_menu_option), varray(MODE_EDIT)); button_edit->set_toggle_mode(true); mode = MODE_EDIT; @@ -532,7 +561,7 @@ CollisionPolygon3DEditor::CollisionPolygon3DEditor(EditorNode *p_editor) { handle_material->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA); handle_material->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true); handle_material->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true); - Ref<Texture2D> handle = editor->get_gui_base()->get_theme_icon(SNAME("Editor3DHandle"), SNAME("EditorIcons")); + Ref<Texture2D> handle = EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Editor3DHandle"), SNAME("EditorIcons")); handle_material->set_point_size(handle->get_width()); handle_material->set_texture(StandardMaterial3D::TEXTURE_ALBEDO, handle); @@ -545,12 +574,12 @@ CollisionPolygon3DEditor::CollisionPolygon3DEditor(EditorNode *p_editor) { snap_ignore = false; } -CollisionPolygon3DEditor::~CollisionPolygon3DEditor() { +Polygon3DEditor::~Polygon3DEditor() { memdelete(imgeom); } void Polygon3DEditorPlugin::edit(Object *p_object) { - collision_polygon_editor->edit(Object::cast_to<Node>(p_object)); + polygon_editor->edit(Object::cast_to<Node>(p_object)); } bool Polygon3DEditorPlugin::handles(Object *p_object) const { @@ -559,19 +588,18 @@ bool Polygon3DEditorPlugin::handles(Object *p_object) const { void Polygon3DEditorPlugin::make_visible(bool p_visible) { if (p_visible) { - collision_polygon_editor->show(); + polygon_editor->show(); } else { - collision_polygon_editor->hide(); - collision_polygon_editor->edit(nullptr); + polygon_editor->hide(); + polygon_editor->edit(nullptr); } } -Polygon3DEditorPlugin::Polygon3DEditorPlugin(EditorNode *p_node) { - editor = p_node; - collision_polygon_editor = memnew(CollisionPolygon3DEditor(p_node)); - Node3DEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor); +Polygon3DEditorPlugin::Polygon3DEditorPlugin() { + polygon_editor = memnew(Polygon3DEditor); + Node3DEditor::get_singleton()->add_control_to_menu_panel(polygon_editor); - collision_polygon_editor->hide(); + polygon_editor->hide(); } Polygon3DEditorPlugin::~Polygon3DEditorPlugin() { diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.h b/editor/plugins/polygon_3d_editor_plugin.h index cd8c857398..e92dcaf319 100644 --- a/editor/plugins/collision_polygon_3d_editor_plugin.h +++ b/editor/plugins/polygon_3d_editor_plugin.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* collision_polygon_3d_editor_plugin.h */ +/* polygon_3d_editor_plugin.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,10 +28,9 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef COLLISION_POLYGON_EDITOR_PLUGIN_H -#define COLLISION_POLYGON_EDITOR_PLUGIN_H +#ifndef POLYGON_3D_EDITOR_PLUGIN_H +#define POLYGON_3D_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/3d/collision_polygon_3d.h" #include "scene/3d/mesh_instance_3d.h" @@ -39,8 +38,8 @@ class CanvasItemEditor; -class CollisionPolygon3DEditor : public HBoxContainer { - GDCLASS(CollisionPolygon3DEditor, HBoxContainer); +class Polygon3DEditor : public HBoxContainer { + GDCLASS(Polygon3DEditor, HBoxContainer); UndoRedo *undo_redo; enum Mode { @@ -57,9 +56,9 @@ class CollisionPolygon3DEditor : public HBoxContainer { Ref<StandardMaterial3D> line_material; Ref<StandardMaterial3D> handle_material; - EditorNode *editor; Panel *panel; Node3D *node; + Ref<Resource> node_resource; Ref<ImmediateMesh> imesh; MeshInstance3D *imgeom; MeshInstance3D *pointsm; @@ -69,8 +68,8 @@ class CollisionPolygon3DEditor : public HBoxContainer { int edited_point; Vector2 edited_point_pos; - Vector<Vector2> pre_move_edit; - Vector<Vector2> wip; + PackedVector2Array pre_move_edit; + PackedVector2Array wip; bool wip_active; bool snap_ignore; @@ -81,6 +80,8 @@ class CollisionPolygon3DEditor : public HBoxContainer { void _menu_option(int p_option); float _get_depth(); + PackedVector2Array _get_polygon(); + void _set_polygon(PackedVector2Array p_poly); protected: void _notification(int p_what); @@ -89,19 +90,18 @@ protected: public: virtual EditorPlugin::AfterGUIInput forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event); - void edit(Node *p_collision_polygon); - CollisionPolygon3DEditor(EditorNode *p_editor); - ~CollisionPolygon3DEditor(); + void edit(Node *p_node); + Polygon3DEditor(); + ~Polygon3DEditor(); }; class Polygon3DEditorPlugin : public EditorPlugin { GDCLASS(Polygon3DEditorPlugin, EditorPlugin); - CollisionPolygon3DEditor *collision_polygon_editor; - EditorNode *editor; + Polygon3DEditor *polygon_editor; public: - virtual EditorPlugin::AfterGUIInput forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event) override { return collision_polygon_editor->forward_spatial_gui_input(p_camera, p_event); } + virtual EditorPlugin::AfterGUIInput forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event) override { return polygon_editor->forward_spatial_gui_input(p_camera, p_event); } virtual String get_name() const override { return "Polygon3DEditor"; } bool has_main_screen() const override { return false; } @@ -109,8 +109,8 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - Polygon3DEditorPlugin(EditorNode *p_node); + Polygon3DEditorPlugin(); ~Polygon3DEditorPlugin(); }; -#endif // COLLISION_POLYGON_EDITOR_PLUGIN_H +#endif // POLYGON_3D_EDITOR_PLUGIN_H diff --git a/editor/plugins/replication_editor_plugin.cpp b/editor/plugins/replication_editor_plugin.cpp new file mode 100644 index 0000000000..e4c1c69804 --- /dev/null +++ b/editor/plugins/replication_editor_plugin.cpp @@ -0,0 +1,396 @@ +/*************************************************************************/ +/* replication_editor_plugin.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "replication_editor_plugin.h" + +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/inspector_dock.h" +#include "scene/gui/dialogs.h" +#include "scene/gui/tree.h" +#include "scene/multiplayer/multiplayer_synchronizer.h" + +/// ReplicationEditor +ReplicationEditor::ReplicationEditor() { + set_v_size_flags(SIZE_EXPAND_FILL); + set_custom_minimum_size(Size2(0, 200) * EDSCALE); + + delete_dialog = memnew(ConfirmationDialog); + delete_dialog->connect("cancelled", callable_mp(this, &ReplicationEditor::_dialog_closed), varray(false)); + delete_dialog->connect("confirmed", callable_mp(this, &ReplicationEditor::_dialog_closed), varray(true)); + add_child(delete_dialog); + + error_dialog = memnew(AcceptDialog); + error_dialog->get_ok_button()->set_text(TTR("Close")); + error_dialog->set_title(TTR("Error!")); + add_child(error_dialog); + + VBoxContainer *vb = memnew(VBoxContainer); + vb->set_v_size_flags(SIZE_EXPAND_FILL); + add_child(vb); + + HBoxContainer *hb = memnew(HBoxContainer); + vb->add_child(hb); + np_line_edit = memnew(LineEdit); + np_line_edit->set_placeholder(":property"); + np_line_edit->set_h_size_flags(SIZE_EXPAND_FILL); + hb->add_child(np_line_edit); + add_button = memnew(Button); + add_button->connect("pressed", callable_mp(this, &ReplicationEditor::_add_pressed)); + add_button->set_text(TTR("Add")); + hb->add_child(add_button); + + tree = memnew(Tree); + tree->set_hide_root(true); + tree->set_columns(4); + tree->set_column_titles_visible(true); + tree->set_column_title(0, TTR("Properties")); + tree->set_column_expand(0, true); + tree->set_column_title(1, TTR("Spawn")); + tree->set_column_expand(1, false); + tree->set_column_custom_minimum_width(1, 100); + tree->set_column_title(2, TTR("Sync")); + tree->set_column_custom_minimum_width(2, 100); + tree->set_column_expand(2, false); + tree->set_column_expand(3, false); + tree->create_item(); + tree->connect("button_pressed", callable_mp(this, &ReplicationEditor::_tree_button_pressed)); + tree->connect("item_edited", callable_mp(this, &ReplicationEditor::_tree_item_edited)); + tree->set_v_size_flags(SIZE_EXPAND_FILL); + vb->add_child(tree); +} + +void ReplicationEditor::_bind_methods() { + ClassDB::bind_method(D_METHOD("_update_config"), &ReplicationEditor::_update_config); + ClassDB::bind_method(D_METHOD("_update_checked", "property", "column", "checked"), &ReplicationEditor::_update_checked); + ADD_SIGNAL(MethodInfo("keying_changed")); +} + +void ReplicationEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); + } break; + + case NOTIFICATION_VISIBILITY_CHANGED: { + update_keying(); + } break; + } +} + +void ReplicationEditor::_add_pressed() { + if (!current) { + error_dialog->set_text(TTR("Please select a MultiplayerSynchronizer first.")); + error_dialog->popup_centered(); + return; + } + if (current->get_root_path().is_empty()) { + error_dialog->set_text(TTR("The MultiplayerSynchronizer needs a root path.")); + error_dialog->popup_centered(); + return; + } + String np_text = np_line_edit->get_text(); + if (np_text.find(":") == -1) { + np_text = ":" + np_text; + } + NodePath prop = NodePath(np_text); + if (prop.is_empty()) { + return; + } + UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo(); + undo_redo->create_action(TTR("Add property")); + config = current->get_replication_config(); + if (config.is_null()) { + config.instantiate(); + current->set_replication_config(config); + undo_redo->add_do_method(current, "set_replication_config", config); + undo_redo->add_undo_method(current, "set_replication_config", Ref<SceneReplicationConfig>()); + _update_config(); + } + undo_redo->add_do_method(config.ptr(), "add_property", prop); + undo_redo->add_undo_method(config.ptr(), "remove_property", prop); + undo_redo->add_do_method(this, "_update_config"); + undo_redo->add_undo_method(this, "_update_config"); + undo_redo->commit_action(); +} + +void ReplicationEditor::_tree_item_edited() { + TreeItem *ti = tree->get_edited(); + if (!ti || config.is_null()) { + return; + } + int column = tree->get_edited_column(); + ERR_FAIL_COND(column < 1 || column > 2); + const NodePath prop = ti->get_metadata(0); + UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo(); + bool value = ti->is_checked(column); + String method; + if (column == 1) { + undo_redo->create_action(TTR("Set spawn property")); + method = "property_set_spawn"; + } else { + undo_redo->create_action(TTR("Set sync property")); + method = "property_set_sync"; + } + undo_redo->add_do_method(config.ptr(), method, prop, value); + undo_redo->add_undo_method(config.ptr(), method, prop, !value); + undo_redo->add_do_method(this, "_update_checked", prop, column, value); + undo_redo->add_undo_method(this, "_update_checked", prop, column, !value); + undo_redo->commit_action(); +} + +void ReplicationEditor::_tree_button_pressed(Object *p_item, int p_column, int p_id) { + TreeItem *ti = Object::cast_to<TreeItem>(p_item); + if (!ti) { + return; + } + deleting = ti->get_metadata(0); + delete_dialog->set_text(TTR("Delete Property?") + "\n\"" + ti->get_text(0) + "\""); + delete_dialog->popup_centered(); +} + +void ReplicationEditor::_dialog_closed(bool p_confirmed) { + if (deleting.is_empty() || config.is_null()) { + return; + } + if (p_confirmed) { + const NodePath prop = deleting; + int idx = config->property_get_index(prop); + bool spawn = config->property_get_spawn(prop); + bool sync = config->property_get_sync(prop); + UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo(); + undo_redo->create_action(TTR("Remove Property")); + undo_redo->add_do_method(config.ptr(), "remove_property", prop); + undo_redo->add_undo_method(config.ptr(), "add_property", prop, idx); + undo_redo->add_undo_method(config.ptr(), "property_set_spawn", prop, spawn); + undo_redo->add_undo_method(config.ptr(), "property_set_sync", prop, sync); + undo_redo->add_do_method(this, "_update_config"); + undo_redo->add_undo_method(this, "_update_config"); + undo_redo->commit_action(); + } + deleting = NodePath(); +} + +void ReplicationEditor::_update_checked(const NodePath &p_prop, int p_column, bool p_checked) { + if (!tree->get_root()) { + return; + } + TreeItem *ti = tree->get_root()->get_first_child(); + while (ti) { + if (ti->get_metadata(0).operator NodePath() == p_prop) { + ti->set_checked(p_column, p_checked); + return; + } + ti = ti->get_next(); + } +} + +void ReplicationEditor::update_keying() { + /// TODO make keying usable. +#if 0 + bool keying_enabled = false; + EditorHistory *editor_history = EditorNode::get_singleton()->get_editor_history(); + if (is_visible_in_tree() && config.is_valid() && editor_history->get_path_size() > 0) { + Object *obj = ObjectDB::get_instance(editor_history->get_path_object(0)); + keying_enabled = Object::cast_to<Node>(obj) != nullptr; + } + + if (keying_enabled == keying) { + return; + } + + keying = keying_enabled; + emit_signal(SNAME("keying_changed")); +#endif +} + +void ReplicationEditor::_update_config() { + deleting = NodePath(); + tree->clear(); + tree->create_item(); + if (!config.is_valid()) { + update_keying(); + return; + } + TypedArray<NodePath> props = config->get_properties(); + for (int i = 0; i < props.size(); i++) { + const NodePath path = props[i]; + _add_property(path, config->property_get_spawn(path), config->property_get_sync(path)); + } + update_keying(); +} + +void ReplicationEditor::edit(MultiplayerSynchronizer *p_sync) { + if (current == p_sync) { + return; + } + current = p_sync; + if (current) { + config = current->get_replication_config(); + } else { + config.unref(); + } + _update_config(); +} + +Ref<Texture2D> ReplicationEditor::_get_class_icon(const Node *p_node) { + if (!p_node || !has_theme_icon(p_node->get_class(), "EditorIcons")) { + return get_theme_icon(SNAME("ImportFail"), SNAME("EditorIcons")); + } + return get_theme_icon(p_node->get_class(), "EditorIcons"); +} + +void ReplicationEditor::_add_property(const NodePath &p_property, bool p_spawn, bool p_sync) { + String prop = String(p_property); + TreeItem *item = tree->create_item(); + item->set_selectable(0, false); + item->set_selectable(1, false); + item->set_selectable(2, false); + item->set_selectable(3, false); + item->set_text(0, prop); + item->set_metadata(0, prop); + Node *root_node = current && !current->get_root_path().is_empty() ? current->get_node(current->get_root_path()) : nullptr; + Ref<Texture2D> icon = _get_class_icon(root_node); + if (root_node) { + String path = prop.substr(0, prop.find(":")); + String subpath = prop.substr(path.size()); + Node *node = root_node->get_node_or_null(path); + if (!node) { + node = root_node; + } + item->set_text(0, String(node->get_name()) + ":" + subpath); + icon = _get_class_icon(node); + } + item->set_icon(0, icon); + item->add_button(3, get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); + item->set_text_alignment(1, HORIZONTAL_ALIGNMENT_CENTER); + item->set_cell_mode(1, TreeItem::CELL_MODE_CHECK); + item->set_checked(1, p_spawn); + item->set_editable(1, true); + item->set_text_alignment(2, HORIZONTAL_ALIGNMENT_CENTER); + item->set_cell_mode(2, TreeItem::CELL_MODE_CHECK); + item->set_checked(2, p_sync); + item->set_editable(2, true); +} + +void ReplicationEditor::property_keyed(const String &p_property) { + ERR_FAIL_COND(!current || config.is_null()); + Node *root = current->get_node(current->get_root_path()); + ERR_FAIL_COND(!root); + EditorHistory *history = EditorNode::get_singleton()->get_editor_history(); + ERR_FAIL_COND(history->get_path_size() == 0); + Node *node = Object::cast_to<Node>(ObjectDB::get_instance(history->get_path_object(0))); + ERR_FAIL_COND(!node); + if (node->is_class("MultiplayerSynchronizer")) { + error_dialog->set_text(TTR("Properties of 'MultiplayerSynchronizer' cannot be configured for replication.")); + error_dialog->popup_centered(); + return; + } + if (history->get_path_size() > 1 || p_property.get_slice_count(":") > 1) { + error_dialog->set_text(TTR("Subresources cannot yet be configured for replication.")); + error_dialog->popup_centered(); + return; + } + + String path = root->get_path_to(node); + for (int i = 1; i < history->get_path_size(); i++) { + String prop = history->get_path_property(i); + ERR_FAIL_COND(prop == ""); + path += ":" + prop; + } + path += ":" + p_property; + + NodePath prop = path; + UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo(); + undo_redo->create_action(TTR("Add property")); + undo_redo->add_do_method(config.ptr(), "add_property", prop); + undo_redo->add_undo_method(config.ptr(), "remove_property", prop); + undo_redo->add_do_method(this, "_update_config"); + undo_redo->add_undo_method(this, "_update_config"); + undo_redo->commit_action(); +} + +/// ReplicationEditorPlugin +ReplicationEditorPlugin::ReplicationEditorPlugin() { + repl_editor = memnew(ReplicationEditor); + EditorNode::get_singleton()->add_bottom_panel_item(TTR("Replication"), repl_editor); +} + +ReplicationEditorPlugin::~ReplicationEditorPlugin() { +} + +void ReplicationEditorPlugin::_keying_changed() { + // TODO make lock usable. + //InspectorDock::get_inspector_singleton()->set_keying(repl_editor->has_keying(), this); +} + +void ReplicationEditorPlugin::_property_keyed(const String &p_keyed, const Variant &p_value, bool p_advance) { + if (!repl_editor->has_keying()) { + return; + } + repl_editor->property_keyed(p_keyed); +} + +void ReplicationEditorPlugin::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + //Node3DEditor::get_singleton()->connect("transform_key_request", callable_mp(this, &AnimationPlayerEditorPlugin::_transform_key_request)); + InspectorDock::get_inspector_singleton()->connect("property_keyed", callable_mp(this, &ReplicationEditorPlugin::_property_keyed)); + repl_editor->connect("keying_changed", callable_mp(this, &ReplicationEditorPlugin::_keying_changed)); + // TODO make lock usable. + //InspectorDock::get_inspector_singleton()->connect("object_inspected", callable_mp(repl_editor, &ReplicationEditor::update_keying)); + get_tree()->connect("node_removed", callable_mp(this, &ReplicationEditorPlugin::_node_removed)); + } break; + } +} + +void ReplicationEditorPlugin::_node_removed(Node *p_node) { + if (p_node && p_node == repl_editor->get_current()) { + repl_editor->edit(nullptr); + if (repl_editor->is_visible_in_tree()) { + EditorNode::get_singleton()->hide_bottom_panel(); + } + } +} + +void ReplicationEditorPlugin::edit(Object *p_object) { + repl_editor->edit(Object::cast_to<MultiplayerSynchronizer>(p_object)); +} + +bool ReplicationEditorPlugin::handles(Object *p_object) const { + return p_object->is_class("MultiplayerSynchronizer"); +} + +void ReplicationEditorPlugin::make_visible(bool p_visible) { + if (p_visible) { + EditorNode::get_singleton()->make_bottom_panel_item_visible(repl_editor); + } +} diff --git a/editor/plugins/replication_editor_plugin.h b/editor/plugins/replication_editor_plugin.h new file mode 100644 index 0000000000..46274d188c --- /dev/null +++ b/editor/plugins/replication_editor_plugin.h @@ -0,0 +1,105 @@ +/*************************************************************************/ +/* replication_editor_plugin.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef REPLICATION_EDITOR_PLUGIN_H +#define REPLICATION_EDITOR_PLUGIN_H + +#include "editor/editor_plugin.h" +#include "scene/resources/scene_replication_config.h" + +class ConfirmationDialog; +class MultiplayerSynchronizer; +class Tree; + +class ReplicationEditor : public VBoxContainer { + GDCLASS(ReplicationEditor, VBoxContainer); + +private: + MultiplayerSynchronizer *current = nullptr; + + AcceptDialog *error_dialog = nullptr; + ConfirmationDialog *delete_dialog = nullptr; + Button *add_button = nullptr; + LineEdit *np_line_edit = nullptr; + + Ref<SceneReplicationConfig> config; + NodePath deleting; + Tree *tree; + bool keying = false; + + Ref<Texture2D> _get_class_icon(const Node *p_node); + + void _add_pressed(); + void _tree_item_edited(); + void _tree_button_pressed(Object *p_item, int p_column, int p_id); + void _update_checked(const NodePath &p_prop, int p_column, bool p_checked); + void _update_config(); + void _dialog_closed(bool p_confirmed); + void _add_property(const NodePath &p_property, bool p_spawn = true, bool p_sync = true); + +protected: + static void _bind_methods(); + + void _notification(int p_what); + +public: + void update_keying(); + void edit(MultiplayerSynchronizer *p_object); + bool has_keying() const { return keying; } + MultiplayerSynchronizer *get_current() const { return current; } + void property_keyed(const String &p_property); + + ReplicationEditor(); + ~ReplicationEditor() {} +}; + +class ReplicationEditorPlugin : public EditorPlugin { + GDCLASS(ReplicationEditorPlugin, EditorPlugin); + +private: + ReplicationEditor *repl_editor; + + void _node_removed(Node *p_node); + void _keying_changed(); + void _property_keyed(const String &p_keyed, const Variant &p_value, bool p_advance); + +protected: + void _notification(int p_what); + +public: + virtual void edit(Object *p_object) override; + virtual bool handles(Object *p_object) const override; + virtual void make_visible(bool p_visible) override; + + ReplicationEditorPlugin(); + ~ReplicationEditorPlugin(); +}; + +#endif // REPLICATION_EDITOR_PLUGIN_H diff --git a/editor/plugins/resource_preloader_editor_plugin.cpp b/editor/plugins/resource_preloader_editor_plugin.cpp index d5287bc2fb..b7aef7f1bb 100644 --- a/editor/plugins/resource_preloader_editor_plugin.cpp +++ b/editor/plugins/resource_preloader_editor_plugin.cpp @@ -32,19 +32,16 @@ #include "core/config/project_settings.h" #include "core/io/resource_loader.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" void ResourcePreloaderEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - load->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); - } - - if (p_what == NOTIFICATION_READY) { - //NodePath("/root")->connect("node_removed", this,"_node_removed",Vector<Variant>(),true); - } - - if (p_what == NOTIFICATION_DRAW) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + load->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); + } break; } } @@ -110,7 +107,7 @@ void ResourcePreloaderEditor::_item_edited() { return; } - if (new_name.is_empty() || new_name.find("\\") != -1 || new_name.find("/") != -1 || preloader->has_resource(new_name)) { + if (new_name.is_empty() || new_name.contains("\\") || new_name.contains("/") || preloader->has_resource(new_name)) { s->set_text(0, old_name); return; } @@ -402,11 +399,11 @@ void ResourcePreloaderEditorPlugin::make_visible(bool p_visible) { if (p_visible) { //preloader_editor->show(); button->show(); - editor->make_bottom_panel_item_visible(preloader_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(preloader_editor); //preloader_editor->set_process(true); } else { if (preloader_editor->is_visible_in_tree()) { - editor->hide_bottom_panel(); + EditorNode::get_singleton()->hide_bottom_panel(); } button->hide(); //preloader_editor->hide(); @@ -414,12 +411,11 @@ void ResourcePreloaderEditorPlugin::make_visible(bool p_visible) { } } -ResourcePreloaderEditorPlugin::ResourcePreloaderEditorPlugin(EditorNode *p_node) { - editor = p_node; +ResourcePreloaderEditorPlugin::ResourcePreloaderEditorPlugin() { preloader_editor = memnew(ResourcePreloaderEditor); preloader_editor->set_custom_minimum_size(Size2(0, 250) * EDSCALE); - button = editor->add_bottom_panel_item(TTR("ResourcePreloader"), preloader_editor); + button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("ResourcePreloader"), preloader_editor); button->hide(); //preloader_editor->set_anchor( MARGIN_TOP, Control::ANCHOR_END); diff --git a/editor/plugins/resource_preloader_editor_plugin.h b/editor/plugins/resource_preloader_editor_plugin.h index 838d72df41..8e81239f1b 100644 --- a/editor/plugins/resource_preloader_editor_plugin.h +++ b/editor/plugins/resource_preloader_editor_plugin.h @@ -31,13 +31,13 @@ #ifndef RESOURCE_PRELOADER_EDITOR_PLUGIN_H #define RESOURCE_PRELOADER_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/gui/dialogs.h" -#include "scene/gui/file_dialog.h" #include "scene/gui/tree.h" #include "scene/main/resource_preloader.h" +class EditorFileDialog; + class ResourcePreloaderEditor : public PanelContainer { GDCLASS(ResourcePreloaderEditor, PanelContainer); @@ -88,7 +88,6 @@ class ResourcePreloaderEditorPlugin : public EditorPlugin { GDCLASS(ResourcePreloaderEditorPlugin, EditorPlugin); ResourcePreloaderEditor *preloader_editor; - EditorNode *editor; Button *button; public: @@ -98,7 +97,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - ResourcePreloaderEditorPlugin(EditorNode *p_node); + ResourcePreloaderEditorPlugin(); ~ResourcePreloaderEditorPlugin(); }; diff --git a/editor/plugins/root_motion_editor_plugin.cpp b/editor/plugins/root_motion_editor_plugin.cpp index 34b39d2a17..bfb672d694 100644 --- a/editor/plugins/root_motion_editor_plugin.cpp +++ b/editor/plugins/root_motion_editor_plugin.cpp @@ -233,9 +233,12 @@ void EditorPropertyRootMotion::setup(const NodePath &p_base_hint) { } void EditorPropertyRootMotion::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - Ref<Texture2D> t = get_theme_icon(SNAME("Clear"), SNAME("EditorIcons")); - clear->set_icon(t); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + Ref<Texture2D> t = get_theme_icon(SNAME("Clear"), SNAME("EditorIcons")); + clear->set_icon(t); + } break; } } diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 2a8882bbd1..30c2b12519 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -36,8 +36,10 @@ #include "core/io/resource_loader.h" #include "core/os/keyboard.h" #include "core/os/os.h" +#include "core/version.h" #include "editor/debugger/editor_debugger_node.h" #include "editor/debugger/script_editor_debugger.h" +#include "editor/editor_file_dialog.h" #include "editor/editor_node.h" #include "editor/editor_run_script.h" #include "editor/editor_scale.h" @@ -159,7 +161,7 @@ void EditorStandardSyntaxHighlighter::_update_cache() { if (E.usage & PROPERTY_USAGE_CATEGORY || E.usage & PROPERTY_USAGE_GROUP || E.usage & PROPERTY_USAGE_SUBGROUP) { continue; } - if (name.find("/") != -1) { + if (name.contains("/")) { continue; } highlighter->add_member_keyword_color(name, member_variable_color); @@ -355,6 +357,7 @@ void ScriptEditorQuickOpen::_notification(int p_what) { case NOTIFICATION_VISIBILITY_CHANGED: { search_box->set_right_icon(search_options->get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); } break; + case NOTIFICATION_EXIT_TREE: { disconnect("confirmed", callable_mp(this, &ScriptEditorQuickOpen::_confirmed)); } break; @@ -415,7 +418,7 @@ void ScriptEditor::_breaked(bool p_breaked, bool p_can_debug) { } void ScriptEditor::_script_created(Ref<Script> p_script) { - editor->push_item(p_script.operator->()); + EditorNode::get_singleton()->push_item(p_script.operator->()); } void ScriptEditor::_goto_script_line2(int p_line) { @@ -429,7 +432,7 @@ void ScriptEditor::_goto_script_line(REF p_script, int p_line) { Ref<Script> script = Object::cast_to<Script>(*p_script); if (script.is_valid() && (script->has_source_code() || script->get_path().is_resource_file())) { if (edit(p_script, p_line, 0)) { - editor->push_item(p_script.ptr()); + EditorNode::get_singleton()->push_item(p_script.ptr()); ScriptEditorBase *current = _get_current_editor(); if (ScriptTextEditor *script_text_editor = Object::cast_to<ScriptTextEditor>(current)) { @@ -714,7 +717,7 @@ void ScriptEditor::_open_recent_script(int p_idx) { return; } // if it's a path then it's most likely a deleted file not help - } else if (path.find("::") != -1) { + } else if (path.contains("::")) { // built-in script String res_path = path.get_slice("::", 0); if (ResourceLoader::get_resource_type(res_path) == "PackedScene") { @@ -759,7 +762,7 @@ void ScriptEditor::_close_tab(int p_idx, bool p_save, bool p_history_back) { if (p_save && file.is_valid()) { // Do not try to save internal scripts, but prompt to save in-memory // scripts which are not saved to disk yet (have empty path). - if (file->is_built_in()) { + if (!file->is_built_in()) { save_current_script(); } } @@ -929,7 +932,7 @@ void ScriptEditor::_resave_scripts(const String &p_str) { _save_text_file(text_file, text_file->get_path()); break; } else { - editor->save_resource(script); + EditorNode::get_singleton()->save_resource(script); } se->tag_saved_version(); } @@ -1090,7 +1093,7 @@ void ScriptEditor::_file_dialog_action(String p_file) { Error err; FileAccess *file = FileAccess::open(p_file, FileAccess::WRITE, &err); if (err) { - editor->show_warning(TTR("Error writing TextFile:") + "\n" + p_file, TTR("Error!")); + EditorNode::get_singleton()->show_warning(TTR("Error writing TextFile:") + "\n" + p_file, TTR("Error!")); break; } file->close(); @@ -1119,7 +1122,7 @@ void ScriptEditor::_file_dialog_action(String p_file) { Error err = _save_text_file(resource, path); if (err != OK) { - editor->show_accept(TTR("Error saving file!"), TTR("OK")); + EditorNode::get_singleton()->show_accept(TTR("Error saving file!"), TTR("OK")); return; } @@ -1129,12 +1132,12 @@ void ScriptEditor::_file_dialog_action(String p_file) { } break; case THEME_SAVE_AS: { if (!EditorSettings::get_singleton()->save_text_editor_theme_as(p_file)) { - editor->show_warning(TTR("Error while saving theme."), TTR("Error Saving")); + EditorNode::get_singleton()->show_warning(TTR("Error while saving theme."), TTR("Error Saving")); } } break; case THEME_IMPORT: { if (!EditorSettings::get_singleton()->import_text_editor_theme(p_file)) { - editor->show_warning(TTR("Error importing theme."), TTR("Error Importing")); + EditorNode::get_singleton()->show_warning(TTR("Error importing theme."), TTR("Error Importing")); } } break; } @@ -1240,7 +1243,7 @@ void ScriptEditor::_menu_option(int p_option) { Ref<Script> scr = ResourceLoader::load(path); if (!scr.is_valid()) { - editor->show_warning(TTR("Could not load file at:") + "\n\n" + path, TTR("Error!")); + EditorNode::get_singleton()->show_warning(TTR("Could not load file at:") + "\n\n" + path, TTR("Error!")); file_dialog_option = -1; return; } @@ -1252,7 +1255,7 @@ void ScriptEditor::_menu_option(int p_option) { Error error; Ref<TextFile> text_file = _load_text_file(path, &error); if (error != OK) { - editor->show_warning(TTR("Could not load file at:") + "\n\n" + path, TTR("Error!")); + EditorNode::get_singleton()->show_warning(TTR("Could not load file at:") + "\n\n" + path, TTR("Error!")); } if (text_file.is_valid()) { @@ -1279,7 +1282,7 @@ void ScriptEditor::_menu_option(int p_option) { help_search_dialog->popup_dialog(); } break; case SEARCH_WEBSITE: { - OS::get_singleton()->shell_open("https://docs.godotengine.org/"); + OS::get_singleton()->shell_open(VERSION_DOCS_URL "/"); } break; case WINDOW_NEXT: { _history_forward(); @@ -1354,8 +1357,8 @@ void ScriptEditor::_menu_option(int p_option) { } } - editor->push_item(resource.ptr()); - editor->save_resource_as(resource); + EditorNode::get_singleton()->push_item(resource.ptr()); + EditorNode::get_singleton()->save_resource_as(resource); if (script != nullptr) { const Vector<DocData::ClassDoc> &documentations = script->get_documentation(); @@ -1521,7 +1524,7 @@ void ScriptEditor::_theme_option(int p_option) { if (EditorSettings::get_singleton()->is_default_text_editor_theme()) { ScriptEditor::_show_save_theme_as_dialog(); } else if (!EditorSettings::get_singleton()->save_text_editor_theme()) { - editor->show_warning(TTR("Error while saving theme"), TTR("Error saving")); + EditorNode::get_singleton()->show_warning(TTR("Error while saving theme"), TTR("Error saving")); } } break; case THEME_SAVE_AS: { @@ -1593,17 +1596,18 @@ void ScriptEditor::_tab_changed(int p_which) { void ScriptEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { - editor->connect("stop_pressed", callable_mp(this, &ScriptEditor::_editor_stop)); - editor->connect("script_add_function_request", callable_mp(this, &ScriptEditor::_add_callback)); - editor->connect("resource_saved", callable_mp(this, &ScriptEditor::_res_saved_callback)); - editor->connect("scene_saved", callable_mp(this, &ScriptEditor::_scene_saved_callback)); + EditorNode::get_singleton()->connect("stop_pressed", callable_mp(this, &ScriptEditor::_editor_stop)); + EditorNode::get_singleton()->connect("script_add_function_request", callable_mp(this, &ScriptEditor::_add_callback)); + EditorNode::get_singleton()->connect("resource_saved", callable_mp(this, &ScriptEditor::_res_saved_callback)); + EditorNode::get_singleton()->connect("scene_saved", callable_mp(this, &ScriptEditor::_scene_saved_callback)); FileSystemDock::get_singleton()->connect("files_moved", callable_mp(this, &ScriptEditor::_files_moved)); FileSystemDock::get_singleton()->connect("file_removed", callable_mp(this, &ScriptEditor::_file_removed)); script_list->connect("item_selected", callable_mp(this, &ScriptEditor::_script_selected)); members_overview->connect("item_selected", callable_mp(this, &ScriptEditor::_members_overview_selected)); help_overview->connect("item_selected", callable_mp(this, &ScriptEditor::_help_overview_selected)); - script_split->connect("dragged", callable_mp(this, &ScriptEditor::_script_split_dragged)); + script_split->connect("dragged", callable_mp(this, &ScriptEditor::_split_dragged)); + list_split->connect("dragged", callable_mp(this, &ScriptEditor::_split_dragged)); EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &ScriptEditor::_editor_settings_changed)); EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &ScriptEditor::_filesystem_changed)); @@ -1629,7 +1633,7 @@ void ScriptEditor::_notification(int p_what) { filter_scripts->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); filter_methods->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); - filename->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("normal"), SNAME("LineEdit"))); + filename->add_theme_style_override("normal", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("normal"), SNAME("LineEdit"))); recent_scripts->set_as_minsize(); @@ -1642,11 +1646,11 @@ void ScriptEditor::_notification(int p_what) { case NOTIFICATION_READY: { get_tree()->connect("tree_changed", callable_mp(this, &ScriptEditor::_tree_changed)); InspectorDock::get_singleton()->connect("request_help", callable_mp(this, &ScriptEditor::_help_class_open)); - editor->connect("request_help_search", callable_mp(this, &ScriptEditor::_help_search)); + EditorNode::get_singleton()->connect("request_help_search", callable_mp(this, &ScriptEditor::_help_search)); } break; case NOTIFICATION_EXIT_TREE: { - editor->disconnect("stop_pressed", callable_mp(this, &ScriptEditor::_editor_stop)); + EditorNode::get_singleton()->disconnect("stop_pressed", callable_mp(this, &ScriptEditor::_editor_stop)); } break; case NOTIFICATION_WM_WINDOW_FOCUS_IN: { @@ -1659,15 +1663,12 @@ void ScriptEditor::_notification(int p_what) { find_in_files_button->show(); } else { if (find_in_files->is_visible_in_tree()) { - editor->hide_bottom_panel(); + EditorNode::get_singleton()->hide_bottom_panel(); } find_in_files_button->hide(); } } break; - - default: - break; } } @@ -2264,7 +2265,7 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra if (use_external_editor && (EditorDebuggerNode::get_singleton()->get_dump_stack_script() != p_resource || EditorDebuggerNode::get_singleton()->get_debug_with_external_editor()) && p_resource->get_path().is_resource_file() && - p_resource->get_class_name() != StringName("VisualScript")) { + !p_resource->is_class("VisualScript")) { String path = EditorSettings::get_singleton()->get("text_editor/external/exec_path"); String flags = EditorSettings::get_singleton()->get("text_editor/external/exec_flags"); @@ -2292,7 +2293,7 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra } else if (flags[i] == '\0' || (!inside_quotes && flags[i] == ' ')) { String arg = flags.substr(from, num_chars); - if (arg.find("{file}") != -1) { + if (arg.contains("{file}")) { has_file_flag = true; } @@ -2363,7 +2364,7 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra se->set_edited_resource(p_resource); - if (p_resource->get_class_name() != StringName("VisualScript")) { + if (!p_resource->is_class("VisualScript")) { bool highlighter_set = false; for (int i = 0; i < syntax_highlighters.size(); i++) { Ref<EditorSyntaxHighlighter> highlighter = syntax_highlighters[i]->_create(); @@ -2478,10 +2479,10 @@ void ScriptEditor::save_current_script() { if (!scene_path.is_empty()) { Vector<String> scene_to_save; scene_to_save.push_back(scene_path); - editor->save_scene_list(scene_to_save); + EditorNode::get_singleton()->save_scene_list(scene_to_save); } } else { - editor->save_resource(resource); + EditorNode::get_singleton()->save_resource(resource); } if (script != nullptr) { @@ -2545,7 +2546,7 @@ void ScriptEditor::save_all_scripts() { } } - editor->save_resource(edited_res); //external script, save it + EditorNode::get_singleton()->save_resource(edited_res); //external script, save it if (script != nullptr) { const Vector<DocData::ClassDoc> &documentations = script->get_documentation(); @@ -2565,7 +2566,7 @@ void ScriptEditor::save_all_scripts() { } if (!scenes_to_save.is_empty()) { - editor->save_scene_list(scenes_to_save); + EditorNode::get_singleton()->save_scene_list(scenes_to_save); } _update_script_names(); @@ -2600,7 +2601,7 @@ RES ScriptEditor::open_file(const String &p_file) { if (extensions.find(p_file.get_extension())) { Ref<Script> scr = ResourceLoader::load(p_file); if (!scr.is_valid()) { - editor->show_warning(TTR("Could not load file at:") + "\n\n" + p_file, TTR("Error!")); + EditorNode::get_singleton()->show_warning(TTR("Could not load file at:") + "\n\n" + p_file, TTR("Error!")); return RES(); } @@ -2611,7 +2612,7 @@ RES ScriptEditor::open_file(const String &p_file) { Error error; Ref<TextFile> text_file = _load_text_file(p_file, &error); if (error != OK) { - editor->show_warning(TTR("Could not load file at:") + "\n\n" + p_file, TTR("Error!")); + EditorNode::get_singleton()->show_warning(TTR("Could not load file at:") + "\n\n" + p_file, TTR("Error!")); return RES(); } @@ -2638,7 +2639,7 @@ void ScriptEditor::_add_callback(Object *p_obj, const String &p_function, const Ref<Script> script = p_obj->get_script(); ERR_FAIL_COND(!script.is_valid()); - editor->push_item(script.ptr()); + EditorNode::get_singleton()->push_item(script.ptr()); for (int i = 0; i < tab_container->get_child_count(); i++) { ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i)); @@ -2683,7 +2684,7 @@ void ScriptEditor::_save_layout() { return; } - editor->save_layout(); + EditorNode::get_singleton()->save_layout(); } void ScriptEditor::_editor_settings_changed() { @@ -2809,7 +2810,7 @@ void ScriptEditor::_tree_changed() { call_deferred(SNAME("_update_script_connections")); } -void ScriptEditor::_script_split_dragged(float) { +void ScriptEditor::_split_dragged(float) { _save_layout(); } @@ -3199,8 +3200,12 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) { tab_container->get_child(i)->set_meta("__editor_pass", Variant()); } - if (p_layout->has_section_key("ScriptEditor", "split_offset")) { - script_split->set_split_offset(p_layout->get_value("ScriptEditor", "split_offset")); + if (p_layout->has_section_key("ScriptEditor", "script_split_offset")) { + script_split->set_split_offset(p_layout->get_value("ScriptEditor", "script_split_offset")); + } + + if (p_layout->has_section_key("ScriptEditor", "list_split_offset")) { + list_split->set_split_offset(p_layout->get_value("ScriptEditor", "list_split_offset")); } // Remove any deleted editors that have been removed between launches. @@ -3253,7 +3258,8 @@ void ScriptEditor::get_window_layout(Ref<ConfigFile> p_layout) { p_layout->set_value("ScriptEditor", "open_scripts", scripts); p_layout->set_value("ScriptEditor", "open_help", helps); - p_layout->set_value("ScriptEditor", "split_offset", script_split->get_split_offset()); + p_layout->set_value("ScriptEditor", "script_split_offset", script_split->get_split_offset()); + p_layout->set_value("ScriptEditor", "list_split_offset", list_split->get_split_offset()); // Save the cache. script_editor_cache->save(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("script_editor_cache.cfg")); @@ -3486,7 +3492,7 @@ void ScriptEditor::_open_script_request(const String &p_path) { void ScriptEditor::register_syntax_highlighter(const Ref<EditorSyntaxHighlighter> &p_syntax_highlighter) { ERR_FAIL_COND(p_syntax_highlighter.is_null()); - if (syntax_highlighters.find(p_syntax_highlighter) == -1) { + if (!syntax_highlighters.has(p_syntax_highlighter)) { syntax_highlighters.push_back(p_syntax_highlighter); } } @@ -3533,7 +3539,7 @@ void ScriptEditor::_on_find_in_files_result_selected(String fpath, int line_numb shader_editor->get_shader_editor()->goto_line_selection(line_number - 1, begin, end); return; } else if (fpath.get_extension() == "tscn") { - editor->load_scene(fpath); + EditorNode::get_singleton()->load_scene(fpath); return; } else { Ref<Script> script = res; @@ -3575,7 +3581,7 @@ void ScriptEditor::_start_find_in_files(bool with_replace) { find_in_files->set_replace_text(find_in_files_dialog->get_replace_text()); find_in_files->start_search(); - editor->make_bottom_panel_item_visible(find_in_files); + EditorNode::get_singleton()->make_bottom_panel_item_visible(find_in_files); } void ScriptEditor::_on_find_in_files_modified_files(PackedStringArray paths) { @@ -3623,7 +3629,7 @@ void ScriptEditor::_bind_methods() { ADD_SIGNAL(MethodInfo("script_close", PropertyInfo(Variant::OBJECT, "script", PROPERTY_HINT_RESOURCE_TYPE, "Script"))); } -ScriptEditor::ScriptEditor(EditorNode *p_editor) { +ScriptEditor::ScriptEditor() { current_theme = ""; script_editor_cache.instantiate(); @@ -3636,7 +3642,6 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { auto_reload_running_scripts = true; members_overview_enabled = EditorSettings::get_singleton()->get("text_editor/script_list/show_members_overview"); help_overview_enabled = EditorSettings::get_singleton()->get("text_editor/help/show_help_index"); - editor = p_editor; VBoxContainer *main_container = memnew(VBoxContainer); add_child(main_container); @@ -3926,7 +3931,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { find_in_files_dialog->connect(FindInFilesDialog::SIGNAL_REPLACE_REQUESTED, callable_mp(this, &ScriptEditor::_start_find_in_files), varray(true)); add_child(find_in_files_dialog); find_in_files = memnew(FindInFilesPanel); - find_in_files_button = editor->add_bottom_panel_item(TTR("Search Results"), find_in_files); + find_in_files_button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Search Results"), find_in_files); find_in_files->set_custom_minimum_size(Size2(0, 200) * EDSCALE); find_in_files->connect(FindInFilesPanel::SIGNAL_RESULT_SELECTED, callable_mp(this, &ScriptEditor::_on_find_in_files_result_selected)); find_in_files->connect(FindInFilesPanel::SIGNAL_FILES_MODIFIED, callable_mp(this, &ScriptEditor::_on_find_in_files_modified_files)); @@ -3942,8 +3947,8 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { ScriptServer::edit_request_func = _open_script_request; - add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"))); - tab_container->add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditor"), SNAME("EditorStyles"))); + add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"))); + tab_container->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditor"), SNAME("EditorStyles"))); } ScriptEditor::~ScriptEditor() { @@ -4027,10 +4032,9 @@ void ScriptEditorPlugin::edited_scene_changed() { script_editor->edited_scene_changed(); } -ScriptEditorPlugin::ScriptEditorPlugin(EditorNode *p_node) { - editor = p_node; - script_editor = memnew(ScriptEditor(p_node)); - editor->get_main_control()->add_child(script_editor); +ScriptEditorPlugin::ScriptEditorPlugin() { + script_editor = memnew(ScriptEditor); + EditorNode::get_singleton()->get_main_control()->add_child(script_editor); script_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); script_editor->hide(); diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index 67a6a9da02..a99e269d46 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -47,6 +47,8 @@ #include "scene/main/timer.h" #include "scene/resources/text_file.h" +class EditorFileDialog; + class EditorSyntaxHighlighter : public SyntaxHighlighter { GDCLASS(EditorSyntaxHighlighter, SyntaxHighlighter) @@ -186,7 +188,6 @@ class FindInFilesPanel; class ScriptEditor : public PanelContainer { GDCLASS(ScriptEditor, PanelContainer); - EditorNode *editor; enum { FILE_NEW, FILE_NEW_TEXTFILE, @@ -418,7 +419,7 @@ class ScriptEditor : public PanelContainer { void _tree_changed(); - void _script_split_dragged(float); + void _split_dragged(float); Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; @@ -520,7 +521,7 @@ public: static void register_create_script_editor_function(CreateScriptEditorFunc p_func); - ScriptEditor(EditorNode *p_editor); + ScriptEditor(); ~ScriptEditor(); }; @@ -528,7 +529,6 @@ class ScriptEditorPlugin : public EditorPlugin { GDCLASS(ScriptEditorPlugin, EditorPlugin); ScriptEditor *script_editor; - EditorNode *editor; public: virtual String get_name() const override { return "Script"; } @@ -551,7 +551,7 @@ public: virtual void edited_scene_changed() override; - ScriptEditorPlugin(EditorNode *p_node); + ScriptEditorPlugin(); ~ScriptEditorPlugin(); }; diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 09af73520b..b87f2995ed 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -30,6 +30,7 @@ #include "script_text_editor.h" +#include "core/config/project_settings.h" #include "core/math/expression.h" #include "core/os/keyboard.h" #include "editor/debugger/editor_debugger_node.h" @@ -398,10 +399,10 @@ Ref<Texture2D> ScriptTextEditor::get_theme_icon() { icon_name += "Internal"; } - if (get_parent_control()->has_theme_icon(icon_name, "EditorIcons")) { - return get_parent_control()->get_theme_icon(icon_name, "EditorIcons"); - } else if (get_parent_control()->has_theme_icon(script->get_class(), "EditorIcons")) { - return get_parent_control()->get_theme_icon(script->get_class(), "EditorIcons"); + if (get_parent_control()->has_theme_icon(icon_name, SNAME("EditorIcons"))) { + return get_parent_control()->get_theme_icon(icon_name, SNAME("EditorIcons")); + } else if (get_parent_control()->has_theme_icon(script->get_class(), SNAME("EditorIcons"))) { + return get_parent_control()->get_theme_icon(script->get_class(), SNAME("EditorIcons")); } } @@ -930,21 +931,22 @@ void ScriptTextEditor::_update_connected_methods() { continue; } - if (methods_found.has(connection.callable.get_method())) { + const StringName method = connection.callable.get_method(); + if (methods_found.has(method)) { continue; } - if (!ClassDB::has_method(script->get_instance_base_type(), connection.callable.get_method())) { + if (!ClassDB::has_method(script->get_instance_base_type(), method)) { int line = -1; for (int j = 0; j < functions.size(); j++) { String name = functions[j].get_slice(":", 0); - if (name == connection.callable.get_method()) { + if (name == method) { line = functions[j].get_slice(":", 1).to_int() - 1; - text_edit->set_line_gutter_metadata(line, connection_gutter, connection.callable.get_method()); + text_edit->set_line_gutter_metadata(line, connection_gutter, method); text_edit->set_line_gutter_icon(line, connection_gutter, get_parent_control()->get_theme_icon(SNAME("Slot"), SNAME("EditorIcons"))); text_edit->set_line_gutter_clickable(line, connection_gutter, true); - methods_found.insert(connection.callable.get_method()); + methods_found.insert(method); break; } } @@ -957,7 +959,7 @@ void ScriptTextEditor::_update_connected_methods() { bool found_inherited_function = false; Ref<Script> inherited_script = script->get_base_script(); while (!inherited_script.is_null()) { - if (inherited_script->has_method(connection.callable.get_method())) { + if (inherited_script->has_method(method)) { found_inherited_function = true; break; } @@ -1295,7 +1297,7 @@ void ScriptTextEditor::_edit_option_toggle_inline_comment() { script->get_language()->get_comment_delimiters(&comment_delimiters); for (const String &script_delimiter : comment_delimiters) { - if (script_delimiter.find(" ") == -1) { + if (!script_delimiter.contains(" ")) { delimiter = script_delimiter; break; } @@ -1341,8 +1343,6 @@ void ScriptTextEditor::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: { code_editor->get_text_editor()->set_gutter_width(connection_gutter, code_editor->get_text_editor()->get_line_height()); } break; - default: - break; } } @@ -1373,7 +1373,7 @@ void ScriptTextEditor::reload(bool p_soft) { return; } scr->set_source_code(te->get_text()); - bool soft = p_soft || scr->get_instance_base_type() == "EditorPlugin"; //always soft-reload editor plugins + bool soft = p_soft || scr->get_instance_base_type() == "EditorPlugin"; // Always soft-reload editor plugins. scr->get_language()->reload_tool_script(scr, soft); } diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 4bbeb33406..cea1a0e808 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -464,14 +464,6 @@ void ShaderEditor::_bind_methods() { } void ShaderEditor::ensure_select_current() { - /* - if (tab_container->get_child_count() && tab_container->get_current_tab()>=0) { - ShaderTextEditor *ste = Object::cast_to<ShaderTextEditor>(tab_container->get_child(tab_container->get_current_tab())); - if (!ste) - return; - Ref<Shader> shader = ste->get_edited_shader(); - get_scene()->get_root_node()->call("_resource_selected",shader); - }*/ } void ShaderEditor::goto_line_selection(int p_line, int p_begin, int p_end) { @@ -691,7 +683,7 @@ void ShaderEditor::_make_context_menu(bool p_selection, Vector2 p_position) { context_menu->popup(); } -ShaderEditor::ShaderEditor(EditorNode *p_node) { +ShaderEditor::ShaderEditor() { GLOBAL_DEF("debug/shader_language/warnings/enable", true); GLOBAL_DEF("debug/shader_language/warnings/treat_warnings_as_errors", false); for (int i = 0; i < (int)ShaderWarning::WARNING_MAX; i++) { @@ -780,7 +772,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) { help_menu = memnew(MenuButton); help_menu->set_text(TTR("Help")); help_menu->set_switch_on_hover(true); - help_menu->get_popup()->add_icon_item(p_node->get_gui_base()->get_theme_icon(SNAME("Instance"), SNAME("EditorIcons")), TTR("Online Docs"), HELP_DOCS); + help_menu->get_popup()->add_icon_item(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Instance"), SNAME("EditorIcons")), TTR("Online Docs"), HELP_DOCS); help_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option)); add_child(main_container); @@ -789,7 +781,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) { hbc->add_child(edit_menu); hbc->add_child(goto_menu); hbc->add_child(help_menu); - hbc->add_theme_style_override("panel", p_node->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"))); + hbc->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"))); VSplitContainer *editor_box = memnew(VSplitContainer); main_container->add_child(editor_box); @@ -849,12 +841,12 @@ bool ShaderEditorPlugin::handles(Object *p_object) const { void ShaderEditorPlugin::make_visible(bool p_visible) { if (p_visible) { button->show(); - editor->make_bottom_panel_item_visible(shader_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(shader_editor); } else { button->hide(); if (shader_editor->is_visible_in_tree()) { - editor->hide_bottom_panel(); + EditorNode::get_singleton()->hide_bottom_panel(); } shader_editor->apply_shaders(); } @@ -872,12 +864,11 @@ void ShaderEditorPlugin::apply_changes() { shader_editor->apply_shaders(); } -ShaderEditorPlugin::ShaderEditorPlugin(EditorNode *p_node) { - editor = p_node; - shader_editor = memnew(ShaderEditor(p_node)); +ShaderEditorPlugin::ShaderEditorPlugin() { + shader_editor = memnew(ShaderEditor); shader_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE); - button = editor->add_bottom_panel_item(TTR("Shader"), shader_editor); + button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Shader"), shader_editor); button->hide(); _2d = false; diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h index 9196ded921..b1391e4f66 100644 --- a/editor/plugins/shader_editor_plugin.h +++ b/editor/plugins/shader_editor_plugin.h @@ -154,7 +154,7 @@ public: virtual Size2 get_minimum_size() const override { return Size2(0, 200); } void save_external_data(const String &p_str = ""); - ShaderEditor(EditorNode *p_node); + ShaderEditor(); }; class ShaderEditorPlugin : public EditorPlugin { @@ -162,7 +162,6 @@ class ShaderEditorPlugin : public EditorPlugin { bool _2d; ShaderEditor *shader_editor; - EditorNode *editor; Button *button; public: @@ -178,7 +177,7 @@ public: virtual void save_external_data() override; virtual void apply_changes() override; - ShaderEditorPlugin(EditorNode *p_node); + ShaderEditorPlugin(); ~ShaderEditorPlugin(); }; diff --git a/editor/plugins/shader_file_editor_plugin.cpp b/editor/plugins/shader_file_editor_plugin.cpp index 8250164885..4458555de2 100644 --- a/editor/plugins/shader_file_editor_plugin.cpp +++ b/editor/plugins/shader_file_editor_plugin.cpp @@ -200,10 +200,12 @@ void ShaderFileEditor::_update_options() { } void ShaderFileEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_WM_WINDOW_FOCUS_IN) { - if (is_visible_in_tree() && shader_file.is_valid()) { - _update_options(); - } + switch (p_what) { + case NOTIFICATION_WM_WINDOW_FOCUS_IN: { + if (is_visible_in_tree() && shader_file.is_valid()) { + _update_options(); + } + } break; } } @@ -245,7 +247,7 @@ void ShaderFileEditor::_shader_changed() { ShaderFileEditor *ShaderFileEditor::singleton = nullptr; -ShaderFileEditor::ShaderFileEditor(EditorNode *p_node) { +ShaderFileEditor::ShaderFileEditor() { singleton = this; HSplitContainer *main_hs = memnew(HSplitContainer); @@ -301,22 +303,21 @@ bool ShaderFileEditorPlugin::handles(Object *p_object) const { void ShaderFileEditorPlugin::make_visible(bool p_visible) { if (p_visible) { button->show(); - editor->make_bottom_panel_item_visible(shader_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(shader_editor); } else { button->hide(); if (shader_editor->is_visible_in_tree()) { - editor->hide_bottom_panel(); + EditorNode::get_singleton()->hide_bottom_panel(); } } } -ShaderFileEditorPlugin::ShaderFileEditorPlugin(EditorNode *p_node) { - editor = p_node; - shader_editor = memnew(ShaderFileEditor(p_node)); +ShaderFileEditorPlugin::ShaderFileEditorPlugin() { + shader_editor = memnew(ShaderFileEditor); shader_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE); - button = editor->add_bottom_panel_item(TTR("ShaderFile"), shader_editor); + button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("ShaderFile"), shader_editor); button->hide(); } diff --git a/editor/plugins/shader_file_editor_plugin.h b/editor/plugins/shader_file_editor_plugin.h index feec0c206e..5ee2d01dbf 100644 --- a/editor/plugins/shader_file_editor_plugin.h +++ b/editor/plugins/shader_file_editor_plugin.h @@ -41,6 +41,8 @@ #include "scene/main/timer.h" #include "servers/rendering/rendering_device_binds.h" +class ItemList; + class ShaderFileEditor : public PanelContainer { GDCLASS(ShaderFileEditor, PanelContainer); @@ -66,14 +68,13 @@ public: static ShaderFileEditor *singleton; void edit(const Ref<RDShaderFile> &p_shader); - ShaderFileEditor(EditorNode *p_node); + ShaderFileEditor(); }; class ShaderFileEditorPlugin : public EditorPlugin { GDCLASS(ShaderFileEditorPlugin, EditorPlugin); ShaderFileEditor *shader_editor; - EditorNode *editor; Button *button; public: @@ -85,7 +86,7 @@ public: ShaderFileEditor *get_shader_editor() const { return shader_editor; } - ShaderFileEditorPlugin(EditorNode *p_node); + ShaderFileEditorPlugin(); ~ShaderFileEditorPlugin(); }; diff --git a/editor/plugins/skeleton_2d_editor_plugin.cpp b/editor/plugins/skeleton_2d_editor_plugin.cpp index b6d465ea81..5a1505c232 100644 --- a/editor/plugins/skeleton_2d_editor_plugin.cpp +++ b/editor/plugins/skeleton_2d_editor_plugin.cpp @@ -31,6 +31,7 @@ #include "skeleton_2d_editor_plugin.h" #include "canvas_item_editor_plugin.h" +#include "editor/editor_node.h" #include "scene/2d/mesh_instance_2d.h" #include "scene/gui/box_container.h" #include "thirdparty/misc/clipper.hpp" @@ -127,10 +128,9 @@ void Skeleton2DEditorPlugin::make_visible(bool p_visible) { } } -Skeleton2DEditorPlugin::Skeleton2DEditorPlugin(EditorNode *p_node) { - editor = p_node; +Skeleton2DEditorPlugin::Skeleton2DEditorPlugin() { sprite_editor = memnew(Skeleton2DEditor); - editor->get_main_control()->add_child(sprite_editor); + EditorNode::get_singleton()->get_main_control()->add_child(sprite_editor); make_visible(false); //sprite_editor->options->hide(); diff --git a/editor/plugins/skeleton_2d_editor_plugin.h b/editor/plugins/skeleton_2d_editor_plugin.h index 2fa7f02622..004dac7b05 100644 --- a/editor/plugins/skeleton_2d_editor_plugin.h +++ b/editor/plugins/skeleton_2d_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef SKELETON_2D_EDITOR_PLUGIN_H #define SKELETON_2D_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/2d/skeleton_2d.h" #include "scene/gui/spin_box.h" @@ -67,7 +66,6 @@ class Skeleton2DEditorPlugin : public EditorPlugin { GDCLASS(Skeleton2DEditorPlugin, EditorPlugin); Skeleton2DEditor *sprite_editor; - EditorNode *editor; public: virtual String get_name() const override { return "Skeleton2D"; } @@ -76,7 +74,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - Skeleton2DEditorPlugin(EditorNode *p_node); + Skeleton2DEditorPlugin(); ~Skeleton2DEditorPlugin(); }; diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index 169ce29438..282ee9a5b7 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -32,6 +32,7 @@ #include "core/io/resource_saver.h" #include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_properties.h" #include "editor/editor_scale.h" #include "editor/plugins/animation_player_editor_plugin.h" @@ -102,8 +103,7 @@ void BoneTransformEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { create_editors(); - break; - } + } break; } } @@ -383,7 +383,7 @@ void Skeleton3DEditor::create_physical_skeleton() { if (!bones_infos[parent].physical_bone) { bones_infos.write[parent].physical_bone = create_physical_bone(parent, bone_id, bones_infos); - ur->create_action(TTR("Create physical bones")); + ur->create_action(TTR("Create physical bones"), UndoRedo::MERGE_ALL); ur->add_do_method(skeleton, "add_child", bones_infos[parent].physical_bone); ur->add_do_reference(bones_infos[parent].physical_bone); ur->add_undo_method(skeleton, "remove_child", bones_infos[parent].physical_bone); @@ -786,8 +786,7 @@ void Skeleton3DEditor::edit_mode_toggled(const bool pressed) { _update_gizmo_visible(); } -Skeleton3DEditor::Skeleton3DEditor(EditorInspectorPluginSkeleton *e_plugin, EditorNode *p_editor, Skeleton3D *p_skeleton) : - editor(p_editor), +Skeleton3DEditor::Skeleton3DEditor(EditorInspectorPluginSkeleton *e_plugin, Skeleton3D *p_skeleton) : editor_plugin(e_plugin), skeleton(p_skeleton) { singleton = this; @@ -821,7 +820,7 @@ void fragment() { } )"); handle_material->set_shader(handle_shader); - Ref<Texture2D> handle = editor->get_gui_base()->get_theme_icon("EditorBoneHandle", "EditorIcons"); + Ref<Texture2D> handle = EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("EditorBoneHandle"), SNAME("EditorIcons")); handle_material->set_shader_param("point_size", handle->get_width()); handle_material->set_shader_param("texture_albedo", handle); @@ -1012,15 +1011,12 @@ void EditorInspectorPluginSkeleton::parse_begin(Object *p_object) { Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(p_object); ERR_FAIL_COND(!skeleton); - skel_editor = memnew(Skeleton3DEditor(this, editor, skeleton)); + skel_editor = memnew(Skeleton3DEditor(this, skeleton)); add_custom_control(skel_editor); } -Skeleton3DEditorPlugin::Skeleton3DEditorPlugin(EditorNode *p_node) { - editor = p_node; - +Skeleton3DEditorPlugin::Skeleton3DEditorPlugin() { skeleton_plugin = memnew(EditorInspectorPluginSkeleton); - skeleton_plugin->editor = editor; EditorInspector::add_inspector_plugin(skeleton_plugin); diff --git a/editor/plugins/skeleton_3d_editor_plugin.h b/editor/plugins/skeleton_3d_editor_plugin.h index d0d81d6498..2dbb552428 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.h +++ b/editor/plugins/skeleton_3d_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef SKELETON_3D_EDITOR_PLUGIN_H #define SKELETON_3D_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/editor_properties.h" #include "node_3d_editor_plugin.h" @@ -109,7 +108,6 @@ class Skeleton3DEditor : public VBoxContainer { Transform3D relative_rest; // Relative to skeleton node. }; - EditorNode *editor; EditorInspectorPluginSkeleton *editor_plugin; Skeleton3D *skeleton; @@ -213,7 +211,7 @@ public: Quaternion get_bone_original_rotation() const { return bone_original_rotation; }; Vector3 get_bone_original_scale() const { return bone_original_scale; }; - Skeleton3DEditor(EditorInspectorPluginSkeleton *e_plugin, EditorNode *p_editor, Skeleton3D *skeleton); + Skeleton3DEditor(EditorInspectorPluginSkeleton *e_plugin, Skeleton3D *skeleton); ~Skeleton3DEditor(); }; @@ -223,7 +221,6 @@ class EditorInspectorPluginSkeleton : public EditorInspectorPlugin { friend class Skeleton3DEditorPlugin; Skeleton3DEditor *skel_editor; - EditorNode *editor; public: virtual bool can_handle(Object *p_object) override; @@ -234,7 +231,6 @@ class Skeleton3DEditorPlugin : public EditorPlugin { GDCLASS(Skeleton3DEditorPlugin, EditorPlugin); EditorInspectorPluginSkeleton *skeleton_plugin; - EditorNode *editor; public: virtual EditorPlugin::AfterGUIInput forward_spatial_gui_input(Camera3D *p_camera, const Ref<InputEvent> &p_event) override; @@ -244,7 +240,7 @@ public: virtual String get_name() const override { return "Skeleton3D"; } - Skeleton3DEditorPlugin(EditorNode *p_node); + Skeleton3DEditorPlugin(); }; class Skeleton3DGizmoPlugin : public EditorNode3DGizmoPlugin { diff --git a/editor/plugins/skeleton_ik_3d_editor_plugin.cpp b/editor/plugins/skeleton_ik_3d_editor_plugin.cpp index ca8786a385..7dc34a0874 100644 --- a/editor/plugins/skeleton_ik_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_ik_3d_editor_plugin.cpp @@ -30,6 +30,7 @@ #include "skeleton_ik_3d_editor_plugin.h" +#include "editor/editor_node.h" #include "scene/3d/skeleton_ik_3d.h" void SkeletonIK3DEditorPlugin::_play() { @@ -80,10 +81,9 @@ void SkeletonIK3DEditorPlugin::make_visible(bool p_visible) { void SkeletonIK3DEditorPlugin::_bind_methods() { } -SkeletonIK3DEditorPlugin::SkeletonIK3DEditorPlugin(EditorNode *p_node) { - editor = p_node; +SkeletonIK3DEditorPlugin::SkeletonIK3DEditorPlugin() { play_btn = memnew(Button); - play_btn->set_icon(editor->get_gui_base()->get_theme_icon(SNAME("Play"), SNAME("EditorIcons"))); + play_btn->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Play"), SNAME("EditorIcons"))); play_btn->set_text(TTR("Play IK")); play_btn->set_toggle_mode(true); play_btn->hide(); diff --git a/editor/plugins/skeleton_ik_3d_editor_plugin.h b/editor/plugins/skeleton_ik_3d_editor_plugin.h index edc3f6dda4..f71e788232 100644 --- a/editor/plugins/skeleton_ik_3d_editor_plugin.h +++ b/editor/plugins/skeleton_ik_3d_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef SKELETON_IK_3D_EDITOR_PLUGIN_H #define SKELETON_IK_3D_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" class SkeletonIK3D; @@ -42,7 +41,6 @@ class SkeletonIK3DEditorPlugin : public EditorPlugin { SkeletonIK3D *skeleton_ik; Button *play_btn; - EditorNode *editor; void _play(); @@ -56,7 +54,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - SkeletonIK3DEditorPlugin(EditorNode *p_node); + SkeletonIK3DEditorPlugin(); ~SkeletonIK3DEditorPlugin(); }; diff --git a/editor/plugins/sprite_2d_editor_plugin.cpp b/editor/plugins/sprite_2d_editor_plugin.cpp index 85ff20dd23..3489ac2c1e 100644 --- a/editor/plugins/sprite_2d_editor_plugin.cpp +++ b/editor/plugins/sprite_2d_editor_plugin.cpp @@ -32,7 +32,9 @@ #include "canvas_item_editor_plugin.h" #include "core/math/geometry_2d.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" +#include "editor/scene_tree_dock.h" #include "scene/2d/collision_polygon_2d.h" #include "scene/2d/light_occluder_2d.h" #include "scene/2d/mesh_instance_2d.h" @@ -583,10 +585,9 @@ void Sprite2DEditorPlugin::make_visible(bool p_visible) { } } -Sprite2DEditorPlugin::Sprite2DEditorPlugin(EditorNode *p_node) { - editor = p_node; +Sprite2DEditorPlugin::Sprite2DEditorPlugin() { sprite_editor = memnew(Sprite2DEditor); - editor->get_main_control()->add_child(sprite_editor); + EditorNode::get_singleton()->get_main_control()->add_child(sprite_editor); make_visible(false); //sprite_editor->options->hide(); diff --git a/editor/plugins/sprite_2d_editor_plugin.h b/editor/plugins/sprite_2d_editor_plugin.h index c93ad1610f..3e4cc17cdd 100644 --- a/editor/plugins/sprite_2d_editor_plugin.h +++ b/editor/plugins/sprite_2d_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef SPRITE_EDITOR_PLUGIN_H #define SPRITE_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/2d/sprite_2d.h" #include "scene/gui/spin_box.h" @@ -99,7 +98,6 @@ class Sprite2DEditorPlugin : public EditorPlugin { GDCLASS(Sprite2DEditorPlugin, EditorPlugin); Sprite2DEditor *sprite_editor; - EditorNode *editor; public: virtual String get_name() const override { return "Sprite2D"; } @@ -108,7 +106,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - Sprite2DEditorPlugin(EditorNode *p_node); + Sprite2DEditorPlugin(); ~Sprite2DEditorPlugin(); }; diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index 014fa0e7a5..c8db16d3be 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -33,8 +33,11 @@ #include "core/config/project_settings.h" #include "core/io/resource_loader.h" #include "core/os/keyboard.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" +#include "editor/scene_tree_dock.h" #include "scene/3d/sprite_3d.h" #include "scene/gui/center_container.h" #include "scene/gui/margin_container.h" @@ -285,7 +288,7 @@ void SpriteFramesEditor::_sheet_spin_changed(double) { } void SpriteFramesEditor::_prepare_sprite_sheet(const String &p_file) { - Ref<Resource> texture = ResourceLoader::load(p_file); + Ref<Texture2D> texture = ResourceLoader::load(p_file); if (!texture.is_valid()) { EditorNode::get_singleton()->show_warning(TTR("Unable to load images")); ERR_FAIL_COND(!texture.is_valid()); @@ -1326,20 +1329,19 @@ bool SpriteFramesEditorPlugin::handles(Object *p_object) const { void SpriteFramesEditorPlugin::make_visible(bool p_visible) { if (p_visible) { button->show(); - editor->make_bottom_panel_item_visible(frames_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(frames_editor); } else { button->hide(); if (frames_editor->is_visible_in_tree()) { - editor->hide_bottom_panel(); + EditorNode::get_singleton()->hide_bottom_panel(); } } } -SpriteFramesEditorPlugin::SpriteFramesEditorPlugin(EditorNode *p_node) { - editor = p_node; +SpriteFramesEditorPlugin::SpriteFramesEditorPlugin() { frames_editor = memnew(SpriteFramesEditor); frames_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE); - button = editor->add_bottom_panel_item(TTR("SpriteFrames"), frames_editor); + button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("SpriteFrames"), frames_editor); button->hide(); } diff --git a/editor/plugins/sprite_frames_editor_plugin.h b/editor/plugins/sprite_frames_editor_plugin.h index 8767e05a94..461c8dd41a 100644 --- a/editor/plugins/sprite_frames_editor_plugin.h +++ b/editor/plugins/sprite_frames_editor_plugin.h @@ -31,16 +31,20 @@ #ifndef SPRITE_FRAMES_EDITOR_PLUGIN_H #define SPRITE_FRAMES_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/2d/animated_sprite_2d.h" +#include "scene/gui/button.h" +#include "scene/gui/check_button.h" #include "scene/gui/dialogs.h" -#include "scene/gui/file_dialog.h" +#include "scene/gui/item_list.h" #include "scene/gui/scroll_container.h" +#include "scene/gui/spin_box.h" #include "scene/gui/split_container.h" #include "scene/gui/texture_rect.h" #include "scene/gui/tree.h" +class EditorFileDialog; + class SpriteFramesEditor : public HSplitContainer { GDCLASS(SpriteFramesEditor, HSplitContainer); @@ -160,7 +164,6 @@ class SpriteFramesEditorPlugin : public EditorPlugin { GDCLASS(SpriteFramesEditorPlugin, EditorPlugin); SpriteFramesEditor *frames_editor; - EditorNode *editor; Button *button; public: @@ -170,7 +173,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - SpriteFramesEditorPlugin(EditorNode *p_node); + SpriteFramesEditorPlugin(); ~SpriteFramesEditorPlugin(); }; diff --git a/editor/plugins/style_box_editor_plugin.cpp b/editor/plugins/style_box_editor_plugin.cpp index 5d38352b22..a3cbaf527e 100644 --- a/editor/plugins/style_box_editor_plugin.cpp +++ b/editor/plugins/style_box_editor_plugin.cpp @@ -84,7 +84,7 @@ StyleBoxPreview::StyleBoxPreview() { add_margin_child(TTR("Preview:"), preview); } -StyleBoxEditorPlugin::StyleBoxEditorPlugin(EditorNode *p_node) { +StyleBoxEditorPlugin::StyleBoxEditorPlugin() { Ref<EditorInspectorPluginStyleBox> inspector_plugin; inspector_plugin.instantiate(); add_inspector_plugin(inspector_plugin); diff --git a/editor/plugins/style_box_editor_plugin.h b/editor/plugins/style_box_editor_plugin.h index 898628fd7f..bdebebbe1c 100644 --- a/editor/plugins/style_box_editor_plugin.h +++ b/editor/plugins/style_box_editor_plugin.h @@ -32,7 +32,7 @@ #define STYLE_BOX_EDITOR_PLUGIN_H #include "editor/editor_inspector.h" -#include "editor/editor_node.h" +#include "editor/editor_plugin.h" #include "scene/gui/option_button.h" #include "scene/gui/texture_rect.h" #include "scene/resources/style_box.h" @@ -69,7 +69,7 @@ class StyleBoxEditorPlugin : public EditorPlugin { public: virtual String get_name() const override { return "StyleBox"; } - StyleBoxEditorPlugin(EditorNode *p_node); + StyleBoxEditorPlugin(); }; #endif // STYLE_BOX_EDITOR_PLUGIN_H diff --git a/editor/plugins/sub_viewport_preview_editor_plugin.cpp b/editor/plugins/sub_viewport_preview_editor_plugin.cpp index 4498a1d64d..c8bb0cd56f 100644 --- a/editor/plugins/sub_viewport_preview_editor_plugin.cpp +++ b/editor/plugins/sub_viewport_preview_editor_plugin.cpp @@ -43,7 +43,7 @@ void EditorInspectorPluginSubViewportPreview::parse_begin(Object *p_object) { add_custom_control(sub_viewport_preview); } -SubViewportPreviewEditorPlugin::SubViewportPreviewEditorPlugin(EditorNode *p_node) { +SubViewportPreviewEditorPlugin::SubViewportPreviewEditorPlugin() { Ref<EditorInspectorPluginSubViewportPreview> plugin; plugin.instantiate(); add_inspector_plugin(plugin); diff --git a/editor/plugins/sub_viewport_preview_editor_plugin.h b/editor/plugins/sub_viewport_preview_editor_plugin.h index 7016910ebd..269553ffb1 100644 --- a/editor/plugins/sub_viewport_preview_editor_plugin.h +++ b/editor/plugins/sub_viewport_preview_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef SUB_VIEWPORT_PREVIEW_EDITOR_PLUGIN_H #define SUB_VIEWPORT_PREVIEW_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/plugins/texture_editor_plugin.h" #include "scene/main/viewport.h" @@ -50,7 +49,7 @@ class SubViewportPreviewEditorPlugin : public EditorPlugin { public: virtual String get_name() const override { return "SubViewportPreview"; } - SubViewportPreviewEditorPlugin(EditorNode *p_node); + SubViewportPreviewEditorPlugin(); }; #endif // SUB_VIEWPORT_PREVIEW_EDITOR_PLUGIN_H diff --git a/editor/plugins/text_control_editor_plugin.cpp b/editor/plugins/text_control_editor_plugin.cpp index a51b5d3e03..4290888e94 100644 --- a/editor/plugins/text_control_editor_plugin.cpp +++ b/editor/plugins/text_control_editor_plugin.cpp @@ -30,10 +30,12 @@ #include "text_control_editor_plugin.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" +#include "editor/multi_node_edit.h" -void TextControlEditor::_notification(int p_notification) { - switch (p_notification) { +void TextControlEditor::_notification(int p_what) { + switch (p_what) { case NOTIFICATION_ENTER_TREE: { if (!EditorFileSystem::get_singleton()->is_connected("filesystem_changed", callable_mp(this, &TextControlEditor::_reload_fonts))) { EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &TextControlEditor::_reload_fonts), make_binds("")); @@ -43,13 +45,12 @@ void TextControlEditor::_notification(int p_notification) { case NOTIFICATION_THEME_CHANGED: { clear_formatting->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); } break; + case NOTIFICATION_EXIT_TREE: { if (EditorFileSystem::get_singleton()->is_connected("filesystem_changed", callable_mp(this, &TextControlEditor::_reload_fonts))) { EditorFileSystem::get_singleton()->disconnect("filesystem_changed", callable_mp(this, &TextControlEditor::_reload_fonts)); } } break; - default: - break; } } @@ -109,7 +110,7 @@ void TextControlEditor::_update_styles_menu() { for (Map<String, String>::Element *E = fonts[name].front(); E; E = E->next()) { font_style_list->add_item(E->key()); } - } else { + } else if (font_list->get_selected() >= 0) { font_style_list->add_item("Default"); } @@ -121,82 +122,157 @@ void TextControlEditor::_update_styles_menu() { } void TextControlEditor::_update_control() { - if (edited_control) { - // Get override names. - if (edited_control->is_class("RichTextLabel")) { - edited_color = "default_color"; - edited_font = "normal_font"; - edited_font_size = "normal_font_size"; - } else { - edited_color = "font_color"; - edited_font = "font"; - edited_font_size = "font_size"; - } - - // Get font override. - Ref<Font> font; - if (edited_control->has_theme_font_override(edited_font)) { - font = edited_control->get_theme_font(edited_font); - } - if (font.is_valid()) { - if (font->get_data_count() != 1) { - // Composite font, save it to "custom_font" to allow undoing font change. - custom_font = font; - _update_fonts_menu(); - font_list->select(FONT_INFO_USER_CUSTOM); - _update_styles_menu(); - font_style_list->select(0); + if (!edited_controls.is_empty()) { + String font_selected; + bool same_font = true; + String style_selected; + bool same_style = true; + int font_size = 0; + bool same_font_size = true; + int outline_size = 0; + bool same_outline_size = true; + Color font_color = Color{ 1.0f, 1.0f, 1.0f }; + bool same_font_color = true; + Color outline_color = Color{ 1.0f, 1.0f, 1.0f }; + bool same_outline_color = true; + + int count = edited_controls.size(); + for (int i = 0; i < count; ++i) { + Control *edited_control = edited_controls[i]; + + StringName edited_color; + StringName edited_font; + StringName edited_font_size; + + // Get override names. + if (Object::cast_to<RichTextLabel>(edited_control)) { + edited_color = SNAME("default_color"); + edited_font = SNAME("normal_font"); + edited_font_size = SNAME("normal_font_size"); } else { - // Single face font, search for the font with matching name and style. - String name = font->get_data(0)->get_font_name(); - String style = font->get_data(0)->get_font_style_name(); - if (fonts.has(name) && fonts[name].has(style)) { - _update_fonts_menu(); - for (int i = 0; i < font_list->get_item_count(); i++) { - if (font_list->get_item_text(i) == name) { - font_list->select(i); - break; - } + edited_color = SNAME("font_color"); + edited_font = SNAME("font"); + edited_font_size = SNAME("font_size"); + } + + // Get font override. + Ref<Font> font; + if (edited_control->has_theme_font_override(edited_font)) { + font = edited_control->get_theme_font(edited_font); + } + + if (font.is_valid()) { + if (font->get_data_count() != 1) { + if (i > 0) { + same_font = same_font && (custom_font == font); } - _update_styles_menu(); - for (int i = 0; i < font_style_list->get_item_count(); i++) { - if (font_style_list->get_item_text(i) == style) { - font_style_list->select(i); - break; + custom_font = font; + + font_selected = TTR("[Custom Font]"); + same_style = false; + } else { + String name = font->get_data(0)->get_font_name(); + String style = font->get_data(0)->get_font_style_name(); + if (fonts.has(name) && fonts[name].has(style)) { + if (i > 0) { + same_font = same_font && (name == font_selected); + same_style = same_style && (style == style_selected); } + font_selected = name; + style_selected = style; + } else { + if (i > 0) { + same_font = same_font && (custom_font == font); + } + custom_font = font; + + font_selected = TTR("[Custom Font]"); + same_style = false; } - } else { - // Unknown font, save it to "custom_font" to allow undoing font change. - custom_font = font; - _update_fonts_menu(); - font_list->select(FONT_INFO_USER_CUSTOM); - _update_styles_menu(); - font_style_list->select(0); + } + } else { + if (i > 0) { + same_font = same_font && (font_selected == TTR("[Theme Default]")); + } + + font_selected = TTR("[Theme Default]"); + same_style = false; + } + + int current_font_size = edited_control->get_theme_font_size(edited_font_size); + int current_outline_size = edited_control->get_theme_constant(SNAME("outline_size")); + Color current_font_color = edited_control->get_theme_color(edited_color); + Color current_outline_color = edited_control->get_theme_color(SNAME("font_outline_color")); + if (i > 0) { + same_font_size = same_font_size && (font_size == current_font_size); + same_outline_size = same_outline_size && (outline_size == current_outline_size); + same_font_color = same_font_color && (font_color == current_font_color); + same_outline_color = same_outline_color && (outline_color == current_outline_color); + } + + font_size = current_font_size; + outline_size = current_outline_size; + font_color = current_font_color; + outline_color = current_outline_color; + } + _update_fonts_menu(); + if (same_font) { + for (int j = 0; j < font_list->get_item_count(); j++) { + if (font_list->get_item_text(j) == font_selected) { + font_list->select(j); + break; + } + } + } else { + custom_font = Ref<Font>(); + font_list->select(-1); + } + + _update_styles_menu(); + if (same_style) { + for (int j = 0; j < font_style_list->get_item_count(); j++) { + if (font_style_list->get_item_text(j) == style_selected) { + font_style_list->select(j); + break; } } } else { - // No font override, select "Theme Default". - _update_fonts_menu(); - font_list->select(FONT_INFO_THEME_DEFAULT); - _update_styles_menu(); - font_style_list->select(0); + font_style_list->select(-1); } // Get other theme overrides. font_size_list->set_block_signals(true); - font_size_list->set_value(edited_control->get_theme_font_size(edited_font_size)); + if (same_font_size) { + font_size_list->get_line_edit()->set_text(String::num_uint64(font_size)); + font_size_list->set_value(font_size); + } else { + font_size_list->get_line_edit()->set_text(""); + } font_size_list->set_block_signals(false); outline_size_list->set_block_signals(true); - outline_size_list->set_value(edited_control->get_theme_constant("outline_size")); + if (same_outline_size) { + outline_size_list->get_line_edit()->set_text(String::num_uint64(outline_size)); + outline_size_list->set_value(outline_size); + } else { + outline_size_list->get_line_edit()->set_text(""); + } outline_size_list->set_block_signals(false); - font_color_picker->set_pick_color(edited_control->get_theme_color(edited_color)); - outline_color_picker->set_pick_color(edited_control->get_theme_color("font_outline_color")); + if (!same_font_color) { + font_color = Color{ 1.0f, 1.0f, 1.0f }; + } + font_color_picker->set_pick_color(font_color); + + if (!same_outline_color) { + outline_color = Color{ 1.0f, 1.0f, 1.0f }; + } + outline_color_picker->set_pick_color(outline_color); } } void TextControlEditor::_font_selected(int p_id) { + _update_styles_menu(); _set_font(); } @@ -205,42 +281,53 @@ void TextControlEditor::_font_style_selected(int p_id) { } void TextControlEditor::_set_font() { - if (!edited_control) { + if (edited_controls.is_empty()) { return; } UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Set Font")); - if (font_list->get_selected_id() == FONT_INFO_THEME_DEFAULT) { - // Remove font override. - ur->add_do_method(edited_control, "remove_theme_font_override", edited_font); - } else if (font_list->get_selected_id() == FONT_INFO_USER_CUSTOM) { - // Restore "custom_font". - ur->add_do_method(edited_control, "add_theme_font_override", edited_font, custom_font); - } else { - // Load new font resource using selected name and style. - String name = font_list->get_item_text(font_list->get_selected()); - String style = font_style_list->get_item_text(font_style_list->get_selected()); - if (style.is_empty()) { - style = "Default"; + int count = edited_controls.size(); + for (int i = 0; i < count; ++i) { + Control *edited_control = edited_controls[i]; + + StringName edited_font; + if (Object::cast_to<RichTextLabel>(edited_control)) { + edited_font = SNAME("normal_font"); + } else { + edited_font = SNAME("font"); } - if (fonts.has(name)) { - Ref<FontData> fd = ResourceLoader::load(fonts[name][style]); - if (fd.is_valid()) { - Ref<Font> font; - font.instantiate(); - font->add_data(fd); - ur->add_do_method(edited_control, "add_theme_font_override", edited_font, font); + if (font_list->get_selected_id() == FONT_INFO_THEME_DEFAULT) { + // Remove font override. + ur->add_do_method(edited_control, "remove_theme_font_override", edited_font); + } else if (font_list->get_selected_id() == FONT_INFO_USER_CUSTOM) { + // Restore "custom_font". + ur->add_do_method(edited_control, "add_theme_font_override", edited_font, custom_font); + } else if (font_list->get_selected() >= 0) { + // Load new font resource using selected name and style. + String name = font_list->get_item_text(font_list->get_selected()); + String style = font_style_list->get_item_text(font_style_list->get_selected()); + if (style.is_empty()) { + style = "Default"; + } + if (fonts.has(name)) { + Ref<FontData> fd = ResourceLoader::load(fonts[name][style]); + if (fd.is_valid()) { + Ref<Font> font; + font.instantiate(); + font->add_data(fd); + ur->add_do_method(edited_control, "add_theme_font_override", edited_font, font); + } } } - } - if (edited_control->has_theme_font_override(edited_font)) { - ur->add_undo_method(edited_control, "add_theme_font_override", edited_font, edited_control->get_theme_font(edited_font)); - } else { - ur->add_undo_method(edited_control, "remove_theme_font_override", edited_font); + if (edited_control->has_theme_font_override(edited_font)) { + ur->add_undo_method(edited_control, "add_theme_font_override", edited_font, edited_control->get_theme_font(edited_font)); + } else { + ur->add_undo_method(edited_control, "remove_theme_font_override", edited_font); + } } ur->add_do_method(this, "_update_control"); @@ -250,18 +337,30 @@ void TextControlEditor::_set_font() { } void TextControlEditor::_font_size_selected(double p_size) { - if (!edited_control) { + if (edited_controls.is_empty()) { return; } UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Set Font Size")); - ur->add_do_method(edited_control, "add_theme_font_size_override", edited_font_size, p_size); - if (edited_control->has_theme_font_size_override(edited_font_size)) { - ur->add_undo_method(edited_control, "add_theme_font_size_override", edited_font_size, edited_control->get_theme_font_size(edited_font_size)); - } else { - ur->add_undo_method(edited_control, "remove_theme_font_size_override", edited_font_size); + int count = edited_controls.size(); + for (int i = 0; i < count; ++i) { + Control *edited_control = edited_controls[i]; + + StringName edited_font_size; + if (Object::cast_to<RichTextLabel>(edited_control)) { + edited_font_size = SNAME("normal_font_size"); + } else { + edited_font_size = SNAME("font_size"); + } + + ur->add_do_method(edited_control, "add_theme_font_size_override", edited_font_size, p_size); + if (edited_control->has_theme_font_size_override(edited_font_size)) { + ur->add_undo_method(edited_control, "add_theme_font_size_override", edited_font_size, edited_control->get_theme_font_size(edited_font_size)); + } else { + ur->add_undo_method(edited_control, "remove_theme_font_size_override", edited_font_size); + } } ur->add_do_method(this, "_update_control"); @@ -271,18 +370,23 @@ void TextControlEditor::_font_size_selected(double p_size) { } void TextControlEditor::_outline_size_selected(double p_size) { - if (!edited_control) { + if (edited_controls.is_empty()) { return; } UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Set Font Outline Size")); - ur->add_do_method(edited_control, "add_theme_constant_override", "outline_size", p_size); - if (edited_control->has_theme_constant_override("outline_size")) { - ur->add_undo_method(edited_control, "add_theme_constant_override", "outline_size", edited_control->get_theme_constant("outline_size")); - } else { - ur->add_undo_method(edited_control, "remove_theme_constant_override", "outline_size"); + int count = edited_controls.size(); + for (int i = 0; i < count; ++i) { + Control *edited_control = edited_controls[i]; + + ur->add_do_method(edited_control, "add_theme_constant_override", "outline_size", p_size); + if (edited_control->has_theme_constant_override("outline_size")) { + ur->add_undo_method(edited_control, "add_theme_constant_override", "outline_size", edited_control->get_theme_constant(SNAME("outline_size"))); + } else { + ur->add_undo_method(edited_control, "remove_theme_constant_override", "outline_size"); + } } ur->add_do_method(this, "_update_control"); @@ -292,18 +396,30 @@ void TextControlEditor::_outline_size_selected(double p_size) { } void TextControlEditor::_font_color_changed(const Color &p_color) { - if (!edited_control) { + if (edited_controls.is_empty()) { return; } UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Set Font Color"), UndoRedo::MERGE_ENDS); - ur->add_do_method(edited_control, "add_theme_color_override", edited_color, p_color); - if (edited_control->has_theme_color_override(edited_color)) { - ur->add_undo_method(edited_control, "add_theme_color_override", edited_color, edited_control->get_theme_color(edited_color)); - } else { - ur->add_undo_method(edited_control, "remove_theme_color_override", edited_color); + int count = edited_controls.size(); + for (int i = 0; i < count; ++i) { + Control *edited_control = edited_controls[i]; + + StringName edited_color; + if (Object::cast_to<RichTextLabel>(edited_control)) { + edited_color = SNAME("default_color"); + } else { + edited_color = SNAME("font_color"); + } + + ur->add_do_method(edited_control, "add_theme_color_override", edited_color, p_color); + if (edited_control->has_theme_color_override(edited_color)) { + ur->add_undo_method(edited_control, "add_theme_color_override", edited_color, edited_control->get_theme_color(edited_color)); + } else { + ur->add_undo_method(edited_control, "remove_theme_color_override", edited_color); + } } ur->add_do_method(this, "_update_control"); @@ -313,18 +429,23 @@ void TextControlEditor::_font_color_changed(const Color &p_color) { } void TextControlEditor::_outline_color_changed(const Color &p_color) { - if (!edited_control) { + if (edited_controls.is_empty()) { return; } UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Set Font Outline Color"), UndoRedo::MERGE_ENDS); - ur->add_do_method(edited_control, "add_theme_color_override", "font_outline_color", p_color); - if (edited_control->has_theme_color_override("font_outline_color")) { - ur->add_undo_method(edited_control, "add_theme_color_override", "font_outline_color", edited_control->get_theme_color("font_outline_color")); - } else { - ur->add_undo_method(edited_control, "remove_theme_color_override", "font_outline_color"); + int count = edited_controls.size(); + for (int i = 0; i < count; ++i) { + Control *edited_control = edited_controls[i]; + + ur->add_do_method(edited_control, "add_theme_color_override", "font_outline_color", p_color); + if (edited_control->has_theme_color_override("font_outline_color")) { + ur->add_undo_method(edited_control, "add_theme_color_override", "font_outline_color", edited_control->get_theme_color(SNAME("font_outline_color"))); + } else { + ur->add_undo_method(edited_control, "remove_theme_color_override", "font_outline_color"); + } } ur->add_do_method(this, "_update_control"); @@ -334,43 +455,63 @@ void TextControlEditor::_outline_color_changed(const Color &p_color) { } void TextControlEditor::_clear_formatting() { - if (!edited_control) { + if (edited_controls.is_empty()) { return; } UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Clear Control Formatting")); - ur->add_do_method(edited_control, "begin_bulk_theme_override"); - ur->add_undo_method(edited_control, "begin_bulk_theme_override"); + int count = edited_controls.size(); + for (int i = 0; i < count; ++i) { + Control *edited_control = edited_controls[i]; - ur->add_do_method(edited_control, "remove_theme_font_override", edited_font); - if (edited_control->has_theme_font_override(edited_font)) { - ur->add_undo_method(edited_control, "add_theme_font_override", edited_font, edited_control->get_theme_font(edited_font)); - } + StringName edited_color; + StringName edited_font; + StringName edited_font_size; - ur->add_do_method(edited_control, "remove_theme_font_size_override", edited_font_size); - if (edited_control->has_theme_font_size_override(edited_font_size)) { - ur->add_undo_method(edited_control, "add_theme_font_size_override", edited_font_size, edited_control->get_theme_font_size(edited_font_size)); - } + // Get override names. + if (Object::cast_to<RichTextLabel>(edited_control)) { + edited_color = SNAME("default_color"); + edited_font = SNAME("normal_font"); + edited_font_size = SNAME("normal_font_size"); + } else { + edited_color = SNAME("font_color"); + edited_font = SNAME("font"); + edited_font_size = SNAME("font_size"); + } - ur->add_do_method(edited_control, "remove_theme_color_override", edited_color); - if (edited_control->has_theme_color_override(edited_color)) { - ur->add_undo_method(edited_control, "add_theme_color_override", edited_color, edited_control->get_theme_color(edited_color)); - } + ur->add_do_method(edited_control, "begin_bulk_theme_override"); + ur->add_undo_method(edited_control, "begin_bulk_theme_override"); - ur->add_do_method(edited_control, "remove_theme_color_override", "font_outline_color"); - if (edited_control->has_theme_color_override("font_outline_color")) { - ur->add_undo_method(edited_control, "add_theme_color_override", "font_outline_color", edited_control->get_theme_color("font_outline_color")); - } + ur->add_do_method(edited_control, "remove_theme_font_override", edited_font); + if (edited_control->has_theme_font_override(edited_font)) { + ur->add_undo_method(edited_control, "add_theme_font_override", edited_font, edited_control->get_theme_font(edited_font)); + } - ur->add_do_method(edited_control, "remove_theme_constant_override", "outline_size"); - if (edited_control->has_theme_constant_override("outline_size")) { - ur->add_undo_method(edited_control, "add_theme_constant_override", "outline_size", edited_control->get_theme_constant("outline_size")); - } + ur->add_do_method(edited_control, "remove_theme_font_size_override", edited_font_size); + if (edited_control->has_theme_font_size_override(edited_font_size)) { + ur->add_undo_method(edited_control, "add_theme_font_size_override", edited_font_size, edited_control->get_theme_font_size(edited_font_size)); + } + + ur->add_do_method(edited_control, "remove_theme_color_override", edited_color); + if (edited_control->has_theme_color_override(edited_color)) { + ur->add_undo_method(edited_control, "add_theme_color_override", edited_color, edited_control->get_theme_color(edited_color)); + } + + ur->add_do_method(edited_control, "remove_theme_color_override", "font_outline_color"); + if (edited_control->has_theme_color_override("font_outline_color")) { + ur->add_undo_method(edited_control, "add_theme_color_override", "font_outline_color", edited_control->get_theme_color(SNAME("font_outline_color"))); + } - ur->add_do_method(edited_control, "end_bulk_theme_override"); - ur->add_undo_method(edited_control, "end_bulk_theme_override"); + ur->add_do_method(edited_control, "remove_theme_constant_override", "outline_size"); + if (edited_control->has_theme_constant_override("outline_size")) { + ur->add_undo_method(edited_control, "add_theme_constant_override", "outline_size", edited_control->get_theme_constant(SNAME("outline_size"))); + } + + ur->add_do_method(edited_control, "end_bulk_theme_override"); + ur->add_undo_method(edited_control, "end_bulk_theme_override"); + } ur->add_do_method(this, "_update_control"); ur->add_undo_method(this, "_update_control"); @@ -380,24 +521,54 @@ void TextControlEditor::_clear_formatting() { void TextControlEditor::edit(Object *p_object) { Control *ctrl = Object::cast_to<Control>(p_object); - if (!ctrl) { - edited_control = nullptr; - custom_font = Ref<Font>(); - } else { - edited_control = ctrl; - custom_font = Ref<Font>(); + MultiNodeEdit *multi_node = Object::cast_to<MultiNodeEdit>(p_object); + + edited_controls.clear(); + custom_font = Ref<Font>(); + if (ctrl) { + edited_controls.append(ctrl); + _update_control(); + } else if (multi_node && handles(multi_node)) { + int count = multi_node->get_node_count(); + Node *scene = EditorNode::get_singleton()->get_edited_scene(); + + for (int i = 0; i < count; ++i) { + Control *child = Object::cast_to<Control>(scene->get_node(multi_node->get_node(i))); + edited_controls.append(child); + } _update_control(); } } bool TextControlEditor::handles(Object *p_object) const { Control *ctrl = Object::cast_to<Control>(p_object); - if (!ctrl) { + MultiNodeEdit *multi_node = Object::cast_to<MultiNodeEdit>(p_object); + + if (!ctrl && !multi_node) { return false; - } else { + } else if (ctrl) { bool valid = false; ctrl->get("text", &valid); return valid; + } else { + bool valid = true; + int count = multi_node->get_node_count(); + Node *scene = EditorNode::get_singleton()->get_edited_scene(); + + for (int i = 0; i < count; ++i) { + bool temp_valid = false; + Control *child = Object::cast_to<Control>(scene->get_node(multi_node->get_node(i))); + if (child) { + child->get("text", &temp_valid); + } + valid = valid && temp_valid; + + if (!valid) { + break; + } + } + + return valid; } } @@ -481,8 +652,7 @@ void TextControlEditorPlugin::make_visible(bool p_visible) { } } -TextControlEditorPlugin::TextControlEditorPlugin(EditorNode *p_node) { - editor = p_node; +TextControlEditorPlugin::TextControlEditorPlugin() { text_ctl_editor = memnew(TextControlEditor); CanvasItemEditor::get_singleton()->add_control_to_menu_panel(text_ctl_editor); diff --git a/editor/plugins/text_control_editor_plugin.h b/editor/plugins/text_control_editor_plugin.h index d284a30f16..1349003a9c 100644 --- a/editor/plugins/text_control_editor_plugin.h +++ b/editor/plugins/text_control_editor_plugin.h @@ -34,8 +34,8 @@ #include "canvas_item_editor_plugin.h" #include "editor/editor_file_system.h" #include "editor/editor_inspector.h" -#include "editor/editor_node.h" #include "editor/editor_plugin.h" +#include "scene/gui/color_picker.h" #include "scene/gui/color_rect.h" #include "scene/gui/menu_button.h" #include "scene/gui/option_button.h" @@ -62,14 +62,11 @@ class TextControlEditor : public HBoxContainer { ColorPickerButton *outline_color_picker = nullptr; Button *clear_formatting = nullptr; - Control *edited_control = nullptr; - String edited_color; - String edited_font; - String edited_font_size; + Vector<Control *> edited_controls; Ref<Font> custom_font; protected: - void _notification(int p_notification); + void _notification(int p_what); static void _bind_methods(); void _find_resources(EditorFileSystemDirectory *p_dir); @@ -104,7 +101,6 @@ class TextControlEditorPlugin : public EditorPlugin { GDCLASS(TextControlEditorPlugin, EditorPlugin); TextControlEditor *text_ctl_editor; - EditorNode *editor; public: virtual String get_name() const override { return "TextControlFontEditor"; } @@ -113,7 +109,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - TextControlEditorPlugin(EditorNode *p_node); + TextControlEditorPlugin(); }; #endif // TEXT_CONTROL_EDITOR_PLUGIN_H diff --git a/editor/plugins/texture_3d_editor_plugin.cpp b/editor/plugins/texture_3d_editor_plugin.cpp index 6080f9df87..0fc7079a24 100644 --- a/editor/plugins/texture_3d_editor_plugin.cpp +++ b/editor/plugins/texture_3d_editor_plugin.cpp @@ -30,27 +30,22 @@ #include "texture_3d_editor_plugin.h" -#include "core/config/project_settings.h" -#include "core/io/resource_loader.h" -#include "editor/editor_settings.h" - void Texture3DEditor::_texture_rect_draw() { texture_rect->draw_rect(Rect2(Point2(), texture_rect->get_size()), Color(1, 1, 1, 1)); } void Texture3DEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - //get_scene()->connect("node_removed",this,"_node_removed"); - } - if (p_what == NOTIFICATION_RESIZED) { - _texture_rect_update_area(); - } + switch (p_what) { + case NOTIFICATION_RESIZED: { + _texture_rect_update_area(); + } break; - if (p_what == NOTIFICATION_DRAW) { - Ref<Texture2D> checkerboard = get_theme_icon(SNAME("Checkerboard"), SNAME("EditorIcons")); - Size2 size = get_size(); + case NOTIFICATION_DRAW: { + Ref<Texture2D> checkerboard = get_theme_icon(SNAME("Checkerboard"), SNAME("EditorIcons")); + Size2 size = get_size(); - draw_texture_rect(checkerboard, Rect2(Point2(), size), true); + draw_texture_rect(checkerboard, Rect2(Point2(), size), true); + } break; } } @@ -204,7 +199,7 @@ void EditorInspectorPlugin3DTexture::parse_begin(Object *p_object) { add_custom_control(editor); } -Texture3DEditorPlugin::Texture3DEditorPlugin(EditorNode *p_node) { +Texture3DEditorPlugin::Texture3DEditorPlugin() { Ref<EditorInspectorPlugin3DTexture> plugin; plugin.instantiate(); add_inspector_plugin(plugin); diff --git a/editor/plugins/texture_3d_editor_plugin.h b/editor/plugins/texture_3d_editor_plugin.h index 5a200f6c11..d418032477 100644 --- a/editor/plugins/texture_3d_editor_plugin.h +++ b/editor/plugins/texture_3d_editor_plugin.h @@ -31,8 +31,8 @@ #ifndef TEXTURE_3D_EDITOR_PLUGIN_H #define TEXTURE_3D_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" +#include "scene/gui/spin_box.h" #include "scene/resources/shader.h" #include "scene/resources/texture.h" @@ -88,7 +88,7 @@ class Texture3DEditorPlugin : public EditorPlugin { public: virtual String get_name() const override { return "Texture3D"; } - Texture3DEditorPlugin(EditorNode *p_node); + Texture3DEditorPlugin(); }; #endif // TEXTURE_EDITOR_PLUGIN_H diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp index 84b33f0986..17fe4fdc50 100644 --- a/editor/plugins/texture_editor_plugin.cpp +++ b/editor/plugins/texture_editor_plugin.cpp @@ -119,7 +119,7 @@ void EditorInspectorPluginTexture::parse_begin(Object *p_object) { add_custom_control(memnew(TexturePreview(texture, true))); } -TextureEditorPlugin::TextureEditorPlugin(EditorNode *p_node) { +TextureEditorPlugin::TextureEditorPlugin() { Ref<EditorInspectorPluginTexture> plugin; plugin.instantiate(); add_inspector_plugin(plugin); diff --git a/editor/plugins/texture_editor_plugin.h b/editor/plugins/texture_editor_plugin.h index 5ba077d6fc..9beada556c 100644 --- a/editor/plugins/texture_editor_plugin.h +++ b/editor/plugins/texture_editor_plugin.h @@ -31,7 +31,6 @@ #ifndef TEXTURE_EDITOR_PLUGIN_H #define TEXTURE_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/resources/texture.h" @@ -68,7 +67,7 @@ class TextureEditorPlugin : public EditorPlugin { public: virtual String get_name() const override { return "Texture2D"; } - TextureEditorPlugin(EditorNode *p_node); + TextureEditorPlugin(); }; #endif // TEXTURE_EDITOR_PLUGIN_H diff --git a/editor/plugins/texture_layered_editor_plugin.cpp b/editor/plugins/texture_layered_editor_plugin.cpp index a8c37d37fe..cb146fd342 100644 --- a/editor/plugins/texture_layered_editor_plugin.cpp +++ b/editor/plugins/texture_layered_editor_plugin.cpp @@ -30,10 +30,6 @@ #include "texture_layered_editor_plugin.h" -#include "core/config/project_settings.h" -#include "core/io/resource_loader.h" -#include "editor/editor_settings.h" - void TextureLayeredEditor::gui_input(const Ref<InputEvent> &p_event) { ERR_FAIL_COND(p_event.is_null()); @@ -50,18 +46,17 @@ void TextureLayeredEditor::_texture_rect_draw() { } void TextureLayeredEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - //get_scene()->connect("node_removed",this,"_node_removed"); - } - if (p_what == NOTIFICATION_RESIZED) { - _texture_rect_update_area(); - } + switch (p_what) { + case NOTIFICATION_RESIZED: { + _texture_rect_update_area(); + } break; - if (p_what == NOTIFICATION_DRAW) { - Ref<Texture2D> checkerboard = get_theme_icon(SNAME("Checkerboard"), SNAME("EditorIcons")); - Size2 size = get_size(); + case NOTIFICATION_DRAW: { + Ref<Texture2D> checkerboard = get_theme_icon(SNAME("Checkerboard"), SNAME("EditorIcons")); + Size2 size = get_size(); - draw_texture_rect(checkerboard, Rect2(Point2(), size), true); + draw_texture_rect(checkerboard, Rect2(Point2(), size), true); + } break; } } @@ -277,7 +272,7 @@ void EditorInspectorPluginLayeredTexture::parse_begin(Object *p_object) { add_custom_control(editor); } -TextureLayeredEditorPlugin::TextureLayeredEditorPlugin(EditorNode *p_node) { +TextureLayeredEditorPlugin::TextureLayeredEditorPlugin() { Ref<EditorInspectorPluginLayeredTexture> plugin; plugin.instantiate(); add_inspector_plugin(plugin); diff --git a/editor/plugins/texture_layered_editor_plugin.h b/editor/plugins/texture_layered_editor_plugin.h index cd8eba1bfe..1c59ec4db0 100644 --- a/editor/plugins/texture_layered_editor_plugin.h +++ b/editor/plugins/texture_layered_editor_plugin.h @@ -31,8 +31,8 @@ #ifndef TEXTURE_LAYERED_EDITOR_PLUGIN_H #define TEXTURE_LAYERED_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" +#include "scene/gui/spin_box.h" #include "scene/resources/shader.h" #include "scene/resources/texture.h" @@ -90,7 +90,7 @@ class TextureLayeredEditorPlugin : public EditorPlugin { public: virtual String get_name() const override { return "TextureLayered"; } - TextureLayeredEditorPlugin(EditorNode *p_node); + TextureLayeredEditorPlugin(); }; #endif // TEXTURE_EDITOR_PLUGIN_H diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index 662c0126ec..ee31131d86 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -33,6 +33,7 @@ #include "core/core_string_names.h" #include "core/input/input.h" #include "core/os/keyboard.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "scene/gui/check_box.h" #include "scene/gui/view_panner.h" @@ -980,14 +981,13 @@ Vector2 TextureRegionEditor::snap_point(Vector2 p_target) const { return p_target; } -TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) { +TextureRegionEditor::TextureRegionEditor() { node_sprite_2d = nullptr; node_sprite_3d = nullptr; node_ninepatch = nullptr; obj_styleBox = Ref<StyleBoxTexture>(nullptr); atlas_tex = Ref<AtlasTexture>(nullptr); - editor = p_editor; - undo_redo = editor->get_undo_redo(); + undo_redo = EditorNode::get_singleton()->get_undo_redo(); snap_step = Vector2(10, 10); snap_separation = Vector2(0, 0); @@ -1145,11 +1145,11 @@ void TextureRegionEditorPlugin::make_visible(bool p_visible) { is_node_configured |= region_editor->get_sprite_2d() && region_editor->get_sprite_2d()->is_region_enabled(); is_node_configured |= region_editor->get_sprite_3d() && region_editor->get_sprite_3d()->is_region_enabled(); if ((is_node_configured && !manually_hidden) || texture_region_button->is_pressed()) { - editor->make_bottom_panel_item_visible(region_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(region_editor); } } else { if (region_editor->is_visible_in_tree()) { - editor->hide_bottom_panel(); + EditorNode::get_singleton()->hide_bottom_panel(); manually_hidden = false; } texture_region_button->hide(); @@ -1198,15 +1198,14 @@ void TextureRegionEditorPlugin::set_state(const Dictionary &p_state) { void TextureRegionEditorPlugin::_bind_methods() { } -TextureRegionEditorPlugin::TextureRegionEditorPlugin(EditorNode *p_node) { +TextureRegionEditorPlugin::TextureRegionEditorPlugin() { manually_hidden = false; - editor = p_node; - region_editor = memnew(TextureRegionEditor(p_node)); + region_editor = memnew(TextureRegionEditor); region_editor->set_custom_minimum_size(Size2(0, 200) * EDSCALE); region_editor->hide(); region_editor->connect("visibility_changed", callable_mp(this, &TextureRegionEditorPlugin::_editor_visiblity_changed)); - texture_region_button = p_node->add_bottom_panel_item(TTR("TextureRegion"), region_editor); + texture_region_button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("TextureRegion"), region_editor); texture_region_button->hide(); } diff --git a/editor/plugins/texture_region_editor_plugin.h b/editor/plugins/texture_region_editor_plugin.h index d78ad3891c..041742c28a 100644 --- a/editor/plugins/texture_region_editor_plugin.h +++ b/editor/plugins/texture_region_editor_plugin.h @@ -32,7 +32,6 @@ #define TEXTURE_REGION_EDITOR_PLUGIN_H #include "canvas_item_editor_plugin.h" -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/2d/sprite_2d.h" #include "scene/3d/sprite_3d.h" @@ -69,7 +68,6 @@ class TextureRegionEditor : public VBoxContainer { VScrollBar *vscroll; HScrollBar *hscroll; - EditorNode *editor; UndoRedo *undo_redo; Vector2 draw_ofs; @@ -141,7 +139,7 @@ public: Sprite3D *get_sprite_3d(); void edit(Object *p_obj); - TextureRegionEditor(EditorNode *p_editor); + TextureRegionEditor(); }; class TextureRegionEditorPlugin : public EditorPlugin { @@ -150,7 +148,6 @@ class TextureRegionEditorPlugin : public EditorPlugin { bool manually_hidden; Button *texture_region_button; TextureRegionEditor *region_editor; - EditorNode *editor; protected: static void _bind_methods(); @@ -166,7 +163,7 @@ public: void set_state(const Dictionary &p_state) override; Dictionary get_state() const override; - TextureRegionEditorPlugin(EditorNode *p_node); + TextureRegionEditorPlugin(); }; #endif // TEXTURE_REGION_EDITOR_PLUGIN_H diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index 611f81db33..a03f036b72 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -31,6 +31,8 @@ #include "theme_editor_plugin.h" #include "core/os/keyboard.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_resource_picker.h" #include "editor/editor_scale.h" #include "editor/progress_dialog.h" @@ -1211,7 +1213,8 @@ void ThemeItemEditorDialog::_update_edit_types() { bool item_reselected = false; edit_type_list->clear(); - int e_idx = 0; + TreeItem *list_root = edit_type_list->create_item(); + for (const StringName &E : theme_types) { Ref<Texture2D> item_icon; if (E == "") { @@ -1219,19 +1222,21 @@ void ThemeItemEditorDialog::_update_edit_types() { } else { item_icon = EditorNode::get_singleton()->get_class_icon(E, "NodeDisabled"); } - edit_type_list->add_item(E, item_icon); + TreeItem *list_item = edit_type_list->create_item(list_root); + list_item->set_text(0, E); + list_item->set_icon(0, item_icon); + list_item->add_button(0, get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TYPES_TREE_REMOVE_ITEM, false, TTR("Remove Type")); if (E == edited_item_type) { - edit_type_list->select(e_idx); + list_item->select(0); item_reselected = true; } - e_idx++; } if (!item_reselected) { edited_item_type = ""; - if (edit_type_list->get_item_count() > 0) { - edit_type_list->select(0); + if (list_root->get_child_count() > 0) { + list_root->get_child(0)->select(0); } } @@ -1240,9 +1245,9 @@ void ThemeItemEditorDialog::_update_edit_types() { default_types.sort_custom<StringName::AlphCompare>(); String selected_type = ""; - Vector<int> selected_ids = edit_type_list->get_selected_items(); - if (selected_ids.size() > 0) { - selected_type = edit_type_list->get_item_text(selected_ids[0]); + TreeItem *selected_item = edit_type_list->get_selected(); + if (selected_item) { + selected_type = selected_item->get_text(0); edit_items_add_color->set_disabled(false); edit_items_add_constant->set_disabled(false); @@ -1276,11 +1281,26 @@ void ThemeItemEditorDialog::_update_edit_types() { _update_edit_item_tree(selected_type); } -void ThemeItemEditorDialog::_edited_type_selected(int p_item_idx) { - String selected_type = edit_type_list->get_item_text(p_item_idx); +void ThemeItemEditorDialog::_edited_type_selected() { + TreeItem *selected_item = edit_type_list->get_selected(); + String selected_type = selected_item->get_text(0); _update_edit_item_tree(selected_type); } +void ThemeItemEditorDialog::_edited_type_button_pressed(Object *p_item, int p_column, int p_id) { + TreeItem *item = Object::cast_to<TreeItem>(p_item); + if (!item) { + return; + } + + switch (p_id) { + case TYPES_TREE_REMOVE_ITEM: { + String type_name = item->get_text(0); + _remove_theme_type(type_name); + } break; + } +} + void ThemeItemEditorDialog::_update_edit_item_tree(String p_item_type) { edited_item_type = p_item_type; @@ -1429,8 +1449,8 @@ void ThemeItemEditorDialog::_update_edit_item_tree(String p_item_type) { } // If some type is selected, but it doesn't seem to have any items, show a guiding message. - Vector<int> selected_ids = edit_type_list->get_selected_items(); - if (selected_ids.size() > 0) { + TreeItem *selected_item = edit_type_list->get_selected(); + if (selected_item) { if (!has_any_items) { edit_items_message->set_text(TTR("This theme type is empty.\nAdd more items to it manually or by importing from another theme.")); edit_items_message->show(); @@ -1477,16 +1497,15 @@ void ThemeItemEditorDialog::_add_theme_type(const String &p_new_text) { const String new_type = edit_add_type_value->get_text().strip_edges(); edit_add_type_value->clear(); - edited_theme->add_icon_type(new_type); - edited_theme->add_stylebox_type(new_type); - edited_theme->add_font_type(new_type); - edited_theme->add_font_size_type(new_type); - edited_theme->add_color_type(new_type); - edited_theme->add_constant_type(new_type); + UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); + ur->create_action(TTR("Add Theme Type")); - _update_edit_types(); + ur->add_do_method(*edited_theme, "add_type", new_type); + ur->add_undo_method(*edited_theme, "remove_type", new_type); + ur->add_do_method(this, "_update_edit_types"); + ur->add_undo_method(this, "_update_edit_types"); - edited_theme->emit_changed(); + ur->commit_action(); } void ThemeItemEditorDialog::_add_theme_item(Theme::DataType p_data_type, String p_item_name, String p_item_type) { @@ -1531,6 +1550,27 @@ void ThemeItemEditorDialog::_add_theme_item(Theme::DataType p_data_type, String ur->commit_action(); } +void ThemeItemEditorDialog::_remove_theme_type(const String &p_theme_type) { + Ref<Theme> old_snapshot = edited_theme->duplicate(); + Ref<Theme> new_snapshot = edited_theme->duplicate(); + + UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); + ur->create_action(TTR("Remove Theme Type")); + + new_snapshot->remove_type(p_theme_type); + + ur->add_do_method(*edited_theme, "clear"); + ur->add_do_method(*edited_theme, "merge_with", new_snapshot); + // If the type was empty, it cannot be restored with merge, but thankfully we can fake it. + ur->add_undo_method(*edited_theme, "add_type", p_theme_type); + ur->add_undo_method(*edited_theme, "merge_with", old_snapshot); + + ur->add_do_method(this, "_update_edit_types"); + ur->add_undo_method(this, "_update_edit_types"); + + ur->commit_action(); +} + void ThemeItemEditorDialog::_remove_data_type_items(Theme::DataType p_data_type, String p_item_type) { List<StringName> names; @@ -1863,10 +1903,14 @@ ThemeItemEditorDialog::ThemeItemEditorDialog(ThemeTypeEditor *p_theme_type_edito edit_type_label->set_text(TTR("Types:")); edit_dialog_side_vb->add_child(edit_type_label); - edit_type_list = memnew(ItemList); + edit_type_list = memnew(Tree); + edit_type_list->set_hide_root(true); + edit_type_list->set_hide_folding(true); + edit_type_list->set_columns(1); edit_type_list->set_v_size_flags(Control::SIZE_EXPAND_FILL); edit_dialog_side_vb->add_child(edit_type_list); edit_type_list->connect("item_selected", callable_mp(this, &ThemeItemEditorDialog::_edited_type_selected)); + edit_type_list->connect("button_pressed", callable_mp(this, &ThemeItemEditorDialog::_edited_type_button_pressed)); Label *edit_add_type_label = memnew(Label); edit_add_type_label->set_text(TTR("Add Type:")); @@ -2226,7 +2270,7 @@ void ThemeTypeEditor::_update_type_list() { } updating = true; - Control *focused = get_focus_owner(); + Control *focused = get_viewport()->gui_get_focus_owner(); if (focused) { if (focusables.has(focused)) { // If focus is currently on one of the internal property editors, don't update. @@ -3469,7 +3513,7 @@ void ThemeEditor::_add_preview_tab(ThemeEditorPreview *p_preview_tab, const Stri preview_tabs->add_tab(p_preview_name, p_icon); preview_tabs_content->add_child(p_preview_tab); - preview_tabs->set_tab_right_button(preview_tabs->get_tab_count() - 1, EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("close"), SNAME("TabBar"))); + preview_tabs->set_tab_button_icon(preview_tabs->get_tab_count() - 1, EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("close"), SNAME("TabBar"))); p_preview_tab->connect("control_picked", callable_mp(this, &ThemeEditor::_preview_control_picked)); preview_tabs->set_current_tab(preview_tabs->get_tab_count() - 1); @@ -3600,7 +3644,7 @@ ThemeEditor::ThemeEditor() { preview_tabs->set_h_size_flags(SIZE_EXPAND_FILL); preview_tabbar_hb->add_child(preview_tabs); preview_tabs->connect("tab_changed", callable_mp(this, &ThemeEditor::_change_preview_tab)); - preview_tabs->connect("tab_rmb_clicked", callable_mp(this, &ThemeEditor::_remove_preview_tab)); + preview_tabs->connect("tab_button_pressed", callable_mp(this, &ThemeEditor::_remove_preview_tab)); HBoxContainer *add_preview_button_hb = memnew(HBoxContainer); preview_tabbar_hb->add_child(add_preview_button_hb); @@ -3713,21 +3757,20 @@ bool ThemeEditorPlugin::handles(Object *p_node) const { void ThemeEditorPlugin::make_visible(bool p_visible) { if (p_visible) { button->show(); - editor->make_bottom_panel_item_visible(theme_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(theme_editor); } else { if (theme_editor->is_visible_in_tree()) { - editor->hide_bottom_panel(); + EditorNode::get_singleton()->hide_bottom_panel(); } button->hide(); } } -ThemeEditorPlugin::ThemeEditorPlugin(EditorNode *p_node) { - editor = p_node; +ThemeEditorPlugin::ThemeEditorPlugin() { theme_editor = memnew(ThemeEditor); theme_editor->set_custom_minimum_size(Size2(0, 200) * EDSCALE); - button = editor->add_bottom_panel_item(TTR("Theme"), theme_editor); + button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Theme"), theme_editor); button->hide(); } diff --git a/editor/plugins/theme_editor_plugin.h b/editor/plugins/theme_editor_plugin.h index c00ce3ae65..7c1b0cda3e 100644 --- a/editor/plugins/theme_editor_plugin.h +++ b/editor/plugins/theme_editor_plugin.h @@ -31,16 +31,20 @@ #ifndef THEME_EDITOR_PLUGIN_H #define THEME_EDITOR_PLUGIN_H +#include "editor/editor_plugin.h" +#include "editor/plugins/theme_editor_preview.h" +#include "scene/gui/check_button.h" #include "scene/gui/dialogs.h" +#include "scene/gui/item_list.h" #include "scene/gui/margin_container.h" #include "scene/gui/option_button.h" #include "scene/gui/scroll_container.h" #include "scene/gui/tab_bar.h" #include "scene/gui/texture_rect.h" +#include "scene/gui/tree.h" #include "scene/resources/theme.h" -#include "theme_editor_preview.h" -#include "editor/editor_node.h" +class EditorFileDialog; class ThemeItemImportTree : public VBoxContainer { GDCLASS(ThemeItemImportTree, VBoxContainer); @@ -188,7 +192,11 @@ class ThemeItemEditorDialog : public AcceptDialog { TabContainer *tc; - ItemList *edit_type_list; + enum TypesTreeAction { + TYPES_TREE_REMOVE_ITEM, + }; + + Tree *edit_type_list; LineEdit *edit_add_type_value; String edited_item_type; @@ -240,13 +248,15 @@ class ThemeItemEditorDialog : public AcceptDialog { void _dialog_about_to_show(); void _update_edit_types(); - void _edited_type_selected(int p_item_idx); + void _edited_type_selected(); + void _edited_type_button_pressed(Object *p_item, int p_column, int p_id); void _update_edit_item_tree(String p_item_type); void _item_tree_button_pressed(Object *p_item, int p_column, int p_id); void _add_theme_type(const String &p_new_text); void _add_theme_item(Theme::DataType p_data_type, String p_item_name, String p_item_type); + void _remove_theme_type(const String &p_theme_type); void _remove_data_type_items(Theme::DataType p_data_type, String p_item_type); void _remove_class_items(); void _remove_custom_items(); @@ -443,7 +453,6 @@ class ThemeEditorPlugin : public EditorPlugin { GDCLASS(ThemeEditorPlugin, EditorPlugin); ThemeEditor *theme_editor; - EditorNode *editor; Button *button; public: @@ -453,7 +462,7 @@ public: virtual bool handles(Object *p_node) const override; virtual void make_visible(bool p_visible) override; - ThemeEditorPlugin(EditorNode *p_node); + ThemeEditorPlugin(); }; #endif // THEME_EDITOR_PLUGIN_H diff --git a/editor/plugins/theme_editor_preview.cpp b/editor/plugins/theme_editor_preview.cpp index c4ef6e086d..252a19a7db 100644 --- a/editor/plugins/theme_editor_preview.cpp +++ b/editor/plugins/theme_editor_preview.cpp @@ -30,11 +30,15 @@ #include "theme_editor_preview.h" +#include "core/config/project_settings.h" #include "core/input/input.h" #include "core/math/math_funcs.h" -#include "scene/resources/packed_scene.h" - +#include "editor/editor_node.h" #include "editor/editor_scale.h" +#include "scene/gui/button.h" +#include "scene/gui/color_picker.h" +#include "scene/gui/progress_bar.h" +#include "scene/resources/packed_scene.h" constexpr double REFRESH_TIMER = 1.5; @@ -199,6 +203,7 @@ void ThemeEditorPreview::_notification(int p_what) { theme_cache.preview_picker_font = get_theme_font(SNAME("status_source"), SNAME("EditorFonts")); theme_cache.font_size = get_theme_font_size(SNAME("font_size"), SNAME("EditorFonts")); } break; + case NOTIFICATION_PROCESS: { time_left -= get_process_delta_time(); if (time_left < 0) { diff --git a/editor/plugins/theme_editor_preview.h b/editor/plugins/theme_editor_preview.h index a509ae3c50..48111df399 100644 --- a/editor/plugins/theme_editor_preview.h +++ b/editor/plugins/theme_editor_preview.h @@ -32,26 +32,12 @@ #define THEME_EDITOR_PREVIEW_H #include "scene/gui/box_container.h" -#include "scene/gui/check_box.h" -#include "scene/gui/check_button.h" -#include "scene/gui/color_picker.h" +#include "scene/gui/button.h" #include "scene/gui/color_rect.h" -#include "scene/gui/label.h" #include "scene/gui/margin_container.h" -#include "scene/gui/menu_button.h" -#include "scene/gui/option_button.h" -#include "scene/gui/panel.h" -#include "scene/gui/progress_bar.h" #include "scene/gui/scroll_container.h" -#include "scene/gui/separator.h" -#include "scene/gui/spin_box.h" -#include "scene/gui/tab_container.h" -#include "scene/gui/text_edit.h" -#include "scene/gui/tree.h" #include "scene/resources/theme.h" -#include "editor/editor_node.h" - class ThemeEditorPreview : public VBoxContainer { GDCLASS(ThemeEditorPreview, VBoxContainer); diff --git a/editor/plugins/tiles/atlas_merging_dialog.cpp b/editor/plugins/tiles/atlas_merging_dialog.cpp index 677c9759c2..0f8c8c616c 100644 --- a/editor/plugins/tiles/atlas_merging_dialog.cpp +++ b/editor/plugins/tiles/atlas_merging_dialog.cpp @@ -30,6 +30,8 @@ #include "atlas_merging_dialog.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "scene/gui/control.h" @@ -251,6 +253,8 @@ void AtlasMergingDialog::update_tile_set(Ref<TileSet> p_tile_set) { } AtlasMergingDialog::AtlasMergingDialog() { + undo_redo = EditorNode::get_singleton()->get_undo_redo(); + // Atlas merging window. set_title(TTR("Atlas Merging")); set_hide_on_ok(false); diff --git a/editor/plugins/tiles/atlas_merging_dialog.h b/editor/plugins/tiles/atlas_merging_dialog.h index 2ae94cf44a..6cf555247d 100644 --- a/editor/plugins/tiles/atlas_merging_dialog.h +++ b/editor/plugins/tiles/atlas_merging_dialog.h @@ -31,14 +31,14 @@ #ifndef ATLAS_MERGING_DIALOG_H #define ATLAS_MERGING_DIALOG_H -#include "editor/editor_node.h" #include "editor/editor_properties.h" - #include "scene/gui/dialogs.h" #include "scene/gui/item_list.h" #include "scene/gui/texture_rect.h" #include "scene/resources/tile_set.h" +class EditorFileDialog; + class AtlasMergingDialog : public ConfirmationDialog { GDCLASS(AtlasMergingDialog, ConfirmationDialog); @@ -49,7 +49,7 @@ private: LocalVector<Map<Vector2i, Vector2i>> merged_mapping; Ref<TileSet> tile_set; - UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo(); + UndoRedo *undo_redo; // Settings. int next_line_after_column = 30; diff --git a/editor/plugins/tiles/tile_atlas_view.cpp b/editor/plugins/tiles/tile_atlas_view.cpp index 35496795e0..71947ae185 100644 --- a/editor/plugins/tiles/tile_atlas_view.cpp +++ b/editor/plugins/tiles/tile_atlas_view.cpp @@ -36,7 +36,6 @@ #include "scene/gui/box_container.h" #include "scene/gui/label.h" #include "scene/gui/panel.h" -#include "scene/gui/texture_rect.h" #include "scene/gui/view_panner.h" #include "editor/editor_scale.h" @@ -95,6 +94,8 @@ Size2i TileAtlasView::_compute_alternative_tiles_control_size() { } void TileAtlasView::_update_zoom_and_panning(bool p_zoom_on_mouse_pos) { + // Don't allow zoom to go below 1% or above 10000% + zoom_widget->set_zoom(CLAMP(zoom_widget->get_zoom(), 0.01f, 100.f)); float zoom = zoom_widget->get_zoom(); // Compute the minimum sizes. @@ -523,13 +524,13 @@ void TileAtlasView::update() { void TileAtlasView::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: - case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); - break; + } break; - case NOTIFICATION_READY: + case NOTIFICATION_READY: { button_center_view->set_icon(get_theme_icon(SNAME("CenterView"), SNAME("EditorIcons"))); - break; + } break; } } diff --git a/editor/plugins/tiles/tile_atlas_view.h b/editor/plugins/tiles/tile_atlas_view.h index 37ef7d6a2a..caf3ef9e4b 100644 --- a/editor/plugins/tiles/tile_atlas_view.h +++ b/editor/plugins/tiles/tile_atlas_view.h @@ -37,8 +37,6 @@ #include "scene/gui/center_container.h" #include "scene/gui/label.h" #include "scene/gui/margin_container.h" -#include "scene/gui/scroll_container.h" -#include "scene/gui/texture_rect.h" #include "scene/resources/tile_set.h" class ViewPanner; diff --git a/editor/plugins/tiles/tile_data_editors.cpp b/editor/plugins/tiles/tile_data_editors.cpp index 12003738e7..6c12573cc4 100644 --- a/editor/plugins/tiles/tile_data_editors.cpp +++ b/editor/plugins/tiles/tile_data_editors.cpp @@ -35,12 +35,13 @@ #include "core/math/geometry_2d.h" #include "core/os/keyboard.h" +#include "editor/editor_node.h" #include "editor/editor_properties.h" #include "editor/editor_scale.h" void TileDataEditor::_tile_set_changed_plan_update() { _tile_set_changed_update_needed = true; - call_deferred("_tile_set_changed_deferred_update"); + call_deferred(SNAME("_tile_set_changed_deferred_update")); } void TileDataEditor::_tile_set_changed_deferred_update() { @@ -743,6 +744,8 @@ void GenericTilePolygonEditor::_bind_methods() { } GenericTilePolygonEditor::GenericTilePolygonEditor() { + editor_undo_redo = EditorNode::get_undo_redo(); + toolbar = memnew(HBoxContainer); add_child(toolbar); @@ -1157,17 +1160,17 @@ void TileDataDefaultEditor::setup_property_editor(Variant::Type p_type, String p void TileDataDefaultEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_THEME_CHANGED: { picker_button->set_icon(get_theme_icon(SNAME("ColorPick"), SNAME("EditorIcons"))); tile_bool_checked = get_theme_icon(SNAME("TileChecked"), SNAME("EditorIcons")); tile_bool_unchecked = get_theme_icon(SNAME("TileUnchecked"), SNAME("EditorIcons")); - break; - default: - break; + } break; } } TileDataDefaultEditor::TileDataDefaultEditor() { + undo_redo = EditorNode::get_undo_redo(); + label = memnew(Label); label->set_text(TTR("Painting:")); add_child(label); @@ -1310,15 +1313,15 @@ void TileDataOcclusionShapeEditor::_tile_set_changed() { void TileDataOcclusionShapeEditor::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_ENTER_TREE: { polygon_editor->set_polygons_color(get_tree()->get_debug_collisions_color()); - break; - default: - break; + } break; } } TileDataOcclusionShapeEditor::TileDataOcclusionShapeEditor() { + undo_redo = EditorNode::get_undo_redo(); + polygon_editor = memnew(GenericTilePolygonEditor); add_child(polygon_editor); } @@ -1507,15 +1510,15 @@ void TileDataCollisionEditor::_tile_set_changed() { void TileDataCollisionEditor::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_ENTER_TREE: { polygon_editor->set_polygons_color(get_tree()->get_debug_collisions_color()); - break; - default: - break; + } break; } } TileDataCollisionEditor::TileDataCollisionEditor() { + undo_redo = EditorNode::get_undo_redo(); + polygon_editor = memnew(GenericTilePolygonEditor); polygon_editor->set_multiple_polygon_mode(true); polygon_editor->connect("polygons_changed", callable_mp(this, &TileDataCollisionEditor::_polygons_changed)); @@ -2478,15 +2481,15 @@ void TileDataTerrainsEditor::draw_over_tile(CanvasItem *p_canvas_item, Transform void TileDataTerrainsEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_THEME_CHANGED: { picker_button->set_icon(get_theme_icon(SNAME("ColorPick"), SNAME("EditorIcons"))); - break; - default: - break; + } break; } } TileDataTerrainsEditor::TileDataTerrainsEditor() { + undo_redo = EditorNode::get_undo_redo(); + label = memnew(Label); label->set_text("Painting:"); add_child(label); @@ -2582,15 +2585,15 @@ void TileDataNavigationEditor::_tile_set_changed() { void TileDataNavigationEditor::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_ENTER_TREE: { polygon_editor->set_polygons_color(get_tree()->get_debug_navigation_color()); - break; - default: - break; + } break; } } TileDataNavigationEditor::TileDataNavigationEditor() { + undo_redo = EditorNode::get_undo_redo(); + polygon_editor = memnew(GenericTilePolygonEditor); polygon_editor->set_multiple_polygon_mode(true); add_child(polygon_editor); diff --git a/editor/plugins/tiles/tile_data_editors.h b/editor/plugins/tiles/tile_data_editors.h index e4551d3302..99724760a7 100644 --- a/editor/plugins/tiles/tile_data_editors.h +++ b/editor/plugins/tiles/tile_data_editors.h @@ -33,9 +33,7 @@ #include "tile_atlas_view.h" -#include "editor/editor_node.h" #include "editor/editor_properties.h" - #include "scene/2d/tile_map.h" #include "scene/gui/box_container.h" #include "scene/gui/control.h" @@ -95,7 +93,7 @@ private: bool multiple_polygon_mode = false; bool use_undo_redo = true; - UndoRedo *editor_undo_redo = EditorNode::get_undo_redo(); + UndoRedo *editor_undo_redo; // UI int hovered_polygon_index = -1; @@ -216,7 +214,7 @@ private: protected: DummyObject *dummy_object = memnew(DummyObject); - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + UndoRedo *undo_redo; StringName type; String property; @@ -281,7 +279,7 @@ private: virtual void _setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, Map<TileMapCell, Variant> p_previous_values, Variant p_new_value) override; protected: - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + UndoRedo *undo_redo; virtual void _tile_set_changed() override; @@ -316,7 +314,7 @@ class TileDataCollisionEditor : public TileDataDefaultEditor { virtual void _setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, Map<TileMapCell, Variant> p_previous_values, Variant p_new_value) override; protected: - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + UndoRedo *undo_redo; virtual void _tile_set_changed() override; @@ -368,7 +366,7 @@ protected: void _notification(int p_what); - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + UndoRedo *undo_redo; public: virtual Control *get_toolbar() override { return toolbar; }; @@ -401,7 +399,7 @@ private: virtual void _setup_undo_redo_action(TileSetAtlasSource *p_tile_set_atlas_source, Map<TileMapCell, Variant> p_previous_values, Variant p_new_value) override; protected: - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + UndoRedo *undo_redo; virtual void _tile_set_changed() override; diff --git a/editor/plugins/tiles/tile_map_editor.cpp b/editor/plugins/tiles/tile_map_editor.cpp index dcda434093..4a0fc0b29f 100644 --- a/editor/plugins/tiles/tile_map_editor.cpp +++ b/editor/plugins/tiles/tile_map_editor.cpp @@ -32,6 +32,7 @@ #include "tiles_editor_plugin.h" +#include "editor/editor_node.h" #include "editor/editor_resource_preview.h" #include "editor/editor_scale.h" #include "editor/plugins/canvas_item_editor_plugin.h" @@ -848,9 +849,9 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over // Fade out the border of the grid. float left_opacity = CLAMP(Math::inverse_lerp(0.0f, (float)fading, (float)pos_in_rect.x), 0.0f, 1.0f); - float right_opacity = CLAMP(Math::inverse_lerp((float)drawn_grid_rect.size.x, (float)(drawn_grid_rect.size.x - fading), (float)pos_in_rect.x), 0.0f, 1.0f); + float right_opacity = CLAMP(Math::inverse_lerp((float)drawn_grid_rect.size.x, (float)(drawn_grid_rect.size.x - fading), (float)(pos_in_rect.x + 1)), 0.0f, 1.0f); float top_opacity = CLAMP(Math::inverse_lerp(0.0f, (float)fading, (float)pos_in_rect.y), 0.0f, 1.0f); - float bottom_opacity = CLAMP(Math::inverse_lerp((float)drawn_grid_rect.size.y, (float)(drawn_grid_rect.size.y - fading), (float)pos_in_rect.y), 0.0f, 1.0f); + float bottom_opacity = CLAMP(Math::inverse_lerp((float)drawn_grid_rect.size.y, (float)(drawn_grid_rect.size.y - fading), (float)(pos_in_rect.y + 1)), 0.0f, 1.0f); float opacity = CLAMP(MIN(left_opacity, MIN(right_opacity, MIN(top_opacity, bottom_opacity))) + 0.1, 0.0f, 1.0f); Transform2D tile_xform; @@ -1327,15 +1328,35 @@ void TileMapEditorTilesPlugin::_stop_dragging() { Rect2i rect = Rect2i(tile_map->world_to_map(drag_start_mouse_pos), tile_map->world_to_map(mpos) - tile_map->world_to_map(drag_start_mouse_pos)).abs(); rect.size += Vector2i(1, 1); + int picked_source = -1; TypedArray<Vector2i> coords_array; for (int x = rect.position.x; x < rect.get_end().x; x++) { for (int y = rect.position.y; y < rect.get_end().y; y++) { Vector2i coords = Vector2i(x, y); - if (tile_map->get_cell_source_id(tile_map_layer, coords) != TileSet::INVALID_SOURCE) { + + int source = tile_map->get_cell_source_id(tile_map_layer, coords); + if (source != TileSet::INVALID_SOURCE) { coords_array.push_back(coords); + if (picked_source == -1) { + picked_source = source; + } else if (picked_source != source) { + picked_source = -2; + } } } } + + if (picked_source >= 0) { + for (int i = 0; i < sources_list->get_item_count(); i++) { + if (int(sources_list->get_item_metadata(i)) == picked_source) { + sources_list->set_current(i); + break; + } + } + sources_list->ensure_current_is_visible(); + TilesEditorPlugin::get_singleton()->set_sources_lists_current(picked_source); + } + Ref<TileMapPattern> new_selection_pattern = tile_map->get_pattern(tile_map_layer, coords_array); if (!new_selection_pattern->is_empty()) { selection_pattern = new_selection_pattern; @@ -1978,7 +1999,11 @@ void TileMapEditorTilesPlugin::_bind_methods() { } TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { - CanvasItemEditor::get_singleton()->get_viewport_control()->connect("mouse_exited", callable_mp(this, &TileMapEditorTilesPlugin::_mouse_exited_viewport)); + undo_redo = EditorNode::get_undo_redo(); + + CanvasItemEditor::get_singleton() + ->get_viewport_control() + ->connect("mouse_exited", callable_mp(this, &TileMapEditorTilesPlugin::_mouse_exited_viewport)); // --- Shortcuts --- ED_SHORTCUT("tiles_editor/cut", TTR("Cut"), KeyModifierMask::CMD | Key::X); @@ -2337,7 +2362,7 @@ Map<Vector2i, TileMapCell> TileMapEditorTerrainsPlugin::_draw_terrains(const Map bool to_replace_modified = true; while (to_replace_modified) { // Get the constraints from the removed cells. - removed_cells_constraints_set = tile_map->get_terrain_constraints_from_removed_cells_list(tile_map_layer, to_replace, p_terrain_set); + removed_cells_constraints_set = tile_map->get_terrain_constraints_from_removed_cells_list(tile_map_layer, to_replace, p_terrain_set, false); // Filter the sources to make sure they are in the potential_to_replace. Map<TileMap::TerrainConstraint, Set<Vector2i>> per_constraint_tiles; @@ -2996,9 +3021,9 @@ void TileMapEditorTerrainsPlugin::forward_canvas_draw_over_viewport(Control *p_o // Fade out the border of the grid. float left_opacity = CLAMP(Math::inverse_lerp(0.0f, (float)fading, (float)pos_in_rect.x), 0.0f, 1.0f); - float right_opacity = CLAMP(Math::inverse_lerp((float)drawn_grid_rect.size.x, (float)(drawn_grid_rect.size.x - fading), (float)pos_in_rect.x), 0.0f, 1.0f); + float right_opacity = CLAMP(Math::inverse_lerp((float)drawn_grid_rect.size.x, (float)(drawn_grid_rect.size.x - fading), (float)(pos_in_rect.x + 1)), 0.0f, 1.0f); float top_opacity = CLAMP(Math::inverse_lerp(0.0f, (float)fading, (float)pos_in_rect.y), 0.0f, 1.0f); - float bottom_opacity = CLAMP(Math::inverse_lerp((float)drawn_grid_rect.size.y, (float)(drawn_grid_rect.size.y - fading), (float)pos_in_rect.y), 0.0f, 1.0f); + float bottom_opacity = CLAMP(Math::inverse_lerp((float)drawn_grid_rect.size.y, (float)(drawn_grid_rect.size.y - fading), (float)(pos_in_rect.y + 1)), 0.0f, 1.0f); float opacity = CLAMP(MIN(left_opacity, MIN(right_opacity, MIN(top_opacity, bottom_opacity))) + 0.1, 0.0f, 1.0f); Transform2D tile_xform; @@ -3242,6 +3267,8 @@ void TileMapEditorTerrainsPlugin::edit(ObjectID p_tile_map_id, int p_tile_map_la } TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { + undo_redo = EditorNode::get_undo_redo(); + main_vbox_container = memnew(VBoxContainer); main_vbox_container->connect("tree_entered", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_theme)); main_vbox_container->connect("theme_changed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_theme)); @@ -3352,15 +3379,16 @@ TileMapEditorTerrainsPlugin::~TileMapEditorTerrainsPlugin() { void TileMapEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_THEME_CHANGED: { missing_tile_texture = get_theme_icon(SNAME("StatusWarning"), SNAME("EditorIcons")); warning_pattern_texture = get_theme_icon(SNAME("WarningPattern"), SNAME("EditorIcons")); advanced_menu_button->set_icon(get_theme_icon(SNAME("Tools"), SNAME("EditorIcons"))); toggle_grid_button->set_icon(get_theme_icon(SNAME("Grid"), SNAME("EditorIcons"))); toggle_grid_button->set_pressed(EditorSettings::get_singleton()->get("editors/tiles_editor/display_grid")); toogle_highlight_selected_layer_button->set_icon(get_theme_icon(SNAME("TileMapHighlightSelected"), SNAME("EditorIcons"))); - break; - case NOTIFICATION_INTERNAL_PROCESS: + } break; + + case NOTIFICATION_INTERNAL_PROCESS: { if (is_visible_in_tree() && tileset_changed_needs_update) { _update_bottom_panel(); _update_layers_selection(); @@ -3368,11 +3396,13 @@ void TileMapEditor::_notification(int p_what) { CanvasItemEditor::get_singleton()->update_viewport(); tileset_changed_needs_update = false; } - break; - case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: + } break; + + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { toggle_grid_button->set_pressed(EditorSettings::get_singleton()->get("editors/tiles_editor/display_grid")); - break; - case NOTIFICATION_VISIBILITY_CHANGED: + } break; + + case NOTIFICATION_VISIBILITY_CHANGED: { TileMap *tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); if (tile_map) { if (is_visible_in_tree()) { @@ -3381,7 +3411,7 @@ void TileMapEditor::_notification(int p_what) { tile_map->set_selected_layer(-1); } } - break; + } break; } } @@ -3735,7 +3765,7 @@ void TileMapEditor::_move_tile_map_array_element(Object *p_undo_redo, Object *p_ String str = pi.name.trim_prefix(p_array_prefix); int to_char_index = 0; while (to_char_index < str.length()) { - if (str[to_char_index] < '0' || str[to_char_index] > '9') { + if (!is_digit(str[to_char_index])) { break; } to_char_index++; @@ -3881,9 +3911,9 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) { // Fade out the border of the grid. float left_opacity = CLAMP(Math::inverse_lerp(0.0f, (float)fading, (float)pos_in_rect.x), 0.0f, 1.0f); - float right_opacity = CLAMP(Math::inverse_lerp((float)displayed_rect.size.x, (float)(displayed_rect.size.x - fading), (float)pos_in_rect.x), 0.0f, 1.0f); + float right_opacity = CLAMP(Math::inverse_lerp((float)displayed_rect.size.x, (float)(displayed_rect.size.x - fading), (float)(pos_in_rect.x + 1)), 0.0f, 1.0f); float top_opacity = CLAMP(Math::inverse_lerp(0.0f, (float)fading, (float)pos_in_rect.y), 0.0f, 1.0f); - float bottom_opacity = CLAMP(Math::inverse_lerp((float)displayed_rect.size.y, (float)(displayed_rect.size.y - fading), (float)pos_in_rect.y), 0.0f, 1.0f); + float bottom_opacity = CLAMP(Math::inverse_lerp((float)displayed_rect.size.y, (float)(displayed_rect.size.y - fading), (float)(pos_in_rect.y + 1)), 0.0f, 1.0f); float opacity = CLAMP(MIN(left_opacity, MIN(right_opacity, MIN(top_opacity, bottom_opacity))) + 0.1, 0.0f, 1.0f); Transform2D tile_xform; @@ -3945,6 +3975,8 @@ void TileMapEditor::edit(TileMap *p_tile_map) { } TileMapEditor::TileMapEditor() { + undo_redo = EditorNode::get_undo_redo(); + set_process_internal(true); // Shortcuts. @@ -3992,7 +4024,7 @@ TileMapEditor::TileMapEditor() { // Layer selector. layers_selection_popup = memnew(PopupMenu); layers_selection_popup->connect("id_pressed", callable_mp(this, &TileMapEditor::_layers_selection_id_pressed)); - layers_selection_popup->set_close_on_parent_focus(false); + layers_selection_popup->set_flag(Window::FLAG_POPUP, false); layers_selection_button = memnew(Button); layers_selection_button->set_toggle_mode(true); diff --git a/editor/plugins/tiles/tile_map_editor.h b/editor/plugins/tiles/tile_map_editor.h index 6fa0d01612..d09061015f 100644 --- a/editor/plugins/tiles/tile_map_editor.h +++ b/editor/plugins/tiles/tile_map_editor.h @@ -35,10 +35,18 @@ #include "core/os/thread.h" #include "core/typedefs.h" -#include "editor/editor_node.h" #include "scene/2d/tile_map.h" #include "scene/gui/box_container.h" +#include "scene/gui/check_box.h" +#include "scene/gui/item_list.h" +#include "scene/gui/menu_button.h" +#include "scene/gui/separator.h" +#include "scene/gui/spin_box.h" +#include "scene/gui/split_container.h" #include "scene/gui/tab_bar.h" +#include "scene/gui/tree.h" + +class UndoRedo; class TileMapEditorPlugin : public Object { public: @@ -61,7 +69,7 @@ class TileMapEditorTilesPlugin : public TileMapEditorPlugin { GDCLASS(TileMapEditorTilesPlugin, TileMapEditorPlugin); private: - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + UndoRedo *undo_redo; ObjectID tile_map_id; int tile_map_layer = -1; virtual void edit(ObjectID p_tile_map_id, int p_tile_map_layer) override; @@ -212,7 +220,7 @@ class TileMapEditorTerrainsPlugin : public TileMapEditorPlugin { GDCLASS(TileMapEditorTerrainsPlugin, TileMapEditorPlugin); private: - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + UndoRedo *undo_redo; ObjectID tile_map_id; int tile_map_layer = -1; virtual void edit(ObjectID p_tile_map_id, int p_tile_map_layer) override; @@ -298,7 +306,7 @@ class TileMapEditor : public VBoxContainer { GDCLASS(TileMapEditor, VBoxContainer); private: - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + UndoRedo *undo_redo; bool tileset_changed_needs_update = false; ObjectID tile_map_id; int tile_map_layer = -1; diff --git a/editor/plugins/tiles/tile_proxies_manager_dialog.cpp b/editor/plugins/tiles/tile_proxies_manager_dialog.cpp index ad44da8dc9..62f3bd6356 100644 --- a/editor/plugins/tiles/tile_proxies_manager_dialog.cpp +++ b/editor/plugins/tiles/tile_proxies_manager_dialog.cpp @@ -30,6 +30,7 @@ #include "tile_proxies_manager_dialog.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" void TileProxiesManagerDialog::_right_clicked(int p_item, Vector2 p_local_mouse_pos, Object *p_item_list) { @@ -312,6 +313,8 @@ void TileProxiesManagerDialog::update_tile_set(Ref<TileSet> p_tile_set) { } TileProxiesManagerDialog::TileProxiesManagerDialog() { + undo_redo = EditorNode::get_singleton()->get_undo_redo(); + // Tile proxy management window. set_title(TTR("Tile Proxies Management")); set_process_unhandled_key_input(true); diff --git a/editor/plugins/tiles/tile_proxies_manager_dialog.h b/editor/plugins/tiles/tile_proxies_manager_dialog.h index b235d44982..3f1461391e 100644 --- a/editor/plugins/tiles/tile_proxies_manager_dialog.h +++ b/editor/plugins/tiles/tile_proxies_manager_dialog.h @@ -31,9 +31,7 @@ #ifndef TILE_PROXIES_MANAGER_DIALOG_H #define TILE_PROXIES_MANAGER_DIALOG_H -#include "editor/editor_node.h" #include "editor/editor_properties.h" - #include "scene/2d/tile_map.h" #include "scene/gui/dialogs.h" #include "scene/gui/item_list.h" @@ -45,7 +43,7 @@ private: int commited_actions_count = 0; Ref<TileSet> tile_set; - UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo(); + UndoRedo *undo_redo; TileMapCell from; TileMapCell to; diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp index e708b83440..0c78a0f1c0 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp @@ -36,6 +36,7 @@ #include "editor/editor_scale.h" #include "editor/progress_dialog.h" +#include "editor/editor_node.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" #include "scene/gui/control.h" @@ -107,7 +108,7 @@ void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_bind_methods() { ClassDB::bind_method(D_METHOD("set_id", "id"), &TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::set_id); ClassDB::bind_method(D_METHOD("get_id"), &TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::get_id); - ADD_PROPERTY(PropertyInfo(Variant::INT, "id"), "set_id", "get_id"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "id", PROPERTY_HINT_RANGE, "0," + itos(INT_MAX) + ",1"), "set_id", "get_id"); ADD_SIGNAL(MethodInfo("changed", PropertyInfo(Variant::STRING, "what"))); } @@ -2269,7 +2270,7 @@ void TileSetAtlasSourceEditor::_auto_remove_tiles() { void TileSetAtlasSourceEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_THEME_CHANGED: { tool_setup_atlas_source_button->set_icon(get_theme_icon(SNAME("Tools"), SNAME("EditorIcons"))); tool_select_button->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); tool_paint_button->set_icon(get_theme_icon(SNAME("CanvasItem"), SNAME("EditorIcons"))); @@ -2280,8 +2281,9 @@ void TileSetAtlasSourceEditor::_notification(int p_what) { resize_handle = get_theme_icon(SNAME("EditorHandle"), SNAME("EditorIcons")); resize_handle_disabled = get_theme_icon(SNAME("EditorHandleDisabled"), SNAME("EditorIcons")); - break; - case NOTIFICATION_INTERNAL_PROCESS: + } break; + + case NOTIFICATION_INTERNAL_PROCESS: { if (tile_set_changed_needs_update) { // Update everything. _update_source_inspector(); @@ -2297,9 +2299,7 @@ void TileSetAtlasSourceEditor::_notification(int p_what) { tile_set_changed_needs_update = false; } - break; - default: - break; + } break; } } @@ -2311,6 +2311,8 @@ void TileSetAtlasSourceEditor::_bind_methods() { } TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { + undo_redo = EditorNode::get_undo_redo(); + set_process_unhandled_key_input(true); set_process_internal(true); @@ -2593,7 +2595,7 @@ void EditorPropertyTilePolygon::_polygons_changed() { changed_properties.push_back(vformat(element_pattern, i)); values.push_back(generic_tile_polygon_editor->get_polygon(i)); } - emit_signal("multiple_properties_changed", changed_properties, values, false); + emit_signal(SNAME("multiple_properties_changed"), changed_properties, values, false); } } } diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.h b/editor/plugins/tiles/tile_set_atlas_source_editor.h index 51771c59ba..4a90b821f8 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.h +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.h @@ -34,7 +34,6 @@ #include "tile_atlas_view.h" #include "tile_data_editors.h" -#include "editor/editor_node.h" #include "scene/gui/split_container.h" #include "scene/resources/tile_set.h" @@ -115,7 +114,7 @@ private: TileSetAtlasSource *tile_set_atlas_source = nullptr; int tile_set_atlas_source_id = TileSet::INVALID_SOURCE; - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + UndoRedo *undo_redo; bool tile_set_changed_needs_update = false; diff --git a/editor/plugins/tiles/tile_set_editor.cpp b/editor/plugins/tiles/tile_set_editor.cpp index be261927ee..49e589c9ef 100644 --- a/editor/plugins/tiles/tile_set_editor.cpp +++ b/editor/plugins/tiles/tile_set_editor.cpp @@ -33,6 +33,8 @@ #include "tile_data_editors.h" #include "tiles_editor_plugin.h" +#include "editor/editor_file_system.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "scene/gui/box_container.h" @@ -331,14 +333,15 @@ void TileSetEditor::_set_source_sort(int p_sort) { void TileSetEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_THEME_CHANGED: { sources_delete_button->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); sources_add_button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); source_sort_button->set_icon(get_theme_icon(SNAME("Sort"), SNAME("EditorIcons"))); sources_advanced_menu_button->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); missing_texture_texture = get_theme_icon(SNAME("TileSet"), SNAME("EditorIcons")); - break; - case NOTIFICATION_INTERNAL_PROCESS: + } break; + + case NOTIFICATION_INTERNAL_PROCESS: { if (tile_set_changed_needs_update) { if (tile_set.is_valid()) { tile_set->set_edited(true); @@ -347,9 +350,7 @@ void TileSetEditor::_notification(int p_what) { _update_patterns_list(); tile_set_changed_needs_update = false; } - break; - default: - break; + } break; } } @@ -458,7 +459,7 @@ void TileSetEditor::_move_tile_set_array_element(Object *p_undo_redo, Object *p_ String str = pi.name.trim_prefix(p_array_prefix); int to_char_index = 0; while (to_char_index < str.length()) { - if (str[to_char_index] < '0' || str[to_char_index] > '9') { + if (!is_digit(str[to_char_index])) { break; } to_char_index++; @@ -657,6 +658,8 @@ void TileSetEditor::edit(Ref<TileSet> p_tile_set) { TileSetEditor::TileSetEditor() { singleton = this; + undo_redo = EditorNode::get_undo_redo(); + set_process_internal(true); // TabBar. diff --git a/editor/plugins/tiles/tile_set_editor.h b/editor/plugins/tiles/tile_set_editor.h index a21c951c42..b79b37cf2e 100644 --- a/editor/plugins/tiles/tile_set_editor.h +++ b/editor/plugins/tiles/tile_set_editor.h @@ -33,6 +33,7 @@ #include "atlas_merging_dialog.h" #include "scene/gui/box_container.h" +#include "scene/gui/tab_bar.h" #include "scene/resources/tile_set.h" #include "tile_proxies_manager_dialog.h" #include "tile_set_atlas_source_editor.h" @@ -57,7 +58,7 @@ private: TileSetAtlasSourceEditor *tile_set_atlas_source_editor; TileSetScenesCollectionSourceEditor *tile_set_scenes_collection_source_editor; - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + UndoRedo *undo_redo; void _drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); bool _can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; diff --git a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp index 240c017b84..21ebcbd655 100644 --- a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp @@ -30,6 +30,8 @@ #include "tile_set_scenes_collection_source_editor.h" +#include "editor/editor_file_system.h" +#include "editor/editor_node.h" #include "editor/editor_resource_preview.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" @@ -328,12 +330,13 @@ void TileSetScenesCollectionSourceEditor::_update_scenes_list() { void TileSetScenesCollectionSourceEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: - case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_THEME_CHANGED: { scene_tile_add_button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); scene_tile_delete_button->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); _update_scenes_list(); - break; - case NOTIFICATION_INTERNAL_PROCESS: + } break; + + case NOTIFICATION_INTERNAL_PROCESS: { if (tile_set_scenes_collection_source_changed_needs_update) { // Update everything. _update_source_inspector(); @@ -342,14 +345,13 @@ void TileSetScenesCollectionSourceEditor::_notification(int p_what) { _update_tile_inspector(); tile_set_scenes_collection_source_changed_needs_update = false; } - break; - case NOTIFICATION_VISIBILITY_CHANGED: + } break; + + case NOTIFICATION_VISIBILITY_CHANGED: { // Update things just in case. _update_scenes_list(); _update_action_buttons(); - break; - default: - break; + } break; } } @@ -452,6 +454,8 @@ void TileSetScenesCollectionSourceEditor::_bind_methods() { } TileSetScenesCollectionSourceEditor::TileSetScenesCollectionSourceEditor() { + undo_redo = EditorNode::get_undo_redo(); + // -- Right side -- HSplitContainer *split_container_right_side = memnew(HSplitContainer); split_container_right_side->set_h_size_flags(SIZE_EXPAND_FILL); diff --git a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.h b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.h index 5b48ea4762..8904e8524a 100644 --- a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.h +++ b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.h @@ -31,10 +31,14 @@ #ifndef TILE_SET_SCENES_COLLECTION_SOURCE_EDITOR_H #define TILE_SET_SCENES_COLLECTION_SOURCE_EDITOR_H -#include "editor/editor_node.h" +#include "editor/editor_inspector.h" #include "scene/gui/box_container.h" +#include "scene/gui/button.h" +#include "scene/gui/item_list.h" #include "scene/resources/tile_set.h" +class UndoRedo; + class TileSetScenesCollectionSourceEditor : public HBoxContainer { GDCLASS(TileSetScenesCollectionSourceEditor, HBoxContainer); @@ -93,7 +97,7 @@ private: TileSetScenesCollectionSource *tile_set_scenes_collection_source = nullptr; int tile_set_source_id = -1; - UndoRedo *undo_redo = EditorNode::get_undo_redo(); + UndoRedo *undo_redo; bool tile_set_scenes_collection_source_changed_needs_update = false; diff --git a/editor/plugins/tiles/tiles_editor_plugin.cpp b/editor/plugins/tiles/tiles_editor_plugin.cpp index 4c644f33d4..4aabe0e6b7 100644 --- a/editor/plugins/tiles/tiles_editor_plugin.cpp +++ b/editor/plugins/tiles/tiles_editor_plugin.cpp @@ -161,9 +161,9 @@ void TilesEditorPlugin::_update_editors() { // Update visibility of bottom panel buttons. if (tileset_editor_button->is_pressed() && !tile_set.is_valid()) { if (tile_map) { - editor_node->make_bottom_panel_item_visible(tilemap_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(tilemap_editor); } else { - editor_node->hide_bottom_panel(); + EditorNode::get_singleton()->hide_bottom_panel(); } } } @@ -190,15 +190,15 @@ void TilesEditorPlugin::make_visible(bool p_visible) { tileset_editor_button->set_visible(tile_set.is_valid()); tilemap_editor_button->set_visible(tile_map); if (tile_map) { - editor_node->make_bottom_panel_item_visible(tilemap_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(tilemap_editor); } else { - editor_node->make_bottom_panel_item_visible(tileset_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(tileset_editor); } } else { tileset_editor_button->hide(); tilemap_editor_button->hide(); - editor_node->hide_bottom_panel(); + EditorNode::get_singleton()->hide_bottom_panel(); } } @@ -353,7 +353,7 @@ void TilesEditorPlugin::edit(Object *p_object) { tile_map_id = p_object->get_instance_id(); tile_map = Object::cast_to<TileMap>(ObjectDB::get_instance(tile_map_id)); tile_set = tile_map->get_tileset(); - editor_node->make_bottom_panel_item_visible(tilemap_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(tilemap_editor); } else if (p_object->is_class("TileSet")) { tile_set = Ref<TileSet>(p_object); if (tile_map) { @@ -362,7 +362,7 @@ void TilesEditorPlugin::edit(Object *p_object) { tile_map_id = ObjectID(); } } - editor_node->make_bottom_panel_item_visible(tileset_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(tileset_editor); } } @@ -379,14 +379,12 @@ bool TilesEditorPlugin::handles(Object *p_object) const { return p_object->is_class("TileMap") || p_object->is_class("TileSet"); } -TilesEditorPlugin::TilesEditorPlugin(EditorNode *p_node) { +TilesEditorPlugin::TilesEditorPlugin() { set_process_internal(true); // Update the singleton. singleton = this; - editor_node = p_node; - // Tileset editor. tileset_editor = memnew(TileSetEditor); tileset_editor->set_h_size_flags(Control::SIZE_EXPAND_FILL); @@ -405,9 +403,9 @@ TilesEditorPlugin::TilesEditorPlugin(EditorNode *p_node) { pattern_preview_thread.start(_thread_func, this); // Bottom buttons. - tileset_editor_button = p_node->add_bottom_panel_item(TTR("TileSet"), tileset_editor); + tileset_editor_button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("TileSet"), tileset_editor); tileset_editor_button->hide(); - tilemap_editor_button = p_node->add_bottom_panel_item(TTR("TileMap"), tilemap_editor); + tilemap_editor_button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("TileMap"), tilemap_editor); tilemap_editor_button->hide(); // Initialization. diff --git a/editor/plugins/tiles/tiles_editor_plugin.h b/editor/plugins/tiles/tiles_editor_plugin.h index 487436b98a..eeff4da4e9 100644 --- a/editor/plugins/tiles/tiles_editor_plugin.h +++ b/editor/plugins/tiles/tiles_editor_plugin.h @@ -53,8 +53,6 @@ public: }; private: - EditorNode *editor_node; - bool tile_map_changed_needs_update = false; ObjectID tile_map_id; Ref<TileSet> tile_set; @@ -127,7 +125,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - TilesEditorPlugin(EditorNode *p_node); + TilesEditorPlugin(); ~TilesEditorPlugin(); }; diff --git a/editor/plugins/version_control_editor_plugin.h b/editor/plugins/version_control_editor_plugin.h index 86f98ad3aa..956c5a334f 100644 --- a/editor/plugins/version_control_editor_plugin.h +++ b/editor/plugins/version_control_editor_plugin.h @@ -33,8 +33,9 @@ #include "editor/editor_plugin.h" #include "editor/editor_vcs_interface.h" -#include "scene/gui/container.h" +#include "scene/gui/box_container.h" #include "scene/gui/rich_text_label.h" +#include "scene/gui/split_container.h" #include "scene/gui/text_edit.h" #include "scene/gui/tree.h" diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 30c13cbf65..a821faf6b3 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -37,6 +37,7 @@ #include "core/math/math_defs.h" #include "core/os/keyboard.h" #include "editor/editor_log.h" +#include "editor/editor_node.h" #include "editor/editor_properties.h" #include "editor/editor_scale.h" #include "scene/animation/animation_player.h" @@ -202,6 +203,10 @@ void VisualShaderGraphPlugin::set_input_port_default_value(VisualShader::Type p_ case Variant::FLOAT: { button->set_text(String::num(p_value, 4)); } break; + case Variant::VECTOR2: { + Vector2 v = p_value; + button->set_text(String::num(v.x, 3) + "," + String::num(v.y, 3)); + } break; case Variant::VECTOR3: { Vector3 v = p_value; button->set_text(String::num(v.x, 3) + "," + String::num(v.y, 3) + "," + String::num(v.z, 3)); @@ -358,10 +363,11 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { static Ref<StyleBoxEmpty> label_style = make_empty_stylebox(2, 1, 2, 1); - static const Color type_color[6] = { + static const Color type_color[7] = { Color(0.38, 0.85, 0.96), // scalar (float) Color(0.49, 0.78, 0.94), // scalar (int) - Color(0.84, 0.49, 0.93), // vector + Color(0.74, 0.57, 0.95), // vector2 + Color(0.84, 0.49, 0.93), // vector3 Color(0.55, 0.65, 0.94), // boolean Color(0.96, 0.66, 0.43), // transform Color(1.0, 1.0, 0.0), // sampler @@ -580,14 +586,14 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { Button *add_input_btn = memnew(Button); add_input_btn->set_text(TTR("Add Input")); - add_input_btn->connect("pressed", callable_mp(editor, &VisualShaderEditor::_add_input_port), varray(p_id, group_node->get_free_input_port_id(), VisualShaderNode::PORT_TYPE_VECTOR, input_port_name), CONNECT_DEFERRED); + add_input_btn->connect("pressed", callable_mp(editor, &VisualShaderEditor::_add_input_port), varray(p_id, group_node->get_free_input_port_id(), VisualShaderNode::PORT_TYPE_VECTOR_3D, input_port_name), CONNECT_DEFERRED); hb2->add_child(add_input_btn); hb2->add_spacer(); Button *add_output_btn = memnew(Button); add_output_btn->set_text(TTR("Add Output")); - add_output_btn->connect("pressed", callable_mp(editor, &VisualShaderEditor::_add_output_port), varray(p_id, group_node->get_free_output_port_id(), VisualShaderNode::PORT_TYPE_VECTOR, output_port_name), CONNECT_DEFERRED); + add_output_btn->connect("pressed", callable_mp(editor, &VisualShaderEditor::_add_output_port), varray(p_id, group_node->get_free_output_port_id(), VisualShaderNode::PORT_TYPE_VECTOR_3D, output_port_name), CONNECT_DEFERRED); hb2->add_child(add_output_btn); node->add_child(hb2); @@ -597,8 +603,15 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { int output_port_count = 0; for (int i = 0; i < vsnode->get_output_port_count(); i++) { if (vsnode->_is_output_port_expanded(i)) { - if (vsnode->get_output_port_type(i) == VisualShaderNode::PORT_TYPE_VECTOR) { - output_port_count += 3; + switch (vsnode->get_output_port_type(i)) { + case VisualShaderNode::PORT_TYPE_VECTOR_2D: { + output_port_count += 2; + } break; + case VisualShaderNode::PORT_TYPE_VECTOR_3D: { + output_port_count += 3; + } break; + default: + break; } } output_port_count++; @@ -608,10 +621,23 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { int expanded_port_counter = 0; for (int i = 0, j = 0; i < max_ports; i++, j++) { - if (expanded_type == VisualShaderNode::PORT_TYPE_VECTOR && expanded_port_counter >= 3) { - expanded_type = VisualShaderNode::PORT_TYPE_SCALAR; - expanded_port_counter = 0; - i -= 3; + switch (expanded_type) { + case VisualShaderNode::PORT_TYPE_VECTOR_2D: { + if (expanded_port_counter >= 2) { + expanded_type = VisualShaderNode::PORT_TYPE_SCALAR; + expanded_port_counter = 0; + i -= 2; + } + } break; + case VisualShaderNode::PORT_TYPE_VECTOR_3D: { + if (expanded_port_counter >= 3) { + expanded_type = VisualShaderNode::PORT_TYPE_SCALAR; + expanded_port_counter = 0; + i -= 3; + } + } break; + default: + break; } if (vsnode->is_port_separator(i)) { @@ -682,7 +708,8 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { hb->add_child(type_box); type_box->add_item(TTR("Float")); type_box->add_item(TTR("Int")); - type_box->add_item(TTR("Vector")); + type_box->add_item(TTR("Vector2")); + type_box->add_item(TTR("Vector3")); type_box->add_item(TTR("Boolean")); type_box->add_item(TTR("Transform")); type_box->add_item(TTR("Sampler")); @@ -743,7 +770,8 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { hb->add_child(type_box); type_box->add_item(TTR("Float")); type_box->add_item(TTR("Int")); - type_box->add_item(TTR("Vector")); + type_box->add_item(TTR("Vector2")); + type_box->add_item(TTR("Vector3")); type_box->add_item(TTR("Boolean")); type_box->add_item(TTR("Transform")); type_box->select(group_node->get_output_port_type(i)); @@ -805,31 +833,55 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { node->set_slot(idx, valid_left, port_left, type_color[port_left], valid_right, port_right, type_color[port_right]); if (vsnode->_is_output_port_expanded(i)) { - if (vsnode->get_output_port_type(i) == VisualShaderNode::PORT_TYPE_VECTOR) { - port_offset++; - valid_left = (i + 1) < vsnode->get_input_port_count(); - port_left = VisualShaderNode::PORT_TYPE_SCALAR; - if (valid_left) { - port_left = vsnode->get_input_port_type(i + 1); - } - node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], true, VisualShaderNode::PORT_TYPE_SCALAR, vector_expanded_color[0]); - port_offset++; + switch (vsnode->get_output_port_type(i)) { + case VisualShaderNode::PORT_TYPE_VECTOR_2D: { + port_offset++; + valid_left = (i + 1) < vsnode->get_input_port_count(); + port_left = VisualShaderNode::PORT_TYPE_SCALAR; + if (valid_left) { + port_left = vsnode->get_input_port_type(i + 1); + } + node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], true, VisualShaderNode::PORT_TYPE_SCALAR, vector_expanded_color[0]); + port_offset++; - valid_left = (i + 2) < vsnode->get_input_port_count(); - port_left = VisualShaderNode::PORT_TYPE_SCALAR; - if (valid_left) { - port_left = vsnode->get_input_port_type(i + 2); - } - node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], true, VisualShaderNode::PORT_TYPE_SCALAR, vector_expanded_color[1]); - port_offset++; + valid_left = (i + 2) < vsnode->get_input_port_count(); + port_left = VisualShaderNode::PORT_TYPE_SCALAR; + if (valid_left) { + port_left = vsnode->get_input_port_type(i + 2); + } + node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], true, VisualShaderNode::PORT_TYPE_SCALAR, vector_expanded_color[1]); + + expanded_type = VisualShaderNode::PORT_TYPE_VECTOR_2D; + } break; + case VisualShaderNode::PORT_TYPE_VECTOR_3D: { + port_offset++; + valid_left = (i + 1) < vsnode->get_input_port_count(); + port_left = VisualShaderNode::PORT_TYPE_SCALAR; + if (valid_left) { + port_left = vsnode->get_input_port_type(i + 1); + } + node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], true, VisualShaderNode::PORT_TYPE_SCALAR, vector_expanded_color[0]); + port_offset++; - valid_left = (i + 3) < vsnode->get_input_port_count(); - port_left = VisualShaderNode::PORT_TYPE_SCALAR; - if (valid_left) { - port_left = vsnode->get_input_port_type(i + 3); - } - node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], true, VisualShaderNode::PORT_TYPE_SCALAR, vector_expanded_color[2]); - expanded_type = VisualShaderNode::PORT_TYPE_VECTOR; + valid_left = (i + 2) < vsnode->get_input_port_count(); + port_left = VisualShaderNode::PORT_TYPE_SCALAR; + if (valid_left) { + port_left = vsnode->get_input_port_type(i + 2); + } + node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], true, VisualShaderNode::PORT_TYPE_SCALAR, vector_expanded_color[1]); + port_offset++; + + valid_left = (i + 3) < vsnode->get_input_port_count(); + port_left = VisualShaderNode::PORT_TYPE_SCALAR; + if (valid_left) { + port_left = vsnode->get_input_port_type(i + 3); + } + node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], true, VisualShaderNode::PORT_TYPE_SCALAR, vector_expanded_color[2]); + + expanded_type = VisualShaderNode::PORT_TYPE_VECTOR_3D; + } break; + default: + break; } } } @@ -1030,7 +1082,7 @@ void VisualShaderEditor::edit(VisualShader *p_visual_shader) { } void VisualShaderEditor::add_plugin(const Ref<VisualShaderNodePlugin> &p_plugin) { - if (plugins.find(p_plugin) != -1) { + if (plugins.has(p_plugin)) { return; } plugins.push_back(p_plugin); @@ -1378,7 +1430,10 @@ void VisualShaderEditor::_update_options_menu() { case VisualShaderNode::PORT_TYPE_SCALAR_INT: item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("int"), SNAME("EditorIcons"))); break; - case VisualShaderNode::PORT_TYPE_VECTOR: + case VisualShaderNode::PORT_TYPE_VECTOR_2D: + item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Vector2"), SNAME("EditorIcons"))); + break; + case VisualShaderNode::PORT_TYPE_VECTOR_3D: item->set_icon(0, EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Vector3"), SNAME("EditorIcons"))); break; case VisualShaderNode::PORT_TYPE_BOOLEAN: @@ -1476,6 +1531,7 @@ void VisualShaderEditor::_update_uniforms(bool p_update_refs) { if (uniform.is_valid()) { Ref<VisualShaderNodeFloatUniform> float_uniform = vsnode; Ref<VisualShaderNodeIntUniform> int_uniform = vsnode; + Ref<VisualShaderNodeVec2Uniform> vec2_uniform = vsnode; Ref<VisualShaderNodeVec3Uniform> vec3_uniform = vsnode; Ref<VisualShaderNodeColorUniform> color_uniform = vsnode; Ref<VisualShaderNodeBooleanUniform> bool_uniform = vsnode; @@ -1488,8 +1544,10 @@ void VisualShaderEditor::_update_uniforms(bool p_update_refs) { uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_INT; } else if (bool_uniform.is_valid()) { uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_BOOLEAN; + } else if (vec2_uniform.is_valid()) { + uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_VECTOR2; } else if (vec3_uniform.is_valid()) { - uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_VECTOR; + uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_VECTOR3; } else if (transform_uniform.is_valid()) { uniform_type = VisualShaderNodeUniformRef::UniformType::UNIFORM_TYPE_TRANSFORM; } else if (color_uniform.is_valid()) { @@ -1728,8 +1786,15 @@ void VisualShaderEditor::_expand_output_port(int p_node, int p_port, bool p_expa undo_redo->add_undo_method(node.ptr(), "_set_output_port_expanded", p_port, !p_expand); int type_size = 0; - if (node->get_output_port_type(p_port) == VisualShaderNode::PORT_TYPE_VECTOR) { - type_size = 3; + switch (node->get_output_port_type(p_port)) { + case VisualShaderNode::PORT_TYPE_VECTOR_2D: { + type_size = 2; + } break; + case VisualShaderNode::PORT_TYPE_VECTOR_3D: { + type_size = 3; + } break; + default: + break; } List<VisualShader::Connection> conns; @@ -2228,7 +2293,9 @@ void VisualShaderEditor::_setup_node(VisualShaderNode *p_node, const Vector<Vari if (vecOp) { ERR_FAIL_COND(p_ops[0].get_type() != Variant::INT); + ERR_FAIL_COND(p_ops[1].get_type() != Variant::INT); vecOp->set_operator((VisualShaderNodeVectorOp::Operator)(int)p_ops[0]); + vecOp->set_op_type((VisualShaderNodeVectorOp::OpType)(int)p_ops[1]); return; } } @@ -2239,7 +2306,9 @@ void VisualShaderEditor::_setup_node(VisualShaderNode *p_node, const Vector<Vari if (vecFunc) { ERR_FAIL_COND(p_ops[0].get_type() != Variant::INT); + ERR_FAIL_COND(p_ops[1].get_type() != Variant::INT); vecFunc->set_function((VisualShaderNodeVectorFunc::Function)(int)p_ops[0]); + vecFunc->set_op_type((VisualShaderNodeVectorFunc::OpType)(int)p_ops[1]); return; } } @@ -2310,7 +2379,29 @@ void VisualShaderEditor::_setup_node(VisualShaderNode *p_node, const Vector<Vari } } - //UV_FUNC + // VECTOR_COMPOSE + { + VisualShaderNodeVectorCompose *vecCompose = Object::cast_to<VisualShaderNodeVectorCompose>(p_node); + + if (vecCompose) { + ERR_FAIL_COND(p_ops[0].get_type() != Variant::INT); + vecCompose->set_op_type((VisualShaderNodeVectorCompose::OpType)(int)p_ops[0]); + return; + } + } + + // VECTOR_DECOMPOSE + { + VisualShaderNodeVectorDecompose *vecDecompose = Object::cast_to<VisualShaderNodeVectorDecompose>(p_node); + + if (vecDecompose) { + ERR_FAIL_COND(p_ops[0].get_type() != Variant::INT); + vecDecompose->set_op_type((VisualShaderNodeVectorDecompose::OpType)(int)p_ops[0]); + return; + } + } + + // UV_FUNC { VisualShaderNodeUVFunc *uvFunc = Object::cast_to<VisualShaderNodeUVFunc>(p_node); @@ -2343,21 +2434,26 @@ void VisualShaderEditor::_setup_node(VisualShaderNode *p_node, const Vector<Vari } } - // DERIVATIVE + // DISTANCE { - VisualShaderNodeScalarDerivativeFunc *sderFunc = Object::cast_to<VisualShaderNodeScalarDerivativeFunc>(p_node); + VisualShaderNodeVectorDistance *dist = Object::cast_to<VisualShaderNodeVectorDistance>(p_node); - if (sderFunc) { + if (dist) { ERR_FAIL_COND(p_ops[0].get_type() != Variant::INT); - sderFunc->set_function((VisualShaderNodeScalarDerivativeFunc::Function)(int)p_ops[0]); + dist->set_op_type((VisualShaderNodeVectorDistance::OpType)(int)p_ops[0]); return; } + } - VisualShaderNodeVectorDerivativeFunc *vderFunc = Object::cast_to<VisualShaderNodeVectorDerivativeFunc>(p_node); + // DERIVATIVE + { + VisualShaderNodeDerivativeFunc *derFunc = Object::cast_to<VisualShaderNodeDerivativeFunc>(p_node); - if (vderFunc) { + if (derFunc) { ERR_FAIL_COND(p_ops[0].get_type() != Variant::INT); - vderFunc->set_function((VisualShaderNodeVectorDerivativeFunc::Function)(int)p_ops[0]); + ERR_FAIL_COND(p_ops[1].get_type() != Variant::INT); + derFunc->set_function((VisualShaderNodeDerivativeFunc::Function)(int)p_ops[0]); + derFunc->set_op_type((VisualShaderNodeDerivativeFunc::OpType)(int)p_ops[1]); return; } } @@ -2395,6 +2491,26 @@ void VisualShaderEditor::_setup_node(VisualShaderNode *p_node, const Vector<Vari } } + // FACEFORWARD + { + VisualShaderNodeFaceForward *faceForward = Object::cast_to<VisualShaderNodeFaceForward>(p_node); + if (faceForward) { + ERR_FAIL_COND(p_ops[0].get_type() != Variant::INT); + faceForward->set_op_type((VisualShaderNodeFaceForward::OpType)(int)p_ops[0]); + return; + } + } + + // LENGTH + { + VisualShaderNodeVectorLen *length = Object::cast_to<VisualShaderNodeVectorLen>(p_node); + if (length) { + ERR_FAIL_COND(p_ops[0].get_type() != Variant::INT); + length->set_op_type((VisualShaderNodeVectorLen::OpType)(int)p_ops[0]); + return; + } + } + // SMOOTHSTEP { VisualShaderNodeSmoothStep *smoothStepFunc = Object::cast_to<VisualShaderNodeSmoothStep>(p_node); @@ -2469,7 +2585,7 @@ void VisualShaderEditor::_add_node(int p_idx, const Vector<Variant> &p_ops, Stri vsnode = Ref<VisualShaderNode>(vsn); } else { ERR_FAIL_COND(add_options[p_idx].script.is_null()); - String base_type = add_options[p_idx].script->get_instance_base_type(); + StringName base_type = add_options[p_idx].script->get_instance_base_type(); VisualShaderNode *vsn = Object::cast_to<VisualShaderNode>(ClassDB::instantiate(base_type)); ERR_FAIL_COND(!vsn); vsnode = Ref<VisualShaderNode>(vsn); @@ -2530,7 +2646,10 @@ void VisualShaderEditor::_add_node(int p_idx, const Vector<Variant> &p_ops, Stri case VisualShaderNode::PORT_TYPE_SCALAR_INT: initial_expression_code = "output0 = 1;"; break; - case VisualShaderNode::PORT_TYPE_VECTOR: + case VisualShaderNode::PORT_TYPE_VECTOR_2D: + initial_expression_code = "output0 = vec2(1.0, 1.0);"; + break; + case VisualShaderNode::PORT_TYPE_VECTOR_3D: initial_expression_code = "output0 = vec3(1.0, 1.0, 1.0);"; break; case VisualShaderNode::PORT_TYPE_BOOLEAN: @@ -2940,6 +3059,25 @@ void VisualShaderEditor::_convert_constants_to_uniforms(bool p_vice_versa) { } } + // vec2 + if (!caught) { + if (!p_vice_versa) { + Ref<VisualShaderNodeVec2Constant> vec2_const = Object::cast_to<VisualShaderNodeVec2Constant>(node.ptr()); + if (vec2_const.is_valid()) { + _replace_node(type_id, node_id, "VisualShaderNodeVec2Constant", "VisualShaderNodeVec2Uniform"); + var = vec2_const->get_constant(); + caught = true; + } + } else { + Ref<VisualShaderNodeVec2Uniform> vec2_uniform = Object::cast_to<VisualShaderNodeVec2Uniform>(node.ptr()); + if (vec2_uniform.is_valid()) { + _replace_node(type_id, node_id, "VisualShaderNodeVec2Uniform", "VisualShaderNodeVec2Constant"); + var = vec2_uniform->get_default_value(); + caught = true; + } + } + } + // vec3 if (!caught) { if (!p_vice_versa) { @@ -3235,91 +3373,98 @@ void VisualShaderEditor::_sbox_input(const Ref<InputEvent> &p_ie) { } void VisualShaderEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - node_filter->set_clear_button_enabled(true); - - // collapse tree by default - - TreeItem *category = members->get_root()->get_first_child(); - while (category) { - category->set_collapsed(true); - TreeItem *sub_category = category->get_first_child(); - while (sub_category) { - sub_category->set_collapsed(true); - sub_category = sub_category->get_next(); - } - category = category->get_next(); - } - } + switch (p_what) { + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + graph->get_panner()->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); + graph->set_warped_panning(bool(EditorSettings::get_singleton()->get("editors/panning/warped_mouse_panning"))); + } break; - if (p_what == NOTIFICATION_ENTER_TREE || p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - graph->get_panner()->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); - graph->set_warped_panning(bool(EditorSettings::get_singleton()->get("editors/panning/warped_mouse_panning"))); - } + case NOTIFICATION_ENTER_TREE: { + node_filter->set_clear_button_enabled(true); - if (p_what == NOTIFICATION_DRAG_BEGIN) { - Dictionary dd = get_viewport()->gui_get_drag_data(); - if (members->is_visible_in_tree() && dd.has("id")) { - members->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM); - } - } else if (p_what == NOTIFICATION_DRAG_END) { - members->set_drop_mode_flags(0); - } + // collapse tree by default + + TreeItem *category = members->get_root()->get_first_child(); + while (category) { + category->set_collapsed(true); + TreeItem *sub_category = category->get_first_child(); + while (sub_category) { + sub_category->set_collapsed(true); + sub_category = sub_category->get_next(); + } + category = category->get_next(); + } - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - highend_label->set_modulate(get_theme_color(SNAME("vulkan_color"), SNAME("Editor"))); + graph->get_panner()->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EditorSettings::get_singleton()->get("editors/panning/simple_panning"))); + graph->set_warped_panning(bool(EditorSettings::get_singleton()->get("editors/panning/warped_mouse_panning"))); + [[fallthrough]]; + } + case NOTIFICATION_THEME_CHANGED: { + highend_label->set_modulate(get_theme_color(SNAME("vulkan_color"), SNAME("Editor"))); - node_filter->set_right_icon(Control::get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); + node_filter->set_right_icon(Control::get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); - preview_shader->set_icon(Control::get_theme_icon(SNAME("Shader"), SNAME("EditorIcons"))); + preview_shader->set_icon(Control::get_theme_icon(SNAME("Shader"), SNAME("EditorIcons"))); - { - Color background_color = EDITOR_GET("text_editor/theme/highlighting/background_color"); - Color text_color = EDITOR_GET("text_editor/theme/highlighting/text_color"); - Color keyword_color = EDITOR_GET("text_editor/theme/highlighting/keyword_color"); - Color control_flow_keyword_color = EDITOR_GET("text_editor/theme/highlighting/control_flow_keyword_color"); - Color comment_color = EDITOR_GET("text_editor/theme/highlighting/comment_color"); - Color symbol_color = EDITOR_GET("text_editor/theme/highlighting/symbol_color"); - Color function_color = EDITOR_GET("text_editor/theme/highlighting/function_color"); - Color number_color = EDITOR_GET("text_editor/theme/highlighting/number_color"); - Color members_color = EDITOR_GET("text_editor/theme/highlighting/member_variable_color"); + { + Color background_color = EDITOR_GET("text_editor/theme/highlighting/background_color"); + Color text_color = EDITOR_GET("text_editor/theme/highlighting/text_color"); + Color keyword_color = EDITOR_GET("text_editor/theme/highlighting/keyword_color"); + Color control_flow_keyword_color = EDITOR_GET("text_editor/theme/highlighting/control_flow_keyword_color"); + Color comment_color = EDITOR_GET("text_editor/theme/highlighting/comment_color"); + Color symbol_color = EDITOR_GET("text_editor/theme/highlighting/symbol_color"); + Color function_color = EDITOR_GET("text_editor/theme/highlighting/function_color"); + Color number_color = EDITOR_GET("text_editor/theme/highlighting/number_color"); + Color members_color = EDITOR_GET("text_editor/theme/highlighting/member_variable_color"); - preview_text->add_theme_color_override("background_color", background_color); + preview_text->add_theme_color_override("background_color", background_color); - for (const String &E : keyword_list) { - if (ShaderLanguage::is_control_flow_keyword(E)) { - syntax_highlighter->add_keyword_color(E, control_flow_keyword_color); - } else { - syntax_highlighter->add_keyword_color(E, keyword_color); + for (const String &E : keyword_list) { + if (ShaderLanguage::is_control_flow_keyword(E)) { + syntax_highlighter->add_keyword_color(E, control_flow_keyword_color); + } else { + syntax_highlighter->add_keyword_color(E, keyword_color); + } } - } - preview_text->add_theme_font_override("font", get_theme_font(SNAME("expression"), SNAME("EditorFonts"))); - preview_text->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("expression_size"), SNAME("EditorFonts"))); - preview_text->add_theme_color_override("font_color", text_color); - syntax_highlighter->set_number_color(number_color); - syntax_highlighter->set_symbol_color(symbol_color); - syntax_highlighter->set_function_color(function_color); - syntax_highlighter->set_member_variable_color(members_color); - syntax_highlighter->clear_color_regions(); - syntax_highlighter->add_color_region("/*", "*/", comment_color, false); - syntax_highlighter->add_color_region("//", "", comment_color, true); + preview_text->add_theme_font_override("font", get_theme_font(SNAME("expression"), SNAME("EditorFonts"))); + preview_text->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("expression_size"), SNAME("EditorFonts"))); + preview_text->add_theme_color_override("font_color", text_color); + syntax_highlighter->set_number_color(number_color); + syntax_highlighter->set_symbol_color(symbol_color); + syntax_highlighter->set_function_color(function_color); + syntax_highlighter->set_member_variable_color(members_color); + syntax_highlighter->clear_color_regions(); + syntax_highlighter->add_color_region("/*", "*/", comment_color, false); + syntax_highlighter->add_color_region("//", "", comment_color, true); + + preview_text->clear_comment_delimiters(); + preview_text->add_comment_delimiter("/*", "*/", false); + preview_text->add_comment_delimiter("//", "", true); + + error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); + error_label->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); + error_label->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + } - preview_text->clear_comment_delimiters(); - preview_text->add_comment_delimiter("/*", "*/", false); - preview_text->add_comment_delimiter("//", "", true); + tools->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Tools"), SNAME("EditorIcons"))); - error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); - error_label->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); - error_label->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); - error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); - } + if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree()) { + _update_graph(); + } + } break; - tools->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Tools"), SNAME("EditorIcons"))); + case NOTIFICATION_DRAG_BEGIN: { + Dictionary dd = get_viewport()->gui_get_drag_data(); + if (members->is_visible_in_tree() && dd.has("id")) { + members->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM); + } + } break; - if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree()) { - _update_graph(); - } + case NOTIFICATION_DRAG_END: { + members->set_drop_mode_flags(0); + } break; } } @@ -4044,7 +4189,8 @@ VisualShaderEditor::VisualShaderEditor() { graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_SCALAR); graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_SCALAR_INT); graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_BOOLEAN); - graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_VECTOR); + graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_VECTOR_2D); + graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_VECTOR_3D); graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_TRANSFORM); graph->add_valid_right_disconnect_type(VisualShaderNode::PORT_TYPE_SAMPLER); //graph->add_valid_left_disconnect_type(0); @@ -4063,19 +4209,28 @@ VisualShaderEditor::VisualShaderEditor() { graph->connect("visibility_changed", callable_mp(this, &VisualShaderEditor::_visibility_changed)); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_SCALAR); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_SCALAR_INT); - graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_VECTOR); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_VECTOR_2D); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_VECTOR_3D); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_BOOLEAN); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT, VisualShaderNode::PORT_TYPE_SCALAR_INT); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT, VisualShaderNode::PORT_TYPE_SCALAR); - graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT, VisualShaderNode::PORT_TYPE_VECTOR); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT, VisualShaderNode::PORT_TYPE_VECTOR_2D); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT, VisualShaderNode::PORT_TYPE_VECTOR_3D); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR_INT, VisualShaderNode::PORT_TYPE_BOOLEAN); - graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR, VisualShaderNode::PORT_TYPE_SCALAR); - graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR, VisualShaderNode::PORT_TYPE_SCALAR_INT); - graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR, VisualShaderNode::PORT_TYPE_VECTOR); - graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR, VisualShaderNode::PORT_TYPE_BOOLEAN); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR_2D, VisualShaderNode::PORT_TYPE_SCALAR); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR_2D, VisualShaderNode::PORT_TYPE_SCALAR_INT); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR_2D, VisualShaderNode::PORT_TYPE_VECTOR_2D); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR_2D, VisualShaderNode::PORT_TYPE_VECTOR_3D); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR_2D, VisualShaderNode::PORT_TYPE_BOOLEAN); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR_3D, VisualShaderNode::PORT_TYPE_SCALAR); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR_3D, VisualShaderNode::PORT_TYPE_SCALAR_INT); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR_3D, VisualShaderNode::PORT_TYPE_VECTOR_2D); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR_3D, VisualShaderNode::PORT_TYPE_VECTOR_3D); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_VECTOR_3D, VisualShaderNode::PORT_TYPE_BOOLEAN); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN, VisualShaderNode::PORT_TYPE_SCALAR); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN, VisualShaderNode::PORT_TYPE_SCALAR_INT); - graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN, VisualShaderNode::PORT_TYPE_VECTOR); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN, VisualShaderNode::PORT_TYPE_VECTOR_2D); + graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN, VisualShaderNode::PORT_TYPE_VECTOR_3D); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_BOOLEAN, VisualShaderNode::PORT_TYPE_BOOLEAN); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_TRANSFORM, VisualShaderNode::PORT_TYPE_TRANSFORM); graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SAMPLER, VisualShaderNode::PORT_TYPE_SAMPLER); @@ -4299,27 +4454,31 @@ VisualShaderEditor::VisualShaderEditor() { // COLOR - add_options.push_back(AddOption("ColorFunc", "Color", "Common", "VisualShaderNodeColorFunc", TTR("Color function."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("ColorOp", "Color", "Common", "VisualShaderNodeColorOp", TTR("Color operator."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("ColorFunc", "Color", "Common", "VisualShaderNodeColorFunc", TTR("Color function."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ColorOp", "Color", "Common", "VisualShaderNodeColorOp", TTR("Color operator."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Grayscale", "Color", "Functions", "VisualShaderNodeColorFunc", TTR("Grayscale function."), { VisualShaderNodeColorFunc::FUNC_GRAYSCALE }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("HSV2RGB", "Color", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts HSV vector to RGB equivalent."), { VisualShaderNodeVectorFunc::FUNC_HSV2RGB }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("RGB2HSV", "Color", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts RGB vector to HSV equivalent."), { VisualShaderNodeVectorFunc::FUNC_RGB2HSV }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Sepia", "Color", "Functions", "VisualShaderNodeColorFunc", TTR("Sepia function."), { VisualShaderNodeColorFunc::FUNC_SEPIA }, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("Grayscale", "Color", "Functions", "VisualShaderNodeColorFunc", TTR("Grayscale function."), { VisualShaderNodeColorFunc::FUNC_GRAYSCALE }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("HSV2RGB", "Color", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts HSV vector to RGB equivalent."), { VisualShaderNodeVectorFunc::FUNC_HSV2RGB, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("RGB2HSV", "Color", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts RGB vector to HSV equivalent."), { VisualShaderNodeVectorFunc::FUNC_RGB2HSV, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Sepia", "Color", "Functions", "VisualShaderNodeColorFunc", TTR("Sepia function."), { VisualShaderNodeColorFunc::FUNC_SEPIA }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Burn", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Burn operator."), { VisualShaderNodeColorOp::OP_BURN }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Darken", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Darken operator."), { VisualShaderNodeColorOp::OP_DARKEN }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Difference", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Difference operator."), { VisualShaderNodeColorOp::OP_DIFFERENCE }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Dodge", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Dodge operator."), { VisualShaderNodeColorOp::OP_DODGE }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("HardLight", "Color", "Operators", "VisualShaderNodeColorOp", TTR("HardLight operator."), { VisualShaderNodeColorOp::OP_HARD_LIGHT }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Lighten", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Lighten operator."), { VisualShaderNodeColorOp::OP_LIGHTEN }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Overlay", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Overlay operator."), { VisualShaderNodeColorOp::OP_OVERLAY }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Screen", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Screen operator."), { VisualShaderNodeColorOp::OP_SCREEN }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("SoftLight", "Color", "Operators", "VisualShaderNodeColorOp", TTR("SoftLight operator."), { VisualShaderNodeColorOp::OP_SOFT_LIGHT }, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("Burn", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Burn operator."), { VisualShaderNodeColorOp::OP_BURN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Darken", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Darken operator."), { VisualShaderNodeColorOp::OP_DARKEN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Difference", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Difference operator."), { VisualShaderNodeColorOp::OP_DIFFERENCE }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Dodge", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Dodge operator."), { VisualShaderNodeColorOp::OP_DODGE }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("HardLight", "Color", "Operators", "VisualShaderNodeColorOp", TTR("HardLight operator."), { VisualShaderNodeColorOp::OP_HARD_LIGHT }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Lighten", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Lighten operator."), { VisualShaderNodeColorOp::OP_LIGHTEN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Overlay", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Overlay operator."), { VisualShaderNodeColorOp::OP_OVERLAY }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Screen", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Screen operator."), { VisualShaderNodeColorOp::OP_SCREEN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("SoftLight", "Color", "Operators", "VisualShaderNodeColorOp", TTR("SoftLight operator."), { VisualShaderNodeColorOp::OP_SOFT_LIGHT }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); add_options.push_back(AddOption("ColorConstant", "Color", "Variables", "VisualShaderNodeColorConstant", TTR("Color constant."))); add_options.push_back(AddOption("ColorUniform", "Color", "Variables", "VisualShaderNodeColorUniform", TTR("Color uniform."))); + // COMMON + + add_options.push_back(AddOption("DerivativeFunc", "Common", "", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) Derivative function."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + // CONDITIONAL const String &compare_func_desc = TTR("Returns the boolean result of the %s comparison between two parameters."); @@ -4327,13 +4486,14 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Equal", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Equal (==)")), { VisualShaderNodeCompare::FUNC_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); add_options.push_back(AddOption("GreaterThan", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Greater Than (>)")), { VisualShaderNodeCompare::FUNC_GREATER_THAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); add_options.push_back(AddOption("GreaterThanEqual", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Greater Than or Equal (>=)")), { VisualShaderNodeCompare::FUNC_GREATER_THAN_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("If", "Conditional", "Functions", "VisualShaderNodeIf", TTR("Returns an associated vector if the provided scalars are equal, greater or less."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("If", "Conditional", "Functions", "VisualShaderNodeIf", TTR("Returns an associated vector if the provided scalars are equal, greater or less."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); add_options.push_back(AddOption("IsInf", "Conditional", "Functions", "VisualShaderNodeIs", TTR("Returns the boolean result of the comparison between INF and a scalar parameter."), { VisualShaderNodeIs::FUNC_IS_INF }, VisualShaderNode::PORT_TYPE_BOOLEAN)); add_options.push_back(AddOption("IsNaN", "Conditional", "Functions", "VisualShaderNodeIs", TTR("Returns the boolean result of the comparison between NaN and a scalar parameter."), { VisualShaderNodeIs::FUNC_IS_NAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); add_options.push_back(AddOption("LessThan", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Less Than (<)")), { VisualShaderNodeCompare::FUNC_LESS_THAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); add_options.push_back(AddOption("LessThanEqual", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Less Than or Equal (<=)")), { VisualShaderNodeCompare::FUNC_LESS_THAN_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); add_options.push_back(AddOption("NotEqual", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Not Equal (!=)")), { VisualShaderNodeCompare::FUNC_NOT_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("Switch", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated vector if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_VECTOR }, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("Switch", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated 3D vector if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Switch2D", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated 2D vector if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); add_options.push_back(AddOption("SwitchBool", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated boolean if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_BOOLEAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); add_options.push_back(AddOption("SwitchFloat", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated floating-point scalar if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_FLOAT }, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("SwitchInt", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated integer scalar if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_INT }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); @@ -4349,35 +4509,35 @@ VisualShaderEditor::VisualShaderEditor() { const String input_param_shader_modes = TTR("'%s' input parameter for all shader modes."); - // SPATIAL-FOR-ALL + // NODE3D-FOR-ALL add_options.push_back(AddOption("Camera", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "camera"), { "camera" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("InvCamera", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "inv_camera"), { "inv_camera" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("InvProjection", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "inv_projection"), { "inv_projection" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Normal", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "normal"), { "normal" }, VisualShaderNode::PORT_TYPE_VECTOR, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Normal", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "normal"), { "normal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("OutputIsSRGB", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "output_is_srgb"), { "output_is_srgb" }, VisualShaderNode::PORT_TYPE_BOOLEAN, -1, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("Projection", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "projection"), { "projection" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("Time", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("UV", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv"), { "uv" }, VisualShaderNode::PORT_TYPE_VECTOR, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("UV2", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv2"), { "uv2" }, VisualShaderNode::PORT_TYPE_VECTOR, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewportSize", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "viewport_size"), { "viewport_size" }, VisualShaderNode::PORT_TYPE_VECTOR, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("UV", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv"), { "uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("UV2", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv2"), { "uv2" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewportSize", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "viewport_size"), { "viewport_size" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("World", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "world"), { "world" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); // CANVASITEM-FOR-ALL add_options.push_back(AddOption("Alpha", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "alpha"), { "alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Color", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "color"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR, -1, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("TexturePixelSize", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "texture_pixel_size"), { "texture_pixel_size" }, VisualShaderNode::PORT_TYPE_VECTOR, -1, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Color", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "color"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("TexturePixelSize", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "texture_pixel_size"), { "texture_pixel_size" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("Time", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("UV", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv"), { "uv" }, VisualShaderNode::PORT_TYPE_VECTOR, -1, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("UV", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv"), { "uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_CANVAS_ITEM)); // PARTICLES-FOR-ALL add_options.push_back(AddOption("Active", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "active"), { "active" }, VisualShaderNode::PORT_TYPE_BOOLEAN, -1, Shader::MODE_PARTICLES)); add_options.push_back(AddOption("Alpha", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "alpha"), { "alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("AttractorForce", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "attractor_force"), { "attractor_force" }, VisualShaderNode::PORT_TYPE_VECTOR, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("Color", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "color"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("Custom", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "custom"), { "custom" }, VisualShaderNode::PORT_TYPE_VECTOR, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("AttractorForce", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "attractor_force"), { "attractor_force" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Color", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "color"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Custom", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "custom"), { "custom" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_PARTICLES)); add_options.push_back(AddOption("CustomAlpha", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "custom_alpha"), { "custom_alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_PARTICLES)); add_options.push_back(AddOption("Delta", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "delta"), { "delta" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_PARTICLES)); add_options.push_back(AddOption("EmissionTransform", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "emission_transform"), { "emission_transform" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_PARTICLES)); @@ -4386,7 +4546,7 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Restart", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "restart"), { "restart" }, VisualShaderNode::PORT_TYPE_BOOLEAN, -1, Shader::MODE_PARTICLES)); add_options.push_back(AddOption("Time", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_PARTICLES)); add_options.push_back(AddOption("Transform", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "transform"), { "transform" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("Velocity", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "velocity"), { "velocity" }, VisualShaderNode::PORT_TYPE_VECTOR, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Velocity", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "velocity"), { "velocity" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_PARTICLES)); ///////////////// @@ -4409,78 +4569,78 @@ VisualShaderEditor::VisualShaderEditor() { // NODE3D INPUTS add_options.push_back(AddOption("Alpha", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "alpha"), { "alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Binormal", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal"), { "binormal" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Color", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Binormal", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal"), { "binormal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Color", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("InstanceId", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_id"), { "instance_id" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("InstanceCustom", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_custom"), { "instance_custom" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("InstanceCustom", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_custom"), { "instance_custom" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("InstanceCustomAlpha", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_custom_alpha"), { "instance_custom_alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("ModelView", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "modelview"), { "modelview" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("PointSize", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "point_size"), { "point_size" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Tangent", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "tangent"), { "tangent" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Vertex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Tangent", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "tangent"), { "tangent" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Vertex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("Alpha", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "alpha"), { "alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Binormal", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal"), { "binormal" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Color", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Binormal", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal"), { "binormal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Color", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("DepthTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "depth_texture"), { "depth_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("FragCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("FragCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("FrontFacing", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "front_facing"), { "front_facing" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("PointCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "point_coord"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("PointCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "point_coord"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("ScreenTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_texture"), { "screen_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ScreenUV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_uv"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Tangent", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "tangent"), { "tangent" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Vertex", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("View", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view"), { "view" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ScreenUV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_uv"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Tangent", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "tangent"), { "tangent" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Vertex", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("View", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view"), { "view" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Albedo", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "albedo"), { "albedo" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Albedo", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "albedo"), { "albedo" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("Attenuation", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "attenuation"), { "attenuation" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Backlight", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "backlight"), { "backlight" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Diffuse", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "diffuse"), { "diffuse" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Light", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light"), { "light" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color"), { "light_color" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Backlight", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "backlight"), { "backlight" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Diffuse", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "diffuse"), { "diffuse" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Light", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light"), { "light" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color"), { "light_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("Metallic", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "metallic"), { "metallic" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); add_options.push_back(AddOption("Roughness", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "roughness"), { "roughness" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Specular", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "specular"), { "specular" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("View", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view"), { "view" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Specular", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "specular"), { "specular" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("View", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view"), { "view" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); // CANVASITEM INPUTS add_options.push_back(AddOption("AtLightPass", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "at_light_pass"), { "at_light_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("Canvas", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "canvas"), { "canvas" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("InstanceCustom", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_custom"), { "instance_custom" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("InstanceCustom", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_custom"), { "instance_custom" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("InstanceCustomAlpha", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_custom_alpha"), { "instance_custom_alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("PointSize", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "point_size"), { "point_size" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("Screen", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "screen"), { "screen" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Vertex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "vertex"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Vertex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "vertex"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("World", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "world"), { "world" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("AtLightPass", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "at_light_pass"), { "at_light_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("FragCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("FragCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("NormalTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "normal_texture"), { "normal_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("PointCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("ScreenPixelSize", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_pixel_size"), { "screen_pixel_size" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("PointCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ScreenPixelSize", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_pixel_size"), { "screen_pixel_size" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("ScreenTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_texture"), { "screen_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("ScreenUV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("SpecularShininess", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "specular_shininess"), { "specular_shininess" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ScreenUV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("SpecularShininess", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "specular_shininess"), { "specular_shininess" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("SpecularShininessAlpha", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "specular_shininess_alpha"), { "specular_shininess_alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("SpecularShininessTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "specular_shininess_texture"), { "specular_shininess_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("Texture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture"), { "texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Vertex", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "vertex"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Vertex", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "vertex"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Light", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light"), { "light" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Light", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light"), { "light" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("LightAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_alpha"), { "light_alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color"), { "light_color" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color"), { "light_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("LightColorAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color_alpha"), { "light_color_alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("LightPosition", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_position"), { "light_position" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("LightVertex", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "light_vertex"), { "light_vertex" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Normal", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "normal"), { "normal" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("PointCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("ScreenUV", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Shadow", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow"), { "shadow" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("LightPosition", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_position"), { "light_position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("LightVertex", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "light_vertex"), { "light_vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Normal", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "normal"), { "normal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("PointCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ScreenUV", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Shadow", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow"), { "shadow" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("ShadowAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow_alpha"), { "shadow_alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("SpecularShininess", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "specular_shininess"), { "specular_shininess" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("SpecularShininess", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "specular_shininess"), { "specular_shininess" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("SpecularShininessAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "specular_shininess_alpha"), { "specular_shininess_alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("Texture", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture"), { "texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); @@ -4489,66 +4649,66 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("AtCubeMapPass", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "at_cubemap_pass"), { "at_cubemap_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("AtHalfResPass", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "at_half_res_pass"), { "at_half_res_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("AtQuarterResPass", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "at_quarter_res_pass"), { "at_quarter_res_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("EyeDir", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "eyedir"), { "eyedir" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("HalfResColor", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "half_res_color"), { "half_res_color" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("EyeDir", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "eyedir"), { "eyedir" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("HalfResColor", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "half_res_color"), { "half_res_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("HalfResAlpha", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "half_res_alpha"), { "half_res_alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light0Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_color"), { "light0_color" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light0Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_direction"), { "light0_direction" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light0Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_color"), { "light0_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light0Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_direction"), { "light0_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("Light0Enabled", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_enabled"), { "light0_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("Light0Energy", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_energy"), { "light0_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light1Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_color"), { "light1_color" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light1Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_direction"), { "light1_direction" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light1Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_color"), { "light1_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light1Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_direction"), { "light1_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("Light1Enabled", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_enabled"), { "light1_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("Light1Energy", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_energy"), { "light1_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light2Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_color"), { "light2_color" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light2Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_direction"), { "light2_direction" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light2Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_color"), { "light2_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light2Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_direction"), { "light2_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("Light2Enabled", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_enabled"), { "light2_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("Light2Energy", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_energy"), { "light2_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light3Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_color"), { "light3_color" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light3Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_direction"), { "light3_direction" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light3Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_color"), { "light3_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light3Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_direction"), { "light3_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("Light3Enabled", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_enabled"), { "light3_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("Light3Energy", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_energy"), { "light3_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Position", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "position"), { "position" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("QuarterResColor", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "quarter_res_color"), { "quarter_res_color" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Position", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "position"), { "position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("QuarterResColor", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "quarter_res_color"), { "quarter_res_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("QuarterResAlpha", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "quarter_res_alpha"), { "quarter_res_alpha" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("Radiance", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "radiance"), { "radiance" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("ScreenUV", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "screen_uv"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("SkyCoords", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "sky_coords"), { "sky_coords" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("ScreenUV", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "screen_uv"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("SkyCoords", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "sky_coords"), { "sky_coords" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); add_options.push_back(AddOption("Time", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "time"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); // FOG INPUTS - add_options.push_back(AddOption("WorldPosition", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "world_position"), { "world_position" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); - add_options.push_back(AddOption("ObjectPosition", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "object_position"), { "object_position" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); - add_options.push_back(AddOption("UVW", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "uvw"), { "uvw" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); - add_options.push_back(AddOption("Extents", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "extents"), { "extents" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("WorldPosition", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "world_position"), { "world_position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("ObjectPosition", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "object_position"), { "object_position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("UVW", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "uvw"), { "uvw" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("Extents", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "extents"), { "extents" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); add_options.push_back(AddOption("SDF", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "sdf"), { "sdf" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); add_options.push_back(AddOption("Time", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "time"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); // PARTICLES INPUTS add_options.push_back(AddOption("CollisionDepth", "Input", "Collide", "VisualShaderNodeInput", vformat(input_param_for_collide_shader_mode, "collision_depth"), { "collision_depth" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("CollisionNormal", "Input", "Collide", "VisualShaderNodeInput", vformat(input_param_for_collide_shader_mode, "collision_normal"), { "collision_normal" }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("CollisionNormal", "Input", "Collide", "VisualShaderNodeInput", vformat(input_param_for_collide_shader_mode, "collision_normal"), { "collision_normal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); // PARTICLES add_options.push_back(AddOption("EmitParticle", "Particles", "", "VisualShaderNodeParticleEmit", "", {}, -1, TYPE_FLAGS_PROCESS | TYPE_FLAGS_PROCESS_CUSTOM | TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("ParticleAccelerator", "Particles", "", "VisualShaderNodeParticleAccelerator", "", {}, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("ParticleAccelerator", "Particles", "", "VisualShaderNodeParticleAccelerator", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES)); add_options.push_back(AddOption("ParticleRandomness", "Particles", "", "VisualShaderNodeParticleRandomness", "", {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_EMIT | TYPE_FLAGS_PROCESS | TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("MultiplyByAxisAngle", "Particles", "Transform", "VisualShaderNodeParticleMultiplyByAxisAngle", TTR("A node for help to multiply a position input vector by rotation using specific axis. Intended to work with emitters."), {}, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT | TYPE_FLAGS_PROCESS | TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("MultiplyByAxisAngle", "Particles", "Transform", "VisualShaderNodeParticleMultiplyByAxisAngle", TTR("A node for help to multiply a position input vector by rotation using specific axis. Intended to work with emitters."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT | TYPE_FLAGS_PROCESS | TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("BoxEmitter", "Particles", "Emitters", "VisualShaderNodeParticleBoxEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("MeshEmitter", "Particles", "Emitters", "VisualShaderNodeParticleMeshEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("RingEmitter", "Particles", "Emitters", "VisualShaderNodeParticleRingEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("SphereEmitter", "Particles", "Emitters", "VisualShaderNodeParticleSphereEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("BoxEmitter", "Particles", "Emitters", "VisualShaderNodeParticleBoxEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("MeshEmitter", "Particles", "Emitters", "VisualShaderNodeParticleMeshEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("RingEmitter", "Particles", "Emitters", "VisualShaderNodeParticleRingEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("SphereEmitter", "Particles", "Emitters", "VisualShaderNodeParticleSphereEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("ConeVelocity", "Particles", "Velocity", "VisualShaderNodeParticleConeVelocity", "", {}, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("ConeVelocity", "Particles", "Velocity", "VisualShaderNodeParticleConeVelocity", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); // SCALAR add_options.push_back(AddOption("FloatFunc", "Scalar", "Common", "VisualShaderNodeFloatFunc", TTR("Float function."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("IntFunc", "Scalar", "Common", "VisualShaderNodeIntFunc", TTR("Integer function."), {}, VisualShaderNode::PORT_TYPE_SCALAR_INT)); add_options.push_back(AddOption("FloatOp", "Scalar", "Common", "VisualShaderNodeFloatOp", TTR("Float operator."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("IntFunc", "Scalar", "Common", "VisualShaderNodeIntFunc", TTR("Integer function."), {}, VisualShaderNode::PORT_TYPE_SCALAR_INT)); add_options.push_back(AddOption("IntOp", "Scalar", "Common", "VisualShaderNodeIntOp", TTR("Integer operator."), {}, VisualShaderNode::PORT_TYPE_SCALAR_INT)); // CONSTANTS @@ -4574,6 +4734,8 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Cos", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_COS }, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("CosH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_COSH }, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Degrees", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeFloatFunc::FUNC_DEGREES }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("DFdX", "Scalar", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'x' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_X, VisualShaderNodeDerivativeFunc::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("DFdY", "Scalar", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'y' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_Y, VisualShaderNodeDerivativeFunc::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); add_options.push_back(AddOption("Exp", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Base-e Exponential."), { VisualShaderNodeFloatFunc::FUNC_EXP }, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Exp2", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Base-2 Exponential."), { VisualShaderNodeFloatFunc::FUNC_EXP2 }, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Floor", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeFloatFunc::FUNC_FLOOR }, VisualShaderNode::PORT_TYPE_SCALAR)); @@ -4601,6 +4763,7 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Sqrt", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeFloatFunc::FUNC_SQRT }, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("SmoothStep", "Scalar", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Step", "Scalar", "Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Sum", "Scalar", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeDerivativeFunc::FUNC_SUM, VisualShaderNodeDerivativeFunc::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); add_options.push_back(AddOption("Tan", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeFloatFunc::FUNC_TAN }, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("TanH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeFloatFunc::FUNC_TANH }, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Trunc", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeFloatFunc::FUNC_TRUNC }, VisualShaderNode::PORT_TYPE_SCALAR)); @@ -4628,16 +4791,16 @@ VisualShaderEditor::VisualShaderEditor() { // SDF { - add_options.push_back(AddOption("ScreenUVToSDF", "SDF", "", "VisualShaderNodeScreenUVToSDF", TTR("Converts screen UV to a SDF."), {}, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ScreenUVToSDF", "SDF", "", "VisualShaderNodeScreenUVToSDF", TTR("Converts screen UV to a SDF."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("SDFRaymarch", "SDF", "", "VisualShaderNodeSDFRaymarch", TTR("Casts a ray against the screen SDF and returns the distance travelled."), {}, -1, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("SDFToScreenUV", "SDF", "", "VisualShaderNodeSDFToScreenUV", TTR("Converts a SDF to screen UV."), {}, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("SDFToScreenUV", "SDF", "", "VisualShaderNodeSDFToScreenUV", TTR("Converts a SDF to screen UV."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("TextureSDF", "SDF", "", "VisualShaderNodeTextureSDF", TTR("Performs a SDF texture lookup."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("TextureSDFNormal", "SDF", "", "VisualShaderNodeTextureSDFNormal", TTR("Performs a SDF normal texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("TextureSDFNormal", "SDF", "", "VisualShaderNodeTextureSDFNormal", TTR("Performs a SDF normal texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); } // TEXTURES - add_options.push_back(AddOption("UVFunc", "Textures", "Common", "VisualShaderNodeUVFunc", TTR("Function to be applied on texture coordinates."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("UVFunc", "Textures", "Common", "VisualShaderNodeUVFunc", TTR("Function to be applied on texture coordinates."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); cubemap_node_option_idx = add_options.size(); add_options.push_back(AddOption("CubeMap", "Textures", "Functions", "VisualShaderNodeCubemap", TTR("Perform the cubic texture lookup."))); @@ -4651,8 +4814,8 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Texture2DArray", "Textures", "Functions", "VisualShaderNodeTexture2DArray", TTR("Perform the 2D-array texture lookup."))); texture3d_node_option_idx = add_options.size(); add_options.push_back(AddOption("Texture3D", "Textures", "Functions", "VisualShaderNodeTexture3D", TTR("Perform the 3D texture lookup."))); - add_options.push_back(AddOption("UVPanning", "Textures", "Functions", "VisualShaderNodeUVFunc", TTR("Apply panning function on texture coordinates."), { VisualShaderNodeUVFunc::FUNC_PANNING }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("UVScaling", "Textures", "Functions", "VisualShaderNodeUVFunc", TTR("Apply scaling function on texture coordinates."), { VisualShaderNodeUVFunc::FUNC_SCALING }, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("UVPanning", "Textures", "Functions", "VisualShaderNodeUVFunc", TTR("Apply panning function on texture coordinates."), { VisualShaderNodeUVFunc::FUNC_PANNING }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("UVScaling", "Textures", "Functions", "VisualShaderNodeUVFunc", TTR("Apply scaling function on texture coordinates."), { VisualShaderNodeUVFunc::FUNC_SCALING }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); add_options.push_back(AddOption("CubeMapUniform", "Textures", "Variables", "VisualShaderNodeCubemapUniform", TTR("Cubic texture uniform lookup."))); add_options.push_back(AddOption("TextureUniform", "Textures", "Variables", "VisualShaderNodeTextureUniform", TTR("2D texture uniform lookup."))); @@ -4679,98 +4842,154 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Multiply", "Transform", "Operators", "VisualShaderNodeTransformOp", TTR("Multiplies two transforms."), { VisualShaderNodeTransformOp::OP_AxB }, VisualShaderNode::PORT_TYPE_TRANSFORM)); add_options.push_back(AddOption("MultiplyComp", "Transform", "Operators", "VisualShaderNodeTransformOp", TTR("Performs per-component multiplication of two transforms."), { VisualShaderNodeTransformOp::OP_AxB_COMP }, VisualShaderNode::PORT_TYPE_TRANSFORM)); add_options.push_back(AddOption("Subtract", "Transform", "Operators", "VisualShaderNodeTransformOp", TTR("Subtracts two transforms."), { VisualShaderNodeTransformOp::OP_A_MINUS_B }, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("TransformVectorMult", "Transform", "Operators", "VisualShaderNodeTransformVecMult", TTR("Multiplies vector by transform."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("TransformVectorMult", "Transform", "Operators", "VisualShaderNodeTransformVecMult", TTR("Multiplies vector by transform."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); add_options.push_back(AddOption("TransformConstant", "Transform", "Variables", "VisualShaderNodeTransformConstant", TTR("Transform constant."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); add_options.push_back(AddOption("TransformUniform", "Transform", "Variables", "VisualShaderNodeTransformUniform", TTR("Transform uniform."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); // VECTOR - add_options.push_back(AddOption("VectorFunc", "Vector", "Common", "VisualShaderNodeVectorFunc", TTR("Vector function."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("VectorOp", "Vector", "Common", "VisualShaderNodeVectorOp", TTR("Vector operator."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); - - add_options.push_back(AddOption("VectorCompose", "Vector", "Composition", "VisualShaderNodeVectorCompose", TTR("Composes vector from three scalars."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("VectorDecompose", "Vector", "Composition", "VisualShaderNodeVectorDecompose", TTR("Decomposes vector to three scalars."))); - - add_options.push_back(AddOption("Abs", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ABS }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("ACos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOS }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("ACosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOSH }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("ASin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASIN }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("ASinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASINH }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("ATan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATAN }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("ATan2", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the arc-tangent of the parameters."), { VisualShaderNodeVectorOp::OP_ATAN2 }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("ATanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATANH }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Ceil", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_CEIL }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Clamp", "Vector", "Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_VECTOR }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Cos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COS }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("CosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COSH }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Cross", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Calculates the cross product of two vectors."), { VisualShaderNodeVectorOp::OP_CROSS }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Degrees", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeVectorFunc::FUNC_DEGREES }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Distance", "Vector", "Functions", "VisualShaderNodeVectorDistance", TTR("Returns the distance between two points."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("VectorFunc", "Vector", "Common", "VisualShaderNodeVectorFunc", TTR("Vector function."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("VectorOp", "Vector", "Common", "VisualShaderNodeVectorOp", TTR("Vector operator."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("VectorCompose", "Vector", "Common", "VisualShaderNodeVectorCompose", TTR("Composes vector from three scalars."))); + add_options.push_back(AddOption("VectorDecompose", "Vector", "Common", "VisualShaderNodeVectorDecompose", TTR("Decomposes vector to three scalars."))); + + add_options.push_back(AddOption("Vector2Compose", "Vector", "Composition", "VisualShaderNodeVectorCompose", TTR("Composes 2D vector from three scalars."), { VisualShaderNodeVectorCompose::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Vector2Decompose", "Vector", "Composition", "VisualShaderNodeVectorDecompose", TTR("Decomposes 2D vector to three scalars."), { VisualShaderNodeVectorCompose::OP_TYPE_VECTOR_2D })); + add_options.push_back(AddOption("Vector3Compose", "Vector", "Composition", "VisualShaderNodeVectorCompose", TTR("Composes 3D vector from three scalars."), { VisualShaderNodeVectorCompose::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Vector3Decompose", "Vector", "Composition", "VisualShaderNodeVectorDecompose", TTR("Decomposes 3D vector to three scalars."), { VisualShaderNodeVectorCompose::OP_TYPE_VECTOR_3D })); + + add_options.push_back(AddOption("Abs", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ABS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Abs", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ABS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ACos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ACos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ACosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ACosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ASin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ASin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ASinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ASinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ATan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ATan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ATan2", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the arc-tangent of the parameters."), { VisualShaderNodeVectorOp::OP_ATAN2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ATan2", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the arc-tangent of the parameters."), { VisualShaderNodeVectorOp::OP_ATAN2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ATanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ATanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Ceil", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_CEIL }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Ceil", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_CEIL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Clamp", "Vector", "Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Clamp", "Vector", "Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Cos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Cos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("CosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("CosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Cross", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Calculates the cross product of two vectors."), { VisualShaderNodeVectorOp::OP_CROSS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Degrees", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeVectorFunc::FUNC_DEGREES, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Degrees", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeVectorFunc::FUNC_DEGREES, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("DFdX", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_X, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("DFdX", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_X, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("DFdY", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_Y, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("DFdY", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_Y, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("Distance2D", "Vector", "Functions", "VisualShaderNodeVectorDistance", TTR("Returns the distance between two points."), { VisualShaderNodeVectorDistance::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Distance3D", "Vector", "Functions", "VisualShaderNodeVectorDistance", TTR("Returns the distance between two points."), { VisualShaderNodeVectorDistance::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Dot", "Vector", "Functions", "VisualShaderNodeDotProduct", TTR("Calculates the dot product of two vectors."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Exp", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-e Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Exp2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP2 }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("FaceForward", "Vector", "Functions", "VisualShaderNodeFaceForward", TTR("Returns the vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Floor", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_FLOOR }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Fract", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Computes the fractional part of the argument."), { VisualShaderNodeVectorFunc::FUNC_FRAC }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("InverseSqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse of the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Length", "Vector", "Functions", "VisualShaderNodeVectorLen", TTR("Calculates the length of a vector."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Log", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Natural logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Log2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG2 }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Max", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the greater of two values."), { VisualShaderNodeVectorOp::OP_MAX }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Min", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the lesser of two values."), { VisualShaderNodeVectorOp::OP_MIN }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Mix", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors."), { VisualShaderNodeMix::OP_TYPE_VECTOR }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("MixS", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors using scalar."), { VisualShaderNodeMix::OP_TYPE_VECTOR_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("MultiplyAdd", "Vector", "Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on vectors."), { VisualShaderNodeMultiplyAdd::OP_TYPE_VECTOR }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Negate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_NEGATE }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Normalize", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Calculates the normalize product of vector."), { VisualShaderNodeVectorFunc::FUNC_NORMALIZE }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("OneMinus", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 - vector"), { VisualShaderNodeVectorFunc::FUNC_ONEMINUS }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Pow", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the value of the first parameter raised to the power of the second."), { VisualShaderNodeVectorOp::OP_POW }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Radians", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in degrees to radians."), { VisualShaderNodeVectorFunc::FUNC_RADIANS }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Reciprocal", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), { VisualShaderNodeVectorFunc::FUNC_RECIPROCAL }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Reflect", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the vector that points in the direction of reflection ( a : incident vector, b : normal vector )."), { VisualShaderNodeVectorOp::OP_REFLECT }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Refract", "Vector", "Functions", "VisualShaderNodeVectorRefract", TTR("Returns the vector that points in the direction of refraction."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Round", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUND }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("RoundEven", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest even integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Saturate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Clamps the value between 0.0 and 1.0."), { VisualShaderNodeVectorFunc::FUNC_SATURATE }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Sign", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIGN }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Sin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIN }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("SinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SINH }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Sqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SQRT }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("SmoothStep", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("SmoothStepS", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Step", "Vector", "Functions", "VisualShaderNodeStep", TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("StepS", "Vector", "Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Tan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TAN }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("TanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TANH }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Trunc", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TRUNC }, VisualShaderNode::PORT_TYPE_VECTOR)); - - add_options.push_back(AddOption("Add", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Adds vector to vector."), { VisualShaderNodeVectorOp::OP_ADD }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Divide", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Divides vector by vector."), { VisualShaderNodeVectorOp::OP_DIV }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Multiply", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Multiplies vector by vector."), { VisualShaderNodeVectorOp::OP_MUL }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Remainder", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Returns the remainder of the two vectors."), { VisualShaderNodeVectorOp::OP_MOD }, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Subtract", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Subtracts vector from vector."), { VisualShaderNodeVectorOp::OP_SUB }, VisualShaderNode::PORT_TYPE_VECTOR)); - - add_options.push_back(AddOption("VectorConstant", "Vector", "Variables", "VisualShaderNodeVec3Constant", TTR("Vector constant."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("VectorUniform", "Vector", "Variables", "VisualShaderNodeVec3Uniform", TTR("Vector uniform."), {}, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("Exp", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-e Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Exp", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-e Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Exp2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Exp2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("FaceForward", "Vector", "Functions", "VisualShaderNodeFaceForward", TTR("Returns the vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."), { VisualShaderNodeFaceForward::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("FaceForward", "Vector", "Functions", "VisualShaderNodeFaceForward", TTR("Returns the vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."), { VisualShaderNodeFaceForward::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Floor", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_FLOOR, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Floor", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_FLOOR, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Fract", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Computes the fractional part of the argument."), { VisualShaderNodeVectorFunc::FUNC_FRAC, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Fract", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Computes the fractional part of the argument."), { VisualShaderNodeVectorFunc::FUNC_FRAC, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Fresnel", "Vector", "Functions", "VisualShaderNodeFresnel", TTR("Returns falloff based on the dot product of surface normal and view direction of camera (pass associated inputs to it)."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("InverseSqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse of the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("InverseSqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse of the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Length", "Vector", "Functions", "VisualShaderNodeVectorLen", TTR("Calculates the length of a vector."), { VisualShaderNodeVectorLen::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Length", "Vector", "Functions", "VisualShaderNodeVectorLen", TTR("Calculates the length of a vector."), { VisualShaderNodeVectorLen::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Log", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Natural logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Log", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Natural logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Log2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Log2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Max", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the greater of two values."), { VisualShaderNodeVectorOp::OP_MAX, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Max", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the greater of two values."), { VisualShaderNodeVectorOp::OP_MAX, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Min", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the lesser of two values."), { VisualShaderNodeVectorOp::OP_MIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Min", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the lesser of two values."), { VisualShaderNodeVectorOp::OP_MIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Mix", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors."), { VisualShaderNodeMix::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Mix", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors."), { VisualShaderNodeMix::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("MixS", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors using scalar."), { VisualShaderNodeMix::OP_TYPE_VECTOR_2D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("MixS", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors using scalar."), { VisualShaderNodeMix::OP_TYPE_VECTOR_3D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("MultiplyAdd", "Vector", "Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on vectors."), { VisualShaderNodeMultiplyAdd::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("MultiplyAdd", "Vector", "Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on vectors."), { VisualShaderNodeMultiplyAdd::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Negate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_NEGATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Negate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_NEGATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Normalize", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Calculates the normalize product of vector."), { VisualShaderNodeVectorFunc::FUNC_NORMALIZE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Normalize", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Calculates the normalize product of vector."), { VisualShaderNodeVectorFunc::FUNC_NORMALIZE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("OneMinus", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 - vector"), { VisualShaderNodeVectorFunc::FUNC_ONEMINUS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("OneMinus", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 - vector"), { VisualShaderNodeVectorFunc::FUNC_ONEMINUS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Pow", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the value of the first parameter raised to the power of the second."), { VisualShaderNodeVectorOp::OP_POW, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Pow", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the value of the first parameter raised to the power of the second."), { VisualShaderNodeVectorOp::OP_POW, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Radians", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in degrees to radians."), { VisualShaderNodeVectorFunc::FUNC_RADIANS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Radians", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in degrees to radians."), { VisualShaderNodeVectorFunc::FUNC_RADIANS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Reciprocal", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), { VisualShaderNodeVectorFunc::FUNC_RECIPROCAL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Reciprocal", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), { VisualShaderNodeVectorFunc::FUNC_RECIPROCAL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Reflect", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the vector that points in the direction of reflection ( a : incident vector, b : normal vector )."), { VisualShaderNodeVectorOp::OP_REFLECT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Refract", "Vector", "Functions", "VisualShaderNodeVectorRefract", TTR("Returns the vector that points in the direction of refraction."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Round", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Round", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("RoundEven", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest even integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("RoundEven", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest even integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Saturate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Clamps the value between 0.0 and 1.0."), { VisualShaderNodeVectorFunc::FUNC_SATURATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Saturate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Clamps the value between 0.0 and 1.0."), { VisualShaderNodeVectorFunc::FUNC_SATURATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Sign", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIGN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Sign", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIGN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Sin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Sin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("SinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("SinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Sqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Sqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("SmoothStep", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("SmoothStep", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("SmoothStepS", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_2D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("SmoothStepS", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_3D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Step", "Vector", "Functions", "VisualShaderNodeStep", TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Step", "Vector", "Functions", "VisualShaderNodeStep", TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("StepS", "Vector", "Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_2D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("StepS", "Vector", "Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_3D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Sum", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeDerivativeFunc::FUNC_SUM, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("Sum", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeDerivativeFunc::FUNC_SUM, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("Tan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Tan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("TanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("TanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Trunc", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TRUNC, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Trunc", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TRUNC, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + + add_options.push_back(AddOption("Add", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Adds 2D vector to 2D vector."), { VisualShaderNodeVectorOp::OP_ADD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Add", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Adds 3D vector to 3D vector."), { VisualShaderNodeVectorOp::OP_ADD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Divide", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Divides 2D vector by 2D vector."), { VisualShaderNodeVectorOp::OP_DIV, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Divide", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Divides 3D vector by 3D vector."), { VisualShaderNodeVectorOp::OP_DIV, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Multiply", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Multiplies 2D vector by 2D vector."), { VisualShaderNodeVectorOp::OP_MUL, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Multiply", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Multiplies 3D vector by 3D vector."), { VisualShaderNodeVectorOp::OP_MUL, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Remainder", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Returns the remainder of the two 2D vectors."), { VisualShaderNodeVectorOp::OP_MOD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Remainder", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Returns the remainder of the two 3D vectors."), { VisualShaderNodeVectorOp::OP_MOD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Subtract", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Subtracts 2D vector from 2D vector."), { VisualShaderNodeVectorOp::OP_SUB, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Subtract", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Subtracts 3D vector from 3D vector."), { VisualShaderNodeVectorOp::OP_SUB, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + + add_options.push_back(AddOption("Vector2Constant", "Vector", "Variables", "VisualShaderNodeVec2Constant", TTR("2D vector constant."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Vector2Uniform", "Vector", "Variables", "VisualShaderNodeVec2Uniform", TTR("2D vector uniform."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Vector3Constant", "Vector", "Variables", "VisualShaderNodeVec3Constant", TTR("3D vector constant."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Vector3Uniform", "Vector", "Variables", "VisualShaderNodeVec3Uniform", TTR("3D vector uniform."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); // SPECIAL add_options.push_back(AddOption("Comment", "Special", "", "VisualShaderNodeComment", TTR("A rectangular area with a description string for better graph organization."))); add_options.push_back(AddOption("Expression", "Special", "", "VisualShaderNodeExpression", TTR("Custom Godot Shader Language expression, with custom amount of input and output ports. This is a direct injection of code into the vertex/fragment/light function, do not use it to write the function declarations inside."))); - add_options.push_back(AddOption("Fresnel", "Special", "", "VisualShaderNodeFresnel", TTR("Returns falloff based on the dot product of surface normal and view direction of camera (pass associated inputs to it)."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("GlobalExpression", "Special", "", "VisualShaderNodeGlobalExpression", TTR("Custom Godot Shader Language expression, which is placed on top of the resulted shader. You can place various function definitions inside and call it later in the Expressions. You can also declare varyings, uniforms and constants."))); add_options.push_back(AddOption("UniformRef", "Special", "", "VisualShaderNodeUniformRef", TTR("A reference to an existing uniform."))); - add_options.push_back(AddOption("ScalarDerivativeFunc", "Special", "Common", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) Scalar derivative function."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("VectorDerivativeFunc", "Special", "Common", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) Vector derivative function."), {}, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - - add_options.push_back(AddOption("DdX", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), { VisualShaderNodeVectorDerivativeFunc::FUNC_X }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("DdXS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'x' using local differencing."), { VisualShaderNodeScalarDerivativeFunc::FUNC_X }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("DdY", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), { VisualShaderNodeVectorDerivativeFunc::FUNC_Y }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("DdYS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'y' using local differencing."), { VisualShaderNodeScalarDerivativeFunc::FUNC_Y }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("Sum", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeVectorDerivativeFunc::FUNC_SUM }, VisualShaderNode::PORT_TYPE_VECTOR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("SumS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeScalarDerivativeFunc::FUNC_SUM }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); custom_node_option_idx = add_options.size(); ///////////////////////////////////////////////////////////////////// @@ -4806,13 +5025,13 @@ void VisualShaderEditorPlugin::make_visible(bool p_visible) { //editor->hide_animation_player_editors(); //editor->animation_panel_make_visible(true); button->show(); - editor->make_bottom_panel_item_visible(visual_shader_editor); + EditorNode::get_singleton()->make_bottom_panel_item_visible(visual_shader_editor); visual_shader_editor->update_custom_nodes(); visual_shader_editor->set_process_input(true); //visual_shader_editor->set_process(true); } else { if (visual_shader_editor->is_visible_in_tree()) { - editor->hide_bottom_panel(); + EditorNode::get_singleton()->hide_bottom_panel(); } button->hide(); visual_shader_editor->set_process_input(false); @@ -4820,12 +5039,11 @@ void VisualShaderEditorPlugin::make_visible(bool p_visible) { } } -VisualShaderEditorPlugin::VisualShaderEditorPlugin(EditorNode *p_node) { - editor = p_node; +VisualShaderEditorPlugin::VisualShaderEditorPlugin() { visual_shader_editor = memnew(VisualShaderEditor); visual_shader_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE); - button = editor->add_bottom_panel_item(TTR("VisualShader"), visual_shader_editor); + button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("VisualShader"), visual_shader_editor); button->hide(); } @@ -4841,8 +5059,10 @@ class VisualShaderNodePluginInputEditor : public OptionButton { public: void _notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - connect("item_selected", callable_mp(this, &VisualShaderNodePluginInputEditor::_item_selected)); + switch (p_what) { + case NOTIFICATION_READY: { + connect("item_selected", callable_mp(this, &VisualShaderNodePluginInputEditor::_item_selected)); + } break; } } @@ -4855,9 +5075,10 @@ public: void setup(const Ref<VisualShaderNodeInput> &p_input) { input = p_input; - Ref<Texture2D> type_icon[6] = { + Ref<Texture2D> type_icon[7] = { EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("float"), SNAME("EditorIcons")), EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("int"), SNAME("EditorIcons")), + EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Vector2"), SNAME("EditorIcons")), EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Vector3"), SNAME("EditorIcons")), EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("bool"), SNAME("EditorIcons")), EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Transform3D"), SNAME("EditorIcons")), @@ -4888,8 +5109,10 @@ class VisualShaderNodePluginUniformRefEditor : public OptionButton { public: void _notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - connect("item_selected", callable_mp(this, &VisualShaderNodePluginUniformRefEditor::_item_selected)); + switch (p_what) { + case NOTIFICATION_READY: { + connect("item_selected", callable_mp(this, &VisualShaderNodePluginUniformRefEditor::_item_selected)); + } break; } } @@ -4903,10 +5126,11 @@ public: void setup(const Ref<VisualShaderNodeUniformRef> &p_uniform_ref) { uniform_ref = p_uniform_ref; - Ref<Texture2D> type_icon[7] = { + Ref<Texture2D> type_icon[8] = { EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("float"), SNAME("EditorIcons")), EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("int"), SNAME("EditorIcons")), EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("bool"), SNAME("EditorIcons")), + EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Vector2"), SNAME("EditorIcons")), EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Vector3"), SNAME("EditorIcons")), EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Transform3D"), SNAME("EditorIcons")), EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Color"), SNAME("EditorIcons")), @@ -5301,29 +5525,31 @@ Size2 VisualShaderNodePortPreview::get_minimum_size() const { } void VisualShaderNodePortPreview::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - Vector<Vector2> points = { - Vector2(), - Vector2(get_size().width, 0), - get_size(), - Vector2(0, get_size().height) - }; - - Vector<Vector2> uvs = { - Vector2(0, 0), - Vector2(1, 0), - Vector2(1, 1), - Vector2(0, 1) - }; - - Vector<Color> colors = { - Color(1, 1, 1, 1), - Color(1, 1, 1, 1), - Color(1, 1, 1, 1), - Color(1, 1, 1, 1) - }; - - draw_primitive(points, colors, uvs); + switch (p_what) { + case NOTIFICATION_DRAW: { + Vector<Vector2> points = { + Vector2(), + Vector2(get_size().width, 0), + get_size(), + Vector2(0, get_size().height) + }; + + Vector<Vector2> uvs = { + Vector2(0, 0), + Vector2(1, 0), + Vector2(1, 1), + Vector2(0, 1) + }; + + Vector<Color> colors = { + Color(1, 1, 1, 1), + Color(1, 1, 1, 1), + Color(1, 1, 1, 1), + Color(1, 1, 1, 1) + }; + + draw_primitive(points, colors, uvs); + } break; } } diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index c5037853cd..02beba971b 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -31,13 +31,14 @@ #ifndef VISUAL_SHADER_EDITOR_PLUGIN_H #define VISUAL_SHADER_EDITOR_PLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/plugins/curve_editor_plugin.h" #include "editor/property_editor.h" #include "scene/gui/button.h" +#include "scene/gui/code_edit.h" #include "scene/gui/graph_edit.h" #include "scene/gui/popup.h" +#include "scene/gui/rich_text_label.h" #include "scene/gui/tree.h" #include "scene/resources/visual_shader.h" @@ -462,7 +463,6 @@ class VisualShaderEditorPlugin : public EditorPlugin { GDCLASS(VisualShaderEditorPlugin, EditorPlugin); VisualShaderEditor *visual_shader_editor = nullptr; - EditorNode *editor = nullptr; Button *button = nullptr; public: @@ -472,7 +472,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - VisualShaderEditorPlugin(EditorNode *p_node); + VisualShaderEditorPlugin(); ~VisualShaderEditorPlugin(); }; diff --git a/editor/plugins/voxel_gi_editor_plugin.cpp b/editor/plugins/voxel_gi_editor_plugin.cpp index cef29032b2..6fc6c1ad39 100644 --- a/editor/plugins/voxel_gi_editor_plugin.cpp +++ b/editor/plugins/voxel_gi_editor_plugin.cpp @@ -30,6 +30,9 @@ #include "voxel_gi_editor_plugin.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" + void VoxelGIEditorPlugin::_bake() { if (voxel_gi) { if (voxel_gi->get_probe_data().is_null()) { @@ -62,41 +65,43 @@ bool VoxelGIEditorPlugin::handles(Object *p_object) const { } void VoxelGIEditorPlugin::_notification(int p_what) { - if (p_what == NOTIFICATION_PROCESS) { - if (!voxel_gi) { - return; - } + switch (p_what) { + case NOTIFICATION_PROCESS: { + if (!voxel_gi) { + return; + } - // Set information tooltip on the Bake button. This information is useful - // to optimize performance (video RAM size) and reduce light leaking (individual cell size). + // Set information tooltip on the Bake button. This information is useful + // to optimize performance (video RAM size) and reduce light leaking (individual cell size). - const Vector3i size = voxel_gi->get_estimated_cell_size(); + const Vector3i size = voxel_gi->get_estimated_cell_size(); - const Vector3 extents = voxel_gi->get_extents(); + const Vector3 extents = voxel_gi->get_extents(); - const int data_size = 4; - const double size_mb = size.x * size.y * size.z * data_size / (1024.0 * 1024.0); - // Add a qualitative measurement to help the user assess whether a VoxelGI node is using a lot of VRAM. - String size_quality; - if (size_mb < 16.0) { - size_quality = TTR("Low"); - } else if (size_mb < 64.0) { - size_quality = TTR("Moderate"); - } else { - size_quality = TTR("High"); - } + const int data_size = 4; + const double size_mb = size.x * size.y * size.z * data_size / (1024.0 * 1024.0); + // Add a qualitative measurement to help the user assess whether a VoxelGI node is using a lot of VRAM. + String size_quality; + if (size_mb < 16.0) { + size_quality = TTR("Low"); + } else if (size_mb < 64.0) { + size_quality = TTR("Moderate"); + } else { + size_quality = TTR("High"); + } - String text; - text += vformat(TTR("Subdivisions: %s"), vformat(String::utf8("%d × %d × %d"), size.x, size.y, size.z)) + "\n"; - text += vformat(TTR("Cell size: %s"), vformat(String::utf8("%.3f × %.3f × %.3f"), extents.x / size.x, extents.y / size.y, extents.z / size.z)) + "\n"; - text += vformat(TTR("Video RAM size: %s MB (%s)"), String::num(size_mb, 2), size_quality); + String text; + text += vformat(TTR("Subdivisions: %s"), vformat(String::utf8("%d × %d × %d"), size.x, size.y, size.z)) + "\n"; + text += vformat(TTR("Cell size: %s"), vformat(String::utf8("%.3f × %.3f × %.3f"), extents.x / size.x, extents.y / size.y, extents.z / size.z)) + "\n"; + text += vformat(TTR("Video RAM size: %s MB (%s)"), String::num(size_mb, 2), size_quality); - // Only update the tooltip when needed to avoid constant redrawing. - if (bake->get_tooltip(Point2()) == text) { - return; - } + // Only update the tooltip when needed to avoid constant redrawing. + if (bake->get_tooltip(Point2()) == text) { + return; + } - bake->set_tooltip(text); + bake->set_tooltip(text); + } break; } } @@ -141,14 +146,13 @@ void VoxelGIEditorPlugin::_voxel_gi_save_path_and_bake(const String &p_path) { void VoxelGIEditorPlugin::_bind_methods() { } -VoxelGIEditorPlugin::VoxelGIEditorPlugin(EditorNode *p_node) { - editor = p_node; +VoxelGIEditorPlugin::VoxelGIEditorPlugin() { bake_hb = memnew(HBoxContainer); bake_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL); bake_hb->hide(); bake = memnew(Button); bake->set_flat(true); - bake->set_icon(editor->get_gui_base()->get_theme_icon(SNAME("Bake"), SNAME("EditorIcons"))); + bake->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Bake"), SNAME("EditorIcons"))); bake->set_text(TTR("Bake VoxelGI")); bake->connect("pressed", callable_mp(this, &VoxelGIEditorPlugin::_bake)); bake_hb->add_child(bake); diff --git a/editor/plugins/voxel_gi_editor_plugin.h b/editor/plugins/voxel_gi_editor_plugin.h index 4c7865d868..67bd1d5105 100644 --- a/editor/plugins/voxel_gi_editor_plugin.h +++ b/editor/plugins/voxel_gi_editor_plugin.h @@ -31,11 +31,13 @@ #ifndef VOXEL_GIEDITORPLUGIN_H #define VOXEL_GIEDITORPLUGIN_H -#include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/3d/voxel_gi.h" #include "scene/resources/material.h" +class EditorFileDialog; +struct EditorProgress; + class VoxelGIEditorPlugin : public EditorPlugin { GDCLASS(VoxelGIEditorPlugin, EditorPlugin); @@ -43,7 +45,6 @@ class VoxelGIEditorPlugin : public EditorPlugin { HBoxContainer *bake_hb; Button *bake; - EditorNode *editor; EditorFileDialog *probe_file; @@ -66,7 +67,7 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; - VoxelGIEditorPlugin(EditorNode *p_node); + VoxelGIEditorPlugin(); ~VoxelGIEditorPlugin(); }; diff --git a/editor/pot_generator.cpp b/editor/pot_generator.cpp index 4d9efefbd3..f6839bae6b 100644 --- a/editor/pot_generator.cpp +++ b/editor/pot_generator.cpp @@ -32,7 +32,7 @@ #include "core/config/project_settings.h" #include "core/error/error_macros.h" -#include "editor_translation_parser.h" +#include "editor/editor_translation_parser.h" #include "plugins/packed_scene_translation_parser_plugin.h" POTGenerator *POTGenerator::singleton = nullptr; diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp index 1644bd7e7f..ed13afc235 100644 --- a/editor/progress_dialog.cpp +++ b/editor/progress_dialog.cpp @@ -32,7 +32,7 @@ #include "core/object/message_queue.h" #include "core/os/os.h" -#include "editor_scale.h" +#include "editor/editor_scale.h" #include "main/main.h" #include "servers/display_server.h" diff --git a/editor/project_export.cpp b/editor/project_export.cpp index f39a494df8..55a4dc2c67 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -39,10 +39,10 @@ #include "core/os/os.h" #include "core/string/optimized_translation.h" #include "core/version_generated.gen.h" -#include "editor_data.h" -#include "editor_node.h" -#include "editor_scale.h" -#include "editor_settings.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" #include "scene/gui/box_container.h" #include "scene/gui/margin_container.h" #include "scene/gui/scroll_container.h" @@ -61,6 +61,7 @@ void ProjectExportDialog::_notification(int p_what) { EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "export", Rect2(get_position(), get_size())); } } break; + case NOTIFICATION_READY: { duplicate_preset->set_icon(presets->get_theme_icon(SNAME("Duplicate"), SNAME("EditorIcons"))); delete_preset->set_icon(presets->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); @@ -1275,8 +1276,6 @@ ProjectExportDialog::ProjectExportDialog() { set_hide_on_ok(false); - editor_icons = "EditorIcons"; - default_filename = EditorSettings::get_singleton()->get_project_metadata("export_options", "default_filename", ""); // If no default set, use project name if (default_filename.is_empty()) { diff --git a/editor/project_export.h b/editor/project_export.h index 3d90a0d3ff..569563ba55 100644 --- a/editor/project_export.h +++ b/editor/project_export.h @@ -34,7 +34,6 @@ #include "core/io/dir_access.h" #include "core/os/thread.h" #include "editor/editor_export.h" -#include "editor/editor_file_dialog.h" #include "editor/editor_file_system.h" #include "editor/editor_inspector.h" #include "editor/editor_properties.h" @@ -53,7 +52,7 @@ #include "scene/gui/tree.h" #include "scene/main/timer.h" -class EditorNode; +class EditorFileDialog; class ProjectExportDialog : public ConfirmationDialog { GDCLASS(ProjectExportDialog, ConfirmationDialog); @@ -85,8 +84,6 @@ private: Label *include_label; MarginContainer *include_margin; - StringName editor_icons; - Button *export_button; Button *export_all_button; AcceptDialog *export_all_dialog; diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 08e0f7ae30..87d008d144 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -30,6 +30,7 @@ #include "project_manager.h" +#include "core/config/project_settings.h" #include "core/io/config_file.h" #include "core/io/dir_access.h" #include "core/io/file_access.h" @@ -40,11 +41,11 @@ #include "core/os/os.h" #include "core/string/translation.h" #include "core/version.h" -#include "core/version_hash.gen.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" +#include "editor/editor_themes.h" #include "editor/editor_vcs_interface.h" -#include "editor_scale.h" -#include "editor_settings.h" -#include "editor_themes.h" #include "scene/gui/center_container.h" #include "scene/gui/line_edit.h" #include "scene/gui/margin_container.h" @@ -54,6 +55,7 @@ #include "scene/main/window.h" #include "servers/display_server.h" #include "servers/navigation_server_3d.h" +#include "servers/physics_server_2d.h" static inline String get_project_key_from_path(const String &dir) { return dir.replace("/", "::"); @@ -99,8 +101,8 @@ private: LineEdit *install_path; TextureRect *status_rect; TextureRect *install_status_rect; - FileDialog *fdialog; - FileDialog *fdialog_install; + EditorFileDialog *fdialog; + EditorFileDialog *fdialog_install; OptionButton *vcs_metadata_selection; String zip_path; String zip_title; @@ -364,19 +366,19 @@ private: fdialog->set_current_dir(project_path->get_text()); if (mode == MODE_IMPORT) { - fdialog->set_file_mode(FileDialog::FILE_MODE_OPEN_FILE); + fdialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); fdialog->clear_filters(); fdialog->add_filter(vformat("project.godot ; %s %s", VERSION_NAME, TTR("Project"))); fdialog->add_filter("*.zip ; " + TTR("ZIP File")); } else { - fdialog->set_file_mode(FileDialog::FILE_MODE_OPEN_DIR); + fdialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_DIR); } fdialog->popup_file_dialog(); } void _browse_install_path() { fdialog_install->set_current_dir(install_path->get_text()); - fdialog_install->set_file_mode(FileDialog::FILE_MODE_OPEN_DIR); + fdialog_install->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_DIR); fdialog_install->popup_file_dialog(); } @@ -645,8 +647,10 @@ private: } void _notification(int p_what) { - if (p_what == NOTIFICATION_WM_CLOSE_REQUEST) { - _remove_created_folder(); + switch (p_what) { + case NOTIFICATION_WM_CLOSE_REQUEST: { + _remove_created_folder(); + } break; } } @@ -924,12 +928,15 @@ public: spacer->set_h_size_flags(Control::SIZE_EXPAND_FILL); default_files_container->add_child(spacer); - fdialog = memnew(FileDialog); - fdialog->set_access(FileDialog::ACCESS_FILESYSTEM); - fdialog_install = memnew(FileDialog); - fdialog_install->set_access(FileDialog::ACCESS_FILESYSTEM); + fdialog = memnew(EditorFileDialog); + fdialog->set_previews_enabled(false); //Crucial, otherwise the engine crashes. + fdialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM); + fdialog_install = memnew(EditorFileDialog); + fdialog_install->set_previews_enabled(false); //Crucial, otherwise the engine crashes. + fdialog_install->set_access(EditorFileDialog::ACCESS_FILESYSTEM); add_child(fdialog); add_child(fdialog_install); + project_name->connect("text_changed", callable_mp(this, &ProjectDialog::_text_changed)); project_path->connect("text_changed", callable_mp(this, &ProjectDialog::_path_text_changed)); install_path->connect("text_changed", callable_mp(this, &ProjectDialog::_path_text_changed)); @@ -973,10 +980,12 @@ public: hover = true; update(); } break; + case NOTIFICATION_MOUSE_EXIT: { hover = false; update(); } break; + case NOTIFICATION_DRAW: { if (hover) { draw_style_box(get_theme_stylebox(SNAME("hover"), SNAME("Tree")), Rect2(Point2(), get_size())); @@ -1138,18 +1147,20 @@ void ProjectList::update_icons_async() { } void ProjectList::_notification(int p_what) { - if (p_what == NOTIFICATION_PROCESS) { - // Load icons as a coroutine to speed up launch when you have hundreds of projects - if (_icon_load_index < _projects.size()) { - Item &item = _projects.write[_icon_load_index]; - if (item.control->icon_needs_reload) { - load_project_icon(_icon_load_index); - } - _icon_load_index++; + switch (p_what) { + case NOTIFICATION_PROCESS: { + // Load icons as a coroutine to speed up launch when you have hundreds of projects + if (_icon_load_index < _projects.size()) { + Item &item = _projects.write[_icon_load_index]; + if (item.control->icon_needs_reload) { + load_project_icon(_icon_load_index); + } + _icon_load_index++; - } else { - set_process(false); - } + } else { + set_process(false); + } + } break; } } @@ -1423,7 +1434,7 @@ void ProjectList::create_project_item_control(int p_index) { Button *show = memnew(Button); // Display a folder icon if the project directory can be opened, or a "broken file" icon if it can't. - show->set_icon(get_theme_icon(!item.missing ? "Load" : "FileBroken", "EditorIcons")); + show->set_icon(get_theme_icon(!item.missing ? SNAME("Load") : SNAME("FileBroken"), SNAME("EditorIcons"))); show->set_flat(true); if (!item.grayed) { // Don't make the icon less prominent if the parent is already grayed out. @@ -1475,7 +1486,7 @@ void ProjectList::sort_projects() { bool visible = true; if (!_search_term.is_empty()) { String search_path; - if (_search_term.find("/") != -1) { + if (_search_term.contains("/")) { // Search path will match the whole path search_path = item.path; } else { @@ -1858,6 +1869,8 @@ void ProjectList::_bind_methods() { ADD_SIGNAL(MethodInfo(SIGNAL_PROJECT_ASK_OPEN)); } +ProjectManager *ProjectManager::singleton = nullptr; + void ProjectManager::_notification(int p_what) { switch (p_what) { case NOTIFICATION_TRANSLATION_CHANGED: @@ -1865,17 +1878,20 @@ void ProjectManager::_notification(int p_what) { settings_hb->set_anchors_and_offsets_preset(Control::PRESET_TOP_RIGHT); update(); } break; + case NOTIFICATION_ENTER_TREE: { search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); search_box->set_clear_button_enabled(true); Engine::get_singleton()->set_editor_hint(false); } break; + case NOTIFICATION_RESIZED: { if (open_templates->is_visible()) { open_templates->popup_centered(); } } break; + case NOTIFICATION_READY: { int default_sorting = (int)EditorSettings::get_singleton()->get("project_manager/sorting_order"); filter_option->select(default_sorting); @@ -1891,18 +1907,36 @@ void ProjectManager::_notification(int p_what) { search_box->grab_focus(); } } break; + case NOTIFICATION_VISIBILITY_CHANGED: { set_process_unhandled_key_input(is_visible_in_tree()); } break; + case NOTIFICATION_WM_CLOSE_REQUEST: { _dim_window(); } break; + case NOTIFICATION_WM_ABOUT: { _show_about(); } break; } } +Ref<Texture2D> ProjectManager::_file_dialog_get_icon(const String &p_path) { + return singleton->icon_type_cache["ObjectHR"]; +} + +void ProjectManager::_build_icon_type_cache(Ref<Theme> p_theme) { + List<StringName> tl; + p_theme->get_icon_list(SNAME("EditorIcons"), &tl); + for (List<StringName>::Element *E = tl.front(); E; E = E->next()) { + if (!ClassDB::class_exists(E->get())) { + continue; + } + icon_type_cache[E->get()] = p_theme->get_icon(E->get(), SNAME("EditorIcons")); + } +} + void ProjectManager::_dim_window() { // This method must be called before calling `get_tree()->quit()`. // Otherwise, its effect won't be visible @@ -2459,6 +2493,8 @@ void ProjectManager::_version_button_pressed() { } ProjectManager::ProjectManager() { + singleton = this; + // load settings if (!EditorSettings::get_singleton()) { EditorSettings::create(); @@ -2501,20 +2537,13 @@ ProjectManager::ProjectManager() { editor_set_scale(EditorSettings::get_singleton()->get("interface/editor/custom_display_scale")); break; } - - // 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 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)); + EditorFileDialog::get_icon_func = &ProjectManager::_file_dialog_get_icon; } // TRANSLATORS: This refers to the application where users manage their Godot projects. DisplayServer::get_singleton()->window_set_title(VERSION_NAME + String(" - ") + TTR("Project Manager")); - FileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files")); + EditorFileDialog::set_default_show_hidden_files(EditorSettings::get_singleton()->get("filesystem/file_dialog/show_hidden_files")); set_anchors_and_offsets_preset(Control::PRESET_WIDE); set_theme(create_custom_theme()); @@ -2745,9 +2774,10 @@ ProjectManager::ProjectManager() { language_restart_ask->get_cancel_button()->set_text(TTR("Continue")); add_child(language_restart_ask); - scan_dir = memnew(FileDialog); - scan_dir->set_access(FileDialog::ACCESS_FILESYSTEM); - scan_dir->set_file_mode(FileDialog::FILE_MODE_OPEN_DIR); + scan_dir = memnew(EditorFileDialog); + scan_dir->set_previews_enabled(false); + scan_dir->set_access(EditorFileDialog::ACCESS_FILESYSTEM); + scan_dir->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_DIR); scan_dir->set_title(TTR("Select a Folder to Scan")); // must be after mode or it's overridden scan_dir->set_current_dir(EditorSettings::get_singleton()->get("filesystem/directories/default_project_path")); add_child(scan_dir); @@ -2811,6 +2841,8 @@ ProjectManager::ProjectManager() { about = memnew(EditorAbout); add_child(about); + + _build_icon_type_cache(get_theme()); } _load_recent_projects(); @@ -2839,10 +2871,27 @@ ProjectManager::ProjectManager() { SceneTree::get_singleton()->get_root()->connect("files_dropped", callable_mp(this, &ProjectManager::_files_dropped)); + // 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); + + // Resize the bootsplash window based on Editor display scale EDSCALE. + float scale_factor = MAX(1, EDSCALE); + if (scale_factor > 1.0) { + Vector2i window_size = DisplayServer::get_singleton()->window_get_size(); + Vector2i screen_size = DisplayServer::get_singleton()->screen_get_size(); + window_size *= scale_factor; + Vector2i window_position; + window_position.x = (screen_size.x - window_size.x) / 2; + window_position.y = (screen_size.y - window_size.y) / 2; + DisplayServer::get_singleton()->window_set_size(window_size); + DisplayServer::get_singleton()->window_set_position(window_position); + } + OS::get_singleton()->set_low_processor_usage_mode(true); } ProjectManager::~ProjectManager() { + singleton = nullptr; if (EditorSettings::get_singleton()) { EditorSettings::destroy(); } diff --git a/editor/project_manager.h b/editor/project_manager.h index f99e879664..2965dc7d2e 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -50,6 +50,11 @@ enum FilterOption { class ProjectManager : public Control { GDCLASS(ProjectManager, Control); + Map<String, Ref<Texture2D>> icon_type_cache; + void _build_icon_type_cache(Ref<Theme> p_theme); + + static ProjectManager *singleton; + TabContainer *tabs; ProjectList *_project_list; @@ -67,7 +72,7 @@ class ProjectManager : public Control { EditorAssetLibrary *asset_library; - FileDialog *scan_dir; + EditorFileDialog *scan_dir; ConfirmationDialog *language_restart_ask; ConfirmationDialog *erase_ask; @@ -129,11 +134,15 @@ class ProjectManager : public Control { void _on_tab_changed(int p_tab); void _on_search_term_changed(const String &p_term); + static Ref<Texture2D> _file_dialog_get_icon(const String &p_path); + protected: void _notification(int p_what); static void _bind_methods(); public: + static ProjectManager *get_singleton() { return singleton; } + ProjectManager(); ~ProjectManager(); }; diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index bcc597d595..03179733d5 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -32,6 +32,7 @@ #include "core/config/project_settings.h" #include "editor/editor_export.h" +#include "editor/editor_log.h" #include "editor/editor_node.h" #include "editor/editor_scale.h" @@ -47,7 +48,8 @@ void ProjectSettingsEditor::popup_project_settings() { } _add_feature_overrides(); - inspector->update_category_list(); + general_settings_inspector->update_category_list(); + set_process_unhandled_input(true); localization_editor->update_translations(); autoload_settings->update_autoload(); @@ -74,7 +76,7 @@ void ProjectSettingsEditor::_setting_edited(const String &p_name) { void ProjectSettingsEditor::_advanced_toggled(bool p_button_pressed) { EditorSettings::get_singleton()->set_project_metadata("project_settings", "advanced_mode", p_button_pressed); - inspector->set_restrict_to_basic_settings(!p_button_pressed); + general_settings_inspector->set_restrict_to_basic_settings(!p_button_pressed); } void ProjectSettingsEditor::_setting_selected(const String &p_path) { @@ -82,7 +84,7 @@ void ProjectSettingsEditor::_setting_selected(const String &p_path) { return; } - property_box->set_text(inspector->get_current_section() + "/" + p_path); + property_box->set_text(general_settings_inspector->get_current_section() + "/" + p_path); _update_property_box(); // set_text doesn't trigger text_changed } @@ -99,13 +101,13 @@ void ProjectSettingsEditor::_add_setting() { undo_redo->add_do_property(ps, setting, value); undo_redo->add_undo_property(ps, setting, ps->has_setting(setting) ? ps->get(setting) : Variant()); - undo_redo->add_do_method(inspector, "update_category_list"); - undo_redo->add_undo_method(inspector, "update_category_list"); + undo_redo->add_do_method(general_settings_inspector, "update_category_list"); + undo_redo->add_undo_method(general_settings_inspector, "update_category_list"); undo_redo->add_do_method(this, "queue_save"); undo_redo->add_undo_method(this, "queue_save"); undo_redo->commit_action(); - inspector->set_current_section(setting.get_slice("/", 1)); + general_settings_inspector->set_current_section(setting.get_slice("/", 1)); add_button->release_focus(); } @@ -120,8 +122,8 @@ void ProjectSettingsEditor::_delete_setting() { undo_redo->add_undo_method(ps, "set", setting, value); undo_redo->add_undo_method(ps, "set_order", setting, order); - undo_redo->add_do_method(inspector, "update_category_list"); - undo_redo->add_undo_method(inspector, "update_category_list"); + undo_redo->add_do_method(general_settings_inspector, "update_category_list"); + undo_redo->add_undo_method(general_settings_inspector, "update_category_list"); undo_redo->add_do_method(this, "queue_save"); undo_redo->add_undo_method(this, "queue_save"); @@ -200,9 +202,47 @@ void ProjectSettingsEditor::_select_type(Variant::Type p_type) { type_box->select(type_box->get_item_index(p_type)); } +void ProjectSettingsEditor::unhandled_input(const Ref<InputEvent> &p_event) { + ERR_FAIL_COND(p_event.is_null()); + + const Ref<InputEventKey> k = p_event; + + if (k.is_valid() && k->is_pressed()) { + bool handled = false; + + if (ED_IS_SHORTCUT("ui_undo", p_event)) { + String action = undo_redo->get_current_action_name(); + if (!action.is_empty()) { + EditorNode::get_log()->add_message("Undo: " + action, EditorLog::MSG_TYPE_EDITOR); + } + undo_redo->undo(); + handled = true; + } + + if (ED_IS_SHORTCUT("ui_redo", p_event)) { + undo_redo->redo(); + String action = undo_redo->get_current_action_name(); + if (!action.is_empty()) { + EditorNode::get_log()->add_message("Redo: " + action, EditorLog::MSG_TYPE_EDITOR); + } + handled = true; + } + + if (k->get_keycode_with_modifiers() == (KeyModifierMask::CMD | Key::F)) { + search_box->grab_focus(); + search_box->select_all(); + handled = true; + } + + if (handled) { + set_input_as_handled(); + } + } +} + String ProjectSettingsEditor::_get_setting_name() const { String name = property_box->get_text().strip_edges(); - if (name.find("/") == -1) { + if (!name.contains("/")) { name = "global/" + name; } return name; @@ -463,7 +503,7 @@ void ProjectSettingsEditor::_update_action_map_editor() { actions.push_back(action_info); } - action_map->update_action_list(actions); + action_map_editor->update_action_list(actions); } void ProjectSettingsEditor::_update_theme() { @@ -472,6 +512,16 @@ void ProjectSettingsEditor::_update_theme() { restart_container->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); restart_icon->set_texture(get_theme_icon(SNAME("StatusWarning"), SNAME("EditorIcons"))); restart_label->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + + type_box->clear(); + for (int i = 0; i < Variant::VARIANT_MAX; i++) { + // There's no point in adding Nil types, and Object types + // can't be serialized correctly in the project settings. + if (i != Variant::NIL && i != Variant::OBJECT) { + String type = Variant::get_type_name(Variant::Type(i)); + type_box->add_icon_item(get_theme_icon(type, SNAME("EditorIcons")), type, i); + } + } } void ProjectSettingsEditor::_notification(int p_what) { @@ -481,14 +531,16 @@ void ProjectSettingsEditor::_notification(int p_what) { EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "project_settings", Rect2(get_position(), get_size())); } } break; + case NOTIFICATION_ENTER_TREE: { - inspector->edit(ps); + general_settings_inspector->edit(ps); _update_action_map_editor(); _update_theme(); } break; - case NOTIFICATION_THEME_CHANGED: + + case NOTIFICATION_THEME_CHANGED: { _update_theme(); - break; + } break; } } @@ -549,14 +601,6 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { type_box->set_custom_minimum_size(Size2(120, 0) * EDSCALE); header->add_child(type_box); - for (int i = 0; i < Variant::VARIANT_MAX; i++) { - // There's no point in adding Nil types, and Object types - // can't be serialized correctly in the project settings. - if (i != Variant::NIL && i != Variant::OBJECT) { - type_box->add_item(Variant::get_type_name(Variant::Type(i)), i); - } - } - add_button = memnew(Button); add_button->set_text(TTR("Add")); add_button->set_disabled(true); @@ -569,14 +613,14 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { del_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_delete_setting)); header->add_child(del_button); - inspector = memnew(SectionedInspector); - inspector->get_inspector()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo()); - inspector->set_v_size_flags(Control::SIZE_EXPAND_FILL); - inspector->register_search_box(search_box); - inspector->get_inspector()->connect("property_selected", callable_mp(this, &ProjectSettingsEditor::_setting_selected)); - inspector->get_inspector()->connect("property_edited", callable_mp(this, &ProjectSettingsEditor::_setting_edited)); - inspector->get_inspector()->connect("restart_requested", callable_mp(this, &ProjectSettingsEditor::_editor_restart_request)); - general_editor->add_child(inspector); + general_settings_inspector = memnew(SectionedInspector); + general_settings_inspector->get_inspector()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo()); + general_settings_inspector->set_v_size_flags(Control::SIZE_EXPAND_FILL); + general_settings_inspector->register_search_box(search_box); + general_settings_inspector->get_inspector()->connect("property_selected", callable_mp(this, &ProjectSettingsEditor::_setting_selected)); + general_settings_inspector->get_inspector()->connect("property_edited", callable_mp(this, &ProjectSettingsEditor::_setting_edited)); + general_settings_inspector->get_inspector()->connect("restart_requested", callable_mp(this, &ProjectSettingsEditor::_editor_restart_request)); + general_editor->add_child(general_settings_inspector); restart_container = memnew(PanelContainer); general_editor->add_child(restart_container); @@ -604,14 +648,14 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { restart_close_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_editor_restart_close)); restart_hb->add_child(restart_close_button); - action_map = memnew(ActionMapEditor); - action_map->set_name(TTR("Input Map")); - action_map->connect("action_added", callable_mp(this, &ProjectSettingsEditor::_action_added)); - action_map->connect("action_edited", callable_mp(this, &ProjectSettingsEditor::_action_edited)); - action_map->connect("action_removed", callable_mp(this, &ProjectSettingsEditor::_action_removed)); - action_map->connect("action_renamed", callable_mp(this, &ProjectSettingsEditor::_action_renamed)); - action_map->connect("action_reordered", callable_mp(this, &ProjectSettingsEditor::_action_reordered)); - tab_container->add_child(action_map); + action_map_editor = memnew(ActionMapEditor); + action_map_editor->set_name(TTR("Input Map")); + action_map_editor->connect("action_added", callable_mp(this, &ProjectSettingsEditor::_action_added)); + action_map_editor->connect("action_edited", callable_mp(this, &ProjectSettingsEditor::_action_edited)); + action_map_editor->connect("action_removed", callable_mp(this, &ProjectSettingsEditor::_action_removed)); + action_map_editor->connect("action_renamed", callable_mp(this, &ProjectSettingsEditor::_action_renamed)); + action_map_editor->connect("action_reordered", callable_mp(this, &ProjectSettingsEditor::_action_reordered)); + tab_container->add_child(action_map_editor); localization_editor = memnew(LocalizationEditor); localization_editor->set_name(TTR("Localization")); @@ -647,7 +691,7 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { advanced->set_pressed(true); } - inspector->set_restrict_to_basic_settings(!use_advanced); + general_settings_inspector->set_restrict_to_basic_settings(!use_advanced); import_defaults_editor = memnew(ImportDefaultsEditor); import_defaults_editor->set_name(TTR("Import Defaults")); diff --git a/editor/project_settings_editor.h b/editor/project_settings_editor.h index a8eed0093f..5dc1ddc0a8 100644 --- a/editor/project_settings_editor.h +++ b/editor/project_settings_editor.h @@ -31,15 +31,16 @@ #ifndef PROJECT_SETTINGS_EDITOR_H #define PROJECT_SETTINGS_EDITOR_H +#include "core/config/project_settings.h" #include "core/object/undo_redo.h" #include "editor/action_map_editor.h" +#include "editor/editor_autoload_settings.h" #include "editor/editor_data.h" #include "editor/editor_plugin_settings.h" #include "editor/editor_sectioned_inspector.h" #include "editor/import_defaults_editor.h" #include "editor/localization_editor.h" #include "editor/shader_globals_editor.h" -#include "editor_autoload_settings.h" #include "scene/gui/tab_container.h" class ProjectSettingsEditor : public AcceptDialog { @@ -50,8 +51,8 @@ class ProjectSettingsEditor : public AcceptDialog { Timer *timer; TabContainer *tab_container; - SectionedInspector *inspector; - ActionMapEditor *action_map; + SectionedInspector *general_settings_inspector; + ActionMapEditor *action_map_editor; LocalizationEditor *localization_editor; EditorAutoloadSettings *autoload_settings; ShaderGlobalsEditor *shaders_global_variables_editor; @@ -81,6 +82,8 @@ class ProjectSettingsEditor : public AcceptDialog { void _feature_selected(int p_index); void _select_type(Variant::Type p_type); + virtual void unhandled_input(const Ref<InputEvent> &p_event) override; + String _get_setting_name() const; void _setting_edited(const String &p_name); void _setting_selected(const String &p_path); diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 9d894afa6f..cd65ee7ae6 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -44,6 +44,7 @@ #include "editor/create_dialog.h" #include "editor/dictionary_property_edit.h" #include "editor/editor_export.h" +#include "editor/editor_file_dialog.h" #include "editor/editor_file_system.h" #include "editor/editor_help.h" #include "editor/editor_node.h" @@ -52,6 +53,7 @@ #include "editor/filesystem_dock.h" #include "editor/multi_node_edit.h" #include "editor/property_selector.h" +#include "editor/scene_tree_dock.h" #include "scene/gui/label.h" #include "scene/main/window.h" #include "scene/resources/font.h" @@ -92,8 +94,10 @@ Ref<Resource> EditorResourceConversionPlugin::convert(const Ref<Resource> &p_res } void CustomPropertyEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_WM_CLOSE_REQUEST) { - hide(); + switch (p_what) { + case NOTIFICATION_WM_CLOSE_REQUEST: { + hide(); + } break; } } @@ -269,7 +273,9 @@ void CustomPropertyEditor::_menu_option(int p_which) { res->call("set_instance_base_type", owner->get_class()); } + EditorNode::get_editor_data().instantiate_object_properties(obj); v = obj; + emit_signal(SNAME("variant_changed")); } break; @@ -623,7 +629,7 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: MAKE_PROPSELECT Variant::Type type = Variant::NIL; String tname = hint_text; - if (tname.find(".") != -1) { + if (tname.contains(".")) { tname = tname.get_slice(".", 0); } for (int i = 0; i < Variant::VARIANT_MAX; i++) { @@ -1092,7 +1098,9 @@ void CustomPropertyEditor::_type_create_selected(int p_idx) { ERR_FAIL_COND(!obj); ERR_FAIL_COND(!Object::cast_to<Resource>(obj)); + EditorNode::get_editor_data().instantiate_object_properties(obj); v = obj; + emit_signal(SNAME("variant_changed")); hide(); } @@ -1283,7 +1291,9 @@ void CustomPropertyEditor::_action_pressed(int p_which) { ERR_BREAK(!obj); ERR_BREAK(!Object::cast_to<Resource>(obj)); + EditorNode::get_editor_data().instantiate_object_properties(obj); v = obj; + emit_signal(SNAME("variant_changed")); hide(); } diff --git a/editor/property_editor.h b/editor/property_editor.h index 298acb3c01..c4287dc115 100644 --- a/editor/property_editor.h +++ b/editor/property_editor.h @@ -31,7 +31,6 @@ #ifndef PROPERTY_EDITOR_H #define PROPERTY_EDITOR_H -#include "editor/editor_file_dialog.h" #include "editor/editor_locale_dialog.h" #include "editor/scene_tree_editor.h" #include "scene/gui/button.h" @@ -47,8 +46,9 @@ #include "scene/gui/texture_rect.h" #include "scene/gui/tree.h" -class PropertyValueEvaluator; class CreateDialog; +class EditorFileDialog; +class PropertyValueEvaluator; class PropertySelector; class EditorResourceConversionPlugin : public RefCounted { diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp index 3b0cbfdde9..453ecb6b24 100644 --- a/editor/property_selector.cpp +++ b/editor/property_selector.cpp @@ -33,7 +33,7 @@ #include "core/os/keyboard.h" #include "editor/doc_tools.h" #include "editor/editor_node.h" -#include "editor_scale.h" +#include "editor/editor_scale.h" void PropertySelector::_text_changed(const String &p_newtext) { _update_search(); @@ -185,7 +185,7 @@ void PropertySelector::_update_search() { continue; } - if (type_filter.size() && type_filter.find(E.type) == -1) { + if (type_filter.size() && !type_filter.has(E.type)) { continue; } @@ -214,10 +214,13 @@ void PropertySelector::_update_search() { Variant::construct(type, v, nullptr, 0, ce); v.get_method_list(&methods); } else { - Object *obj = ObjectDB::get_instance(script); - if (Object::cast_to<Script>(obj)) { + Ref<Script> script_ref = Object::cast_to<Script>(ObjectDB::get_instance(script)); + if (script_ref.is_valid()) { methods.push_back(MethodInfo("*Script Methods")); - Object::cast_to<Script>(obj)->get_script_method_list(&methods); + if (script_ref->is_built_in()) { + script_ref->reload(true); + } + script_ref->get_script_method_list(&methods); } StringName base = base_type; @@ -276,7 +279,7 @@ void PropertySelector::_update_search() { TreeItem *item = search_options->create_item(category ? category : root); String desc; - if (mi.name.find(":") != -1) { + if (mi.name.contains(":")) { desc = mi.name.get_slice(":", 1) + " "; mi.name = mi.name.get_slice(":", 0); } else if (mi.return_val.type != Variant::NIL) { @@ -296,7 +299,7 @@ void PropertySelector::_update_search() { if (mi.arguments[i].type == Variant::NIL) { desc += ": Variant"; - } else if (mi.arguments[i].name.find(":") != -1) { + } else if (mi.arguments[i].name.contains(":")) { desc += vformat(": %s", mi.arguments[i].name.get_slice(":", 1)); mi.arguments[i].name = mi.arguments[i].name.get_slice(":", 0); } else { @@ -418,10 +421,14 @@ void PropertySelector::_hide_requested() { } void PropertySelector::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - connect("confirmed", callable_mp(this, &PropertySelector::_confirmed)); - } else if (p_what == NOTIFICATION_EXIT_TREE) { - disconnect("confirmed", callable_mp(this, &PropertySelector::_confirmed)); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + connect("confirmed", callable_mp(this, &PropertySelector::_confirmed)); + } break; + + case NOTIFICATION_EXIT_TREE: { + disconnect("confirmed", callable_mp(this, &PropertySelector::_confirmed)); + } break; } } diff --git a/editor/property_selector.h b/editor/property_selector.h index af848b9f18..1e8c6300a0 100644 --- a/editor/property_selector.h +++ b/editor/property_selector.h @@ -31,8 +31,8 @@ #ifndef PROPERTYSELECTOR_H #define PROPERTYSELECTOR_H +#include "editor/editor_help.h" #include "editor/property_editor.h" -#include "editor_help.h" #include "scene/gui/rich_text_label.h" class PropertySelector : public ConfirmationDialog { diff --git a/editor/quick_open.cpp b/editor/quick_open.cpp index 2a8ca67fe6..4e64aba1db 100644 --- a/editor/quick_open.cpp +++ b/editor/quick_open.cpp @@ -229,6 +229,7 @@ void EditorQuickOpen::_notification(int p_what) { search_box->set_clear_button_enabled(true); } break; + case NOTIFICATION_EXIT_TREE: { disconnect("confirmed", callable_mp(this, &EditorQuickOpen::_confirmed)); } break; diff --git a/editor/quick_open.h b/editor/quick_open.h index 00edf46622..dc485a7c86 100644 --- a/editor/quick_open.h +++ b/editor/quick_open.h @@ -32,7 +32,7 @@ #define EDITOR_QUICK_OPEN_H #include "core/templates/oa_hash_map.h" -#include "editor_file_system.h" +#include "editor/editor_file_system.h" #include "scene/gui/dialogs.h" #include "scene/gui/tree.h" diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp index 92dcd53830..46751058d0 100644 --- a/editor/rename_dialog.cpp +++ b/editor/rename_dialog.cpp @@ -34,10 +34,10 @@ #ifdef MODULE_REGEX_ENABLED #include "core/string/print_string.h" -#include "editor_node.h" -#include "editor_scale.h" -#include "editor_settings.h" -#include "editor_themes.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" +#include "editor/editor_themes.h" #include "modules/regex/regex.h" #include "plugins/script_editor_plugin.h" #include "scene/gui/control.h" @@ -337,7 +337,7 @@ void RenameDialog::_bind_methods() { } void RenameDialog::_update_substitute() { - LineEdit *focus_owner_line_edit = Object::cast_to<LineEdit>(scene_tree_editor->get_focus_owner()); + LineEdit *focus_owner_line_edit = Object::cast_to<LineEdit>(scene_tree_editor->get_viewport()->gui_get_focus_owner()); bool is_main_field = _is_main_field(focus_owner_line_edit); but_insert_name->set_disabled(!is_main_field); @@ -632,7 +632,7 @@ bool RenameDialog::_is_main_field(LineEdit *line_edit) { } void RenameDialog::_insert_text(String text) { - LineEdit *focus_owner = Object::cast_to<LineEdit>(scene_tree_editor->get_focus_owner()); + LineEdit *focus_owner = Object::cast_to<LineEdit>(scene_tree_editor->get_viewport()->gui_get_focus_owner()); if (_is_main_field(focus_owner)) { focus_owner->selection_delete(); diff --git a/editor/rename_dialog.h b/editor/rename_dialog.h index 9d02fb10bd..c9747795f0 100644 --- a/editor/rename_dialog.h +++ b/editor/rename_dialog.h @@ -37,9 +37,11 @@ #include "core/object/undo_redo.h" #include "editor/scene_tree_editor.h" #include "scene/gui/check_box.h" +#include "scene/gui/check_button.h" #include "scene/gui/dialogs.h" #include "scene/gui/option_button.h" #include "scene/gui/spin_box.h" +#include "scene/gui/tab_container.h" class RenameDialog : public ConfirmationDialog { GDCLASS(RenameDialog, ConfirmationDialog); diff --git a/editor/reparent_dialog.cpp b/editor/reparent_dialog.cpp index 1a83a61534..8879085d86 100644 --- a/editor/reparent_dialog.cpp +++ b/editor/reparent_dialog.cpp @@ -35,12 +35,14 @@ #include "scene/gui/label.h" void ReparentDialog::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - connect("confirmed", callable_mp(this, &ReparentDialog::_reparent)); - } - - if (p_what == NOTIFICATION_EXIT_TREE) { - disconnect("confirmed", callable_mp(this, &ReparentDialog::_reparent)); + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + connect("confirmed", callable_mp(this, &ReparentDialog::_reparent)); + } break; + + case NOTIFICATION_EXIT_TREE: { + disconnect("confirmed", callable_mp(this, &ReparentDialog::_reparent)); + } break; } } diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index cece787bf3..628e7880a1 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -37,6 +37,7 @@ #include "core/os/keyboard.h" #include "editor/debugger/editor_debugger_node.h" #include "editor/editor_feature_profile.h" +#include "editor/editor_file_dialog.h" #include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" @@ -53,6 +54,9 @@ #include "servers/rendering_server.h" #include "modules/modules_enabled.gen.h" // For regex. +#ifdef MODULE_REGEX_ENABLED +#include "editor/rename_dialog.h" +#endif // MODULE_REGEX_ENABLED void SceneTreeDock::_nodes_drag_begin() { if (restore_script_editor_on_drag) { @@ -78,7 +82,7 @@ void SceneTreeDock::input(const Ref<InputEvent> &p_event) { void SceneTreeDock::unhandled_key_input(const Ref<InputEvent> &p_event) { ERR_FAIL_COND(p_event.is_null()); - if (get_focus_owner() && get_focus_owner()->is_text_field()) { + if (get_viewport()->gui_get_focus_owner() && get_viewport()->gui_get_focus_owner()->is_text_field()) { return; } @@ -254,7 +258,7 @@ void SceneTreeDock::_replace_with_branch_scene(const String &p_file, Node *base) return; } - UndoRedo *undo_redo = editor->get_undo_redo(); + UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo(); undo_redo->create_action(TTR("Replace with Branch Scene")); Node *parent = base->get_parent(); @@ -451,7 +455,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { } else { was_empty = true; } - clipboard_source_scene = editor->get_edited_scene()->get_scene_file_path(); + clipboard_source_scene = EditorNode::get_singleton()->get_edited_scene()->get_scene_file_path(); selection.sort_custom<Node::Comparator>(); @@ -521,7 +525,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { } editor_data->get_undo_redo().create_action(TTR("Detach Script")); - editor_data->get_undo_redo().add_do_method(editor, "push_item", (Script *)nullptr); + editor_data->get_undo_redo().add_do_method(EditorNode::get_singleton(), "push_item", (Script *)nullptr); for (int i = 0; i < selection.size(); i++) { Node *n = Object::cast_to<Node>(selection[i]); @@ -757,7 +761,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { editor_data->get_undo_redo().create_action(TTR("Make node as Root")); editor_data->get_undo_redo().add_do_method(node->get_parent(), "remove_child", node); - editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", node); + editor_data->get_undo_redo().add_do_method(EditorNode::get_singleton(), "set_edited_scene", node); editor_data->get_undo_redo().add_do_method(node, "add_child", root, true); editor_data->get_undo_redo().add_do_method(node, "set_scene_file_path", root->get_scene_file_path()); editor_data->get_undo_redo().add_do_method(root, "set_scene_file_path", String()); @@ -768,7 +772,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { editor_data->get_undo_redo().add_undo_method(root, "set_scene_file_path", root->get_scene_file_path()); editor_data->get_undo_redo().add_undo_method(node, "set_scene_file_path", String()); editor_data->get_undo_redo().add_undo_method(node, "remove_child", root); - editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", root); + editor_data->get_undo_redo().add_undo_method(EditorNode::get_singleton(), "set_edited_scene", root); editor_data->get_undo_redo().add_undo_method(node->get_parent(), "add_child", node, true); editor_data->get_undo_redo().add_undo_method(node->get_parent(), "move_child", node, node->get_index()); editor_data->get_undo_redo().add_undo_method(root, "set_owner", (Object *)nullptr); @@ -1099,7 +1103,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { add_root_node(new_node); - editor->edit_node(new_node); + EditorNode::get_singleton()->edit_node(new_node); editor_selection->clear(); editor_selection->add_node(new_node); @@ -1136,10 +1140,10 @@ void SceneTreeDock::_perform_property_drop(Node *p_node, String p_property, RES void SceneTreeDock::add_root_node(Node *p_node) { editor_data->get_undo_redo().create_action(TTR("New Scene Root")); - editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", p_node); + editor_data->get_undo_redo().add_do_method(EditorNode::get_singleton(), "set_edited_scene", p_node); editor_data->get_undo_redo().add_do_method(scene_tree, "update_tree"); editor_data->get_undo_redo().add_do_reference(p_node); - editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)nullptr); + editor_data->get_undo_redo().add_undo_method(EditorNode::get_singleton(), "set_edited_scene", (Object *)nullptr); editor_data->get_undo_redo().commit_action(); } @@ -1206,8 +1210,16 @@ void SceneTreeDock::_notification(int p_what) { create_root_dialog->add_child(top_row); + ScrollContainer *scroll_container = memnew(ScrollContainer); + scroll_container->set_name("NodeShortcutsScrollContainer"); + create_root_dialog->add_child(scroll_container); + scroll_container->set_v_size_flags(SIZE_EXPAND_FILL); + scroll_container->set_horizontal_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); + VBoxContainer *node_shortcuts = memnew(VBoxContainer); node_shortcuts->set_name("NodeShortcuts"); + scroll_container->add_child(node_shortcuts); + node_shortcuts->set_h_size_flags(SIZE_EXPAND_FILL); VBoxContainer *beginner_node_shortcuts = memnew(VBoxContainer); beginner_node_shortcuts->set_name("BeginnerNodeShortcuts"); @@ -1247,8 +1259,6 @@ void SceneTreeDock::_notification(int p_what) { button_clipboard->set_icon(get_theme_icon(SNAME("ActionPaste"), SNAME("EditorIcons"))); button_clipboard->connect("pressed", callable_bind(callable_mp(this, &SceneTreeDock::_tool_selected), TOOL_PASTE, false)); - node_shortcuts->add_spacer(); - create_root_dialog->add_child(node_shortcuts); _update_create_root_dialog(); } break; @@ -1260,6 +1270,7 @@ void SceneTreeDock::_notification(int p_what) { case NOTIFICATION_EXIT_TREE: { clear_inherit_confirm->disconnect("confirmed", callable_mp(this, &SceneTreeDock::_tool_selected)); } break; + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { scene_tree->set_auto_expand_selected(EditorSettings::get_singleton()->get("docks/scene_tree/auto_expand_to_selected"), false); button_add->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); @@ -1276,6 +1287,7 @@ void SceneTreeDock::_notification(int p_what) { filter->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); filter->set_clear_button_enabled(true); } break; + case NOTIFICATION_PROCESS: { bool show_create_root = bool(EDITOR_GET("interface/editors/show_scene_tree_root_selection")) && get_tree()->get_edited_scene_root() == nullptr; @@ -1288,7 +1300,6 @@ void SceneTreeDock::_notification(int p_what) { scene_tree->show(); } } - } break; } } @@ -1319,16 +1330,16 @@ void SceneTreeDock::_node_replace_owner(Node *p_base, Node *p_node, Node *p_root } void SceneTreeDock::_load_request(const String &p_path) { - editor->open_request(p_path); + EditorNode::get_singleton()->open_request(p_path); } void SceneTreeDock::_script_open_request(const Ref<Script> &p_script) { - editor->edit_resource(p_script); + EditorNode::get_singleton()->edit_resource(p_script); } void SceneTreeDock::_push_item(Object *p_object) { if (!Input::get_singleton()->is_key_pressed(Key::ALT)) { - editor->push_item(p_object); + EditorNode::get_singleton()->push_item(p_object); } } @@ -1554,7 +1565,7 @@ void SceneTreeDock::perform_node_renames(Node *p_base, Map<Node *, NodePath> *p_ for (int i = 0; i < anim->get_track_count(); i++) { NodePath track_np = anim->track_get_path(i); - Node *n = root->get_node(track_np); + Node *n = root->get_node_or_null(track_np); if (!n) { continue; } @@ -1723,7 +1734,7 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V Node *validate = new_parent; while (validate) { - ERR_FAIL_COND_MSG(p_nodes.find(validate) != -1, "Selection changed at some point. Can't reparent."); + ERR_FAIL_COND_MSG(p_nodes.has(validate), "Selection changed at some point. Can't reparent."); validate = validate->get_parent(); } @@ -1991,7 +2002,7 @@ void SceneTreeDock::_delete_confirm(bool p_cut) { return; } - editor->get_editor_plugins_over()->make_visible(false); + EditorNode::get_singleton()->get_editor_plugins_over()->make_visible(false); if (p_cut) { editor_data->get_undo_redo().create_action(TTR("Cut Node(s)")); @@ -2008,8 +2019,8 @@ void SceneTreeDock::_delete_confirm(bool p_cut) { } if (entire_scene) { - editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", (Object *)nullptr); - editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", edited_scene); + editor_data->get_undo_redo().add_do_method(EditorNode::get_singleton(), "set_edited_scene", (Object *)nullptr); + editor_data->get_undo_redo().add_undo_method(EditorNode::get_singleton(), "set_edited_scene", edited_scene); editor_data->get_undo_redo().add_undo_method(edited_scene, "set_owner", edited_scene->get_owner()); editor_data->get_undo_redo().add_undo_method(scene_tree, "update_tree"); editor_data->get_undo_redo().add_undo_reference(edited_scene); @@ -2137,10 +2148,10 @@ void SceneTreeDock::_do_create(Node *p_parent) { editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(p_parent)).plus_file(new_name))); } else { - editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", child); + editor_data->get_undo_redo().add_do_method(EditorNode::get_singleton(), "set_edited_scene", child); editor_data->get_undo_redo().add_do_method(scene_tree, "update_tree"); editor_data->get_undo_redo().add_do_reference(child); - editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)nullptr); + editor_data->get_undo_redo().add_undo_method(EditorNode::get_singleton(), "set_edited_scene", (Object *)nullptr); } editor_data->get_undo_redo().commit_action(); @@ -2332,7 +2343,7 @@ void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node, bool p_keep_prop if (n == edited_scene) { edited_scene = newnode; - editor->set_edited_scene(newnode); + EditorNode::get_singleton()->set_edited_scene(newnode); } //small hack to make collisionshapes and other kind of nodes to work @@ -3027,7 +3038,7 @@ List<Node *> SceneTreeDock::paste_nodes() { if (!paste_parent) { paste_parent = dup; owner = dup; - ur.add_do_method(editor, "set_edited_scene", dup); + ur.add_do_method(EditorNode::get_singleton(), "set_edited_scene", dup); } else { ur.add_do_method(paste_parent, "add_child", dup, true); } @@ -3045,14 +3056,14 @@ List<Node *> SceneTreeDock::paste_nodes() { ur.add_do_method(editor_selection, "add_node", dup); if (dup == paste_parent) { - ur.add_undo_method(editor, "set_edited_scene", (Object *)nullptr); + ur.add_undo_method(EditorNode::get_singleton(), "set_edited_scene", (Object *)nullptr); } else { ur.add_undo_method(paste_parent, "remove_child", dup); } ur.add_do_reference(dup); if (node_clipboard.size() == 1) { - ur.add_do_method(editor, "push_item", dup); + ur.add_do_method(EditorNode::get_singleton(), "push_item", dup); } } @@ -3112,7 +3123,7 @@ void SceneTreeDock::_local_tree_selected() { void SceneTreeDock::_update_create_root_dialog() { BaseButton *toggle = Object::cast_to<BaseButton>(create_root_dialog->get_node(String("NodeShortcutsTopRow/NodeShortcutsToggle"))); - Node *node_shortcuts = create_root_dialog->get_node(String("NodeShortcuts")); + Node *node_shortcuts = create_root_dialog->get_node(String("NodeShortcutsScrollContainer/NodeShortcuts")); if (!toggle || !node_shortcuts) { return; @@ -3142,6 +3153,7 @@ void SceneTreeDock::_update_create_root_dialog() { Button *button = memnew(Button); favorite_nodes->add_child(button); button->set_text(l); + button->set_clip_text(true); String name = l.get_slicec(' ', 0); if (ScriptServer::is_global_class(name)) { name = ScriptServer::get_global_class_native_base(name); @@ -3289,10 +3301,9 @@ void SceneTreeDock::_update_configuration_warning() { } } -SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data) { +SceneTreeDock::SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data) { singleton = this; set_name("Scene"); - editor = p_editor; edited_scene = nullptr; editor_data = &p_editor_data; editor_selection = p_editor_selection; @@ -3403,6 +3414,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel create_root_dialog = memnew(VBoxContainer); vbc->add_child(create_root_dialog); + create_root_dialog->set_v_size_flags(SIZE_EXPAND_FILL); create_root_dialog->hide(); scene_tree = memnew(SceneTreeEditor(false, true, true)); diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h index 3639e66233..2a98c469dc 100644 --- a/editor/scene_tree_dock.h +++ b/editor/scene_tree_dock.h @@ -35,7 +35,6 @@ #include "editor/editor_data.h" #include "editor/groups_editor.h" #include "editor/quick_open.h" -#include "editor/rename_dialog.h" #include "editor/reparent_dialog.h" #include "editor/script_create_dialog.h" #include "scene/animation/animation_player.h" @@ -48,8 +47,10 @@ #include "scene_tree_editor.h" #include "modules/modules_enabled.gen.h" // For regex. +#ifdef MODULE_REGEX_ENABLED +class RenameDialog; +#endif // MODULE_REGEX_ENABLED -class EditorNode; class ShaderCreateDialog; class SceneTreeDock : public VBoxContainer { @@ -171,7 +172,6 @@ class SceneTreeDock : public VBoxContainer { void _do_create(Node *p_parent); Node *scene_root; Node *edited_scene; - EditorNode *editor; VBoxContainer *create_root_dialog; String selected_favorite_root; @@ -319,7 +319,7 @@ public: ScriptCreateDialog *get_script_create_dialog() { return script_create_dialog; } - SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data); + SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data); ~SceneTreeDock(); }; diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index c755bca64f..ba65828ac1 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -32,11 +32,13 @@ #include "core/object/message_queue.h" #include "core/string/print_string.h" +#include "editor/editor_file_system.h" #include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/node_dock.h" #include "editor/plugins/animation_player_editor_plugin.h" #include "editor/plugins/canvas_item_editor_plugin.h" +#include "editor/plugins/script_editor_plugin.h" #include "scene/gui/label.h" #include "scene/main/window.h" #include "scene/resources/packed_scene.h" @@ -362,6 +364,17 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent, bool p_scroll } _update_visibility_color(p_node, item); + } else if (p_node->is_class("CanvasLayer")) { + bool v = p_node->call("is_visible"); + if (v) { + item->add_button(0, get_theme_icon(SNAME("GuiVisibilityVisible"), SNAME("EditorIcons")), BUTTON_VISIBILITY, false, TTR("Toggle Visibility")); + } else { + item->add_button(0, get_theme_icon(SNAME("GuiVisibilityHidden"), SNAME("EditorIcons")), BUTTON_VISIBILITY, false, TTR("Toggle Visibility")); + } + + if (!p_node->is_connected("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed))) { + p_node->connect("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed), varray(p_node)); + } } else if (p_node->is_class("Node3D")) { bool is_locked = p_node->has_meta("_edit_lock_"); if (is_locked) { @@ -471,6 +484,9 @@ void SceneTreeEditor::_node_visibility_changed(Node *p_node) { if (p_node->is_class("CanvasItem")) { visible = p_node->call("is_visible"); CanvasItemEditor::get_singleton()->get_viewport_control()->update(); + } else if (p_node->is_class("CanvasLayer")) { + visible = p_node->call("is_visible"); + CanvasItemEditor::get_singleton()->get_viewport_control()->update(); } else if (p_node->is_class("Node3D")) { visible = p_node->call("is_visible"); } @@ -514,7 +530,7 @@ void SceneTreeEditor::_node_removed(Node *p_node) { p_node->disconnect("script_changed", callable_mp(this, &SceneTreeEditor::_node_script_changed)); } - if (p_node->is_class("Node3D") || p_node->is_class("CanvasItem")) { + if (p_node->is_class("Node3D") || p_node->is_class("CanvasItem") || p_node->is_class("CanvasLayer")) { if (p_node->is_connected("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed))) { p_node->disconnect("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed)); } @@ -684,6 +700,7 @@ void SceneTreeEditor::_notification(int p_what) { _update_tree(); } break; + case NOTIFICATION_EXIT_TREE: { get_tree()->disconnect("tree_changed", callable_mp(this, &SceneTreeEditor::_tree_changed)); get_tree()->disconnect("tree_process_mode_changed", callable_mp(this, &SceneTreeEditor::_tree_process_mode_changed)); @@ -692,6 +709,7 @@ void SceneTreeEditor::_notification(int p_what) { tree->disconnect("item_collapsed", callable_mp(this, &SceneTreeEditor::_cell_collapsed)); get_tree()->disconnect("node_configuration_warning_changed", callable_mp(this, &SceneTreeEditor::_warning_changed)); } break; + case NOTIFICATION_THEME_CHANGED: { _update_tree(); } break; @@ -1267,13 +1285,16 @@ void SceneTreeDialog::_notification(int p_what) { tree->update_tree(); } } break; + case NOTIFICATION_ENTER_TREE: { connect("confirmed", callable_mp(this, &SceneTreeDialog::_select)); _update_theme(); } break; + case NOTIFICATION_THEME_CHANGED: { _update_theme(); } break; + case NOTIFICATION_EXIT_TREE: { disconnect("confirmed", callable_mp(this, &SceneTreeDialog::_select)); } break; diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h index 39fe64b828..f700182681 100644 --- a/editor/scene_tree_editor.h +++ b/editor/scene_tree_editor.h @@ -32,8 +32,8 @@ #define SCENE_TREE_EDITOR_H #include "core/object/undo_redo.h" -#include "editor_data.h" -#include "editor_settings.h" +#include "editor/editor_data.h" +#include "editor/editor_settings.h" #include "scene/gui/button.h" #include "scene/gui/dialogs.h" #include "scene/gui/tree.h" diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index 2098fa2c85..bf43e11cdb 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -35,9 +35,74 @@ #include "core/io/resource_saver.h" #include "core/string/string_builder.h" #include "editor/create_dialog.h" +#include "editor/editor_file_dialog.h" +#include "editor/editor_file_system.h" #include "editor/editor_node.h" #include "editor/editor_scale.h" -#include "editor_file_system.h" +#include "editor/editor_settings.h" + +static String _get_parent_class_of_script(String p_path) { + if (!ResourceLoader::exists(p_path, "Script")) { + return "Object"; // A script eventually inherits from Object. + } + + Ref<Script> script = ResourceLoader::load(p_path, "Script"); + ERR_FAIL_COND_V(script.is_null(), "Object"); + + String class_name; + Ref<Script> base = script->get_base_script(); + + // Inherits from a built-in class. + if (base.is_null()) { + script->get_language()->get_global_class_name(script->get_path(), &class_name); + return class_name; + } + + // Inherits from a script that has class_name. + class_name = script->get_language()->get_global_class_name(base->get_path()); + if (!class_name.is_empty()) { + return class_name; + } + + // Inherits from a plain script. + return _get_parent_class_of_script(base->get_path()); +} + +static Vector<String> _get_hierarchy(String p_class_name) { + Vector<String> hierarchy; + + String class_name = p_class_name; + while (true) { + // A registered class. + if (ClassDB::class_exists(class_name)) { + hierarchy.push_back(class_name); + + class_name = ClassDB::get_parent_class(class_name); + continue; + } + + // A class defined in script with class_name. + if (ScriptServer::is_global_class(class_name)) { + hierarchy.push_back(class_name); + + Ref<Script> script = EditorNode::get_editor_data().script_class_load_script(class_name); + ERR_BREAK(script.is_null()); + class_name = _get_parent_class_of_script(script->get_path()); + continue; + } + + break; + } + + if (hierarchy.is_empty()) { + if (p_class_name.is_valid_identifier()) { + hierarchy.push_back(p_class_name); + } + hierarchy.push_back("Object"); + } + + return hierarchy; +} void ScriptCreateDialog::_notification(int p_what) { switch (p_what) { @@ -153,7 +218,7 @@ bool ScriptCreateDialog::_validate_class(const String &p_string) { } } - bool valid_char = (p_string[i] >= '0' && p_string[i] <= '9') || (p_string[i] >= 'a' && p_string[i] <= 'z') || (p_string[i] >= 'A' && p_string[i] <= 'Z') || p_string[i] == '_' || p_string[i] == '.'; + bool valid_char = is_ascii_identifier_char(p_string[i]) || p_string[i] == '.'; if (!valid_char) { return false; @@ -352,18 +417,6 @@ void ScriptCreateDialog::_load_exist() { hide(); } -Vector<String> ScriptCreateDialog::get_hierarchy(String p_object) const { - Vector<String> hierarchy; - hierarchy.append(p_object); - - String parent_class = ClassDB::get_parent_class(p_object); - while (parent_class.is_valid_identifier()) { - hierarchy.append(parent_class); - parent_class = ClassDB::get_parent_class(parent_class); - } - return hierarchy; -} - void ScriptCreateDialog::_language_changed(int l) { language = ScriptServer::get_language(l); @@ -378,7 +431,7 @@ void ScriptCreateDialog::_language_changed(int l) { String path = file_path->get_text(); String extension = ""; if (!path.is_empty()) { - if (path.find(".") != -1) { + if (path.contains(".")) { extension = path.get_extension(); } @@ -552,14 +605,14 @@ void ScriptCreateDialog::_update_template_menu() { } String inherits_base_type = parent_name->get_text(); - // If it inherits from a script, select Object instead. + // If it inherits from a script, get its parent class first. if (inherits_base_type[0] == '"') { - inherits_base_type = "Object"; + inherits_base_type = _get_parent_class_of_script(inherits_base_type.unquote()); } // Get all ancestor node for selected base node. // There templates will also fit the base node. - Vector<String> hierarchy = get_hierarchy(inherits_base_type); + Vector<String> hierarchy = _get_hierarchy(inherits_base_type); int last_used_template = -1; int preselected_template = -1; int previous_ancestor_level = -1; @@ -656,14 +709,18 @@ void ScriptCreateDialog::_update_dialog() { if (is_new_script_created) { class_name->set_editable(true); class_name->set_placeholder(TTR("Allowed: a-z, A-Z, 0-9, _ and .")); - class_name->set_placeholder_alpha(0.3); + Color placeholder_color = class_name->get_theme_color(SNAME("font_placeholder_color")); + placeholder_color.a = 0.3; + class_name->add_theme_color_override("font_placeholder_color", placeholder_color); } else { class_name->set_editable(false); } } else { class_name->set_editable(false); class_name->set_placeholder(TTR("N/A")); - class_name->set_placeholder_alpha(1); + Color placeholder_color = class_name->get_theme_color(SNAME("font_placeholder_color")); + placeholder_color.a = 1; + class_name->add_theme_color_override("font_placeholder_color", placeholder_color); class_name->set_text(""); } @@ -759,10 +816,10 @@ void ScriptCreateDialog::_update_dialog() { } ScriptLanguage::ScriptTemplate ScriptCreateDialog::_get_current_template() const { - int selected_id = template_menu->get_selected_id(); + int selected_index = template_menu->get_selected(); for (const ScriptLanguage::ScriptTemplate &t : template_list) { if (is_using_templates) { - if (t.id == selected_id) { + if (t.id == selected_index) { return t; } } else { @@ -807,7 +864,7 @@ ScriptLanguage::ScriptTemplate ScriptCreateDialog::_parse_template(const ScriptL List<String> comment_delimiters; language->get_comment_delimiters(&comment_delimiters); for (const String &script_delimiter : comment_delimiters) { - if (script_delimiter.find(" ") == -1) { + if (!script_delimiter.contains(" ")) { meta_delimiter = script_delimiter; break; } @@ -1033,6 +1090,7 @@ ScriptCreateDialog::ScriptCreateDialog() { internal_name = memnew(LineEdit); internal_name->set_h_size_flags(Control::SIZE_EXPAND_FILL); + internal_name->connect("text_submitted", callable_mp(this, &ScriptCreateDialog::_path_submitted)); label = memnew(Label(TTR("Name:"))); gc->add_child(label); gc->add_child(internal_name); diff --git a/editor/script_create_dialog.h b/editor/script_create_dialog.h index 67d30e21fb..5c0f51812f 100644 --- a/editor/script_create_dialog.h +++ b/editor/script_create_dialog.h @@ -32,8 +32,6 @@ #define SCRIPT_CREATE_DIALOG_H #include "core/object/script_language.h" -#include "editor/editor_file_dialog.h" -#include "editor/editor_settings.h" #include "scene/gui/check_box.h" #include "scene/gui/dialogs.h" #include "scene/gui/grid_container.h" @@ -42,6 +40,7 @@ #include "scene/gui/panel_container.h" class CreateDialog; +class EditorFileDialog; class ScriptCreateDialog : public ConfirmationDialog { GDCLASS(ScriptCreateDialog, ConfirmationDialog); @@ -116,7 +115,6 @@ class ScriptCreateDialog : public ConfirmationDialog { virtual void ok_pressed() override; void _create_new(); void _load_exist(); - Vector<String> get_hierarchy(String p_object) const; void _msg_script_valid(bool valid, const String &p_msg = String()); void _msg_path_valid(bool valid, const String &p_msg = String()); void _update_template_menu(); diff --git a/editor/shader_create_dialog.cpp b/editor/shader_create_dialog.cpp index 239860c9ab..dbc78e846c 100644 --- a/editor/shader_create_dialog.cpp +++ b/editor/shader_create_dialog.cpp @@ -29,6 +29,9 @@ /*************************************************************************/ #include "shader_create_dialog.h" + +#include "core/config/project_settings.h" +#include "editor/editor_file_dialog.h" #include "editor/editor_scale.h" #include "scene/resources/visual_shader.h" #include "servers/rendering/shader_types.h" @@ -54,6 +57,7 @@ void ShaderCreateDialog::_notification(int p_what) { current_mode = EditorSettings::get_singleton()->get_project_metadata("shader_setup", "last_selected_mode", 0); mode_menu->select(current_mode); } break; + case NOTIFICATION_THEME_CHANGED: { _update_theme(); } break; @@ -221,7 +225,7 @@ void ShaderCreateDialog::_language_changed(int p_language) { String extension = ""; if (!path.is_empty()) { - if (path.find(".") != -1) { + if (path.contains(".")) { extension = path.get_extension(); } if (extension.length() == 0) { diff --git a/editor/shader_create_dialog.h b/editor/shader_create_dialog.h index be0fef211c..6737ce4f10 100644 --- a/editor/shader_create_dialog.h +++ b/editor/shader_create_dialog.h @@ -31,7 +31,6 @@ #ifndef SHADER_CREATE_DIALOG_H #define SHADER_CREATE_DIALOG_H -#include "editor/editor_file_dialog.h" #include "editor/editor_settings.h" #include "scene/gui/check_box.h" #include "scene/gui/dialogs.h" @@ -40,6 +39,8 @@ #include "scene/gui/option_button.h" #include "scene/gui/panel_container.h" +class EditorFileDialog; + class ShaderCreateDialog : public ConfirmationDialog { GDCLASS(ShaderCreateDialog, ConfirmationDialog); diff --git a/editor/shader_globals_editor.cpp b/editor/shader_globals_editor.cpp index 2f3867a58c..70a43d24ba 100644 --- a/editor/shader_globals_editor.cpp +++ b/editor/shader_globals_editor.cpp @@ -29,7 +29,9 @@ /*************************************************************************/ #include "shader_globals_editor.h" -#include "editor_node.h" + +#include "core/config/project_settings.h" +#include "editor/editor_node.h" #include "servers/rendering/shader_language.h" static const char *global_var_type_names[RS::GLOBAL_VAR_TYPE_MAX] = { @@ -436,13 +438,16 @@ void ShaderGlobalsEditor::_bind_methods() { } void ShaderGlobalsEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (is_visible_in_tree()) { - inspector->edit(interface); - } - } - if (p_what == NOTIFICATION_PREDELETE) { - inspector->edit(nullptr); + switch (p_what) { + case NOTIFICATION_VISIBILITY_CHANGED: { + if (is_visible_in_tree()) { + inspector->edit(interface); + } + } break; + + case NOTIFICATION_PREDELETE: { + inspector->edit(nullptr); + } break; } } diff --git a/editor/shader_globals_editor.h b/editor/shader_globals_editor.h index efec9f4219..3b337e07de 100644 --- a/editor/shader_globals_editor.h +++ b/editor/shader_globals_editor.h @@ -36,7 +36,6 @@ #include "editor/editor_data.h" #include "editor/editor_plugin_settings.h" #include "editor/editor_sectioned_inspector.h" -#include "scene/gui/dialogs.h" #include "scene/gui/tab_container.h" class ShaderGlobalsEditorInterface; diff --git a/editor/translations/af.po b/editor/translations/af.po index f139124259..ad1b7ef436 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -521,8 +521,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1420,7 +1420,7 @@ msgid "Bus Options" msgstr "Bus opsies" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Dupliseer" @@ -2243,8 +2243,8 @@ msgstr "Metode Beskrywing:" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Daar is tans geen beskrywing vir hierdie metode nie. Help ons asseblief deur " "[color=$color][url=$url]een by te dra[/url][/color]!" @@ -3304,8 +3304,14 @@ msgid "Update Continuously" msgstr "Deurlopend" #: editor/editor_node.cpp -msgid "Update When Changed" -msgstr "" +#, fuzzy +msgid "Update All Changes" +msgstr "Plaaslike veranderinge word gebêre..." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Plaaslike veranderinge word gebêre..." #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -4053,6 +4059,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4176,7 +4190,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Duplicate..." msgstr "Dupliseer" @@ -5024,19 +5038,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12813,6 +12827,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14167,10 +14189,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Ongeldige naam." -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14217,17 +14235,195 @@ msgstr "Kon nie vouer skep nie." msgid "Error starting HTTP server:" msgstr "Leêr word gebêre:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Ongeldige naam." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Kon nie vouer skep nie." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Ongeldige Pad." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Ontkoppel" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Moet 'n geldige uitbreiding gebruik." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Moet 'n geldige uitbreiding gebruik." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Nie gevind nie!" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "Kon nie vouer skep nie." + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Ongeldige naam." #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14238,6 +14434,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14296,6 +14555,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Ongeldige Pad." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Moet 'n geldige uitbreiding gebruik." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Ongeldige naam." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14646,8 +14926,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14891,7 +15171,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 37c6d1943e..29efa92a54 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -57,13 +57,17 @@ # Hareth Mohammed <harethpy@gmail.com>, 2021. # Mohammed Mubarak <modymu9@gmail.com>, 2021. # Spirit <i8bou3@gmail.com>, 2021, 2022. +# TURKYM7MD <turkytb7700@gmail.com>, 2022. +# zeyad majed <zmajd62@gmail.com>, 2022. +# Whales State <whalesstate@gmail.com>, 2022. +# Mr.k <mineshtine28546271@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" -"Last-Translator: Nabeel20 <nabeelandnizam@gmail.com>\n" +"PO-Revision-Date: 2022-02-16 08:44+0000\n" +"Last-Translator: Mr.k <mineshtine28546271@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -72,7 +76,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -285,7 +289,7 @@ msgstr "تكرار الرسوم المتحركة" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Functions:" -msgstr "الإعدادات:المهام:" +msgstr "الدوال:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" @@ -427,7 +431,7 @@ msgstr "إدخال حركة" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp msgid "node '%s'" -msgstr "العقدة (node) '%s'" +msgstr "وحدة '%s'" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp @@ -557,8 +561,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -654,7 +658,7 @@ msgstr "إذهب إلى الخطوة السابقة" #: editor/animation_track_editor.cpp msgid "Apply Reset" -msgstr "طَبق إعادة تعيين" +msgstr "إعادة تعيين" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -998,7 +1002,7 @@ msgstr "تعديل..." #: editor/connections_dialog.cpp msgid "Go to Method" -msgstr "إذهب إلى الدالة" +msgstr "اذهب إلى الدالة" #: editor/create_dialog.cpp msgid "Change %s Type" @@ -1062,16 +1066,16 @@ msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" -"المشهد '%s' هو حالياً جاري تعديله.\n" -"ستسري التغييرات فقط عند إعادة التحميل." +"يتم حاليا تحرير المشهد '٪s'.\n" +"لن تسري التغييرات إلا بعد إعادة تحميلها." #: editor/dependency_editor.cpp msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" -"المورد '%s' قيد الإستخدام.\n" -" ستسري التغييرات فقط عند إعادة التحميل." +"المورد '%s' هو قيد الإستخدام.\n" +"لن تسري التغييرات إلا بعد إعادة التحميل." #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -1123,9 +1127,9 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"حذف الملفات المُختارة من المشروع؟ (لا يمكن استعادتها).\n" -"حسب إِعدادات مُدير ملفاتِك, إِما سيتم نقل الملقات إِلى سلة المُهملات أَو سيتم حذفها " -"نهائياً." +"هل تريد حذف الملفات المحددة من المشروع؟ (لا يمكن التراجع.)\n" +"إستنادًا إلى نظام تشغيل جهازك, قد يتم نقل الملفات إلى سلة المهملات أو حذفها " +"نهائيًا." #: editor/dependency_editor.cpp msgid "" @@ -1146,7 +1150,7 @@ msgstr "لا يمكن المسح:" #: editor/dependency_editor.cpp msgid "Error loading:" -msgstr "خطآ في التحميل:" +msgstr "خطأ في التحميل:" #: editor/dependency_editor.cpp msgid "Load failed due to missing dependencies:" @@ -1158,7 +1162,7 @@ msgstr "إفتح علي أية حال" #: editor/dependency_editor.cpp msgid "Which action should be taken?" -msgstr "ماذا يجب أن يُفعل؟" +msgstr "ماذا الأجراء الذي يجب أن يُتخذ؟" #: editor/dependency_editor.cpp msgid "Fix Dependencies" @@ -1170,7 +1174,7 @@ msgstr "اخطاء في التحميل!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "هل تريد حذف %d عنصر (عناصر) نهائيًا؟ (لا تراجع!)" +msgstr "هل تريد حذف %d عنصر (عناصر) نهائيًا؟ (لا يمكن التراجع!)" #: editor/dependency_editor.cpp msgid "Show Dependencies" @@ -1210,7 +1214,7 @@ msgstr "شكراً من مجتمع غودوت!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "انقر للنسخ" +msgstr "انقر للنسخ." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1333,7 +1337,7 @@ msgstr "فشل استخراج الملفات التالية من الحزمة \" #: editor/editor_asset_installer.cpp msgid "(and %s more files)" -msgstr "و %s ملف أكثر." +msgstr "(و فَشَلَ %s من الملفات)" #: editor/editor_asset_installer.cpp msgid "Asset \"%s\" installed successfully!" @@ -1417,7 +1421,7 @@ msgid "Bus Options" msgstr "خيارات مسار الصوت (BUS)" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "تكرير" @@ -1529,7 +1533,7 @@ msgstr "اسم غير صالح." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "لا يمكن أن تبدأ برقم." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -1927,9 +1931,8 @@ msgid "Configure Selected Profile:" msgstr "عدل على الحساب الحالي:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Extra Options:" -msgstr "إعدادات الصف (Class):" +msgstr "خيارات إضافية:" #: editor/editor_feature_profile.cpp msgid "Create or import a profile to edit available classes and properties." @@ -1960,7 +1963,6 @@ msgid "Select Current Folder" msgstr "تحديد المجلد الحالي" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "File exists, overwrite?" msgstr "الملف موجود، إستبدال؟" @@ -2153,7 +2155,7 @@ msgstr "خاصيات" #: editor/editor_help.cpp #, fuzzy msgid "overrides %s:" -msgstr "يتجاوز:" +msgstr "يتجاوز s%:" #: editor/editor_help.cpp msgid "default:" @@ -2168,28 +2170,25 @@ msgid "Theme Properties" msgstr "خصائص الثِمة" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Colors" -msgstr "اللون" +msgstr "الألوان" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constants" msgstr "ثوابت" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Fonts" -msgstr "الخط" +msgstr "الخطوط" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Icons" -msgstr "الأيقونة" +msgstr "الأيقونات" #: editor/editor_help.cpp #, fuzzy msgid "Styles" -msgstr "الأسلوب" +msgstr "الأنماط" #: editor/editor_help.cpp msgid "Enumerations" @@ -2208,8 +2207,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"لا يوجد حاليا وصف لهذه الخاصية. الرجاء المساعدة من خلال [color=$color][url=" -"$url]المساهمة واحد [/url][/color]!" +"لا يوجد حاليا وصف لهذه الخاصية. الرجاء المساعدة من خلال [color=$color]" +"[url=$url]المساهمة واحد [/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2217,11 +2216,11 @@ msgstr "أوصاف الدوال" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"لا يوجد حاليا وصف لهذه الطريقة. الرجاء المساعدة من خلال [color=$color][url=" -"$url]المساهمة واحد[/url][/color] !" +"لا يوجد حاليا وصف لهذه الطريقة. الرجاء المساعدة من خلال [color=$color]" +"[url=$url]المساهمة واحد[/url][/color] !" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -2304,11 +2303,11 @@ msgstr "(القيمة)" #: editor/editor_inspector.cpp msgid "" "Pinning a value forces it to be saved even if it's equal to the default." -msgstr "" +msgstr "تثبيت القيمةيجْبرَهٌ حتي لو كانت تساوي القيمة الإفتراضية." #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" -msgstr "" +msgstr "القيمة المثبتة [معطلة لان '%s' هو/هي في المحرر-فقط]" #: editor/editor_inspector.cpp editor/scene_tree_dock.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -2323,21 +2322,19 @@ msgstr "تحديد التكرار:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "" +msgstr "تم تثبيت %s" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "" +msgstr "تم فك التثبيت s%" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" -msgstr "خاصيات" +msgstr "نسخ ال" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" -msgstr "خاصيات" +msgstr "لصق ال" #: editor/editor_inspector.cpp #, fuzzy @@ -2515,9 +2512,8 @@ msgid "" msgstr "لا يمكن حفظ المشهد. على الأرجح لا يمكن إستيفاء التبعيات (مجسّدات)." #: editor/editor_node.cpp -#, fuzzy msgid "Could not save one or more scenes!" -msgstr "لا يمكن بدء عملية جانبية!" +msgstr "لم يتمكن من حفظ واحد أو أكثر من المشاهد!" #: editor/editor_node.cpp msgid "Save All Scenes" @@ -2714,9 +2710,8 @@ msgid "Nothing to undo." msgstr "لا شيء للتراجع عنه." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "تراجع" +msgstr "تراجع: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." @@ -2727,9 +2722,8 @@ msgid "Nothing to redo." msgstr "لا شيء لإعادة عمله مجدداً." #: editor/editor_node.cpp -#, fuzzy msgid "Redo: %s" -msgstr "إعادة تراجع" +msgstr "إعادة: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2819,9 +2813,9 @@ msgid "" "error in that script.\n" "Disabling the addon at '%s' to prevent further errors." msgstr "" -"غير قادر علي تحميل النص البرمجي للإضافة من المسار: '%s'. يبدو أنه يوجد خطأ " +"غير قادر علي تحميل النص البرمجي للإضافة من المسار: '%s'. يبدو أنه يوجد خطأ " "في ذلك النص البرمجي.\n" -" تعطيل الإضافة في '%s' كي لا تحصل أخطاء." +"تعطيل الإضافة في '%s' كي لا تحصل أخطاء." #: editor/editor_node.cpp msgid "" @@ -3333,10 +3327,16 @@ msgid "Update Continuously" msgstr "تحديث متواصل" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "تحديث عند التغيير" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "تغيرات المادة:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "إخفاء دوران التحديث" @@ -3462,9 +3462,8 @@ msgid "Select" msgstr "حدد" #: editor/editor_node.cpp -#, fuzzy msgid "Select Current" -msgstr "تحديد الحالي" +msgstr "حدد المشهد الحالي" #: editor/editor_node.cpp msgid "Open 2D Editor" @@ -3703,9 +3702,8 @@ msgid "Paste" msgstr "لصق" #: editor/editor_resource_picker.cpp editor/property_editor.cpp -#, fuzzy msgid "Convert to %s" -msgstr "تحويل إلي %s" +msgstr "حوّلْ إلى %s" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New %s" @@ -3754,10 +3752,10 @@ msgid "Did you forget the '_run' method?" msgstr "هل نسيت الطريقة '_run' ؟" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hold %s to round to integers. Hold Shift for more precise changes." msgstr "" -"امسك Ctrl للتدوير للأعداد الصحيحة. اضغط على Shift لإجراء تغييرات أكثر دقة." +"اضغط باستمرار s% للتقريب إلى اعداد صحيحة.اضغط باستمرار Shift لإجراء تغييرات " +"أكثر دقة." #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -3790,9 +3788,8 @@ msgid "Uninstall these templates." msgstr "إزالة تثبيت هذه القوالب." #: editor/export_template_manager.cpp -#, fuzzy msgid "There are no mirrors available." -msgstr "لا يوجد ملف '%s'." +msgstr "لا يوجد مرايا متوفرة." #: editor/export_template_manager.cpp #, fuzzy @@ -3808,24 +3805,20 @@ msgid "Error requesting URL:" msgstr "خطأ في طلب الرابط:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connecting to the mirror..." -msgstr "يتصل بالسرفر..." +msgstr "يتم الاتصال بالمرآة..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't resolve the requested address." -msgstr "لا يمكن حل أسم المُضيف:" +msgstr "لا يمكن حل العنوان المطلوب." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't connect to the mirror." -msgstr "لا يمكن الإتصال بالمُضيف:" +msgstr "لا يمكن الإتصال بالمُضيف." #: editor/export_template_manager.cpp -#, fuzzy msgid "No response from the mirror." -msgstr "لا ردّ من المُضيف:" +msgstr "لا ردّ من المُضيف." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3833,14 +3826,12 @@ msgid "Request failed." msgstr "فشل الطلب." #: editor/export_template_manager.cpp -#, fuzzy msgid "Request ended up in a redirect loop." -msgstr "فشل الطلب٫ السبب هو اعادة التحويل مرات اكثر من اللازم" +msgstr "فشل الطلب, السبب هو انتهاء الطلب في حلقة إعادة توجيه." #: editor/export_template_manager.cpp -#, fuzzy msgid "Request failed:" -msgstr "فشل الطلب." +msgstr "فَشَلَ الطلب:" #: editor/export_template_manager.cpp msgid "Download complete; extracting templates..." @@ -3929,9 +3920,8 @@ msgid "Can't open the export templates file." msgstr "لم نستطع فتح الملف المضغوط المُورد." #: editor/export_template_manager.cpp -#, fuzzy msgid "Invalid version.txt format inside the export templates file: %s." -msgstr "صيغة غير صالحة ل version.txt داخل القالب: %s." +msgstr "صيغة غير صالحة ل version.txt داخل ملف القالب: %s." #: editor/export_template_manager.cpp #, fuzzy @@ -3952,9 +3942,8 @@ msgid "Importing:" msgstr "يستورد:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove templates for the version '%s'?" -msgstr "ازالة نسخة القالب '%s'؟" +msgstr "ازالة القوالب للنسخة '%s'؟" #: editor/export_template_manager.cpp msgid "Uncompressing Android Build Sources" @@ -3990,14 +3979,12 @@ msgid "Uninstall" msgstr "إلغاء التثبيت" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall templates for the current version." -msgstr "القيمة المبدئية للعداد" +msgstr "إلغاء تثبيت القوالب للنسخة الحالية." #: editor/export_template_manager.cpp -#, fuzzy msgid "Download from:" -msgstr "خطأ في التحميل" +msgstr "التحميل من:" #: editor/export_template_manager.cpp #, fuzzy @@ -4029,9 +4016,8 @@ msgid "Install from File" msgstr "تثبيت من ملف" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install templates from a local file." -msgstr "إستيراد القوالب من ملف مضغوط بصيغة Zip" +msgstr "تثبيت القوالب من ملف محلي." #: editor/export_template_manager.cpp editor/find_in_files.cpp #: editor/progress_dialog.cpp scene/gui/dialogs.cpp @@ -4120,6 +4106,14 @@ msgstr "الأسم يحتوي علي أحرف غير صالحة." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4127,7 +4121,10 @@ msgid "" "\n" "Do you wish to overwrite them?" msgstr "" -"تتعارض الملفات أو المجلدات التالية مع العناصر الموجودة في الموقع الهدف\n" +"تتعارض الملفات أو المجلدات التالية مع العناصر الموجودة في الموقع الهدف '%s'\n" +"\n" +"%s\n" +"\n" "هل ترغب في الكتابة عليها؟" #: editor/filesystem_dock.cpp @@ -4233,11 +4230,10 @@ msgid "Sort by Last Modified" msgstr "آخر ما تم تعديله" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort by First Modified" -msgstr "آخر ما تم تعديله" +msgstr "رتب من أول ما تم تعديله" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "تكرير..." @@ -4592,7 +4588,7 @@ msgstr "إجعل الموارد الجانبية مميزة" #: editor/inspector_dock.cpp msgid "Create a new resource in memory and edit it." -msgstr "انشاء مورد جديد فى الذاكرة و تعديله" +msgstr "انشاء مورد جديد فى الذاكرة و تعديله." #: editor/inspector_dock.cpp msgid "Load an existing resource from disk and edit it." @@ -4640,9 +4636,8 @@ msgid "History of recently edited objects." msgstr "تاريخ العناصر المعدلة حالياً." #: editor/inspector_dock.cpp -#, fuzzy msgid "Open documentation for this object." -msgstr "فتح الوثائق" +msgstr "إفتح الوثائق لهذا الكائن." #: editor/inspector_dock.cpp editor/scene_tree_dock.cpp msgid "Open Documentation" @@ -4902,9 +4897,8 @@ msgid "Blend:" msgstr "الدمج:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Parameter Changed:" -msgstr "لقد تم تغيير المَعلم" +msgstr "لقد تم تغيير المَعلم:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -5050,6 +5044,10 @@ msgid "Rename Animation" msgstr "إعادة تسمية الرسم المتحرك" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "تكرار الرسم المتحرك" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "دمج التغيير التالي" @@ -5062,10 +5060,6 @@ msgid "Load Animation" msgstr "تحميل الرسم المتحرك" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "تكرار الرسم المتحرك" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "لا رسم متحرك لنسخها!" @@ -6045,14 +6039,12 @@ msgid "Drag: Rotate selected node around pivot." msgstr "ازالة الكائن المحدد او الإنتقال المحدد." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Move selected node." -msgstr "Alt+سحب: تحريك" +msgstr "Alt + إسحب: لتحريك الوحدة المحددة." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Scale selected node." -msgstr "Alt+سحب: تحريك" +msgstr "Alt+سحب: لتغيير حجم الوحدة المحددة." #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6061,11 +6053,10 @@ msgstr "ازالة الكائن المحدد او الإنتقال المحدد. #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Alt+RMB: Show list of all nodes at position clicked, including locked." msgstr "" -"أظهر قائمة من كل العناصر في المنطقة المضغوطة\n" -"(تماماً مثل Alt+زر الفأرة الأيمن في وضع التحديد)." +"Alt + زر الفأرة الأيمن: أظهر قائمة لكل الوحدات في المنطقة المضغوطة، متضمنة " +"المقفلة منها." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "RMB: Add node at position clicked." @@ -6368,51 +6359,45 @@ msgid "Zoom to 12.5%" msgstr "التكبير حتى 12.5%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 25%" -msgstr "تصغير" +msgstr "التكبير إلى 25%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 50%" -msgstr "تصغير" +msgstr "التكبير إلى 50%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 100%" -msgstr "تصغير" +msgstr "التكبير إلى 100%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 200%" -msgstr "تصغير" +msgstr "التكبير إلى 200%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 400%" -msgstr "تصغير" +msgstr "التكبير إلى 400%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 800%" -msgstr "تصغير" +msgstr "التكبير إلى 800%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 1600%" -msgstr "التكبير حتى 1600%" +msgstr "التكبير إلى 1600%" #: editor/plugins/canvas_item_editor_plugin.cpp #: modules/visual_script/visual_script_func_nodes.cpp msgid "Add %s" -msgstr "أضف %s" +msgstr "أضفْ %s" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Adding %s..." -msgstr "إضافة %s..." +msgstr "يتم إضافة %s..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Cannot instantiate multiple nodes without root." -msgstr "لا يمكن إنشاء عقد متعددة بدون العقدة الجذر." +msgstr "لا يمكن إضافة وحدات متعددة بدون الوحدةالرئيسية." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6682,9 +6667,8 @@ msgid "No mesh to debug." msgstr "لا ميش لتصحيحة." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Mesh has no UV in layer %d." -msgstr "النموذج ليس لديه UV في هذا الطابق" +msgstr "المجسّم ليس لديه UV في الطبقة %d." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "MeshInstance lacks a Mesh!" @@ -7435,12 +7419,12 @@ msgstr "القلب أفقياً" #: editor/plugins/room_manager_editor_plugin.cpp #, fuzzy msgid "Room Generate Points" -msgstr "عدد النقاط المولدة:" +msgstr "عدد النقاط المولدة" #: editor/plugins/room_manager_editor_plugin.cpp #, fuzzy msgid "Generate Points" -msgstr "عدد النقاط المولدة:" +msgstr "عدد النقاط المولدة" #: editor/plugins/room_manager_editor_plugin.cpp #, fuzzy @@ -8065,8 +8049,9 @@ msgstr " [auto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid " [portals active]" -msgstr " [portals active]" +msgstr " [البوابات مفعلة]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8103,7 +8088,7 @@ msgstr "وضع التدوير" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Translate" -msgstr "الترجمة:" +msgstr "الترجمة" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale" @@ -8130,48 +8115,41 @@ msgid "Animation Key Inserted." msgstr "أُدخل مفتاح الرسوم المتحركة." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Pitch:" -msgstr "حدّة" +msgstr "حدّة:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Yaw:" msgstr "ياو:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size:" -msgstr "الحجم: " +msgstr "الحجم:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Objects Drawn:" -msgstr "كائنات مرسومة" +msgstr "كائنات مرسومة:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Material Changes:" -msgstr "تُغيرات المادة" +msgstr "تغيرات المادة:" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Shader Changes:" -msgstr "تغيرات المُظلل" +msgstr "تغيرات المُظلل:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Surface Changes:" -msgstr "تغيرات السطح" +msgstr "تغيرات السطح:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Draw Calls:" -msgstr "رسم الاستدعاءات" +msgstr "استدعاءات الرسم:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Vertices:" -msgstr "القمم" +msgstr "القمم:" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" @@ -8353,8 +8331,8 @@ msgstr "" "\n" "العين المفتوحة: الأداة مرئية.\n" "العين المغلقة: الأداة مخفية.\n" -"العين نصف مفتوحة: الأداة مرئية أيضا من خلال الأسطح المعتمة (\"الأشعة السينية" -"\")." +"العين نصف مفتوحة: الأداة مرئية أيضا من خلال الأسطح المعتمة (\"الأشعة " +"السينية\")." #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -8444,11 +8422,11 @@ msgstr "إلغاء/تفعيل وضع الرؤية الحُرة" #: editor/plugins/spatial_editor_plugin.cpp msgid "Decrease Field of View" -msgstr "" +msgstr "قلّل مجال الرؤية" #: editor/plugins/spatial_editor_plugin.cpp msgid "Increase Field of View" -msgstr "" +msgstr "زدْ مجال الرؤية" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -8867,16 +8845,15 @@ msgstr "{num} خط (خطوط)" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy msgid "No fonts found." -msgstr "لم يوجد!" +msgstr "لم يوجد." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} icon(s)" msgstr "{num} أيقونة (أيقونات)" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No icons found." -msgstr "لم يوجد!" +msgstr "لم توجد ايقونات." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} stylebox(es)" @@ -8905,9 +8882,8 @@ msgid "Importing items {n}/{n}" msgstr "استيراد العناصر {n}/{n}" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Updating the editor" -msgstr "خروج من المُعدل؟" +msgstr "تحديث المحرر" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8924,9 +8900,8 @@ msgid "With Data" msgstr "مع البيانات" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select by data type:" -msgstr "اختر عُقدة" +msgstr "أخترْ بوساطة نوع المعلومة:" #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible color items." @@ -8941,9 +8916,8 @@ msgid "Deselect all visible color items." msgstr "أزل اختيار العناصر الملونة المرئية." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible constant items." -msgstr "اختر عنصر إعدادات بدايةً!" +msgstr "اختر كل العناصر الثابتة المرئية." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible constant items and their data." @@ -8954,9 +8928,8 @@ msgid "Deselect all visible constant items." msgstr "أزل اختيار العناصر الثابتة المرئية." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible font items." -msgstr "اختر عنصر إعدادات بدايةً!" +msgstr "اختر كل عناصر الخط المرئية." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible font items and their data." @@ -8967,19 +8940,16 @@ msgid "Deselect all visible font items." msgstr "أزل اختيار جميع عناصر الخط المرئية." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items." -msgstr "اختر عنصر إعدادات بدايةً!" +msgstr "اختر كل عناصر الأيقونات المرئية." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all visible icon items and their data." -msgstr "اختر عنصر إعدادات بدايةً!" +msgstr "اختر كل عناصر الأيقونات المرئية و بياناتها." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Deselect all visible icon items." -msgstr "اختر عنصر إعدادات بدايةً!" +msgstr "ألغِ اختيار كل عناصر الأيقونات المرئية." #: editor/plugins/theme_editor_plugin.cpp msgid "Select all visible stylebox items." @@ -9002,42 +8972,37 @@ msgstr "" "بصورة معتبرة." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Collapse types." -msgstr "طوي الكل" +msgstr "إطوي الأنواع." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Expand types." -msgstr "توسيع الكل" +msgstr "توسيع كل الأنواع." #: editor/plugins/theme_editor_plugin.cpp #, fuzzy msgid "Select all Theme items." -msgstr "حدد ملف القالب" +msgstr "حدد ملف القالب." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select With Data" -msgstr "إختر النقاط" +msgstr "إختر مع البيانات" #: editor/plugins/theme_editor_plugin.cpp msgid "Select all Theme items with item data." msgstr "اختر جميع عناصر الثيم والبيانات المتعلقة بهم." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Deselect All" -msgstr "تحديد الكل" +msgstr "إلغاء تحديد الكل" #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all Theme items." msgstr "أزل اختيار جميع عناصر الثيم." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Import Selected" -msgstr "إستيراد مشهد" +msgstr "إستيراد المحدد" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -9058,9 +9023,8 @@ msgstr "" "يمكنك إضافة نوع خاص أو استيراد نوع آخر مترافق من عناصره من ثيم آخر." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove All Color Items" -msgstr "إزالة جميع العناصر" +msgstr "إزالة جميع عناصر الالوان" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9096,9 +9060,8 @@ msgstr "" "ضف المزيد من العناصر يدوياً أو عن طريق استيرادها من ثيم آخر." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Color Item" -msgstr "إضافة بنود للصنف" +msgstr "إضافة عنصر اللون" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9121,9 +9084,8 @@ msgid "Add Stylebox Item" msgstr "إضافة جميع العناصر" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Rename Color Item" -msgstr "حذف بنود من الصنف" +msgstr "إعادة تسمية عنصر اللون" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9136,9 +9098,8 @@ msgid "Rename Font Item" msgstr "إعادة تسمية العُقدة" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Rename Icon Item" -msgstr "إعادة تسمية العُقدة" +msgstr "إعادة تسمية عنصر الأيقونة" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9160,24 +9121,20 @@ msgid "Manage Theme Items" msgstr "إدارة القوالب" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Items" -msgstr "عنصر قابل للتعديل" +msgstr "تحرير العناصر" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Types:" -msgstr "نوع:" +msgstr "أنواع:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Type:" -msgstr "نوع:" +msgstr "أضفْ نوع:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Item:" -msgstr "إضافة عنصر" +msgstr "إضافة عنصر:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9185,9 +9142,8 @@ msgid "Add StyleBox Item" msgstr "إضافة جميع العناصر" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Items:" -msgstr "إزالة عنصر" +msgstr "إزالة عنصر:" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" @@ -9208,14 +9164,12 @@ msgid "Add Theme Item" msgstr "عناصر ثيم واجهة المستخدم" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Old Name:" -msgstr "إسم العقدة:" +msgstr "الأسم القديم:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Import Items" -msgstr "استيراد الموضوع Theme" +msgstr "إستَردْ العناصر" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9230,7 +9184,7 @@ msgstr "تحرير الموضوع" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy msgid "Select Another Theme Resource:" -msgstr "حذف المورد" +msgstr "حذف المورد:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9243,7 +9197,7 @@ msgstr "إضافة نوع" #: editor/plugins/theme_editor_plugin.cpp msgid "Filter the list of types or create a new custom type:" -msgstr "" +msgstr "قم بتصفية قائمة الأنواع أو قم بأنشاء نوع جديد:" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9251,24 +9205,20 @@ msgid "Available Node-based types:" msgstr "الملفات المتوافرة:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Type name is empty!" -msgstr "اسم الملف فارغ." +msgstr "أسم النوع فارغ!" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Are you sure you want to create an empty type?" -msgstr "هل أنت واثق من فتح أكثر من مشروع؟" +msgstr "هل أنت واثق من إنشاء نوع فارغ؟" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Confirm Item Rename" -msgstr "تغيير إسم مسار التحريك" +msgstr "تأكيد اعادة تسمية العنصر" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Cancel Item Rename" -msgstr "إعادة تسمية الدفعة" +msgstr "إلغاء إعادة تسمية العنصر" #: editor/plugins/theme_editor_plugin.cpp msgid "Override Item" @@ -9287,18 +9237,16 @@ msgstr "" "المشابهة في جميع صناديق المظهر من هذا النوع." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Show Default" -msgstr "تحميل الإفتراضي" +msgstr "أظهر الإفتراضي" #: editor/plugins/theme_editor_plugin.cpp msgid "Show default type items alongside items that have been overridden." msgstr "أظهر عناصر النمط الافتراضي إلى جانب العناصر التي تم تجاوزها." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Override All" -msgstr "يتجاوز" +msgstr "تجاوز الكل" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." @@ -9311,12 +9259,11 @@ msgstr "إضافة نوع للعنصر" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy msgid "Theme:" -msgstr "الموضوع" +msgstr "الموضوع:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Manage Items..." -msgstr "إدارة قوالب التصدير..." +msgstr "إدارة الأنواع..." #: editor/plugins/theme_editor_plugin.cpp msgid "Add, remove, organize and import Theme items." @@ -9376,9 +9323,8 @@ msgid "Checked Radio Item" msgstr "عنصر مُفعل اختياري" #: editor/plugins/theme_editor_preview.cpp -#, fuzzy msgid "Named Separator" -msgstr "الفاصل المُسمّى." +msgstr "فاصل مُسمّى" #: editor/plugins/theme_editor_preview.cpp msgid "Submenu" @@ -9902,7 +9848,7 @@ msgstr "خطأ" #: editor/plugins/version_control_editor_plugin.cpp msgid "" "Remote settings are empty. VCS features that use the network may not work." -msgstr "" +msgstr "الإعدادت عن بُعد فارغة. يمكن أنْ لا تعمل خصائص VCS التي تستخدم الشبكة." #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -9926,20 +9872,20 @@ msgstr "تغيرات المُظلل" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Commit:" -msgstr "ارتكاب" +msgstr "ارتكاب:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "تاريخ:" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Subtitle:" -msgstr "الشجرة الفرعية" +msgstr "العنوان:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "هل تريد إزالة فرع s%؟" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -9971,27 +9917,27 @@ msgstr "إعادة التسمية" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "كلمة المرور" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "مسار المفتاح العام لSSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "أختر مسار المفتاح العام لSSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "مسار المفتاح الخاص لSSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "أختر مسار المفتاح الخاص لSSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "كلمة مرور SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" @@ -10000,12 +9946,12 @@ msgstr "الكشف عن التغيرات الجديدة" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Discard all changes" -msgstr "الإغلاق مع حفظ التعديلات؟" +msgstr "إلغاء جميع التعديلات" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Stage all changes" -msgstr "جاري تخزين التعديلات المحلية..." +msgstr "تحضير جميع التغيرات" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -10043,9 +9989,8 @@ msgid "30" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "يطابق:" +msgstr "فروع" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -10059,7 +10004,7 @@ msgstr "حذف مسار التحريك" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "أسم الفرع" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -10077,14 +10022,13 @@ msgid "Remove Remote" msgstr "إزالة عنصر" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "من بعد " +msgstr "من بُعد" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Remote URL" -msgstr "من بعد " +msgstr "من بعد" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" @@ -10101,7 +10045,7 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Force Push" -msgstr "الميش المصدر:" +msgstr "أنشر بإجبار" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -10126,7 +10070,7 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "View:" -msgstr "أظهر" +msgstr "أظهر:" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -11026,7 +10970,7 @@ msgstr "المُظلل البصري" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Edit Visual Property:" -msgstr "تحرير الخاصية البصرية" +msgstr "تحرير الخاصية البصرية:" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" @@ -11470,12 +11414,12 @@ msgstr "هل أنت متأكد من فتح %d مشاريع مرّة واحدة؟ #: editor/project_manager.cpp #, fuzzy msgid "Remove %d projects from the list?" -msgstr "اختر جهازاً من القائمة" +msgstr "أتريد إزالة %d من المشاريع من القائمة؟" #: editor/project_manager.cpp #, fuzzy msgid "Remove this project from the list?" -msgstr "اختر جهازاً من القائمة" +msgstr "أتريد إزالة هذا المشروع من القائمة؟" #: editor/project_manager.cpp msgid "" @@ -11563,7 +11507,7 @@ msgstr "إزالة المفقود" #: editor/project_manager.cpp msgid "About" -msgstr "حول" +msgstr "حول هذا المستند" #: editor/project_manager.cpp #, fuzzy @@ -11851,7 +11795,7 @@ msgstr "إعدادات المشروع (project.godot)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" -msgstr "بشكل عام" +msgstr "عام" #: editor/project_settings_editor.cpp msgid "Override For..." @@ -12983,6 +12927,16 @@ msgstr "تعديل نصف قطر الشكل الأسطواني" msgid "Set Occluder Sphere Position" msgstr "ضع الإنحناء في الموقع" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "حدد موقع نقطة الإنحناء" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "حدد موقع نقطة الإنحناء" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "تغيير نصف قطر الاسطوانة" @@ -13708,24 +13662,23 @@ msgstr "تحديد التعبير" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "أرجعْ" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "رسوم متحركة" +msgstr "شرط" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "" +msgstr "إذا (الشرط) هو:" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "رَيْثَما" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "ريثما (الشرط):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" @@ -13733,7 +13686,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "لكل (عنصر) في (معلومات-الإدخال):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -13768,7 +13721,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy msgid "Type Cast" -msgstr "نوع:" +msgstr "نوع" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" @@ -13991,7 +13944,7 @@ msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "إنتظر" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy @@ -14005,7 +13958,7 @@ msgstr "نسبة الإطار الفيزيائي %" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "s% ثانية(ثواني)" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy @@ -14057,12 +14010,11 @@ msgstr "يعمل على %s" #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Exporting APK..." -msgstr "تصدير الكُل" +msgstr "تصدير APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Uninstalling..." -msgstr "إلغاء التثبيت" +msgstr "إلغاء التثبيت..." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -14072,7 +14024,7 @@ msgstr "يستقبل المرايا، من فضلك إنتظر..." #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Could not install to device: %s" -msgstr "لا يمكن بدء عملية جانبية!" +msgstr "لم يتمكن من التثبيت على الجهاز: %s" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -14150,7 +14102,7 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "Missing 'build-tools' directory!" -msgstr "ملف \"أدوات البناء\"build-tools مفقود!" +msgstr "مجلد 'أدوات البناء' (build-tools) مفقود!" #: platform/android/export/export_plugin.cpp msgid "Unable to find Android SDK build-tools' apksigner command." @@ -14240,16 +14192,13 @@ msgid "Signing debug %s..." msgstr "يتم توقيع نسخة التنقيح البرمجي %s..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signing release %s..." -msgstr "" -"يفحص الملفات،\n" -"من فضلك إنتظر..." +msgstr "التوقيع-الرقمي للاصدار %s..." #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Could not find keystore, unable to export." -msgstr "لا يمكن فتح القالب من أجل التصدير:" +msgstr "لا يمكن فتح القالب, من أجل التصدير." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -14258,7 +14207,7 @@ msgstr "أعاد 'apksigner' الخطأ التالي #%d" #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Verifying %s..." -msgstr "إضافة %s..." +msgstr "التأكيد من %s..." #: platform/android/export/export_plugin.cpp msgid "'apksigner' verification of %s failed." @@ -14279,8 +14228,9 @@ msgid "APK Expansion not compatible with Android App Bundle." msgstr "توسيع APK غير متوافق مع حزمة تطبيق الأندرويد Android App Bundle." #: platform/android/export/export_plugin.cpp +#, fuzzy msgid "Invalid filename! Android APK requires the *.apk extension." -msgstr "إسم ملف غير صالح! يتطلب ملف APK اللاحقة *.apk" +msgstr "إسم ملف غير صالح! يتطلب ملف اندرويد APK اللاحقة .*.apk" #: platform/android/export/export_plugin.cpp msgid "Unsupported export format!\n" @@ -14313,14 +14263,13 @@ msgstr "" "تعذرت كتابة overwrite ملفات res://android/build/res/*.xml مع اسم المشروع" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project\n" -msgstr "لا قدرة على تحرير project.godot في مسار المشروع." +msgstr "لم يتمكن من تصدير ملفات المشروع إلى مشروع gradle\n" #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Could not write expansion package file!" -msgstr "لا يمكن كتابة الملف:" +msgstr "لا يمكن كتابة الملف!" #: platform/android/export/export_plugin.cpp msgid "Building Android Project (gradle)" @@ -14355,11 +14304,12 @@ msgid "Creating APK..." msgstr "إنشاء المحيط..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Could not find template APK to export:\n" "%s" -msgstr "لا يمكن فتح القالب من أجل التصدير:" +msgstr "" +"لم يتم إيجاد قالب APK للتصدير:\n" +"%s" #: platform/android/export/export_plugin.cpp msgid "" @@ -14380,7 +14330,7 @@ msgstr "إضافة %s..." #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Could not export project files" -msgstr "لا يمكن كتابة الملف:" +msgstr "لا يمكن كتابة الملف" #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -14408,10 +14358,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "مُحدد غير صالح:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "الأيقونة المطلوبة لم تُحدد في الإعدادات المُسبقة." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "إيقاف مُخدم HTTP" @@ -14449,12 +14395,174 @@ msgstr "لا يمكن قراءة ملف HTML مخصص:" #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not create HTTP server directory:" -msgstr "لا يمكن إنشاء المجلد." +msgstr "لا يمكن إنشاء المجلد:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server:" -msgstr "خطأ في حفظ المشهد." +msgstr "خطأ في بدء تشغيل خادم HTTP:" + +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "اسم مشروع غير صالح." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "هندسياصً غير صالح، لا يمكن إنشاء مُضلّع." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "لا يمكن إنشاء المجلد." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "مسار غير صالح." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "فشل تحميل المورد." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "فشل تحميل المورد." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "صيغة غير صالحة." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "صيغة غير صالحة." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "لم توجد ايقونات." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "ينشئ الصورة المصغرة" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"لم يتم إيجاد قالب APK للتصدير:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" #: platform/osx/export/export.cpp #, fuzzy @@ -14462,11 +14570,34 @@ msgid "Invalid bundle identifier:" msgstr "مُحدد غير صالح:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "التوثيق: إن توقيع الشفرة البرمجية مطلوب." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "التوثيق: إن تمكين وقت التشغيل hardened runtime مطلوب." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "التوثيق: إن تمكين وقت التشغيل hardened runtime مطلوب." #: platform/osx/export/export.cpp @@ -14477,6 +14608,69 @@ msgstr "التوثيق: لم يتم تحديد اسم معرف Apple ID." msgid "Notarization: Apple ID password not specified." msgstr "التوثيق: لم يتم تحديد كلمة مرور Apple ID." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "اسم الرُزمة القصير غير صالح." @@ -14529,6 +14723,27 @@ msgstr "أبعاد صورة الشعار المربع 310x150 غير صالحة msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "أبعاد شاشة البداية غير صالحة (ينبغي أن تكون 620×300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "مسار غير صالح." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "صيغة غير صالحة." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "مُعرف GUID (المُعرّف الفريد العالمي) للمنتج غير صالح." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14584,8 +14799,8 @@ msgstr "" #: scene/2d/collision_polygon_2d.cpp msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." msgstr "" -"مضلع غير صالح. يتطلب الأمر على الأقل نقطتين في نمط البناء \"المتجزئ Segments" -"\"." +"مضلع غير صالح. يتطلب الأمر على الأقل نقطتين في نمط البناء \"المتجزئ " +"Segments\"." #: scene/2d/collision_shape_2d.cpp msgid "" @@ -14623,8 +14838,8 @@ msgid "" "\"Particles Animation\" enabled." msgstr "" "تتطلب الرسوم المتحركة للجسيمات-وحدة-المعالجة-المركزية-ثنائية-الأبعاد " -"(CPUParticles2D) استخدام لوحة-مادة-العنصر (CanvasItemMaterial) مع تفعيل" -"\"الرسوم المتحركة للجزيئات\"." +"(CPUParticles2D) استخدام لوحة-مادة-العنصر (CanvasItemMaterial) مع " +"تفعيل\"الرسوم المتحركة للجزيئات\"." #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be PhysicsBody2Ds" @@ -14988,8 +15203,8 @@ msgstr "المعايير الموحدة هي المدعومة فقط." #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "الجسيمات القائمة على وحدة معالجة الرسومات (GPU-based particles) لا تدعم " "برنامج تشغيل الفيديو GLES2 .\n" @@ -15256,9 +15471,10 @@ msgstr "" "ذلك." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "اللون: #%s\n" diff --git a/editor/translations/az.po b/editor/translations/az.po index 5aecfb0e5f..46738301a9 100644 --- a/editor/translations/az.po +++ b/editor/translations/az.po @@ -534,8 +534,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1413,7 +1413,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2188,8 +2188,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3217,7 +3217,12 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" +msgstr "Dəyişdir" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3945,6 +3950,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4057,7 +4070,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4848,19 +4861,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12322,6 +12335,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13622,10 +13643,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13666,16 +13683,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13686,6 +13873,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13738,6 +13988,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14088,8 +14356,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14329,7 +14597,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index a0e22270a6..7bb426d010 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -10,8 +10,8 @@ # Damyan Dichev <mwshock2@gmail.com>, 2019. # Whod <whodizhod@gmail.com>, 2020. # Stoyan <stoyan.stoyanov99@protonmail.com>, 2020. -# zooid <the.zooid@gmail.com>, 2020. -# Любомир Василев <lyubomirv@gmx.com>, 2020, 2021. +# zooid <the.zooid@gmail.com>, 2020, 2022. +# Любомир Василев <lyubomirv@gmx.com>, 2020, 2021, 2022. # Ziv D <wizdavid@gmail.com>, 2020. # Violin Iliev <violin.developer@gmail.com>, 2021. msgid "" @@ -19,8 +19,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-12-31 08:52+0000\n" -"Last-Translator: Violin Iliev <violin.developer@gmail.com>\n" +"PO-Revision-Date: 2022-02-16 08:44+0000\n" +"Last-Translator: Любомир Василев <lyubomirv@gmx.com>\n" "Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/" "godot/bg/>\n" "Language: bg\n" @@ -28,7 +28,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.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -49,12 +49,12 @@ msgstr "Недостатъчно байтове за разкодиране ил #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "Неправилно въведени дани %i (не подаден) в израза" +msgstr "Неправилен входен параметър %i (не е подаден) в израза" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" msgstr "" -"self не може да се ползва, тъй като инстанцията е null (не е била подадена)" +"self не може да се използва, тъй като инстанцията е null (не е била подадена)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -70,11 +70,11 @@ msgstr "Невалидно наименован индекс '%s' за базо #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" -msgstr "Неправилни аргументи за създаване на „%s“" +msgstr "Неправилни аргументи за изграждане на „%s“" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "При обаждане към '%s':" +msgstr "При извикване на „%s“:" #: core/ustring.cpp msgid "B" @@ -110,7 +110,7 @@ msgstr "Свободно" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "Балансиран" +msgstr "Балансирано" #: editor/animation_bezier_editor.cpp msgid "Mirror" @@ -203,27 +203,27 @@ msgstr "Промени анимационния цикъл" #: editor/animation_track_editor.cpp msgid "Property Track" -msgstr "Писта за промяна на характеристики" +msgstr "Пътечка за свойство" #: editor/animation_track_editor.cpp msgid "3D Transform Track" -msgstr "Писта за промяна на триизмерна трансформация" +msgstr "Пътечка за 3-измерна трансформация" #: editor/animation_track_editor.cpp msgid "Call Method Track" -msgstr "" +msgstr "Пътечка за извикване на метод" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "" +msgstr "Пътечка за крива на Безие" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "" +msgstr "Пътечка за възпроизвеждане на звук" #: editor/animation_track_editor.cpp msgid "Animation Playback Track" -msgstr "" +msgstr "Пътечка за възпроизвеждане на анимация" #: editor/animation_track_editor.cpp msgid "Animation length (frames)" @@ -248,35 +248,36 @@ msgstr "Функции:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "" +msgstr "Звукови клипове:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" -msgstr "" +msgstr "Анимационни клипове:" #: editor/animation_track_editor.cpp msgid "Change Track Path" -msgstr "" +msgstr "Промяна на пътя на пътечката" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." -msgstr "" +msgstr "Включване/изключване на тази пътечка." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" -msgstr "" +msgstr "Режим на обновяване (как се задава стойност на това свойство)" #: editor/animation_track_editor.cpp msgid "Interpolation Mode" -msgstr "" +msgstr "Режим на интерполация" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" msgstr "" +"Режим на превъртане (интерполиране между края и началото при превъртане)" #: editor/animation_track_editor.cpp msgid "Remove this track." -msgstr "Премахване на пътечката." +msgstr "Премахване на тази пътечка." #: editor/animation_track_editor.cpp msgid "Time (s): " @@ -284,15 +285,15 @@ msgstr "Време (сек): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" -msgstr "" +msgstr "Включване/изключване на пътечката" #: editor/animation_track_editor.cpp msgid "Continuous" -msgstr "" +msgstr "Плавно" #: editor/animation_track_editor.cpp msgid "Discrete" -msgstr "" +msgstr "Дискретно" #: editor/animation_track_editor.cpp msgid "Trigger" @@ -304,7 +305,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Nearest" -msgstr "" +msgstr "Без интерполиране" #: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp @@ -313,7 +314,7 @@ msgstr "Линейно" #: editor/animation_track_editor.cpp msgid "Cubic" -msgstr "" +msgstr "Кубично" #: editor/animation_track_editor.cpp msgid "Clamp Loop Interp" @@ -326,7 +327,7 @@ msgstr "" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "" +msgstr "Вмъкване на ключ" #: editor/animation_track_editor.cpp msgid "Duplicate Key(s)" @@ -355,16 +356,16 @@ msgstr "Промяна на режима на повтаряне на анима #: editor/animation_track_editor.cpp msgid "Remove Anim Track" -msgstr "" +msgstr "Премахване на анимационната пътечка" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp msgid "Create NEW track for %s and insert key?" -msgstr "Създаване на НОВА пътечка за %s и вмъкване на ключ?" +msgstr "Да се създаде ли НОВА пътечка за %s и да се вмъкне ключ?" #: editor/animation_track_editor.cpp msgid "Create %d NEW tracks and insert keys?" -msgstr "" +msgstr "Да се създадат ли %d НОВИ пътечки и да се вмъкнат ключове?" #: editor/animation_track_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp @@ -381,12 +382,12 @@ msgstr "Създаване" #: editor/animation_track_editor.cpp msgid "Anim Insert" -msgstr "" +msgstr "Вмъкване на анимация" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp msgid "node '%s'" -msgstr "възел „%s“" +msgstr "обект „%s“" #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp @@ -404,15 +405,15 @@ msgstr "свойство „%s“" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" -msgstr "" +msgstr "Създаване и вмъкване на анимация" #: editor/animation_track_editor.cpp msgid "Anim Insert Track & Key" -msgstr "" +msgstr "Вмъкване на писта и ключ за анимация" #: editor/animation_track_editor.cpp msgid "Anim Insert Key" -msgstr "" +msgstr "Вмъкване на ключ за анимация" #: editor/animation_track_editor.cpp msgid "Change Animation Step" @@ -425,6 +426,8 @@ msgstr "Пренареждане на пътечките" #: editor/animation_track_editor.cpp msgid "Transform tracks only apply to Spatial-based nodes." msgstr "" +"Пътечките за трансформация могат да работят само с обекти, базирани на " +"Spatial." #: editor/animation_track_editor.cpp msgid "" @@ -433,14 +436,19 @@ msgid "" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" msgstr "" +"Пътечки за възпроизвеждане на звук могат да сочат само към обекти от тип:\n" +"-AudioStreamPlayer\n" +"-AudioStreamPlayer2D\n" +"-AudioStreamPlayer3D" #: editor/animation_track_editor.cpp msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" +"Анимационните пътечки могат да сочат само към обекти от тип AnimationPlayer." #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" -msgstr "" +msgstr "Добавянето на нова пътечка без корен е невъзможно" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" @@ -511,8 +519,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -612,7 +620,7 @@ msgstr "Почистване на анимацията" #: editor/animation_track_editor.cpp msgid "Pick the node that will be animated:" -msgstr "Изберете възелa, който да бъде анимиран:" +msgstr "Изберете обекта, който да бъде анимиран:" #: editor/animation_track_editor.cpp msgid "Use Bezier Curves" @@ -685,7 +693,7 @@ msgstr "Избиране на всичко/нищо" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" -msgstr "Добавяне на аудио клип" +msgstr "Добавяне на звукова пътечка" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" @@ -798,7 +806,7 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Connect to Node:" -msgstr "Свързване към възел:" +msgstr "Свързване към обект:" #: editor/connections_dialog.cpp msgid "Connect to Script:" @@ -995,23 +1003,27 @@ msgstr "Описание:" #: editor/dependency_editor.cpp msgid "Search Replacement For:" -msgstr "" +msgstr "Търсене на заместител за:" #: editor/dependency_editor.cpp msgid "Dependencies For:" -msgstr "" +msgstr "Зависимости за:" #: editor/dependency_editor.cpp msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" +"Сцената „%s“ в момента се редактира.\n" +"Промените ще влязат в сила след презареждане." #: editor/dependency_editor.cpp msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" +"Ресурсът „%s“ се използва.\n" +"Промените ще влязат в сила след презареждане." #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -1020,12 +1032,12 @@ msgstr "Зависимости" #: editor/dependency_editor.cpp editor/editor_resource_picker.cpp msgid "Resource" -msgstr "" +msgstr "Ресурс" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings_editor.cpp msgid "Path" -msgstr "" +msgstr "Път" #: editor/dependency_editor.cpp msgid "Dependencies:" @@ -1033,15 +1045,15 @@ msgstr "Зависимости:" #: editor/dependency_editor.cpp msgid "Fix Broken" -msgstr "" +msgstr "Поправка на грешките" #: editor/dependency_editor.cpp msgid "Dependency Editor" -msgstr "" +msgstr "Редактор на зависимости" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" -msgstr "" +msgstr "Търсене на заместващ ресурс:" #: editor/dependency_editor.cpp editor/editor_file_dialog.cpp #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -1055,7 +1067,7 @@ msgstr "Отваряне" #: editor/dependency_editor.cpp msgid "Owners Of:" -msgstr "" +msgstr "Собственици на:" #: editor/dependency_editor.cpp msgid "" @@ -1063,9 +1075,9 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"Да се премахнат ли избраните файлове от проекта? (Действието е необратимо.)\n" -"Според настройката на файловата Ви система, файловете ще бъдат или " -"преместени в кошчето, или окончателно изтрити." +"Да се премахнат ли избраните файлове от проекта? (Това е необратимо.)\n" +"В зависимост от настройките на файловата система, файловете може да бъдат " +"преместени в кошчето или окончателно изтрити." #: editor/dependency_editor.cpp msgid "" @@ -1075,6 +1087,10 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" +"Файловете за премахване са необходими за работата на други ресурси.\n" +"Наистина ли искате да ги премахнете? (Това е необратимо.)\n" +"В зависимост от настройките на файловата система, файловете може да бъдат " +"преместени в кошчето или окончателно изтрити." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1106,7 +1122,7 @@ msgstr "Грешки при зареждането!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "" +msgstr "Наистина ли искате да изтриете %d елемент(а)? (Това е необратимо!)" #: editor/dependency_editor.cpp msgid "Show Dependencies" @@ -1349,7 +1365,7 @@ msgid "Bus Options" msgstr "Настройки на шината" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -1457,75 +1473,76 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Invalid name." -msgstr "" +msgstr "Неправилно име." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "Не може да започва с цифра." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" -msgstr "" +msgstr "Позволени знаци:" #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing engine class name." -msgstr "" +msgstr "Не може да съвпада с име на клас от Godot." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing built-in type name." -msgstr "" +msgstr "Не може да съвпада с име на вграден тип." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing global constant name." -msgstr "" +msgstr "Не може да съвпада с име на съществуваща глобална константа." #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "Не може да се ползва ключова дума като име на автозареждане." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "" +msgstr "Вече съществува автозареждане „%s“!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "" +msgstr "Преименуване на автозареждането" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" -msgstr "" +msgstr "Превключване на глобалните автозареждания" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" -msgstr "" +msgstr "Преместване на автозареждането" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" -msgstr "" +msgstr "Премахване на автозареждането" #: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" -msgstr "" +msgstr "Включване" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" -msgstr "" +msgstr "Преподреждане на автозарежданията" #: editor/editor_autoload_settings.cpp msgid "Can't add autoload:" -msgstr "" +msgstr "Не може да се добави автозареждане:" #: editor/editor_autoload_settings.cpp msgid "%s is an invalid path. File does not exist." -msgstr "" +msgstr "Неправилен път: „%s“. Файлът не съществува." #: editor/editor_autoload_settings.cpp msgid "%s is an invalid path. Not in resource path (res://)." msgstr "" +"Неправилен път: „%s“. Трябва да се намира в пътя за ресурсите (res://)." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "" +msgstr "Добавяне на автозареждане" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp @@ -1536,13 +1553,13 @@ msgstr "Път:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" -msgstr "" +msgstr "Име на обекта:" #: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp #: editor/editor_plugin_settings.cpp editor/editor_profiler.cpp #: editor/project_manager.cpp editor/settings_config_dialog.cpp msgid "Name" -msgstr "" +msgstr "Име" #: editor/editor_autoload_settings.cpp msgid "Global Variable" @@ -1550,7 +1567,7 @@ msgstr "Глобална променлива" #: editor/editor_data.cpp msgid "Paste Params" -msgstr "" +msgstr "Поставяне на параметрите" #: editor/editor_data.cpp msgid "Updating Scene" @@ -1695,7 +1712,7 @@ msgstr "Редактиране на дървото на сцената" #: editor/editor_feature_profile.cpp msgid "Node Dock" -msgstr "Панел за възлите" +msgstr "Панел за обектите" #: editor/editor_feature_profile.cpp msgid "FileSystem Dock" @@ -1787,7 +1804,7 @@ msgstr "" #: editor/editor_feature_profile.cpp msgid "Nodes and Classes:" -msgstr "Възли и класове:" +msgstr "Обекти и класове:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." @@ -2063,9 +2080,8 @@ msgid "Properties" msgstr "" #: editor/editor_help.cpp -#, fuzzy msgid "overrides %s:" -msgstr "Замяна на всичко" +msgstr "заменя %s:" #: editor/editor_help.cpp msgid "default:" @@ -2096,9 +2112,8 @@ msgid "Icons" msgstr "Иконки" #: editor/editor_help.cpp -#, fuzzy msgid "Styles" -msgstr "Стил" +msgstr "Стилове" #: editor/editor_help.cpp msgid "Enumerations" @@ -2124,8 +2139,8 @@ msgstr "Описания на методите" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -2202,9 +2217,8 @@ msgid "Property:" msgstr "" #: editor/editor_inspector.cpp -#, fuzzy msgid "Pin value" -msgstr "(стойност)" +msgstr "Закачане на стойността" #: editor/editor_inspector.cpp msgid "" @@ -2235,19 +2249,16 @@ msgid "Unpinned %s" msgstr "" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" -msgstr "Копиране на свойствата" +msgstr "Копиране на свойството" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" -msgstr "Поставяне на свойствата" +msgstr "Поставяне на свойството" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "Копиране на свойствата" +msgstr "Копиране на пътя на свойството" #: editor/editor_log.cpp msgid "Output:" @@ -2295,7 +2306,7 @@ msgstr "" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" -msgstr "Възел" +msgstr "Обект" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" @@ -2936,9 +2947,8 @@ msgid "Install Android Build Template..." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Отваряне на папката с данни на проекта" +msgstr "Отваряне на папката с данни на потребителя" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3024,6 +3034,12 @@ msgid "" "Asynchronous shader compilation must be enabled in the project settings for " "this option to make a difference." msgstr "" +"Ако това е включено, ще се използват резервните варианти на шейдърите (или " +"видими чрез убершейдър, или скрити) през цялото време на изпълнението.\n" +"Това е полезно, ако искате да видите как изглеждат и как се държат " +"резервните шейдъри, които обикновено се виждат за много кратко време.\n" +"За да работи това, в настройките на проекта трябва да е включено " +"асинхронното компилиране на шейдърите." #: editor/editor_node.cpp msgid "Synchronize Scene Changes" @@ -3179,8 +3195,14 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" -msgstr "" +#, fuzzy +msgid "Update All Changes" +msgstr "Премахване на всички промени от индекса за подаване" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Промени в материала:" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -3219,9 +3241,8 @@ msgid "Install from file" msgstr "Инсталиране от файл" #: editor/editor_node.cpp -#, fuzzy msgid "Select android sources file" -msgstr "Изберете източник за полигонна мрежа:" +msgstr "Изберете изходен файл за android" #: editor/editor_node.cpp msgid "" @@ -3233,6 +3254,14 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" +"Това ще настрои проекта Ви за персонализирано компилиране за Android, като " +"инсталира изходния шаблон в „res://android/build“.\n" +"След това ще можете да го промените (като добавите модули, промените файла " +"„AndroidManifest.xml“ и т.н.) и да създадете свой собствен APK за " +"изнасянето.\n" +"Имайте предвид, че за да ползвате персонализирани файлове APK, вместо " +"предварително готовите, в конфигурацията за изнасяне за Android трябва да " +"поставена отметка в „Използване на собствена компилация“." #: editor/editor_node.cpp msgid "" @@ -3259,9 +3288,8 @@ msgid "Merge With Existing" msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Apply MeshInstance Transforms" -msgstr "Промяна на трансформация (Анимация)" +msgstr "Прилагане на трансформациите на MeshInstance" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3597,9 +3625,8 @@ msgstr "" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Грешка!" +msgstr "Грешка от %s" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -3908,6 +3935,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4020,7 +4055,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4117,9 +4152,8 @@ msgid "Replace..." msgstr "Замяна..." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Replace in Files" -msgstr "Замяна на всички" +msgstr "Замяна във файловете" #: editor/find_in_files.cpp msgid "Find: " @@ -4130,9 +4164,8 @@ msgid "Replace: " msgstr "Замяна: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace All (NO UNDO)" -msgstr "Замяна на всички" +msgstr "Замяна на всички (НЕОБРАТИМО)" #: editor/find_in_files.cpp msgid "Searching..." @@ -4185,7 +4218,7 @@ msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp #: editor/scene_tree_editor.cpp msgid "Filter nodes" -msgstr "Филтриране на възлите" +msgstr "Филтриране на обектите" #: editor/groups_editor.cpp msgid "Nodes in Group" @@ -4286,11 +4319,11 @@ msgstr "Запазване..." #: editor/import_defaults_editor.cpp msgid "Select Importer" -msgstr "Изберете метод на внасяне" +msgstr "Изберете вид внасяне" #: editor/import_defaults_editor.cpp msgid "Importer:" -msgstr "Метод на внасяне:" +msgstr "Вид внасяне:" #: editor/import_defaults_editor.cpp msgid "Reset to Defaults" @@ -4439,7 +4472,7 @@ msgstr "" #: editor/node_dock.cpp msgid "Select a single node to edit its signals and groups." -msgstr "Изберете един възел, за да редактирате сигналите и групите му." +msgstr "Изберете един обект, за да редактирате сигналите и групите му." #: editor/plugin_config_dialog.cpp msgid "Edit a Plugin" @@ -4539,7 +4572,7 @@ msgstr "Зареждане..." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Move Node Point" -msgstr "Преместване на точката на възела" +msgstr "Преместване на точката на обекта" #: editor/plugins/animation_blend_space_1d_editor.cpp msgid "Change BlendSpace1D Limits" @@ -4554,12 +4587,12 @@ msgstr "" #: editor/plugins/animation_state_machine_editor.cpp msgid "This type of node can't be used. Only root nodes are allowed." msgstr "" -"Този тип възел не може да бъде използван. Разрешени са само коренни възли." +"Този тип обект не може да бъде използван. Разрешени са само коренни обекти." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Add Node Point" -msgstr "Добавяне на точка за възел" +msgstr "Добавяне на точка за обект" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4584,7 +4617,7 @@ msgid "" msgstr "" "AnimationTree не е активен.\n" "Активирайте го, за да включите възпроизвеждането. Ако не стане, проверете " -"дали има предупредителни съобщения относно възлите." +"дали има предупредителни съобщения относно обектите." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4617,7 +4650,7 @@ msgstr "Отваряне на редактора" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Open Animation Node" -msgstr "Отваряне на възела за анимация" +msgstr "Отваряне на обекта за анимация" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Triangle already exists." @@ -4645,7 +4678,7 @@ msgstr "" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "BlendSpace2D does not belong to an AnimationTree node." -msgstr "BlendSpace2D не принадлежи на възел от тип AnimationTree." +msgstr "BlendSpace2D не принадлежи на обект от тип AnimationTree." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "No triangles exist, so no blending can take place." @@ -4687,11 +4720,11 @@ msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Add Node to BlendTree" -msgstr "" +msgstr "Добавяне на обекта към BlendTree" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Node Moved" -msgstr "Възелът е преместен" +msgstr "Обектът е преместен" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Unable to connect, port may be in use or connection may be invalid." @@ -4702,12 +4735,12 @@ msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Nodes Connected" -msgstr "Възлите са свързани" +msgstr "Обектите са свързани" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Nodes Disconnected" -msgstr "Възлите са разкачени" +msgstr "Обектите са разкачени" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Set Animation" @@ -4716,12 +4749,12 @@ msgstr "Задаване на анимация" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Delete Node" -msgstr "Изтриване на възела" +msgstr "Изтриване на обекта" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/scene_tree_dock.cpp msgid "Delete Node(s)" -msgstr "Изтриване на възела/възлите" +msgstr "Изтриване на обекта/обектите" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" @@ -4748,7 +4781,7 @@ msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Anim Clips" -msgstr "" +msgstr "Анимационни клипове" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Audio Clips" @@ -4761,12 +4794,12 @@ msgstr "Функции" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" -msgstr "Възелът е преименуван" +msgstr "Обектът е преименуван" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add Node..." -msgstr "Добавяне на възел..." +msgstr "Добавяне на обект…" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp @@ -4779,7 +4812,7 @@ msgstr "Включване на филтрирането" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" -msgstr "" +msgstr "Превключване на авт. възпроизвеждане" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" @@ -4817,6 +4850,10 @@ msgid "Rename Animation" msgstr "Преименуване на анимацията" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Дублиране на анимацията" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "" @@ -4829,10 +4866,6 @@ msgid "Load Animation" msgstr "Зареждане на анимация" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Дублиране на анимацията" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Няма анимация за копиране!" @@ -4880,7 +4913,7 @@ msgstr "Позиция в анимацията (в секунди)." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." msgstr "" -"Скалиране на скоростта на възпроизвеждане на анимацията глобално за възела." +"Скалиране на скоростта на възпроизвеждане на анимацията глобално за обекта." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" @@ -4893,7 +4926,7 @@ msgstr "Анимация" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/version_control_editor_plugin.cpp msgid "New" -msgstr "" +msgstr "Нова" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Transitions..." @@ -4905,7 +4938,7 @@ msgstr "Отваряне в инспектора" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." -msgstr "" +msgstr "Показване на списъка с анимации." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" @@ -4992,7 +5025,7 @@ msgstr "Времена на смесване между анимациите" #: editor/plugins/animation_state_machine_editor.cpp msgid "Move Node" -msgstr "Преместване на възела" +msgstr "Преместване на обекта" #: editor/plugins/animation_state_machine_editor.cpp msgid "Transition exists!" @@ -5005,7 +5038,7 @@ msgstr "Добавяне на преход" #: editor/plugins/animation_state_machine_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Add Node" -msgstr "Добавяне на възел" +msgstr "Добавяне на обект" #: editor/plugins/animation_state_machine_editor.cpp msgid "End" @@ -5037,7 +5070,7 @@ msgstr "Няма ресурс, който може да бъде изпълне #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Removed" -msgstr "Възелът е премахнат" +msgstr "Обектът е премахнат" #: editor/plugins/animation_state_machine_editor.cpp msgid "Transition Removed" @@ -5056,15 +5089,15 @@ msgstr "" #: editor/plugins/animation_state_machine_editor.cpp msgid "Create new nodes." -msgstr "Създаване на нови възли." +msgstr "Създаване на нови обекти." #: editor/plugins/animation_state_machine_editor.cpp msgid "Connect nodes." -msgstr "Свързване на възли." +msgstr "Свързване на обекти." #: editor/plugins/animation_state_machine_editor.cpp msgid "Remove selected node or transition." -msgstr "Премахване на избрания възел или преход." +msgstr "Премахване на избрания обект или преход." #: editor/plugins/animation_state_machine_editor.cpp msgid "Toggle autoplay this animation on start, restart or seek to zero." @@ -5085,7 +5118,7 @@ msgstr "Режим на възпроизвеждане:" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "AnimationTree" -msgstr "" +msgstr "AnimationTree" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "New name:" @@ -5177,7 +5210,7 @@ msgstr "" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Animation Node" -msgstr "Анимационен възел" +msgstr "Анимационен обект" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "OneShot Node" @@ -5217,7 +5250,7 @@ msgstr "Внасяне на анимации..." #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Edit Node Filters" -msgstr "Промяна на филтрите за възлите" +msgstr "Промяна на филтрите за обектите" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Filters..." @@ -5756,7 +5789,7 @@ msgstr "Изчистване на водачите" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Custom Bone(s) from Node(s)" -msgstr "Създаване на персонализирана(и) кост(и) от възела(възлите)" +msgstr "Създаване на персонализирана/и кост(и) от обекта/обектите" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Bones" @@ -5791,31 +5824,30 @@ msgstr "Режим на избиране" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Drag: Rotate selected node around pivot." -msgstr "Влачене: Въртене на избрания възел около централната му точка." +msgstr "Влачене: въртене на избрания обект около централната му точка." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+Drag: Move selected node." -msgstr "Alt+Влачене: преместване на избрания възел." +msgstr "Alt+Влачене: преместване на избрания обект." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Scale selected node." -msgstr "Alt+Влачене: преместване на избрания възел." +msgstr "Alt+Влачене: скалиране на избрания обект." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "V: Set selected node's pivot position." -msgstr "V: Задаване на централната точка на възела." +msgstr "V: задаване на централната точка на обекта." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Alt+RMB: Show list of all nodes at position clicked, including locked." msgstr "" -"Alt+Десен бутон: Показване на списък с всички обекти на щракнатата позиция, " +"Alt+Десен бутон: показване на списък с всички обекти на щракнатата позиция, " "включително заключените." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "RMB: Add node at position clicked." -msgstr "" +msgstr "Десен бутон: добавяне на обект на щракнатата позиция." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5912,7 +5944,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Node Sides" -msgstr "Прилепване към страните на възела" +msgstr "Прилепване към страните на обекта" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Node Center" @@ -5920,7 +5952,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Other Nodes" -msgstr "Прилепване към другите възли" +msgstr "Прилепване към другите обекти" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Guides" @@ -5929,13 +5961,12 @@ msgstr "Прилепване към водачите" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock the selected object in place (can't be moved)." -msgstr "Заключване на избрания обект на място (за да не може да се премества)." +msgstr "Заключване на избрания обект на място (за да не може да бъде местен)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected Node(s)" -msgstr "Заключване на избраното" +msgstr "Заключване на избрания обект/обекти" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5944,9 +5975,8 @@ msgstr "Отключване на избрания обект (за да мож #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected Node(s)" -msgstr "Изтриване на възела/възлите" +msgstr "Отключване на избрания обект/обекти" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5955,9 +5985,8 @@ msgstr "Прави така, че децата на този обект да н #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected Node(s)" -msgstr "Групиране на избраното" +msgstr "Групиране на избрания обект/обекти" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5966,9 +5995,8 @@ msgstr "Възстановява на способността да се изб #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected Node(s)" -msgstr "Разгрупиране на избраното" +msgstr "Разгрупиране на избрания обект/обекти" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton Options" @@ -6025,7 +6053,7 @@ msgstr "Центриране върху избраното" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "" +msgstr "Мащабиране до побиране на избраното в изгледа" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" @@ -6077,11 +6105,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add Node Here" -msgstr "Добавяне на възел тук" +msgstr "Добавяне на обект тук" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Instance Scene Here" -msgstr "Инстанциране на сцената тук" +msgstr "Инстанциране на сцена тук" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" @@ -6151,7 +6179,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Create Node" -msgstr "Създаване на възел" +msgstr "Създаване на обект" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6254,7 +6282,7 @@ msgstr "Създаване на излъчващи точки от полиго #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Node" -msgstr "Създаване на излъчващи точки от възела" +msgstr "Създаване на излъчващи точки от обекта" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 0" @@ -6564,14 +6592,12 @@ msgid "Remove Selected Item" msgstr "" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Ignore Transforms)" -msgstr "Внасяне от сцена" +msgstr "Внасяне от сцена (пренебрегване на трансформациите)" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Import from Scene (Apply Transforms)" -msgstr "Внасяне от сцена" +msgstr "Внасяне от сцена (прилагане на трансформациите)" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Update from Scene" @@ -6579,8 +6605,7 @@ msgstr "Обновяване от сцена" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." -msgstr "" -"Няма посочен източник за полигонна мрежа (и във възела няма MultiMesh)." +msgstr "Няма посочен източник за полигонна мрежа (и в обекта няма MultiMesh)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and MultiMesh contains no Mesh)." @@ -7165,9 +7190,8 @@ msgid "Occluder Set Transform" msgstr "Изчистване на трансформацията" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Center Node" -msgstr "Създаване на възел" +msgstr "Центриране на обекта" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -7301,12 +7325,10 @@ msgid "Move Down" msgstr "Преместване надолу" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Next Script" msgstr "Следващ скрипт" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Previous Script" msgstr "Предишен скрипт" @@ -7596,9 +7618,8 @@ msgid "Find in Files..." msgstr "Търсене във файловете…" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Replace in Files..." -msgstr "Замяна..." +msgstr "Замяна във файловете…" #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" @@ -7674,9 +7695,8 @@ msgid "Skeleton2D" msgstr "" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Reset to Rest Pose" -msgstr "Връщане на стандартните настройки" +msgstr "Връщане в поза на покой" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Overwrite Rest Pose" @@ -7841,7 +7861,7 @@ msgstr "Размер:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn:" -msgstr "" +msgstr "Изчертани обекти:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Material Changes:" @@ -7857,7 +7877,7 @@ msgstr "Промени в повърхнината:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Draw Calls:" -msgstr "" +msgstr "Извиквания за изчертаване:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Vertices:" @@ -7865,7 +7885,7 @@ msgstr "Вертекси:" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" -msgstr "" +msgstr "Кадри/сек: %d (%s мсек)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -7901,11 +7921,11 @@ msgstr "Подравняване на ротацията с изгледа" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." -msgstr "" +msgstr "Няма родител, към който да се добави дъщерен обект." #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "This operation requires a single selected node." -msgstr "" +msgstr "Това действие изисква да е избран само един обект." #: editor/plugins/spatial_editor_plugin.cpp msgid "Auto Orthogonal Enabled" @@ -7913,7 +7933,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" -msgstr "" +msgstr "Заключване на въртенето на изгледа" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Normal" @@ -7933,15 +7953,15 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Environment" -msgstr "" +msgstr "Показване на обкръжението" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Gizmos" -msgstr "" +msgstr "Показване на гизмота" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" -msgstr "" +msgstr "Показване на информация" #: editor/plugins/spatial_editor_plugin.cpp msgid "View FPS" @@ -7949,7 +7969,7 @@ msgstr "Показване на кадри/сек" #: editor/plugins/spatial_editor_plugin.cpp msgid "Half Resolution" -msgstr "" +msgstr "Половин резолюция" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" @@ -7961,11 +7981,11 @@ msgstr "Включване на доплеровия ефект" #: editor/plugins/spatial_editor_plugin.cpp msgid "Cinematic Preview" -msgstr "" +msgstr "Кинематографски предварителен преглед" #: editor/plugins/spatial_editor_plugin.cpp msgid "Not available when using the GLES2 renderer." -msgstr "" +msgstr "Не е налично при използване на изчертаване чрез GLES2." #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" @@ -7993,7 +8013,7 @@ msgstr "Свободен изглед отдолу" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "" +msgstr "Модификатор за скоростта на свободния изглед" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Slow Modifier" @@ -8005,18 +8025,23 @@ msgstr "Превключване на изгледа за преглед на к #: editor/plugins/spatial_editor_plugin.cpp msgid "View Rotation Locked" -msgstr "" +msgstr "Въртенето на изгледа е заключено" #: editor/plugins/spatial_editor_plugin.cpp msgid "" "To zoom further, change the camera's clipping planes (View -> Settings...)" msgstr "" +"За да увеличите още мащаба, променете равнините на отсичане на камерата " +"(Изглед -> Настройки…)" #: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" +"Забележка: Показаната стойност за кадрите/сек е тази на редактора.\n" +"Тя не бива да се ползва като показател за реалната производителност на " +"играта." #: editor/plugins/spatial_editor_plugin.cpp msgid "Convert Rooms" @@ -8024,7 +8049,7 @@ msgstr "Преобразуване на стаите" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" -msgstr "" +msgstr "Диалогов прозорец XForm" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -8034,22 +8059,28 @@ msgid "" "Closed eye: Gizmo is hidden.\n" "Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")." msgstr "" +"Щракнете, за да превключите между състоянията на видимост.\n" +"\n" +"Отворено око: гизмото е видимо.\n" +"Затворено око: гизмото е скрито.\n" +"Полуотворено око: гизмото е видимо и през непрозрачни повърхности " +"(„рентген“)." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Nodes to Floor" -msgstr "Прилепване на възлите към пода" +msgstr "Прилепване на обектите към пода" #: editor/plugins/spatial_editor_plugin.cpp msgid "Couldn't find a solid floor to snap the selection to." -msgstr "" +msgstr "Не е намерен твърд под, към който да се прилепи избраното." #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Local Space" -msgstr "" +msgstr "Използване на локалното пространство" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" -msgstr "" +msgstr "Използване на прилепването" #: editor/plugins/spatial_editor_plugin.cpp msgid "Converts rooms for portal culling." @@ -8057,129 +8088,128 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" -msgstr "" +msgstr "Изглед отдолу" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View" -msgstr "" +msgstr "Изглед отгоре" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View" -msgstr "" +msgstr "Изглед отзад" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View" -msgstr "" +msgstr "Изглед отпред" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View" -msgstr "" +msgstr "Изглед отляво" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View" -msgstr "" +msgstr "Изглед отдясно" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orbit View Down" -msgstr "" +msgstr "Орбитален изглед отдолу" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orbit View Left" -msgstr "" +msgstr "Орбитален изглед отляво" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orbit View Right" -msgstr "" +msgstr "Орбитален изглед отдясно" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orbit View Up" -msgstr "" +msgstr "Орбитален изглед отгоре" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orbit View 180" -msgstr "" +msgstr "Орбитален изглед 180" #: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" -msgstr "" +msgstr "Превключване между перспективен/ортогонален изглед" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" -msgstr "" +msgstr "Вмъкване на ключ за анимиране" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Origin" -msgstr "" +msgstr "Фокусиране върху отправната точка" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Selection" -msgstr "" +msgstr "Фокусиране върху избраното" #: editor/plugins/spatial_editor_plugin.cpp msgid "Toggle Freelook" -msgstr "" +msgstr "Превключване към свободен изглед" #: editor/plugins/spatial_editor_plugin.cpp msgid "Decrease Field of View" -msgstr "" +msgstr "Намаляване на полето на видимост" #: editor/plugins/spatial_editor_plugin.cpp msgid "Increase Field of View" -msgstr "" +msgstr "Увеличаване на полето на видимост" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Reset Field of View to Default" -msgstr "Връщане на стандартните настройки" +msgstr "Връщане на стандартното поле на видимост" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform" -msgstr "" +msgstr "Трансформиране" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Object to Floor" -msgstr "" +msgstr "Прилепяне на обекта към пода" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." -msgstr "" +msgstr "Прозорец за трансформиране…" #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" -msgstr "" +msgstr "1 прозорец за изглед" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports" -msgstr "" +msgstr "2 прозореца за изглед" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports (Alt)" -msgstr "" +msgstr "2 прозореца за изглед (друг)" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports" -msgstr "" +msgstr "3 прозореца за изглед" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports (Alt)" -msgstr "" +msgstr "3 прозореца за изглед (друг)" #: editor/plugins/spatial_editor_plugin.cpp msgid "4 Viewports" -msgstr "" +msgstr "4 прозореца за изглед" #: editor/plugins/spatial_editor_plugin.cpp msgid "Gizmos" -msgstr "" +msgstr "Гизмота" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" -msgstr "" +msgstr "Показване на отправната точка" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Grid" -msgstr "" +msgstr "Показване на решетката" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Portal Culling" @@ -8197,27 +8227,27 @@ msgstr "Настройки…" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" -msgstr "" +msgstr "Настройки за прилепването" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" -msgstr "" +msgstr "Прилепване при транслация:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "" +msgstr "Прилепване при ротация (градуси):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "" +msgstr "Прилепване при скалиране (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" -msgstr "" +msgstr "Настройки на прозореца за изглед" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" -msgstr "" +msgstr "Поле на видимост в перспектива (градуси):" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Near:" @@ -8854,14 +8884,12 @@ msgid "Filter the list of types or create a new custom type:" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Available Node-based types:" -msgstr "Налични профили:" +msgstr "Налични типове основани на Node:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Type name is empty!" -msgstr "Полигонната мрежа е празна!" +msgstr "Името на типа е празно!" #: editor/plugins/theme_editor_plugin.cpp msgid "Are you sure you want to create an empty type?" @@ -9488,14 +9516,12 @@ msgid "Commit" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Промени в шейдъра:" +msgstr "Промени в индекса за подаване" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Промени в шейдъра:" +msgstr "Промени, които не са в индекса за подаване" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit:" @@ -9506,9 +9532,8 @@ msgid "Date:" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "Поддърво" +msgstr "Подзаглавие:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" @@ -9531,150 +9556,136 @@ msgid "Initialize" msgstr "Инициализиране" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "Премахване на точката" +msgstr "Отдалечен вход" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "Преименуван" +msgstr "Потребителско име" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "Парола" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "Път до публичния SSH ключ" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "Задайте пътя до публичния SSH ключ" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "Път до частния SSH ключ" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "Задайте пътя до частния SSH ключ" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "Парола за SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "Засичане на новите промени" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "Затвяране и запазване на промените?" +msgstr "Отмяна на всички промени" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "Запазване на локалните промени..." +msgstr "Добавяне на всички промени в индекса за подаване" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "Промени в материала:" +msgstr "Премахване на всички промени от индекса за подаване" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Message" -msgstr "" +msgstr "Съобщение за подаването" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" -msgstr "" +msgstr "Подаване на промените" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit List" -msgstr "" +msgstr "Списък с подавания" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "Размер на списъка с подавания" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Съвпадения:" +msgstr "Клони" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "Създаване на нов проект" +msgstr "Създаване на нов клон" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "Премахване на проекта" +msgstr "Премахване на клона" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "Име на клона" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" -msgstr "Отдалечен" +msgstr "Отдалечени хранилища" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "Създаване на нов проект" +msgstr "Създаване на ново отдалечено хранилище" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "Премахване на текстурата" +msgstr "Премахване на отдалеченото хранилище" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Отдалечено " +msgstr "Име на отдалеченото хранилище" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "Отдалечено " +msgstr "Адрес на отдалеченото хранилище" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "Извличане" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "Получаване" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "Изпращане" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "Източник за полигонна мрежа:" +msgstr "Принудително изпращане" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" -msgstr "" +msgstr "Променен" #: editor/plugins/version_control_editor_plugin.cpp msgid "Renamed" @@ -9686,28 +9697,27 @@ msgstr "Изтрит" #: editor/plugins/version_control_editor_plugin.cpp msgid "Typechange" -msgstr "" +msgstr "Променен тип" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "Неслят" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "Преглед" +msgstr "Преглед:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Split" -msgstr "" +msgstr "Разделен" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unified" -msgstr "" +msgstr "Обединен" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(само GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add Output" @@ -9715,7 +9725,7 @@ msgstr "Добавяне на изход" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" -msgstr "" +msgstr "Число" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector" @@ -9767,7 +9777,7 @@ msgstr "Задаване на израз" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Resize VisualShader node" -msgstr "Преоразмеряване на възела VisualShader" +msgstr "Преоразмеряване на обекта VisualShader" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" @@ -9783,20 +9793,20 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Node(s) Moved" -msgstr "Възлите са преместени" +msgstr "Обектът/обектите са преместени" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Duplicate Nodes" -msgstr "Дублиране на възлите" +msgstr "Дублиране на обектите" #: editor/plugins/visual_shader_editor_plugin.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Paste Nodes" -msgstr "Поставяне на възлите" +msgstr "Поставяне на обектите" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Delete Nodes" -msgstr "Изтриване на възлите" +msgstr "Изтриване на обектите" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" @@ -9824,7 +9834,7 @@ msgstr "Показване на получения код на шейдъра." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Create Shader Node" -msgstr "Създаване на възел с шейдър" +msgstr "Създаване на обект с шейдър" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color function." @@ -11357,24 +11367,23 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "AutoLoad" -msgstr "" +msgstr "Автозареждане" #: editor/project_settings_editor.cpp msgid "Plugins" msgstr "Приставки" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Import Defaults" -msgstr "Внасяне на преводи" +msgstr "Внасяния" #: editor/property_editor.cpp msgid "Preset..." -msgstr "" +msgstr "Конфигурация…" #: editor/property_editor.cpp msgid "Zero" -msgstr "" +msgstr "Нула" #: editor/property_editor.cpp msgid "Easing In-Out" @@ -11386,31 +11395,31 @@ msgstr "" #: editor/property_editor.cpp msgid "File..." -msgstr "" +msgstr "Файл…" #: editor/property_editor.cpp msgid "Dir..." -msgstr "" +msgstr "Папка…" #: editor/property_editor.cpp msgid "Assign" -msgstr "" +msgstr "Задаване" #: editor/property_editor.cpp msgid "Select Node" -msgstr "Избиране на възел" +msgstr "Избиране на обект" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" -msgstr "" +msgstr "Грешка при зареждането на файла: не е ресурс!" #: editor/property_editor.cpp msgid "Pick a Node" -msgstr "Изберете възел" +msgstr "Изберете обект" #: editor/property_editor.cpp msgid "Bit %d, val %d." -msgstr "" +msgstr "Бит %d, стойност %d." #: editor/property_selector.cpp msgid "Select Property" @@ -11426,15 +11435,15 @@ msgstr "Избиране на метод" #: editor/rename_dialog.cpp editor/scene_tree_dock.cpp msgid "Batch Rename" -msgstr "" +msgstr "Масово преименуване" #: editor/rename_dialog.cpp msgid "Prefix:" -msgstr "" +msgstr "Представка:" #: editor/rename_dialog.cpp msgid "Suffix:" -msgstr "" +msgstr "Наставка:" #: editor/rename_dialog.cpp msgid "Use Regular Expressions" @@ -11442,15 +11451,15 @@ msgstr "Използване на регулярни изрази" #: editor/rename_dialog.cpp msgid "Advanced Options" -msgstr "" +msgstr "Разширени настройки" #: editor/rename_dialog.cpp msgid "Substitute" -msgstr "" +msgstr "Заместване" #: editor/rename_dialog.cpp msgid "Node name" -msgstr "Име на възела" +msgstr "Име на обекта" #: editor/rename_dialog.cpp msgid "Node's parent name, if available" @@ -11458,33 +11467,35 @@ msgstr "" #: editor/rename_dialog.cpp msgid "Node type" -msgstr "Тип на възела" +msgstr "Тип на обекта" #: editor/rename_dialog.cpp msgid "Current scene name" -msgstr "" +msgstr "Текущо име на сцената" #: editor/rename_dialog.cpp msgid "Root node name" -msgstr "" +msgstr "Име на коренния обект" #: editor/rename_dialog.cpp msgid "" "Sequential integer counter.\n" "Compare counter options." msgstr "" +"Последователен целочислен брояч.\n" +"Сравнете настройките на брояча." #: editor/rename_dialog.cpp msgid "Per-level Counter" -msgstr "" +msgstr "Брояч по нива" #: editor/rename_dialog.cpp msgid "If set, the counter restarts for each group of child nodes." -msgstr "" +msgstr "Ако е зададено, броячът се подновява за всяка група дъщерни обекти." #: editor/rename_dialog.cpp msgid "Initial value for the counter" -msgstr "" +msgstr "Начална стойност на брояча" #: editor/rename_dialog.cpp msgid "Step" @@ -11492,17 +11503,19 @@ msgstr "Стъпка" #: editor/rename_dialog.cpp msgid "Amount by which counter is incremented for each node" -msgstr "" +msgstr "Стойност, с която броячът се увеличава при всеки следващ обект" #: editor/rename_dialog.cpp msgid "Padding" -msgstr "" +msgstr "Отстъп" #: editor/rename_dialog.cpp msgid "" "Minimum number of digits for the counter.\n" "Missing digits are padded with leading zeros." msgstr "" +"Минимален брой цифри за брояча.\n" +"Ако числото има по-малко цифри, ще се допълни с нули отпред." #: editor/rename_dialog.cpp msgid "Post-Process" @@ -11514,31 +11527,31 @@ msgstr "Стил" #: editor/rename_dialog.cpp msgid "Keep" -msgstr "" +msgstr "Запазване" #: editor/rename_dialog.cpp msgid "PascalCase to snake_case" -msgstr "" +msgstr "PascalCase към snake_case" #: editor/rename_dialog.cpp msgid "snake_case to PascalCase" -msgstr "" +msgstr "snake_case към PascalCase" #: editor/rename_dialog.cpp msgid "Case" -msgstr "" +msgstr "Регистър" #: editor/rename_dialog.cpp msgid "To Lowercase" -msgstr "" +msgstr "Към долен регистър" #: editor/rename_dialog.cpp msgid "To Uppercase" -msgstr "" +msgstr "Към горен регистър" #: editor/rename_dialog.cpp msgid "Reset" -msgstr "" +msgstr "Нулиране" #: editor/rename_dialog.cpp msgid "Regular Expression Error:" @@ -11616,7 +11629,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Paste Node(s)" -msgstr "Поставяне на възела(възлите)" +msgstr "Поставяне на обекта/обектите" #: editor/scene_tree_dock.cpp msgid "Detach Script" @@ -11652,15 +11665,15 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Make node as Root" -msgstr "Превръщане на възела в корен" +msgstr "Превръщане на обекта в коренен" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes and any children?" -msgstr "Изтриване на %d възела и дъщерните им елементи?" +msgstr "Изтриване на %d обекта и дъщерните им обекти?" #: editor/scene_tree_dock.cpp msgid "Delete %d nodes?" -msgstr "Изтриване на %d възела?" +msgstr "Изтриване на %d обекта?" #: editor/scene_tree_dock.cpp msgid "Delete the root node \"%s\"?" @@ -11672,7 +11685,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Delete node \"%s\"?" -msgstr "Изтриване на възела „%s“?" +msgstr "Изтриване на обекта „%s“?" #: editor/scene_tree_dock.cpp msgid "" @@ -11740,7 +11753,7 @@ msgstr "Нов корен на сцената" #: editor/scene_tree_dock.cpp msgid "Create Root Node:" -msgstr "Създаване на коренен възел:" +msgstr "Създаване на коренен обект:" #: editor/scene_tree_dock.cpp msgid "2D Scene" @@ -11756,7 +11769,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Other Node" -msgstr "Друг възел" +msgstr "Друг обект" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" @@ -11776,7 +11789,7 @@ msgstr "Закачане на скрипт" #: editor/scene_tree_dock.cpp msgid "Cut Node(s)" -msgstr "Изрязване на възела(възлите)" +msgstr "Изрязване на обекта/обектите" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -11837,7 +11850,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Reparent to New Node" -msgstr "Преместване под нов възел" +msgstr "Преместване под нов обект" #: editor/scene_tree_dock.cpp msgid "Make Scene Root" @@ -11861,7 +11874,7 @@ msgstr "Изтриване (без потвърждение)" #: editor/scene_tree_dock.cpp msgid "Add/Create a New Node." -msgstr "Добавяне/създаване на нов възел." +msgstr "Добавяне/създаване на нов обект." #: editor/scene_tree_dock.cpp msgid "" @@ -11902,7 +11915,7 @@ msgstr "" #: editor/scene_tree_editor.cpp msgid "Unlock Node" -msgstr "Отключване на възела" +msgstr "Отключване на обекта" #: editor/scene_tree_editor.cpp msgid "Button Group" @@ -12357,6 +12370,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -12653,14 +12674,14 @@ msgstr "Запълване на избраното" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" -msgstr "" +msgstr "Край на вътрешния стек на проследяване за изключението" #: modules/navigation/navigation_mesh_editor_plugin.cpp #: scene/3d/navigation_mesh_instance.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" "Трябва да се зададе или създаде ресурс от тип NavigationMesh, за може да " -"работи този възел." +"работи този обект." #: modules/navigation/navigation_mesh_editor_plugin.cpp msgid "Bake NavMesh" @@ -12862,11 +12883,11 @@ msgstr "Промяна на израза" #: modules/visual_script/visual_script_editor.cpp msgid "Remove VisualScript Nodes" -msgstr "Премахване на възлите с VisualScript" +msgstr "Премахване на обектите с VisualScript" #: modules/visual_script/visual_script_editor.cpp msgid "Duplicate VisualScript Nodes" -msgstr "Дублиране на възлите с VisualScript" +msgstr "Дублиране на обектите с VisualScript" #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." @@ -12898,7 +12919,7 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s)" -msgstr "Добавяне на възел(възли)" +msgstr "Добавяне на обект(и)" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -12924,7 +12945,7 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Move Node(s)" -msgstr "Преместване на възела(възлите)" +msgstr "Преместване на обекта/обектите" #: modules/visual_script/visual_script_editor.cpp msgid "Remove VisualScript Node" @@ -12932,19 +12953,19 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Nodes" -msgstr "Свързване на възлите" +msgstr "Свързване на обектите" #: modules/visual_script/visual_script_editor.cpp msgid "Disconnect Nodes" -msgstr "Разкачане на възлите" +msgstr "Разкачане на обектите" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" -msgstr "Свързване на данните на възела" +msgstr "Свързване на данните на обекта" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Sequence" -msgstr "Свързване на последователност от възли" +msgstr "Свързване на последователност от обекти" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" @@ -12964,7 +12985,7 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" -msgstr "Поставяне на възлите с VisualScript" +msgstr "Поставяне на обектите с VisualScript" #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function with a function node." @@ -13020,7 +13041,7 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Add Nodes..." -msgstr "Добавяне на възли…" +msgstr "Добавяне на обекти…" #: modules/visual_script/visual_script_editor.cpp msgid "Add Function..." @@ -13048,7 +13069,7 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Cut Nodes" -msgstr "Изрязване на възлите" +msgstr "Изрязване на обектите" #: modules/visual_script/visual_script_editor.cpp msgid "Make Function" @@ -13063,18 +13084,16 @@ msgid "Edit Member" msgstr "" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "Задаване на израз" +msgstr "Израз" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "анимация" +msgstr "Условие" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" @@ -13113,9 +13132,8 @@ msgid "Sequence" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "Папка:" +msgstr "в ред:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Switch" @@ -13126,9 +13144,8 @@ msgid "'input' is:" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "Типове:" +msgstr "Преобразуване на типа" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" @@ -13155,30 +13172,28 @@ msgid "Divide %s" msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "Добавяне на %s" +msgstr "Остатък от деление %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftLeft %s" -msgstr "" +msgstr "Отместване наляво %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "Отместване надясно %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "Добавяне на %s" +msgstr "Побитово И %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" -msgstr "" +msgstr "Побитово ИЛИ %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitXor %s" -msgstr "" +msgstr "Побитолво Изключващо ИЛИ %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -13207,14 +13222,12 @@ msgid "Emit %s" msgstr "" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Функции" +msgstr "Функция" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Compose Array" -msgstr "Преоразмеряване на масива" +msgstr "Създаване на масив" #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -13237,62 +13250,52 @@ msgid "VariableSet not found in script: " msgstr "" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "Презареждане" +msgstr "Предварително зареждане" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Индекс по Z" +msgstr "Вземане на индекс" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Индекс по Z" +msgstr "Задаване на индекс" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "Константа" +msgstr "Глобална константа" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "Константа" +msgstr "Константа от клас" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "Константа" +msgstr "Проста константа" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "Константа" +msgstr "Математическа константа" #: modules/visual_script/visual_script_nodes.cpp msgid "Get Engine Singleton" msgstr "" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "Нов корен на сцената" +msgstr "Вземане на обект от сцената" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "Редактиране на дървото на сцената" +msgstr "Вземане на дървото на сцената" #: modules/visual_script/visual_script_nodes.cpp msgid "Get Self" msgstr "" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "Изрязване на възлите" +msgstr "Персонализиран обект" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -13309,26 +13312,24 @@ msgid "SubCall" msgstr "" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Константи" +msgstr "Създаване на %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Get Local Var" -msgstr "" +msgstr "Вземане на локална променлива" #: modules/visual_script/visual_script_nodes.cpp msgid "Set Local Var" -msgstr "" +msgstr "Задаване на локална променлива" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "Действие" +msgstr "Действие %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "Деконструиране на %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -13340,66 +13341,64 @@ msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Изчакване" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "Преместване на кадъра" +msgstr "Следващ кадър" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Next Physics Frame" -msgstr "" +msgstr "Следващ кадър на физичната система" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s сек" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitSignal" -msgstr "Сигнал" +msgstr "Изчакване на сигнал" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitNodeSignal" -msgstr "Сигнал" +msgstr "Изчакване на сигнал от обект" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "WaitInstanceSignal" -msgstr "" +msgstr "Изчакване на сигнал от инстанция" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." -msgstr "" +msgstr "Липсва име на пакета." #: platform/android/export/export_plugin.cpp msgid "Package segments must be of non-zero length." -msgstr "" +msgstr "Частите на пакета не могат да бъдат с нулева дължина." #: platform/android/export/export_plugin.cpp msgid "The character '%s' is not allowed in Android application package names." msgstr "" +"Знакът „%s“ не може да се ползва в името на пакет за приложение на Android." #: platform/android/export/export_plugin.cpp msgid "A digit cannot be the first character in a package segment." -msgstr "" +msgstr "Първият знак в част от пакет не може да бъде цифра." #: platform/android/export/export_plugin.cpp msgid "The character '%s' cannot be the first character in a package segment." -msgstr "" +msgstr "Първият знак в част от пакет не може да бъде „%s“." #: platform/android/export/export_plugin.cpp msgid "The package must have at least one '.' separator." -msgstr "" +msgstr "Пакетът трябва да има поне един разделител „.“ (точка)." #: platform/android/export/export_plugin.cpp msgid "Select device from the list" -msgstr "" +msgstr "Изберете устройство от списъка" #: platform/android/export/export_plugin.cpp msgid "Running on %s" -msgstr "" +msgstr "Изпълнение на %s" #: platform/android/export/export_plugin.cpp msgid "Exporting APK..." @@ -13419,7 +13418,7 @@ msgstr "Не може да се инсталира на устройство: %s #: platform/android/export/export_plugin.cpp msgid "Running on device..." -msgstr "" +msgstr "Изпълнение на устройство…" #: platform/android/export/export_plugin.cpp msgid "Could not execute on device." @@ -13427,7 +13426,7 @@ msgstr "Изпълнението на устройството е невъзмо #: platform/android/export/export_plugin.cpp msgid "Unable to find the 'apksigner' tool." -msgstr "" +msgstr "Инструментът „apksigner“ не може да бъде намерен." #: platform/android/export/export_plugin.cpp msgid "" @@ -13506,6 +13505,8 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." msgstr "" +"„Използване на собствена компилация“ трябва да е включено, за да могат да се " +"използват приставките." #: platform/android/export/export_plugin.cpp msgid "" @@ -13520,21 +13521,29 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." msgstr "" +"„Изнасяне на AAB“ може да се ползва само когато е включено „Използване на " +"собствена компилация“." #: platform/android/export/export_plugin.cpp msgid "" "Changing the \"Min Sdk\" is only valid when \"Use Custom Build\" is enabled." msgstr "" +"„Мин. версия на SDK“ може да се променя само когато „Използване на собствена " +"компилация“ е включено." #: platform/android/export/export_plugin.cpp msgid "" "Changing the \"Target Sdk\" is only valid when \"Use Custom Build\" is " "enabled." msgstr "" +"„Целева версия на SDK“ може да се променя само когато „Използване на " +"собствена компилация“ е включено." #: platform/android/export/export_plugin.cpp msgid "\"Target Sdk\" version must be greater or equal to \"Min Sdk\" version." msgstr "" +"„Целева версия на SDK“ трябва да бъде по-голяма или равна на „Мин. версия на " +"SDK“." #: platform/android/export/export_plugin.cpp msgid "" @@ -13561,7 +13570,7 @@ msgstr "Не е намерено хранилище за ключове. Изн #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" -msgstr "" +msgstr "„apksigner“ завърши с грешка #%d" #: platform/android/export/export_plugin.cpp msgid "Verifying %s..." @@ -13569,7 +13578,7 @@ msgstr "Потвърждаване на %s..." #: platform/android/export/export_plugin.cpp msgid "'apksigner' verification of %s failed." -msgstr "" +msgstr "Проверката на %s от „apksigner“ беше неуспешна." #: platform/android/export/export_plugin.cpp msgid "Exporting for Android" @@ -13585,11 +13594,11 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "Invalid filename! Android APK requires the *.apk extension." -msgstr "" +msgstr "Неправилно име! Android APK изисква разширение *.apk." #: platform/android/export/export_plugin.cpp msgid "Unsupported export format!\n" -msgstr "" +msgstr "Неподдържан формат за изнасяне!\n" #: platform/android/export/export_plugin.cpp msgid "" @@ -13609,10 +13618,13 @@ msgstr "" msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name" msgstr "" +"файловете res://android/build/res/*.xml не могат да бъдат презаписани с " +"името на проекта" #: platform/android/export/export_plugin.cpp msgid "Could not export project files to gradle project\n" msgstr "" +"Файловете на проекта не могат да бъдат изнесени като проект на gradle.\n" #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -13620,23 +13632,29 @@ msgstr "Файлът с пакета за разширение не може д #: platform/android/export/export_plugin.cpp msgid "Building Android Project (gradle)" -msgstr "" +msgstr "Компилиране на проект за Android (gradle)" #: platform/android/export/export_plugin.cpp msgid "" "Building of Android project failed, check output for the error.\n" "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" +"Компилирането на проекта за Android беше неуспешно. Вижте изхода за " +"грешката.\n" +"Може също да разгледате документацията за компилиране за Android на docs." +"godotengine.org." #: platform/android/export/export_plugin.cpp msgid "Moving output" -msgstr "" +msgstr "Преместване на изходящите данни" #: platform/android/export/export_plugin.cpp msgid "" "Unable to copy and rename export file, check gradle project directory for " "outputs." msgstr "" +"Изнесеният файл не може да бъде копиран и преименуван. Потърсете резултатите " +"в папката на проекта на gradle." #: platform/android/export/export_plugin.cpp msgid "Package not found: %s" @@ -13661,6 +13679,9 @@ msgid "" "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" +"В шаблона за изнасяне липсват библиотеки за избраните архитектури: %s.\n" +"Моля, създайте шаблон с всички необходими библиотеки или махнете отметките " +"от липсващите архитектури в конфигурацията за изнасяне." #: platform/android/export/export_plugin.cpp msgid "Adding files..." @@ -13694,10 +13715,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13738,16 +13755,199 @@ msgstr "Папката на HTTP-сървъра не може да бъде съ msgid "Error starting HTTP server:" msgstr "Грешка при стартирането на HTTP-сървър:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Неправилно име на проекта." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Неправилна геометрия, не може да се създаде полигон." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Папката не може да бъде създадена." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Неправилен базов път." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Ресурсът не може да бъде зареден." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Ресурсът не може да бъде зареден." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Неправилно разширение." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Неправилно разширение." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Няма намерени константи." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Създаване на полигонна мрежа…" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Не е намерен шаблонен файл APK за изнасяне:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Неправилен идентификатор на пакета:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13758,6 +13958,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Неправилно кратко име на пакет." @@ -13810,6 +14073,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Неправилен път." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Неправилно разширение." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Неправилен продуктов GUID." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13840,8 +14124,8 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionPolygon2D служи само, за да даде форма за колизии на " -"CollisionObject2D. Моля, използвайте го като наследник на Area2D, " +"CollisionPolygon2D служи само, за да даде форма за колизии на обект основан " +"на CollisionObject2D. Моля, използвайте го като наследник на Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D и т.н. само, за да им дадете " "форма." @@ -13863,7 +14147,7 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D служи само, за да даде форма за колизии на " +"CollisionShape2D служи само, за да даде форма за колизии на обект основан на " "CollisionObject2D. Моля, използвайте го като наследник на Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, и т.н. само, за да им дадете " "форма." @@ -13944,7 +14228,7 @@ msgid "" "A NavigationPolygon resource must be set or created for this node to work. " "Please set a property or draw a polygon." msgstr "" -"За този възел трябва да бъде зададен или създаден ресурс NavigationPolygon. " +"За този обект трябва да бъде зададен или създаден ресурс NavigationPolygon. " "Моля, задайте свойство или нарисувайте полигон." #: scene/2d/navigation_polygon.cpp @@ -13952,13 +14236,15 @@ msgid "" "NavigationPolygonInstance must be a child or grandchild to a Navigation2D " "node. It only provides navigation data." msgstr "" -"NavigationPolygonInstance трябва да бъде наследник или поднаследник на " -"Navigation2D. Той дава само навигационна информация." +"NavigationPolygonInstance трябва да бъде дъщерен или под-дъщерен на обект от " +"тип Navigation2D. Той дава само навигационна информация." #: scene/2d/parallax_layer.cpp msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." -msgstr "ParallaxLayer работи само, когато е наследник на ParallaxBackground." +msgstr "" +"ParallaxLayer работи само, когато е дъщерен на обект от тип " +"ParallaxBackground." #: scene/2d/particles_2d.cpp msgid "" @@ -13990,7 +14276,7 @@ msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." -msgstr "PathFollow2D работи само, когато е наследник на Path2D." +msgstr "PathFollow2D работи само, когато е дъщерен на обект от тип Path2D." #: scene/2d/physics_body_2d.cpp msgid "" @@ -14002,7 +14288,8 @@ msgstr "" #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." msgstr "" -"Свойството Path трябва да сочи към действителен възел Node2D, за да работи." +"Свойството „Path“ трябва да сочи към действителен обект от тип Node2D, за да " +"работи." #: scene/2d/skeleton_2d.cpp msgid "This Bone2D chain should end at a Skeleton2D node." @@ -14174,7 +14461,7 @@ msgid "" "NavigationMeshInstance must be a child or grandchild to a Navigation node. " "It only provides navigation data." msgstr "" -"NavigationMeshInstance трябва да бъде дъщерен или под-дъщерен на възел от " +"NavigationMeshInstance трябва да бъде дъщерен или под-дъщерен на обект от " "тип Navigation. Той само предоставя данните за навигирането." #: scene/3d/navigation_obstacle.cpp @@ -14194,8 +14481,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14221,7 +14508,7 @@ msgstr "" #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." -msgstr "PathFollow работи само когато е дъщерен елемент на възел от тип Path." +msgstr "PathFollow работи само когато е дъщерен обект на обект от тип Path." #: scene/3d/path.cpp msgid "" @@ -14273,7 +14560,7 @@ msgid "" "The \"Remote Path\" property must point to a valid Spatial or Spatial-" "derived node to work." msgstr "" -"Свойството „Remote Path“ трябва да сочи към действителен възел от тип " +"Свойството „Remote Path“ трябва да сочи към действителен обект от тип " "Spatial или негов наследник, за да работи." #: scene/3d/room.cpp @@ -14441,7 +14728,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 6af9541a8e..b8b8ccbf84 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -516,8 +516,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1417,7 +1417,7 @@ msgid "Bus Options" msgstr "বাস অপশন" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "ডুপ্লিকেট" @@ -2274,8 +2274,8 @@ msgstr "মেথডের বর্ণ্না:" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "এই মেথড সম্পর্কে বিস্তারিত তথ্য লিপিবদ্ধ করা হয়নি। অনুগ্রহ করে তথ্য প্রদানের মাধ্যমে " "সহায়তা করুন। তথ্য প্রদানের জন্য [color=$color][url=$url], [/url][/color] ফরম্যাট " @@ -3444,7 +3444,12 @@ msgstr "অবিচ্ছিন্ন/নিরবচ্ছিন্ন" #: editor/editor_node.cpp #, fuzzy -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "পরিবর্তনসমূহ হাল-নাগাদ করুন" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" msgstr "পরিবর্তনসমূহ হাল-নাগাদ করুন" #: editor/editor_node.cpp @@ -4275,6 +4280,14 @@ msgstr "গ্রহনযোগ্য অক্ষরসমূহ:" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4402,7 +4415,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Duplicate..." msgstr "ডুপ্লিকেট" @@ -5296,6 +5309,10 @@ msgid "Rename Animation" msgstr "অ্যানিমেশন পুনঃনামকরণ করুন" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "অ্যানিমেশন প্রতিলিপি করুন" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "পরবর্তী পরিবর্তনের সাথে ব্লেন্ড করুন" @@ -5308,10 +5325,6 @@ msgid "Load Animation" msgstr "অ্যানিমেশন লোড করুন" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "অ্যানিমেশন প্রতিলিপি করুন" - -#: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "No animation to copy!" msgstr "ভুল: প্রতিলিপি করার মতো কোনো অ্যানিমেশন নেই!" @@ -13576,6 +13589,16 @@ msgstr "Capsule Shape এর ব্যাসার্ধ পরিবর্ত msgid "Set Occluder Sphere Position" msgstr "আন্ত-বক্ররেখার স্থান নির্ধারণ করুন" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "বক্ররেখার বিন্দুর স্থান নির্ধারণ করুন" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "বক্ররেখার বিন্দুর স্থান নির্ধারণ করুন" + #: modules/csg/csg_gizmos.cpp #, fuzzy msgid "Change Cylinder Radius" @@ -15032,10 +15055,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "নামটি কার্যকর সনাক্তকারী নয়:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -15084,17 +15103,197 @@ msgstr "ফোল্ডার তৈরী করা সম্ভব হয়ন msgid "Error starting HTTP server:" msgstr "দৃশ্য সংরক্ষণে সমস্যা হয়েছে।" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "প্রকল্পের নাম:" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "ফোল্ডার তৈরী করা সম্ভব হয়নি।" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "বেস পথ অগ্রহণযোগ্য" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "রিসোর্স লোড ব্যর্থ হয়েছে।" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "রিসোর্স লোড ব্যর্থ হয়েছে।" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "অগ্রহণযোগ্য এক্সটেনশন" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "অগ্রহণযোগ্য এক্সটেনশন" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "খুঁজে পাওয়া যায়নি!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "থাম্বনেইল তৈরি হচ্ছে" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "ফোল্ডার তৈরী করা সম্ভব হয়নি।" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "নামটি কার্যকর সনাক্তকারী নয়:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -15105,6 +15304,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -15160,6 +15422,27 @@ msgstr "৩১০x১৫০ প্রশস্ত লোগোর (logo) ছব msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "স্প্ল্যাশ পর্দার (splash screen) ছবির অগ্রহনযোগ্য মাত্রা (৬২০x৩০০ হতে হবে)।" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "অকার্যকর পথ।" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "অগ্রহণযোগ্য এক্সটেনশন" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "পণ্যের অগ্রহনযোগ্য GUID।" + #: scene/2d/animated_sprite.cpp #, fuzzy msgid "" @@ -15556,8 +15839,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -15810,7 +16093,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/br.po b/editor/translations/br.po index 77c78f55b8..574adeb121 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -511,8 +511,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1348,7 +1348,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2122,8 +2122,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3149,7 +3149,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3875,6 +3879,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3987,7 +3999,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4773,19 +4785,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12220,6 +12232,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13516,10 +13536,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13560,16 +13576,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13580,6 +13766,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13632,6 +13881,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13982,8 +14249,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14223,7 +14490,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 15c6342076..144cbbad2e 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -519,8 +519,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -529,8 +529,8 @@ msgstr "" "\n" "Per habilitar la possibilitat d’afegir pistes personalitzades, navegueu a la " "configuració d’importació de l’escena i establiu\n" -"\"Animation > Storage\" a \"Files\", activeu \"Animation > Keep Custom Tracks" -"\", i, després, reimporteu.\n" +"\"Animation > Storage\" a \"Files\", activeu \"Animation > Keep Custom " +"Tracks\", i, després, reimporteu.\n" "També podeu fer servir una configuració preestablerta que importi animacions " "a fitxers separats." @@ -1399,7 +1399,7 @@ msgid "Bus Options" msgstr "Opcions del Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplica" @@ -2207,8 +2207,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Aquesta propietat no disposa de cap descripció. Podeu contribuir [color=" -"$color][url=$url] tot aportant-ne una[/url][/color]!" +"Aquesta propietat no disposa de cap descripció. Podeu contribuir " +"[color=$color][url=$url] tot aportant-ne una[/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2216,8 +2216,8 @@ msgstr "Descripcions dels Mètodes" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Aquest mètode no disposa de cap descripció. Podeu contribuir [color=$color]" "[url=$url] tot aportant-ne una[/url][/color]!" @@ -3345,10 +3345,16 @@ msgid "Update Continuously" msgstr "Actualitzar contínuament" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Actualitzar quan es canvia" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Canvis de Material:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Amaga l'Indicador d'Actualització" @@ -4149,6 +4155,14 @@ msgstr "El Nom conté caràcters que no són vàlids." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4268,7 +4282,7 @@ msgstr "Ordenar per Última Modificació" msgid "Sort by First Modified" msgstr "Ordenar per Primera Modificació" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplica..." @@ -5097,6 +5111,10 @@ msgid "Rename Animation" msgstr "Reanomena l'Animació" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplica l'Animació" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Mesclar Següent Canviat" @@ -5109,10 +5127,6 @@ msgid "Load Animation" msgstr "Carrega l'Animació" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplica l'Animació" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "No hi ha animacions per copiar!" @@ -13156,6 +13170,16 @@ msgstr "Modifica el radi d'una Forma Càpsula" msgid "Set Occluder Sphere Position" msgstr "Estableix la Posició d'Entrada de la Corba" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Estableix la Posició del Punt de la Corba" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Estableix la Posició del Punt de la Corba" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Canviar Radi del Cilindre" @@ -14594,12 +14618,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Identificador no vàlid:" -#: platform/iphone/export/export.cpp -#, fuzzy -msgid "Required icon is not specified in the preset." -msgstr "" -"La icona necessària no està especificada a la configuració preestablerta." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Atura el servidor HTTP" @@ -14644,17 +14662,200 @@ msgstr "No s'ha pogut crear el directori:" msgid "Error starting HTTP server:" msgstr "Error en desar l'escena:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "El nom del Projecte no és vàlid." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "La geometria no és valida, no es pot crear el polígon." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "No s'ha pogut crear el directori." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "El Camí base no és vàlid." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "No s'ha pogut carregar el recurs." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "No s'ha pogut carregar el recurs." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "L'extensió no és vàlida." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "L'extensió no és vàlida." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "No s'ha trobat cap icona." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Creant Miniatura" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"No s'ha trobat la plantilla APK per a exportar:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Identificador no vàlid:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14665,6 +14866,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14721,6 +14985,27 @@ msgstr "" "Imatge de la pantalla de presentació no vàlida. La mida hauria de ser " "620x300." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Camí no vàlid." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "L'extensió no és vàlida." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "GUID del producte no vàlid." + #: scene/2d/animated_sprite.cpp #, fuzzy msgid "" @@ -15153,8 +15438,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -15419,7 +15704,7 @@ msgstr "Aquest node està en desús. Fes servir AnimationTree." #, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Color: #%s\n" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 24933836f4..3908694615 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -19,7 +19,7 @@ # Emil Jiří Tywoniak <emil.tywoniak@gmail.com>, 2020, 2021. # Filip Vincůrek <vincurek.f@gmail.com>, 2020. # Ondrej Pavelka <ondrej.pavelka@outlook.com>, 2020. -# Zbyněk <zbynek.fiala@gmail.com>, 2020, 2021. +# Zbyněk <zbynek.fiala@gmail.com>, 2020, 2021, 2022. # Daniel Kříž <Daniel.kriz@protonmail.com>, 2020. # VladimirBlazek <vblazek042@gmail.com>, 2020. # kubajz22 <til.jakubesko@seznam.cz>, 2020. @@ -28,13 +28,14 @@ # swifterik <blaha.j502@gmail.com>, 2021. # Daniel <dan@ger.cz>, 2021. # Jakub Janšta <jansta.ja@gmail.com>, 2021. +# Petr Voparil <voparil.petr96@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-03 03:55+0000\n" -"Last-Translator: Vojtěch Šamla <auzkok@seznam.cz>\n" +"PO-Revision-Date: 2022-02-10 07:50+0000\n" +"Last-Translator: Zbyněk <zbynek.fiala@gmail.com>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" "Language: cs\n" @@ -42,7 +43,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -532,8 +533,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -630,7 +631,6 @@ msgid "Go to Previous Step" msgstr "Přejít k předchozímu kroku" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Apply Reset" msgstr "Resetovat" @@ -1397,7 +1397,7 @@ msgid "Bus Options" msgstr "Možnosti sběrnice" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplikovat" @@ -2194,8 +2194,8 @@ msgstr "Popisy metod" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "V současné době neexistuje žádný popis pro tuto metodu. Prosím pomozte nám " "tím, že ho [color=$color][url=$url]vytvoříte[/url][/color]!" @@ -3303,10 +3303,16 @@ msgid "Update Continuously" msgstr "Aktualizovat průběžně" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Akualizovat při změně" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Změny materiálu:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Schovat aktualizační kolečko" @@ -4072,6 +4078,14 @@ msgstr "Jméno obsahuje neplatné znaky." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4190,7 +4204,7 @@ msgstr "Seřadit podle poslední změny" msgid "Sort by First Modified" msgstr "Seřadit podle první změny" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplikovat..." @@ -4996,6 +5010,10 @@ msgid "Rename Animation" msgstr "Přejmenovat animaci" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplikovat animaci" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Upraveno prolnutí na další" @@ -5008,10 +5026,6 @@ msgid "Load Animation" msgstr "Načíst animaci" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplikovat animaci" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Žádná animace pro kopírování!" @@ -10837,16 +10851,16 @@ msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Pouze pro režim Fragment/Light) (Vektor) Součet absolutní derivace podle \"x" -"\" a \"y\"." +"(Pouze pro režim Fragment/Light) (Vektor) Součet absolutní derivace podle " +"\"x\" a \"y\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Pouze pro režim Fragment/Light) (Skalár) Součet absolutní derivace podle \"x" -"\" a \"y\"." +"(Pouze pro režim Fragment/Light) (Skalár) Součet absolutní derivace podle " +"\"x\" a \"y\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -12790,6 +12804,16 @@ msgstr "Změnit poloměr Cylinder Shape" msgid "Set Occluder Sphere Position" msgstr "Nastavit bod do křivky" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Nastavit pozici bodu křivky" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Nastavit pozici bodu křivky" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Změnit poloměr Cylinder" @@ -13555,9 +13579,8 @@ msgid "in order:" msgstr "Přejmenování složky:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "Stoupání:" +msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" @@ -13955,8 +13978,8 @@ msgid "" "Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " "project setting (changed in Godot 3.2.2).\n" msgstr "" -"Neplatný modul \"GodotPaymentV3\" v nastavení projektu \"Android / moduly" -"\" (změněno v Godot 3.2.2).\n" +"Neplatný modul \"GodotPaymentV3\" v nastavení projektu \"Android / " +"moduly\" (změněno v Godot 3.2.2).\n" #: platform/android/export/export_plugin.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." @@ -14172,10 +14195,6 @@ msgstr "App Store Team ID nebyla poskytnuta - projekt nelze konfigurovat." msgid "Invalid Identifier:" msgstr "Neplatný identifikátor:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "V profilu není nastavena požadovaná ikona." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Zastavit HTTP Server" @@ -14217,17 +14236,200 @@ msgstr "Nepodařilo se vytvořit adresář serveru HTTP:" msgid "Error starting HTTP server:" msgstr "Chyba při spuštění serveru HTTP:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Neplatný název projektu." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Neplatná geometrie, nelze vytvořit polygon." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Nelze vytvořit složku." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Neplatná základní cesta." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Selhalo nahrání zdroje." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Selhalo nahrání zdroje." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Neplatná přípona." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Neplatná přípona." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Nebyly nalezeny žádné ikony." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Vytvářím náhled" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Nepodařilo se najít šablonu APK pro export:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Neplatný identifikátor:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14238,6 +14440,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Neplatné krátké jméno balíčku." @@ -14290,6 +14555,27 @@ msgstr "Neplatné rozměry Square 310x150 Logo obrázku (měly by být 310x150). msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Neplatné rozměry obrázku uvítací obrazovky (měly by být 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Neplatná cesta." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Neplatná přípona." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Neplatné GUID produktu." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14451,8 +14737,8 @@ msgid "" "CPUParticles2D\" toolbar option for this purpose." msgstr "" "Grafický ovladač GLES2 nepodporuje částice založené na GPU.\n" -"Použijte uzel CPUParticles2D. Na převod lze použít \"Převést na CPUParticles" -"\"." +"Použijte uzel CPUParticles2D. Na převod lze použít \"Převést na " +"CPUParticles\"." #: scene/2d/particles_2d.cpp msgid "" @@ -14711,8 +14997,8 @@ msgstr "" #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "Video driver GLES2 nepodporuje částice na GPU.\n" "Místo toho použijte uzel CPUParticles. K převodu můžete použít \"Převést na " @@ -14975,9 +15261,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Podpora tohoto uzlu byla ukončena. Použijte místo něho AnimationTree." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Barva: #%s\n" @@ -15020,8 +15307,8 @@ msgid "" "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" "Tip nápovědy se nezobrazí, protože filtr myši je nastaven na \"Ignorovat\". " -"Chcete-li tento problém vyřešit, nastavte filtr myši na \"Stop\" nebo \"Pass" -"\"." +"Chcete-li tento problém vyřešit, nastavte filtr myši na \"Stop\" nebo " +"\"Pass\"." #: scene/gui/dialogs.cpp msgid "Alert!" diff --git a/editor/translations/da.po b/editor/translations/da.po index 94f5d4b033..0fe9e67693 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -535,8 +535,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1436,7 +1436,7 @@ msgid "Bus Options" msgstr "Bus muligheder" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplikér" @@ -2277,8 +2277,8 @@ msgstr "Metode beskrivelser" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Der er i øjeblikket ingen beskrivelse af denne metode. Det vil være en stor " "hjælp, hvis du kan [color=$color][url=$url]bidrage[/url][/color] med en " @@ -3413,11 +3413,16 @@ msgstr "Kontinuerlig" #: editor/editor_node.cpp #, fuzzy -msgid "Update When Changed" +msgid "Update All Changes" msgstr "Opdater Ændringer" #: editor/editor_node.cpp #, fuzzy +msgid "Update Vital Changes" +msgstr "Skift Shader" + +#: editor/editor_node.cpp +#, fuzzy msgid "Hide Update Spinner" msgstr "Slå Opdaterings Snurrer Fra" @@ -4196,6 +4201,14 @@ msgstr "Navnet indeholder ugyldige karakterer." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4321,7 +4334,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Duplicate..." msgstr "Duplikere" @@ -5192,6 +5205,10 @@ msgid "Rename Animation" msgstr "Omdøb animation" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Lav en kopi af animation" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "" @@ -5204,10 +5221,6 @@ msgid "Load Animation" msgstr "Indlæs animation" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Lav en kopi af animation" - -#: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "No animation to copy!" msgstr "FEJL: Der er ingen animation der kan kopieres!" @@ -13137,6 +13150,16 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "Fjern Signal" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Fjern Kurve Punktets Position" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Fjern Kurve Punktets Position" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14532,10 +14555,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Navnet er ikke et gyldigt id:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14583,17 +14602,197 @@ msgstr "Kunne ikke oprette mappe." msgid "Error starting HTTP server:" msgstr "Error loading skrifttype." +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Ugyldigt navn." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Kunne ikke oprette mappe." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Ugyldig Sti." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Fejler med at indlæse ressource." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Fejler med at indlæse ressource." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Du skal bruge en gyldig udvidelse." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Du skal bruge en gyldig udvidelse." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Ikke fundet!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Opretter Thumbnail" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "Kan ikke åbne skabelon til eksport:\n" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Navnet er ikke et gyldigt id:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14604,6 +14803,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14662,6 +14924,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Ugyldig Sti." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Du skal bruge en gyldig udvidelse." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Ugyldig skriftstørrelse." + #: scene/2d/animated_sprite.cpp #, fuzzy msgid "" @@ -15057,8 +15340,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -15311,7 +15594,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/de.po b/editor/translations/de.po index 33f5042f4d..88904ba7d7 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -75,13 +75,14 @@ # Zae Chao <zaevi@live.com>, 2021. # Tim <tim14speckenwirth@gmail.com>, 2021. # Antonio Noack <corperateraider@gmail.com>, 2022. +# <artism90@googlemail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" -"Last-Translator: So Wieso <sowieso@dukun.de>\n" +"PO-Revision-Date: 2022-02-16 08:44+0000\n" +"Last-Translator: <artism90@googlemail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -89,7 +90,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.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -577,8 +578,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1449,7 +1450,7 @@ msgid "Bus Options" msgstr "Audiobusoptionen" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplizieren" @@ -2249,8 +2250,9 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Es gibt zurzeit keine Beschreibung dieses Objekts. [color=$color][url=" -"$url]Ergänzungen durch eigene Beiträge[/url][/color] sind sehr erwünscht!" +"Es gibt zurzeit keine Beschreibung dieses Objekts. [color=$color]" +"[url=$url]Ergänzungen durch eigene Beiträge[/url][/color] sind sehr " +"erwünscht!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2258,11 +2260,12 @@ msgstr "Methoden-Beschreibung" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Es gibt zurzeit keine Beschreibung dieser Methode. [color=$color][url=" -"$url]Ergänzungen durch eigene Beiträge[/url][/color] sind sehr erwünscht!" +"Es gibt zurzeit keine Beschreibung dieser Methode. [color=$color]" +"[url=$url]Ergänzungen durch eigene Beiträge[/url][/color] sind sehr " +"erwünscht!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -3121,9 +3124,8 @@ msgid "Install Android Build Template..." msgstr "Android-Build-Vorlage installieren..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Editordateiverzeichnis öffnen" +msgstr "Datei-Ordner des Nutzers öffnen" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3334,7 +3336,7 @@ msgstr "Dokumentationsvorschläge senden" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" -msgstr "Gemeinschaft" +msgstr "Community" #: editor/editor_node.cpp msgid "About Godot" @@ -3394,10 +3396,16 @@ msgid "Update Continuously" msgstr "Fortlaufend aktualisieren" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Bei Änderungen aktualisieren" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Materialänderungen:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Aktualisierungsanzeigerad ausblenden" @@ -3842,9 +3850,8 @@ msgstr "Aus Node importieren:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Fehler" +msgstr "%s Fehler" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4169,6 +4176,14 @@ msgstr "Name enthält ungültige Zeichen." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4287,7 +4302,7 @@ msgstr "Nach Bearbeitungszeit sortieren (Aktuelles zuerst)" msgid "Sort by First Modified" msgstr "Nach Bearbeitungszeit sortieren (Aktuelles zuletzt)" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplizieren..." @@ -5105,6 +5120,10 @@ msgid "Rename Animation" msgstr "Animation umbenennen" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Animation duplizieren" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Blende über in nächste Geänderte" @@ -5117,10 +5136,6 @@ msgid "Load Animation" msgstr "Animation laden" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Animation duplizieren" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Keine Animation zum kopieren!" @@ -8023,7 +8038,7 @@ msgstr "IK abspielen" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "Senkrecht" +msgstr "Orthogonal" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" @@ -9830,7 +9845,6 @@ msgid "TileSet" msgstr "Kachelsatz" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." msgstr "Keine Versionsverwaltungserweiterungen verfügbar." @@ -9842,53 +9856,48 @@ msgstr "Fehler" msgid "" "Remote settings are empty. VCS features that use the network may not work." msgstr "" +"Keine Remote-Einstellungen vorhanden. VCS-Netzwerk-Funktionen werden " +"wahrscheinlich nicht funktionieren." #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "Kein Name angegeben." +msgstr "Keine Commit-Nachricht angegeben." #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "Speicherpunkt" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Shader-Änderungen:" +msgstr "Vorgemerkte Änderungen" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Shader-Änderungen:" +msgstr "Nicht vorgemerkte Änderungen" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "Speicherpunkt" +msgstr "Commit:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "Datum:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "Unterbaum" +msgstr "Untertitel:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "Soll Zweig %s wirklich entfernt werden?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "Soll wirklich ein leerer Typ erstellt werden?" +msgstr "Soll die Remote %s wirklich entfernt werden?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "Zurücksetzen durchführen" +msgstr "Anwenden" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9899,148 +9908,132 @@ msgid "Initialize" msgstr "Initialisieren" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "Punkt entfernen" +msgstr "Remote-Logininformationen" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "Umbenennen" +msgstr "Nutzername" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "Passwort" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "Pfad des öffentlichen SSH-Schlüssels" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "Pfad zum öffentlichen SSH-Schlüssel auswählen" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "Pfad des privaten SSH-Schlüssels" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "Pfad des privaten SSH-Schlüssels auswählen" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "SSH-Passphrase" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "Neue Veränderungen beachten" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "Schließen und Änderungen speichern?" +msgstr "Alle Änderungen verwerfen" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "Speichere lokale Änderungen..." +msgstr "Alle Änderungen vormerken" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "Materialänderungen:" +msgstr "Alle Änderungen nicht vormerken" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "Änderungen als Speicherpunkt sichern" +msgstr "Commit-Nachricht" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "Änderungen als Speicherpunkt sichern" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "Speicherpunkt" +msgstr "Commit-Liste" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "Größe der Commit-Liste" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Treffer:" +msgstr "Zweige" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "Erstelle neues Projekt" +msgstr "Neuen Zweig erstellen" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "Spur entfernen" +msgstr "Zweig entfernen" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "Zweigname" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" -msgstr "Fern" +msgstr "Remotes" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "Erstelle neues Projekt" +msgstr "Neues Remote eintragen" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "Entferne Element" +msgstr "Remote entfernen" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Fern " +msgstr "Remote-Name" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "Fern " +msgstr "Remote-URL" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "Fetch" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "Pull" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "Push" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "Quell-Mesh:" +msgstr "Force Push" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -10060,22 +10053,19 @@ msgstr "Dateitypänderung" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "Nicht zusammengeführt" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "Ansicht" +msgstr "Ansicht:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "Pfad aufteilen" +msgstr "Teilen" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "Bearbeitet" +msgstr "Vereinheitlicht" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -12299,7 +12289,7 @@ msgstr "Benutzerschnittstelle" #: editor/scene_tree_dock.cpp msgid "Other Node" -msgstr "Anderes Node" +msgstr "Anderer Node" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" @@ -12927,6 +12917,16 @@ msgstr "Occluder-Sphärenradius festlegen" msgid "Set Occluder Sphere Position" msgstr "Occluder-Sphärenposition festlegen" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Portal-Point-Position festlegen" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Kurvenpunktposition festlegen" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Zylinderradius ändern" @@ -13643,38 +13643,36 @@ msgid "Edit Member" msgstr "Mitglied bearbeiten" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "Ausdruck eintragen" +msgstr "Ausdruck" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "Rückgabewert" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "Animation" +msgstr "Bedingung" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "" +msgstr "if (Bedingung) ist:" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "Während" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "while (Bedinung):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "Iterator" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "for (Element) in (Eingabe):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -13690,79 +13688,71 @@ msgstr "Iterator wurde ungültig: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "Sequenz" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "Benenne Ordner um:" +msgstr "in Reihenfolge:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "Neigung:" +msgstr "Durchwechseln" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" -msgstr "" +msgstr "‚input‘ ist:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "Typen:" +msgstr "Typkonvertierung" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "Ist %s?" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "auf %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "On Self" -msgstr "Selbst" +msgstr "Auf selbst" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "Bei Zeichen %s" +msgstr "%s abziehen" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "%s multiplizieren" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "Durch %s dividieren" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "%s hinzufügen" +msgstr "modulo %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "ShiftLeft %s" -msgstr "%s setzen" +msgstr "Linksshift %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "Rechtsshift %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "%s angeheftet" +msgstr "Bitweises Und %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" -msgstr "" +msgstr "Bitweises Oder %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitXor %s" -msgstr "" +msgstr "Bitweises Exklusivoder %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -13787,19 +13777,16 @@ msgid "Invalid index property name '%s' in node %s." msgstr "Ungültiger Indexeigenschaftsname ‚%s‘ in Node %s." #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Emit %s" -msgstr "%s setzen" +msgstr "%s emittieren" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Funktionen" +msgstr "Funktion" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Compose Array" -msgstr "Größe des Arrays ändern" +msgstr "Array zusammenstellen" #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -13811,7 +13798,7 @@ msgstr ": Ungültige Parameter: " #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" -msgstr "" +msgstr "Falls Bedingung a, ansonsten b" #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " @@ -13822,64 +13809,52 @@ msgid "VariableSet not found in script: " msgstr "VariableSet nicht im Skript gefunden: " #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "Neu laden" +msgstr "Vorladen" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Z-Index" +msgstr "Index lesen" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Z-Index" +msgstr "Index schreiben" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "Konstante" +msgstr "Globale Konstante" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "Konstante" +msgstr "Klassenkonstante" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "Konstante" +msgstr "Normale Konstante" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "Konstante" +msgstr "Mathematische Konstante" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Engine Singleton" -msgstr "GDNative Singleton wurde aktiviert" +msgstr "Engine-Singleton erhalten" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "Zeitsuch-Node" +msgstr "Szenen-Node erhalten" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "Szenenbaum-Bearbeitung" +msgstr "Szenenbaum erhalten" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Self" -msgstr "Selbst" +msgstr "Selbst erhalten" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "Nodes trennen" +msgstr "Benutzerdefiniertes Node" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -13896,33 +13871,28 @@ msgstr "" "String (für Fehler) sein." #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "SubCall" -msgstr "Aufrufe" +msgstr "Unteraufruf" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Konstanten" +msgstr "%s konstruieren" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "Lokalkoordinaten verwenden" +msgstr "Lokale Variable erhalten" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "Lokalkoordinaten verwenden" +msgstr "Lokale Variable setzen" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "Aktion" +msgstr "Aktion %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "Zerlege %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -13930,40 +13900,35 @@ msgstr "VisualScript suchen" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Übergebe" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Warte" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "Frame verschieben" +msgstr "Nächster Frame" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Physics Frame" -msgstr "Physik-relative Renderzeit %" +msgstr "Nächster Physik-Frame" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s sek" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitSignal" -msgstr "Ereignis" +msgstr "Wartesignal" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitNodeSignal" -msgstr "Ereignis" +msgstr "Node-Wartesignal" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitInstanceSignal" -msgstr "Instanz" +msgstr "Instanz-Wartesignal" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -14334,10 +14299,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Ungültiger Bezeichner:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "Benötigtes Icon wurde nicht in der Vorlage festgelegt." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "HTTP Server Anhalten" @@ -14378,16 +14339,202 @@ msgstr "Konnte HTTP-Server-Verzeichnis nicht erstellen:" msgid "Error starting HTTP server:" msgstr "Fehler beim Starten des HTTP-Servers:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Ungültiger Projektname." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Ungültige Geometrie, Polygon kann nicht erzeugt werden." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Ordner konnte nicht erstellt werden." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Ungültiger Basispfad." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Laden der Ressource gescheitert." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Laden der Ressource gescheitert." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Ungültige Dateiendung." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Ungültige Dateiendung." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Keine Symbole gefunden." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Erzeuge Miniaturansicht" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Konnte keine APK-Vorlage zum Exportieren finden:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Ungültiger Bundle-Bezeichner:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Beglaubigung: Code-Signierung wird benötigt." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Beglaubigung: Abgehärtete Ausführungsumgebung wird benötigt." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Beglaubigung: Abgehärtete Ausführungsumgebung wird benötigt." #: platform/osx/export/export.cpp @@ -14398,6 +14545,69 @@ msgstr "Beglaubigung: Apple-ID-Name nicht angegeben." msgid "Notarization: Apple ID password not specified." msgstr "Beglaubigung: Apple-ID-Passwort nicht angegeben." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Ungültiger Paket-Kurzname." @@ -14450,6 +14660,27 @@ msgstr "Ungültige Abmessungen für 310x150-Breitlogo (sollte 310x150 sein)." msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Ungültige Abmessungen für Startbildschirm (sollte 620x300 sein)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Ungültiger Pfad." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Ungültige Dateiendung." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Ungültige Produkt-GUID." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14484,8 +14715,8 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionPolygon2D liefert nur eine Kollisionsform für ein von " -"CollisionObject2D abgeleitetes Node. Es kann nur als Unterobjekt von Area2D, " +"CollisionPolygon2D liefert nur eine Kollisionsform für einen von " +"CollisionObject2D abgeleiteten Node. Es kann nur als Unterobjekt von Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D usw. eingehängt werden, um diesen " "eine Form zu geben." @@ -14511,8 +14742,8 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D liefert nur eine Kollisionsform für ein von " -"CollisionObject2D abgeleitetes Node. Es kann nur als Unterobjekt von Area2D, " +"CollisionShape2D liefert nur eine Kollisionsform für einen von " +"CollisionObject2D abgeleiteten Node. Es kann nur als Unterobjekt von Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D usw. eingehängt werden, um diesen " "eine Form zu geben." @@ -14620,15 +14851,14 @@ msgstr "" "ParallaxBackground-Node verwenden." #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " "CPUParticles2D\" toolbar option for this purpose." msgstr "" "GPU-basierte Partikel werden vom GLES2-Grafiktreiber nicht unterstützt.\n" -"Stattdessen bitte CPUParticles2D-Nodes verwenden. Die „In CPU-Partikel " -"konvertieren“-Funktion kann dazu verwendet werden." +"Stattdessen bitte CPUParticles2D-Nodes verwenden. Die Funktion „Zu " +"CPUParticles2D konvertieren“ der Werkzeugleiste kann dazu verwendet werden." #: scene/2d/particles_2d.cpp msgid "" @@ -14638,6 +14868,12 @@ msgid "" "You can use the \"Convert to CPUParticles2D\" toolbar option for this " "purpose." msgstr "" +"Unter MacOS ist das Rendern von Particles2Ds wesentlich langsamer als " +"CPUParticles2Ds, da die Transforms über die CPU statt über die GPU " +"abgewickelt werden.\n" +"Für MacOS als Zielplattform werden CPUParticles2D empfohlen.\n" +"Die Option „Zu CPUParticles2D konvertieren“ der Werkzeugleiste kann dafür " +"verwendet werden." #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" @@ -14675,7 +14911,7 @@ msgstr "" #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." msgstr "" -"Die Pfad-Eigenschaft muss auf ein gültiges Node2D-Node zeigen um zu " +"Die Pfad-Eigenschaft muss auf ein gültiges Node2D-Node zeigen, um zu " "funktionieren." #: scene/2d/skeleton_2d.cpp @@ -14704,7 +14940,7 @@ msgstr "" "Eine TileMap mit aktivierter „Use Parent“-Option benötigt ein Eltern-Node " "des Typs CollisionObject2D, welcher der TileMap eine Form verleiht. Sie " "sollte als Unterobjekt von Area2D, StaticBody2D, RigidBody2D, " -"KinematicBody2D, usw. verwendet werden, um ihnen eine Form zu geben." +"KinematicBody2D, usw. verwendet werden, um diesen eine Form zu geben." #: scene/2d/visibility_notifier_2d.cpp msgid "" @@ -14901,15 +15137,14 @@ msgid "Only uniform scales are supported." msgstr "Es werden nur gleichförmige Skalierungen unterstützt." #: scene/3d/particles.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "GPU-basierte Partikel werden vom GLES2-Grafiktreiber nicht unterstützt.\n" -"Stattdessen bitte CPUParticles-Nodes verwenden. Die „In CPU-Partikel " -"konvertieren“-Funktion kann dazu verwendet werden." +"Stattdessen bitte CPUParticles-Nodes verwenden. Die Funktion „Zu " +"CPUParticles konvertieren“ der Werkzeugleiste kann dazu verwendet werden." #: scene/3d/particles.cpp msgid "" @@ -14918,6 +15153,12 @@ msgid "" "Consider using CPUParticles instead when targeting macOS.\n" "You can use the \"Convert to CPUParticles\" toolbar option for this purpose." msgstr "" +"Unter MacOS ist das Rendern von Particles wesentlich langsamer als " +"CPUParticles, da die Transforms über die CPU statt über die GPU abgewickelt " +"werden.\n" +"Für MacOS als Zielplattform werden CPUParticles empfohlen.\n" +"Die Option „Zu CPUParticles konvertieren“ der Werkzeugleiste kann dafür " +"verwendet werden." #: scene/3d/particles.cpp msgid "" @@ -15075,7 +15316,7 @@ msgid "" "Check the portal is facing outwards from the source room." msgstr "" "Portal-Autolink fehlgeschlagen, siehe Log-Ausgabe für Details.\n" -"Zeigt das Portal nach außen vom Quellraum ausgesehen?" +"Portal muss vom Quellraum nach außen zeigen." #: scene/3d/room_manager.cpp msgid "" @@ -15202,9 +15443,10 @@ msgstr "" "AnimationTree." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Farbe: #%s\n" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index e41400290d..f9d1c47b88 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -491,8 +491,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1326,7 +1326,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2099,8 +2099,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3125,7 +3125,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3849,6 +3853,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3961,7 +3973,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4747,19 +4759,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12186,6 +12198,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13477,10 +13497,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13521,16 +13537,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13541,6 +13727,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13593,6 +13842,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13943,8 +14210,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14184,7 +14451,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index b24b443b09..d3cbb4b072 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -13,13 +13,15 @@ # Michalis <michalisntovas@yahoo.gr>, 2021. # leriaz <leriaz@live.com>, 2021. # Shadofer <shadowrlrs@gmail.com>, 2021. +# thealexanton <greektechmania@gmail.com>, 2022. +# Παναγιώτης Παπαηλίου <pan.papail@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-07-09 14:32+0000\n" -"Last-Translator: Shadofer <shadowrlrs@gmail.com>\n" +"PO-Revision-Date: 2022-02-14 22:08+0000\n" +"Last-Translator: Παναγιώτης Παπαηλίου <pan.papail@gmail.com>\n" "Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/" "el/>\n" "Language: el\n" @@ -27,7 +29,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -402,7 +404,7 @@ msgstr "Ένα AnimationPlayer δεν μπορεί να κινήσει τον ε #: editor/animation_track_editor.cpp #, fuzzy msgid "property '%s'" -msgstr "Η ιδιότητα '%s' δεν υπάρχει." +msgstr "Η ιδιότητα '%s'" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -523,8 +525,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -993,7 +995,7 @@ msgstr "Κανένα αποτέλεσμα για \"%s\"." #: editor/create_dialog.cpp editor/property_selector.cpp msgid "No description available for %s." -msgstr "" +msgstr "Δεν υπάρχει διαθέσιμη περιγραφή για %s." #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp @@ -1297,6 +1299,8 @@ msgstr "%s (Υπάρχει ήδη)" #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" msgstr "" +"Τα περιεχόμενα του πόρου \"%s\" - %d αρχείο(α) έρχονται σε αντίθεση με το " +"έργο σου:" #: editor/editor_asset_installer.cpp msgid "Contents of asset \"%s\" - No files conflict with your project:" @@ -1401,7 +1405,7 @@ msgid "Bus Options" msgstr "Επιλογές διαύλου" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Αναπαραγωγή" @@ -1513,7 +1517,7 @@ msgstr "Μη έγκυρο όνομα." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "Δεν μπορείς να ξεκινήσεις με ψηφίο." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -2214,8 +2218,8 @@ msgstr "Περιγραφές μεθόδων" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Δεν υπάρχει ακόμη περιγραφή για αυτήν την μέθοδο. Παρακαλούμε βοηθήστε μας " "[color=$color][url=$url]γράφοντας μία[/url][/color]!" @@ -2909,7 +2913,7 @@ msgstr "Διαγραφή διάταξης" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "Προεπιλογή" +msgstr "Προεπιλεγμένο" #: editor/editor_node.cpp editor/editor_resource_picker.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp @@ -3349,10 +3353,16 @@ msgid "Update Continuously" msgstr "Συνεχόμενη Ανανέωση" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Ανανέωση στην Αλλαγή" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Αλλαγές υλικού" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Απόκρυψη Δείκτη Ενημέρωσης" @@ -4149,6 +4159,14 @@ msgstr "Το όνομα περιέχει άκυρους χαρακτήρες." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4156,8 +4174,8 @@ msgid "" "\n" "Do you wish to overwrite them?" msgstr "" -"Τα ακόλουθα αρχεία ή φάκελοι συγκρούονται με στοιχεία στον προορισμό \"%s" -"\":\n" +"Τα ακόλουθα αρχεία ή φάκελοι συγκρούονται με στοιχεία στον προορισμό " +"\"%s\":\n" "\n" "%s\n" "\n" @@ -4270,7 +4288,7 @@ msgstr "Τελευταία Τροποποιημένα" msgid "Sort by First Modified" msgstr "Τελευταία Τροποποιημένα" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Αναπαραγωγή..." @@ -5090,6 +5108,10 @@ msgid "Rename Animation" msgstr "Μετονομασία κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Αναπαραγωγή κίνησης" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Το επόμενο στην μείξη κίνησης άλλαξε" @@ -5102,10 +5124,6 @@ msgid "Load Animation" msgstr "Φόρτωση κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Αναπαραγωγή κίνησης" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Καμία κίνηση για αντριγραφή!" @@ -13042,6 +13060,16 @@ msgstr "Αλλαγή Ακτίνας Σχήματος Κυλίνδρου" msgid "Set Occluder Sphere Position" msgstr "Ορισμός θέσης εισόδου καμπύλης" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Ορισμός θέσης σημείου καμπύλης" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Ορισμός θέσης σημείου καμπύλης" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Αλλαγή Ακτίνας Κυλίνδρου" @@ -14464,10 +14492,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Άκυρο Αναγνωριστικό:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "Το απαιτούμενο εικονίδιο δεν έχει καθοριστεί στην διαμόρφωση." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Τερματισμός Διακομιστή HTTP" @@ -14512,17 +14536,198 @@ msgstr "Αδύνατη η δημιουργία φακέλου." msgid "Error starting HTTP server:" msgstr "Σφάλμα κατά την αποθήκευση σκηνής." +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Άκυρο όνομα έργου." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Άκυρη γεωμετρία, αδύνατη η δημιουργία πολυγώνου." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Αδύνατη η δημιουργία φακέλου." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Άκυρη βασική διαδρομή." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Απέτυχε η φόρτωση πόρου." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Απέτυχε η φόρτωση πόρου." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Άκυρη επέκταση." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Άκυρη επέκταση." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Δεν βρέθηκε!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Δημιουργία μικρογραφίας" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "Σφάλμα κατά το άνοιγμα προτύπου για εξαγωγή:" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Άκυρο Αναγνωριστικό:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14533,6 +14738,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Άκυρο σύντομο όνομα πακέτου." @@ -14585,6 +14853,27 @@ msgstr "Άκυρη εικόνα ευρύ λογότυπου 310x150 (πρέπε msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Άκυρες διαστάσεις εικόνας οθόνης εκκίνησης (πρέπει να είναι 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Άκυρη διαδρομή." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Άκυρη επέκταση." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Άκυρο GUID προϊόντος." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -15025,8 +15314,8 @@ msgstr "" #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "Τα σωματίδια GPU δεν υποστηρίζονται από τον οδηγό βίντεο GLES2.\n" "Χρησιμοποιήστε τον κόμβο CPUParticles. Μπορείτε να χρησιμοποιήσετε την " @@ -15292,9 +15581,10 @@ msgstr "" "Αυτός ο κόμβος έχει καταργηθεί. Χρησιμοποιήστε το AnimationTree αντ 'αυτού." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Χρώμα: #%s\n" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 0049194bfe..1a95fb6702 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -512,8 +512,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1378,7 +1378,7 @@ msgid "Bus Options" msgstr "Agordoj de buso" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duobligi" @@ -2171,8 +2171,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Estas aktuale ne priskribo por ĉi tiu atributo. Bonvolu helpi nin per [color=" -"$color][url=$url]kontribui unu[/url][/color]!" +"Estas aktuale ne priskribo por ĉi tiu atributo. Bonvolu helpi nin per " +"[color=$color][url=$url]kontribui unu[/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2180,11 +2180,11 @@ msgstr "Metodaj priskriboj" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Estas aktuale ne priskribo por ĉi tiu metodo. Bonvolu helpi nin per [color=" -"$color][url=$url]kontribui unu[/url][/color]!" +"Estas aktuale ne priskribo por ĉi tiu metodo. Bonvolu helpi nin per " +"[color=$color][url=$url]kontribui unu[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -3300,10 +3300,15 @@ msgstr "Ĝisdatigi kontinue" #: editor/editor_node.cpp #, fuzzy -msgid "Update When Changed" +msgid "Update All Changes" msgstr "Ĝisdatigi kiam ŝanĝitis" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Parametro ŝanĝiĝis" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Kaŝi la ĝisdatan indikilon" @@ -4087,6 +4092,14 @@ msgstr "Nomo enhavas malvalidajn signojn." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4208,7 +4221,7 @@ msgstr "Lastaj modifitaj" msgid "Sort by First Modified" msgstr "Lastaj modifitaj" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duobligi..." @@ -5026,6 +5039,10 @@ msgid "Rename Animation" msgstr "Renomi animaĵon" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplikati animacion" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Mikso sekvo ŝanĝiĝis" @@ -5038,10 +5055,6 @@ msgid "Load Animation" msgstr "Ŝargi animacion" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplikati animacion" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Ne animacio por kopii!" @@ -12731,6 +12744,16 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "Krei okludan plurlateron" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Krei okludan plurlateron" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Krei okludan plurlateron" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14086,10 +14109,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14134,16 +14153,195 @@ msgstr "Ne povis krei dosierujon." msgid "Error starting HTTP server:" msgstr "Eraras konservi TileSet!" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nevalida nomo de projekto." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Ne povis krei dosierujon." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Malvalida baza dosierindiko." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Ne eblas ŝargi risurcon." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Ne eblas ŝargi risurcon." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Nevalida kromprogramo." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Nevalida kromprogramo." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Ne sub-risurcojn trovis." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Kreas bildeton" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14154,6 +14352,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14207,6 +14468,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Nevalida dosierindiko." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Nevalida kromprogramo." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Nevalida nomo de projekto." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14557,8 +14839,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14798,7 +15080,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/es.po b/editor/translations/es.po index 058549cbd4..d4f2364598 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -14,7 +14,7 @@ # Diego López <diegodario21@gmail.com>, 2017. # eon-s <emanuel.segretin@gmail.com>, 2018, 2019, 2020. # Gustavo Leon <gleondiaz@gmail.com>, 2017-2018. -# Javier Ocampos <xavier.ocampos@gmail.com>, 2018, 2019, 2020, 2021. +# Javier Ocampos <xavier.ocampos@gmail.com>, 2018, 2019, 2020, 2021, 2022. # Jose Maria Martinez <josemar1992@hotmail.com>, 2018. # Juan Quiroga <juanquiroga9@gmail.com>, 2017. # Kiji Pixel <raccoon.fella@gmail.com>, 2017. @@ -78,8 +78,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" -"Last-Translator: Alfonso V <alfonsov96@gmail.com>\n" +"PO-Revision-Date: 2022-01-16 13:19+0000\n" +"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" "Language: es\n" @@ -392,9 +392,8 @@ msgid "Duplicate Key(s)" msgstr "Duplicar Clave(s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add RESET Value(s)" -msgstr "Añadir %d Fotograma(s)" +msgstr "Añadir Valor(es) de RESET" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" @@ -570,9 +569,8 @@ msgstr "" "única." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Add RESET Keys" -msgstr "Escalar Claves de Animación" +msgstr "Añadir Claves de Animación de RESET" #: editor/animation_track_editor.cpp msgid "" @@ -581,8 +579,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -591,8 +589,8 @@ msgstr "" "\n" "Para habilitar la capacidad de añadir pistas personalizadas, ve a la " "configuración de importación de la escena y establece\n" -"\"Animation > Storage\" a \"Files\", activa \"Animation > Keep Custom Tracks" -"\", y luego reimporta.\n" +"\"Animation > Storage\" a \"Files\", activa \"Animation > Keep Custom " +"Tracks\", y luego reimporta.\n" "También puedes usar un preset de importación que importa animaciones para " "separar archivos." @@ -1449,7 +1447,7 @@ msgid "Bus Options" msgstr "Opciones de Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplicar" @@ -1561,7 +1559,7 @@ msgstr "Nombre inválido." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "No puede comenzar con un dígito." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -2177,11 +2175,11 @@ msgstr "Clase:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp #: editor/script_create_dialog.cpp msgid "Inherits:" -msgstr "Hereda de:" +msgstr "Herencia:" #: editor/editor_help.cpp msgid "Inherited by:" -msgstr "Heredada por:" +msgstr "Heredado de:" #: editor/editor_help.cpp msgid "Description" @@ -2196,9 +2194,8 @@ msgid "Properties" msgstr "Propiedades" #: editor/editor_help.cpp -#, fuzzy msgid "overrides %s:" -msgstr "anulación:" +msgstr "anula %s:" #: editor/editor_help.cpp msgid "default:" @@ -2258,8 +2255,8 @@ msgstr "Descripciones de Métodos" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Actualmente no existe descripción para este método. Por favor ¡ayúdanos con " "[color=$color][url=$url] contribuyendo con una[ /url][/color]!" @@ -2338,18 +2335,17 @@ msgid "Property:" msgstr "Propiedad:" #: editor/editor_inspector.cpp -#, fuzzy msgid "Pin value" -msgstr "(valor)" +msgstr "Valor de fijación" #: editor/editor_inspector.cpp msgid "" "Pinning a value forces it to be saved even if it's equal to the default." -msgstr "" +msgstr "Fijar un valor obliga a guardarlo aunque sea igual al predeterminado." #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" -msgstr "" +msgstr "Valor de fijación [Desactivado porque '%s' es solo para el editor]" #: editor/editor_inspector.cpp editor/scene_tree_dock.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -2364,26 +2360,23 @@ msgstr "Asignar Múltiples:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "" +msgstr "Fijado %s" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "" +msgstr "Desfijado %s" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" -msgstr "Copiar Propiedades" +msgstr "Copiar Propiedad" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" -msgstr "Pegar Propiedades" +msgstr "Pegar Propiedad" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "Copiar Ruta del Script" +msgstr "Copiar Ruta de Propiedad" #: editor/editor_log.cpp msgid "Output:" @@ -2951,7 +2944,6 @@ msgstr "Eliminar Layout" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp -#, fuzzy msgid "Default" msgstr "Por defecto" @@ -3120,9 +3112,8 @@ msgid "Install Android Build Template..." msgstr "Instalar plantilla de compilación de Android..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Abrir Carpeta de Editor de Datos" +msgstr "Abrir Carpeta de Datos del Usuario" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3211,7 +3202,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Force Shader Fallbacks" -msgstr "" +msgstr "Forzar Shader Fallbacks" #: editor/editor_node.cpp msgid "" @@ -3222,6 +3213,13 @@ msgid "" "Asynchronous shader compilation must be enabled in the project settings for " "this option to make a difference." msgstr "" +"Cuando esta opción está activada, los shaders se utilizarán en su forma de " +"fallback (ya sea visible a través de un ubershader u oculto) durante todo el " +"tiempo de ejecución.\n" +"Esto es útil para verificar el aspecto y el rendimiento de los fallbacks, " +"que normalmente se muestran brevemente.\n" +"La compilación asíncrona de los shaders debe estar activada en la " +"configuración del proyecto para que esta opción suponga una diferencia." #: editor/editor_node.cpp msgid "Synchronize Scene Changes" @@ -3387,10 +3385,16 @@ msgid "Update Continuously" msgstr "Actualizar Continuamente" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Actualizar Al Cambiar" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Cambios del Material:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Ocultar Spinner de Actualización" @@ -3838,9 +3842,8 @@ msgstr "Importar Desde Nodo:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Error" +msgstr "Error %s" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4170,6 +4173,14 @@ msgstr "El nombre contiene caracteres inválidos." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4288,7 +4299,7 @@ msgstr "Ordenar por Última Modificación" msgid "Sort by First Modified" msgstr "Ordenar por Primera Modificación" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplicar..." @@ -4389,9 +4400,8 @@ msgid "Replace..." msgstr "Reemplazar..." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Replace in Files" -msgstr "Reemplazar Todo" +msgstr "Reemplazar en Archivos" #: editor/find_in_files.cpp msgid "Find: " @@ -4402,9 +4412,8 @@ msgid "Replace: " msgstr "Reemplazar: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace All (NO UNDO)" -msgstr "Reemplazar Todo" +msgstr "Reemplazar Todo (NO SE PUEDE DESHACER)" #: editor/find_in_files.cpp msgid "Searching..." @@ -4630,6 +4639,8 @@ msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." msgstr "" +"Selecciona un archivo de recursos en el sistema de archivos o en el " +"inspector para ajustar la configuración de importación." #: editor/inspector_dock.cpp msgid "Failed to load resource." @@ -5104,6 +5115,10 @@ msgid "Rename Animation" msgstr "Renombrar Animación" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplicar Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Mezclar el Siguiente Cambio" @@ -5116,10 +5131,6 @@ msgid "Load Animation" msgstr "Cargar Animación" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplicar Animación" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "¡No hay animaciones para copiar!" @@ -6101,9 +6112,8 @@ msgid "Alt+Drag: Move selected node." msgstr "Alt+Arrastrar: Mover el nodo seleccionado." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Scale selected node." -msgstr "Alt+Arrastrar: Mover el nodo seleccionado." +msgstr "Alt+Arrastrar: Escala el nodo seleccionado." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "V: Set selected node's pivot position." @@ -6137,7 +6147,7 @@ msgstr "Modo de Escalado" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Shift: Scale proportionally." -msgstr "" +msgstr "Shift: Escala proporcional." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6237,9 +6247,8 @@ msgstr "Bloquear el objeto seleccionado en su sitio (no se puede mover)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected Node(s)" -msgstr "Bloqueo Seleccionado" +msgstr "Bloquear Nodo(s) Seleccionado(s)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6248,9 +6257,8 @@ msgstr "Desbloquear el objeto seleccionado (puede ser movido)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected Node(s)" -msgstr "Desbloquear Seleccionado" +msgstr "Desbloquear Nodo(s) Seleccionado(s)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6259,9 +6267,8 @@ msgstr "Asegura que los hijos del objeto no sean seleccionables." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected Node(s)" -msgstr "Agrupar Seleccionados" +msgstr "Grupo Nodo(s) Seleccionado(s)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6270,9 +6277,8 @@ msgstr "Restaura la capacidad de selección de los hijos del objeto." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected Node(s)" -msgstr "Desagrupar Seleccionados" +msgstr "Desagrupar Nodo(s) Seleccionado(s)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton Options" @@ -6569,11 +6575,11 @@ msgstr "Crear Puntos de Emisión Desde el Nodo" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 0" -msgstr "Flat 0" +msgstr "Plano 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "Flat 1" +msgstr "Plano 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -7827,7 +7833,7 @@ msgstr "Seleccionar Color" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Convert Case" -msgstr "Convertir Mayúsculas" +msgstr "Convertir Mayúsculas/Minúsculas" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Uppercase" @@ -7926,9 +7932,8 @@ msgid "Find in Files..." msgstr "Buscar en Archivos..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Replace in Files..." -msgstr "Reemplazar..." +msgstr "Reemplazar en Archivos..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" @@ -8091,7 +8096,7 @@ msgstr " [auto]" #. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. #: editor/plugins/spatial_editor_plugin.cpp msgid " [portals active]" -msgstr " [portals active]" +msgstr " [portales activos]" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -8456,16 +8461,15 @@ msgstr "Act./Desact. Vista Libre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Decrease Field of View" -msgstr "" +msgstr "Disminuir el Campo de Visión" #: editor/plugins/spatial_editor_plugin.cpp msgid "Increase Field of View" -msgstr "" +msgstr "Incrementar el Campo de Visión" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Reset Field of View to Default" -msgstr "Restablecer Valores por Defecto" +msgstr "Restablecer el Campo de Visión por Defecto" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9195,22 +9199,19 @@ msgstr "Añadir Tipo" #: editor/plugins/theme_editor_plugin.cpp msgid "Filter the list of types or create a new custom type:" -msgstr "" +msgstr "Filtra la lista de tipos o crea un nuevo tipo personalizado:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Available Node-based types:" -msgstr "Perfiles Disponibles:" +msgstr "Tipos disponibles basados en nodos:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Type name is empty!" -msgstr "El nombre del archivo está vacío." +msgstr "¡El nombre del tipo está vacío!" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Are you sure you want to create an empty type?" -msgstr "¿Seguro que quieres abrir más de un proyecto?" +msgstr "¿Estás seguro de que quieres crear un tipo vacío?" #: editor/plugins/theme_editor_plugin.cpp msgid "Confirm Item Rename" @@ -9834,9 +9835,8 @@ msgid "TileSet" msgstr "TileSet" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." -msgstr "No hay addons de VCS disponibles." +msgstr "No hay plugins VCS disponibles." #: editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -9846,53 +9846,48 @@ msgstr "Error" msgid "" "Remote settings are empty. VCS features that use the network may not work." msgstr "" +"La configuración remota está vacía. Las funciones de VCS que utilizan la red " +"pueden no funcionar." #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "Nombre no proporcionado." +msgstr "No se proporcionó ningún mensaje de confirmación." #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "Confirmar" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Cambios de sombreado:" +msgstr "Cambios Progresivos" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Cambios de sombreado:" +msgstr "Cambios Indeterminados" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "Confirmar" +msgstr "Commit:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "Fecha:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "Subárbol" +msgstr "Subtítulo:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "¿Quieres eliminar la rama %s?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "¿Seguro que quieres abrir más de un proyecto?" +msgstr "¿Quieres eliminar el %s remoto?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "Aplicar Restablecer" +msgstr "Aplicar" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9903,148 +9898,132 @@ msgid "Initialize" msgstr "Inicializar" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "Eliminar Punto" +msgstr "Inicio de Sesión Remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "Renombrar" +msgstr "Nombre de usuario" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "Contraseña" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "Ruta de la clave pública SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "Selecciona la ruta de la clave pública SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "Ruta de la Clave Privada SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "Selecciona la ruta de la clave privada SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "Contraseña SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "Detectar nuevos cambios" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "¿Cerrar y guardar cambios?" +msgstr "Descartar todos los cambios" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "Guardando cambios locales..." +msgstr "Realizar todos los cambios" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "Cambios del Material:" +msgstr "Anular todos los cambios" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "Confirmar Cambios" +msgstr "Mensaje de Confirmación" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "Confirmar Cambios" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "Confirmar" +msgstr "Lista de Confirmación" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "Tamaño de la lista de confirmación" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Coincidencias:" +msgstr "Ramas" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "Crear Nuevo Proyecto" +msgstr "Crear Nueva Rama" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "Eliminar Pista de Animación" +msgstr "Eliminar Rama" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "Nombre de la Rama" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" -msgstr "Remoto" +msgstr "Remotos" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "Crear Nuevo Proyecto" +msgstr "Crear un Nuevo Remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "Eliminar Elemento" +msgstr "Eliminar Remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Remoto " +msgstr "Nombre Remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "Remoto " +msgstr "URL Remota" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "Buscar" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "Pull" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "Push" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "Malla de Origen:" +msgstr "Forzar Push" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -10064,22 +10043,19 @@ msgstr "Cambio de Tipo" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "Sin fusionar" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "Ver" +msgstr "Ver:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "Dividir Ruta" +msgstr "Dividir" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "Modificado/s" +msgstr "Unificado" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -11162,8 +11138,8 @@ msgstr "Error al abrir el archivo del paquete (no está en formato ZIP)." msgid "" "Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." msgstr "" -"Archivo de proyecto \".zip\" inválido; no contiene un archivo \"project.godot" -"\"." +"Archivo de proyecto \".zip\" inválido; no contiene un archivo \"project." +"godot\"." #: editor/project_manager.cpp msgid "Please choose an empty folder." @@ -12237,6 +12213,10 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"No se puede guardar una rama que es hija de una escena ya instanciada.\n" +"Para guardar esta rama en su propia escena, abre la escena original, haz " +"clic con el botón derecho del ratón en esta rama y selecciona \"Guardar Rama " +"como Escena\"." #: editor/scene_tree_dock.cpp msgid "" @@ -12244,6 +12224,10 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"No se puede guardar una rama que forma parte de una escena heredada.\n" +"Para guardar esta rama en la propia escena, abre la escena original, haz " +"clic con el botón derecho en esta rama y selecciona \"Guardar Rama como " +"Escena\"." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -12920,6 +12904,16 @@ msgstr "Establecer Radio de la Esfera de Oclusión" msgid "Set Occluder Sphere Position" msgstr "Establecer Posición de la Esfera de Oclusión" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Establecer Posición del Portal Point" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Establecer Posición de Punto de Curva" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Cambiar Radio de Cylinder" @@ -13637,38 +13631,36 @@ msgid "Edit Member" msgstr "Editar Miembro" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "Establecer expresión" +msgstr "Expresión" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "Regresar" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "animación" +msgstr "Condición" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "" +msgstr "if (cond) is:" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "While" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "while (cond):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "Iterador" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "for (elem) in (input):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -13684,79 +13676,71 @@ msgstr "El iterador ya no es correcto: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "Secuencia" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "Renombrar carpeta:" +msgstr "en orden:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "Eje de paso:" +msgstr "Cambiar" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" -msgstr "" +msgstr "'entrada' es:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "Tipos:" +msgstr "Tipo de Proyección" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "¿Es %s?" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "En %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "On Self" -msgstr "Propio" +msgstr "Sobre Sí Mismo" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "En el carácter %s" +msgstr "Restar %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "Multiplicar %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "Dividir %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "Añadir %s" +msgstr "Mod %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "ShiftLeft %s" -msgstr "Establecer %s" +msgstr "ShiftLeft %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "ShiftRight %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "Añadir %s" +msgstr "BitAnd %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" -msgstr "" +msgstr "BitOr %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitXor %s" -msgstr "" +msgstr "BitXor %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -13781,19 +13765,16 @@ msgid "Invalid index property name '%s' in node %s." msgstr "Índice inválido de nombre de propiedad '%s' en el nodo %s." #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Emit %s" -msgstr "Establecer %s" +msgstr "Emitir %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Funciones" +msgstr "Función" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Compose Array" -msgstr "Redimensionar Array" +msgstr "Ordenar Array" #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -13805,7 +13786,7 @@ msgstr ": Argumentos incorrectos: " #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" -msgstr "" +msgstr "a si cond, sino b" #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " @@ -13816,64 +13797,52 @@ msgid "VariableSet not found in script: " msgstr "VariableSet no encontrado en el script: " #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "Recargar" +msgstr "Precarga" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Índice Z" +msgstr "Obtener Índice" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Índice Z" +msgstr "Establecer Índice" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "Constante" +msgstr "Constante Global" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "Constante" +msgstr "Constante de Clase" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "Constante" +msgstr "Constante Básica" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "Constante" +msgstr "Constante Matemática" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Engine Singleton" -msgstr "Activar Singleton GDNative" +msgstr "Obtener Engine Singleton" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "Nodo TimeSeek" +msgstr "Obtener Nodo de Escena" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "Editor del Árbol de Escenas" +msgstr "Obtener Árbol de Escenas" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Self" -msgstr "Propio" +msgstr "Obtener Propio" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "Cortar Nodos" +msgstr "CustomNode" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -13890,33 +13859,28 @@ msgstr "" "o string/cadena (error)." #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "SubCall" -msgstr "Llamadas" +msgstr "SubCall" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Constantes" +msgstr "Construir %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "Usar Espacio Local" +msgstr "Obtener Var local" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "Usar Espacio Local" +msgstr "Establecer Var Local" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "Acción" +msgstr "Acción %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "Deconstruir %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -13924,40 +13888,35 @@ msgstr "Buscar en VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Yield" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Wait" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "Mover Fotograma" +msgstr "Siguiente Fotograma" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Physics Frame" -msgstr "Fotogramas de Física %" +msgstr "Siguiente Fotograma de Física" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s seg(s)" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitSignal" -msgstr "Señal" +msgstr "WaitSignal" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitNodeSignal" -msgstr "Señal" +msgstr "WaitNodeSignal" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitInstanceSignal" -msgstr "Instanciar" +msgstr "WaitInstanceSignal" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -14118,8 +14077,8 @@ msgid "" "\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VrApi\" " "or \"OpenXR\"." msgstr "" -"\"Hand Tracking\" solo es válido cuando \"Xr Mode\" es \"Oculus Mobile VrApi" -"\" u \"OpenXR\"." +"\"Hand Tracking\" solo es válido cuando \"Xr Mode\" es \"Oculus Mobile " +"VrApi\" u \"OpenXR\"." #: platform/android/export/export_plugin.cpp msgid "\"Passthrough\" is only valid when \"Xr Mode\" is \"OpenXR\"." @@ -14331,10 +14290,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Identificador inválido:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "El icono requerido no está especificado en el preset." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Detener Servidor HTTP" @@ -14375,16 +14330,202 @@ msgstr "No se pudo crear el directorio del servidor HTTP:" msgid "Error starting HTTP server:" msgstr "Error al iniciar el servidor HTTP:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nombre de Proyecto Inválido." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Geometría inválida, no es posible crear un polígono." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "No se pudo crear la carpeta." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Ruta base incorrecta." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Error al cargar el recurso." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Error al cargar el recurso." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Extensión inválida." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Extensión inválida." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "No se han encontrado icons." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Creando Miniatura" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"No se pudo encontrar la plantilla APK para exportar:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Identificador de paquete no válido:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Notarización: se requiere firma de código." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Notarización: se requiere tiempo de ejecución reforzado." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Notarización: se requiere tiempo de ejecución reforzado." #: platform/osx/export/export.cpp @@ -14395,6 +14536,69 @@ msgstr "Notarización: nombre de ID de Apple no especificado." msgid "Notarization: Apple ID password not specified." msgstr "Notarización: contraseña de ID de Apple no especificada." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nombre corto del paquete inválido." @@ -14460,13 +14664,34 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" "Las dimensiones de la imagen del splash son inválidas (debería ser 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Ruta inválida." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Extensión inválida." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "GUID de producto inválido." + #: 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 "" -"Se debe crear o establecer un recurso SpriteFrames en la propiedad \"Frames" -"\" para que AnimatedSprite pueda mostrar los fotogramas." +"Se debe crear o establecer un recurso SpriteFrames en la propiedad " +"\"Frames\" para que AnimatedSprite pueda mostrar los fotogramas." #: scene/2d/canvas_modulate.cpp msgid "" @@ -14593,13 +14818,15 @@ msgstr "" #: scene/2d/navigation_agent_2d.cpp msgid "The NavigationAgent2D can be used only under a Node2D node." -msgstr "" +msgstr "El NavigationAgent2D sólo puede utilizarse bajo un nodo Node2D." #: scene/2d/navigation_obstacle_2d.cpp msgid "" "The NavigationObstacle2D only serves to provide collision avoidance to a " "Node2D object." msgstr "" +"El NavigationObstacle2D sólo sirve para evitar la colisión de un objeto " +"Node2D." #: scene/2d/navigation_polygon.cpp msgid "" @@ -14625,16 +14852,15 @@ msgstr "" "nodo ParallaxBackground." #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " "CPUParticles2D\" toolbar option for this purpose." msgstr "" -"Las partículas basadas en la GPU no son compatibles con el controlador de " -"vídeo GLES2.\n" -"En su lugar, utiliza el nodo CPUParticles2D. Para ello puedes utilizar la " -"opción \"Convertir a CPUParticles\"." +"Las partículas basadas en la GPU no son soportadas por el controlador de " +"video GLES2.\n" +"Utiliza el nodo CPUParticles2D en su lugar. Puedes usar la opción de la " +"barra de herramientas \"Convertir a CPUParticles2D\" para este propósito." #: scene/2d/particles_2d.cpp msgid "" @@ -14644,6 +14870,12 @@ msgid "" "You can use the \"Convert to CPUParticles2D\" toolbar option for this " "purpose." msgstr "" +"En macOS, el renderizado de Particles2D es mucho más lento que el de " +"CPUParticles2D debido a que la retroalimentación de las transformaciones se " +"implementa en la CPU en lugar de la GPU.\n" +"Considera usar CPUParticles2D en su lugar cuando te dirijas a macOS.\n" +"Puedes usar la opción de la barra de herramientas \"Convertir a " +"CPUParticles2D\" para este propósito." #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" @@ -14872,7 +15104,7 @@ msgstr "" #: scene/3d/navigation_agent.cpp msgid "The NavigationAgent can be used only under a spatial node." -msgstr "" +msgstr "El NavigationAgent sólo puede utilizarse bajo un nodo spatial." #: scene/3d/navigation_mesh_instance.cpp msgid "" @@ -14887,6 +15119,8 @@ msgid "" "The NavigationObstacle only serves to provide collision avoidance to a " "spatial object." msgstr "" +"El NavigationObstacle sólo sirve para evitar la colisión de un objeto " +"spatial." #: scene/3d/occluder.cpp msgid "No shape is set." @@ -14897,16 +15131,15 @@ msgid "Only uniform scales are supported." msgstr "Sólo se admiten escalas uniformes." #: scene/3d/particles.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" -"Las partículas basadas en la GPU no son compatibles con el controlador de " -"vídeo GLES2.\n" -"En su lugar, utiliza el nodo CPUParticles. Para ello puedes utilizar la " -"opción \"Convertir a CPUParticles\"." +"Las partículas basadas en la GPU no son soportadas por el controlador de " +"video GLES2.\n" +"Utiliza el nodo CPUParticles en su lugar. Puedes usar la opción de la barra " +"de herramientas \"Convertir a CPUParticles\" para este propósito." #: scene/3d/particles.cpp msgid "" @@ -14915,6 +15148,12 @@ msgid "" "Consider using CPUParticles instead when targeting macOS.\n" "You can use the \"Convert to CPUParticles\" toolbar option for this purpose." msgstr "" +"En macOS, el renderizado de Particles es mucho más lento que el de " +"CPUParticles debido a que la retroalimentación de las transformaciones se " +"implementa en la CPU en lugar de la GPU.\n" +"Considera usar CPUParticles en su lugar cuando te dirijas a macOS.\n" +"Puedes usar la opción de la barra de herramientas \"Convertir a " +"CPUParticles\" para este propósito." #: scene/3d/particles.cpp msgid "" @@ -15108,8 +15347,8 @@ msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"Se debe crear o establecer un recurso SpriteFrames en la propiedad \"Frames" -"\" para que AnimatedSprite3D pueda mostrar los fotogramas." +"Se debe crear o establecer un recurso SpriteFrames en la propiedad " +"\"Frames\" para que AnimatedSprite3D pueda mostrar los fotogramas." #: scene/3d/vehicle_body.cpp msgid "" @@ -15190,9 +15429,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Este nodo ha quedado obsoleto. Usa AnimationTree en su lugar." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Color: #%s\n" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index b7dd76951e..25d0908e26 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -524,8 +524,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -534,8 +534,8 @@ msgstr "" "\n" "Para habilitar la capacidad de añadir pistas personalizadas, andá a la " "configuración de importación de la escena y establece\n" -"\"Animation > Storage\" a \"Files\", activa \"Animation > Keep Custom Tracks" -"\", y luego reimportá.\n" +"\"Animation > Storage\" a \"Files\", activa \"Animation > Keep Custom " +"Tracks\", y luego reimportá.\n" "También podés usar un preset de importación que importa animaciones a " "archivos separados." @@ -1393,7 +1393,7 @@ msgid "Bus Options" msgstr "Opciones de Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplicar" @@ -2199,8 +2199,8 @@ msgstr "Descripción de Método" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Actualmente no existe descripción para este método. Por favor ayúdanos " "[color=$color][url=$url]contribuyendo una[/url][/color]!" @@ -3326,10 +3326,16 @@ msgid "Update Continuously" msgstr "Actualizar Continuamente" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Actualizar Al Cambiar" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Cambios de Material:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Ocultar Spinner de Actualización" @@ -4109,6 +4115,14 @@ msgstr "El nombre indicado contiene caracteres inválidos." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4227,7 +4241,7 @@ msgstr "Ordenar por Ultima Modificación" msgid "Sort by First Modified" msgstr "Ordenar por Primera Modificación" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplicar..." @@ -5043,6 +5057,10 @@ msgid "Rename Animation" msgstr "Renombrar Animación" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplicar Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Blendear Próximo Cambiado" @@ -5055,10 +5073,6 @@ msgid "Load Animation" msgstr "Cargar Animación" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplicar Animación" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "No hay animaciones para copiar!" @@ -11094,8 +11108,8 @@ msgstr "Error al abrir el archivo de paquete (no esta en formato ZIP)." msgid "" "Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." msgstr "" -"Archivo de projecto \".zip\" inválido; no contiene un archivo \"project.godot" -"\"." +"Archivo de projecto \".zip\" inválido; no contiene un archivo \"project." +"godot\"." #: editor/project_manager.cpp msgid "Please choose an empty folder." @@ -12854,6 +12868,16 @@ msgstr "Establecer Radio de la Esfera de Oclusión" msgid "Set Occluder Sphere Position" msgstr "Establecer Posición de la Esfera de Oclusión" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Establecer Posición del Portal Point" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Setear Posición de Punto de Curva" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Cambiar Radio de Cilindro" @@ -14044,8 +14068,8 @@ msgid "" "\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VrApi\" " "or \"OpenXR\"." msgstr "" -"\"Hand Tracking\" sólo es válido cuando \"Xr Mode\" es \"Oculus Mobile VrApi" -"\" o \"OpenXR\"." +"\"Hand Tracking\" sólo es válido cuando \"Xr Mode\" es \"Oculus Mobile " +"VrApi\" o \"OpenXR\"." #: platform/android/export/export_plugin.cpp msgid "\"Passthrough\" is only valid when \"Xr Mode\" is \"OpenXR\"." @@ -14074,8 +14098,8 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "\"Target Sdk\" version must be greater or equal to \"Min Sdk\" version." msgstr "" -"La versión de \"Target Sdk\" debe ser mayor o igual a la versión de \"Min Sdk" -"\"." +"La versión de \"Target Sdk\" debe ser mayor o igual a la versión de \"Min " +"Sdk\"." #: platform/android/export/export_plugin.cpp msgid "" @@ -14258,10 +14282,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Identificador inválido:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "El icono requerido no esta especificado en el preset." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Detener Servidor HTTP" @@ -14302,16 +14322,202 @@ msgstr "No se pudo crear el directorio del servidor HTTP:" msgid "Error starting HTTP server:" msgstr "Error al iniciar el servidor HTTP:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nombre de proyecto Inválido." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Geometría inválida, no es posible crear un polígono." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "No se pudo crear la carpeta." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Ruta base inválida." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Fallo al cargar recurso." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Fallo al cargar recurso." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Extensión inválida." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Extensión inválida." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "No se encontraron íconos." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Creando Miniatura" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"No se pudo encontrar la plantilla APK para exportar:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Identificador de paquete no válido:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Notarización: se requiere firma de código." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Notarización: se requiere hardened runtime." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Notarización: se requiere hardened runtime." #: platform/osx/export/export.cpp @@ -14322,6 +14528,69 @@ msgstr "Notarización: nombre de ID de Apple no especificado." msgid "Notarization: Apple ID password not specified." msgstr "Notarización: contraseña de ID de Apple no especificada." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nombre corto de paquete inválido." @@ -14385,13 +14654,34 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Dimensiones de la imagen del splash inválidas (debería ser 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Ruta inválida." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Extensión inválida." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "GUID de producto inválido." + #: 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 "" -"Se debe crear o establecer un recurso SpriteFrames en la propiedad \"Frames" -"\" para que AnimatedSprite pueda mostrar frames." +"Se debe crear o establecer un recurso SpriteFrames en la propiedad " +"\"Frames\" para que AnimatedSprite pueda mostrar frames." #: scene/2d/canvas_modulate.cpp msgid "" @@ -14825,8 +15115,8 @@ msgstr "Sólo se admiten escalas uniformes." #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "Las partículas basadas en la GPU no son compatibles con el controlador de " "vídeo GLES2.\n" @@ -15031,8 +15321,8 @@ msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"Se debe crear o establecer un recurso SpriteFrames en la propiedad \"Frames" -"\" para que AnimatedSprite3D pueda mostrar frames." +"Se debe crear o establecer un recurso SpriteFrames en la propiedad " +"\"Frames\" para que AnimatedSprite3D pueda mostrar frames." #: scene/3d/vehicle_body.cpp msgid "" @@ -15113,9 +15403,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Este nodo ha sido deprecado. Usá AnimationTree." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Color: #%s\n" diff --git a/editor/translations/et.po b/editor/translations/et.po index db162ecca8..9b70c32d20 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -505,8 +505,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1350,7 +1350,7 @@ msgid "Bus Options" msgstr "Klassi valikud" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplikeeri" @@ -2158,8 +2158,8 @@ msgstr "Meetodi kirjeldused" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3208,8 +3208,14 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" -msgstr "" +#, fuzzy +msgid "Update All Changes" +msgstr "Materjali muutused" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Materjali muutused" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -3944,6 +3950,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4057,7 +4071,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplikeeri..." @@ -4853,19 +4867,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -10938,8 +10952,8 @@ msgid "" "the \"Application\" category." msgstr "" "Projekti ei saa käivitada: peastseeni ei ole määratud.\n" -"Redigeerige project.godot faili ja määrake projekti peastseen \"application" -"\" alajaotuses." +"Redigeerige project.godot faili ja määrake projekti peastseen " +"\"application\" alajaotuses." #: editor/project_manager.cpp msgid "" @@ -12404,6 +12418,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13727,10 +13749,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13775,16 +13793,194 @@ msgstr "Ei saanud luua kausta." msgid "Error starting HTTP server:" msgstr "Viga TileSeti salvestamisel!" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Vigane nimi." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Ei saanud luua kausta." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Vigane nimi." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Salvesta käesolevalt muudetud ressurss." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Vigane nimi." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Vigane nimi." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Ainult konstandid" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Loon pisipilti" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13795,6 +13991,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13847,6 +14106,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Kehtetu tee." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Paigaldatud pistikprogrammid:" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Vigane nimi." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14198,8 +14478,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14439,7 +14719,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index 448788dc2e..2918926ac7 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -507,8 +507,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1358,7 +1358,7 @@ msgid "Bus Options" msgstr "Klaseko aukerak" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Bikoiztu" @@ -2139,8 +2139,8 @@ msgstr "Metodo-deskripzioak" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3176,7 +3176,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3920,6 +3924,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4033,7 +4045,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4829,6 +4841,10 @@ msgid "Rename Animation" msgstr "Aldatu izena animazioari" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Bikoiztu animazioa" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "" @@ -4841,10 +4857,6 @@ msgid "Load Animation" msgstr "Kargatu animazioa" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Bikoiztu animazioa" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Ez dago animaziorik kopiatzeko!" @@ -12350,6 +12362,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13666,10 +13686,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13711,16 +13727,189 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Animazio izen baliogabea!" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Animazio izen baliogabea!" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Konstanteak bakarrik" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13731,6 +13920,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13783,6 +14035,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Animazio izen baliogabea!" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Instalatutako bertsioak:" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Animazio izen baliogabea!" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14133,8 +14406,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14374,7 +14647,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index dee445a3d1..e75b0277a6 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -523,8 +523,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1386,7 +1386,7 @@ msgid "Bus Options" msgstr "گزینه های اتوبوس" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "تکثیر کردن" @@ -2181,8 +2181,8 @@ msgstr "توضیحات تابع" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3229,7 +3229,12 @@ msgstr "مستمر" #: editor/editor_node.cpp #, fuzzy -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "تغییر بده" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" msgstr "تغییر بده" #: editor/editor_node.cpp @@ -4006,6 +4011,14 @@ msgstr "کاراکترهای معتبر:" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4130,7 +4143,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Duplicate..." msgstr "انتخاب شده را به دو تا تکثیر کن" @@ -4987,19 +5000,19 @@ msgid "Rename Animation" msgstr "تغییر نام انیمیشن" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12972,6 +12985,16 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "برداشتن موج" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "برداشتن موج" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "برداشتن موج" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14382,10 +14405,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "نام یک شناسهی معتبر نیست:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14433,17 +14452,195 @@ msgstr "ناتوان در ساختن پوشه." msgid "Error starting HTTP server:" msgstr "خطا در بارگذاری:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "نام پروژه:" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "ناتوان در ساختن پوشه." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "مسیر نامعتبر." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "اتصال قطع شده" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "باید از یک پسوند معتبر استفاده شود." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "باید از یک پسوند معتبر استفاده شود." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "چیزی یافت نشد!" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "نمیتواند یک پوشه ایجاد شود." + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "نام یک شناسهی معتبر نیست:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14454,6 +14651,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14512,6 +14772,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "مسیر نامعتبر." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "باید از یک پسوند معتبر استفاده شود." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "اندازهی قلم نامعتبر." + #: scene/2d/animated_sprite.cpp #, fuzzy msgid "" @@ -14909,8 +15190,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -15165,7 +15446,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index ab1acf1db8..bd2dd36308 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -17,7 +17,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" +"PO-Revision-Date: 2022-02-04 13:45+0000\n" "Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -26,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -510,8 +510,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1374,7 +1374,7 @@ msgid "Bus Options" msgstr "Väylän asetukset" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Monista" @@ -2088,7 +2088,7 @@ msgstr "Tuodaan (uudelleen) assetteja" #: editor/editor_help.cpp msgid "Top" -msgstr "Yläpuoli" +msgstr "Alku" #: editor/editor_help.cpp msgid "Class:" @@ -2168,8 +2168,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Tälle ominaisuudelle ei vielä löydy kuvausta. Voit auttaa meitä [color=" -"$color][url=$url]kirjoittamalla sellaisen[/url][/color]!" +"Tälle ominaisuudelle ei vielä löydy kuvausta. Voit auttaa meitä " +"[color=$color][url=$url]kirjoittamalla sellaisen[/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2177,8 +2177,8 @@ msgstr "Metodien kuvaukset" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Tälle metodille ei vielä löydy kuvausta. Voit auttaa meitä [color=$color]" "[url=$url]kirjoittamalla sellaisen[/url][/color]!" @@ -3023,9 +3023,8 @@ msgid "Install Android Build Template..." msgstr "Asenna Androidin käännösmalli..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Avaa editorin datakansio" +msgstr "Avaa käyttäjän datakansio" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3294,10 +3293,16 @@ msgid "Update Continuously" msgstr "Päivitä jatkuvasti" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Päivitä kun muuttuu" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Materiaalimuutokset:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Piilota päivitysanimaatio" @@ -3742,9 +3747,8 @@ msgstr "Tuo solmusta:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Virhe" +msgstr "%s virhe" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4066,6 +4070,14 @@ msgstr "Nimi sisältää virheellisiä kirjainmerkkejä." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4184,7 +4196,7 @@ msgstr "Lajittele viimeksi muokatun mukaan" msgid "Sort by First Modified" msgstr "Lajittele ensiksi muokatun mukaan" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Kahdenna..." @@ -4999,6 +5011,10 @@ msgid "Rename Animation" msgstr "Nimeä animaatio uudelleen" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Monista animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Sulauta seuraavaan vaihdettu" @@ -5011,10 +5027,6 @@ msgid "Load Animation" msgstr "Lataa animaatio" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Monista animaatio" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Ei kopioitavaa animaatiota!" @@ -6882,7 +6894,7 @@ msgstr "Luo navigointipolygoni" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" -msgstr "Muunna CPUPartikkeleiksi" +msgstr "Muunna CPUParticles solmuksi" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generating Visibility Rect" @@ -9705,7 +9717,6 @@ msgid "TileSet" msgstr "Laattavalikoima" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." msgstr "VCS-lisäosia ei ole saatavilla." @@ -9717,53 +9728,48 @@ msgstr "Virhe" msgid "" "Remote settings are empty. VCS features that use the network may not work." msgstr "" +"Etäasetukset ovat tyhjät. VCS-ominaisuudet, jotka käyttävät verkkoa eivät " +"välttämättä toimi." #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "Nimeä ei annettu." +msgstr "Muutoksen vahvistuksen viestiä ei annettu." #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "Vahvista muutos" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Sävytinmuutokset:" +msgstr "Valmistellut muutokset" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Sävytinmuutokset:" +msgstr "Valmistelemattomat muutokset" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "Vahvista muutos" +msgstr "Vahvistettu muutos:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "Päivämäärä:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "Alipuu" +msgstr "Alaotsikko:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "Haluatko poistaa haaran %s?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "Haluatko varmasti luoda tyhjän tyypin?" +msgstr "Haluatko poistaa etäsäilön %s?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "Tee palautus" +msgstr "Käytä" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9774,148 +9780,132 @@ msgid "Initialize" msgstr "Alusta" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "Poista piste" +msgstr "Etäkirjautuminen" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "Nimeä uudelleen" +msgstr "Käyttäjänimi" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "Salasana" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "Julkisen SSH-avaimen polku" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "Valitse julkisen SSH-avaimen polku" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "Yksityisen SSH-avaimen polku" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "Valitse yksityisen SSH-avaimen polku" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "SSH tunnuslause" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "Havaitse uudet muutokset" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "Sulje ja tallenna muutokset?" +msgstr "Hylkää kaikki muutokset" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "Varastoidaan paikalliset muutokset..." +msgstr "Valmistele kaikki muutokset" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "Materiaalimuutokset:" +msgstr "Poista kaikkien muutosten valmistelu" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "Vahvista muutokset" +msgstr "Muutosten vahvistusviesti" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "Vahvista muutokset" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "Vahvista muutos" +msgstr "Vahvistettujen muutosten lista" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "Vahvistuslistan koko" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Osumat:" +msgstr "Haarat" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "Luo uusi projekti" +msgstr "Luo uusi haara" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "Poista animaatioraita" +msgstr "Poista haara" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "Haaran nimi" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" -msgstr "Etäinen" +msgstr "Etäsäilöt" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "Luo uusi projekti" +msgstr "Luo uusi etäsäilö" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "Poista" +msgstr "Poista etäsäilö" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Etäinen " +msgstr "Etäsäilön nimi" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "Etäinen " +msgstr "Etäsäilön URL" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "Nouda" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "Vedä" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "Työnnä" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "Lähde Mesh:" +msgstr "Työnnä väkisin" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -9935,22 +9925,19 @@ msgstr "Tyyppimuunnos" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "Yhdistämätön" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "Näytä" +msgstr "Näkymä:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "Puolita polku" +msgstr "Osita" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "Muutettu" +msgstr "Yhdistetty" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -12784,6 +12771,16 @@ msgstr "Aseta peittopallon säde" msgid "Set Occluder Sphere Position" msgstr "Aseta peittopallon sijainti" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Aseta portaalin pisteen sijainti" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Aseta käyräpisteen sijainti" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Muuta sylinterin sädettä" @@ -13499,38 +13496,36 @@ msgid "Edit Member" msgstr "Muokkaa jäsentä" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "Aseta lauseke" +msgstr "Lauseke" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "Palauta" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "animaatio" +msgstr "Ehto" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "" +msgstr "jos (ehto) on:" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "Kun" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "kun (ehto):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "Iteraattori" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "kullekin (elementille) (syötteessä):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -13546,79 +13541,71 @@ msgstr "Iteraattori muuttui epäkelvoksi: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "Sarja" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "Nimetään kansio uudelleen:" +msgstr "järjestyksessä:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "Nyökkäyskulma:" +msgstr "Valitsin" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" -msgstr "" +msgstr "'syöte' on:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "Tyypit:" +msgstr "Tyyppimuunnos" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "On %s?" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "Kullekin %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "On Self" -msgstr "Itse" +msgstr "Itselle" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "Merkissä %s" +msgstr "Vähennä %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "Monista %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "Jaa %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "Lisää %s" +msgstr "Jakojäännös %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "ShiftLeft %s" -msgstr "Aseta %s" +msgstr "Siirrä vasemmalle %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "Siirrä oikealle %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "Kiinnitetty %s" +msgstr "Binääri JA %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" -msgstr "" +msgstr "Binääri TAI %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitXor %s" -msgstr "" +msgstr "Binääri XOR %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -13643,19 +13630,16 @@ msgid "Invalid index property name '%s' in node %s." msgstr "Virheellinen osoitinominaisuuden nimi '%s' solmussa %s." #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Emit %s" -msgstr "Aseta %s" +msgstr "Lähetä %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Funktiot" +msgstr "Funktio" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Compose Array" -msgstr "Muuta taulukon kokoa" +msgstr "Laadi taulukko" #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -13667,7 +13651,7 @@ msgstr ": Virheelliset argumentit: " #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" -msgstr "" +msgstr "a jos ehto, muutoin b" #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " @@ -13678,64 +13662,52 @@ msgid "VariableSet not found in script: " msgstr "VariableSet ei löytynyt skriptistä: " #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "Lataa uudelleen" +msgstr "Esilataa" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Z-indeksi" +msgstr "Hae indeksi" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Z-indeksi" +msgstr "Aseta indeksi" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "Vakio" +msgstr "Globaali vakio" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "Vakio" +msgstr "Luokkavakio" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "Vakio" +msgstr "Perusvakio" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "Vakio" +msgstr "Matemaattinen vakio" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Engine Singleton" -msgstr "GDNative singleton on otettu käyttöön" +msgstr "Hae pelimoottorin singleton" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "Ajanhakusolmu" +msgstr "Hae skenen solmu" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "Skenepuun muokkaus" +msgstr "Hae skenepuu" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Self" -msgstr "Itse" +msgstr "Hae itse" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "Leikkaa solmut" +msgstr "Mukautettu solmu" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -13751,33 +13723,28 @@ msgstr "" "tai merkkijono (virhe)." #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "SubCall" -msgstr "Kutsuja" +msgstr "Alikutsu" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Vakiot" +msgstr "Muodosta %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "Käytä paikallisavaruutta" +msgstr "Hae paikallinen muuttuja" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "Käytä paikallisavaruutta" +msgstr "Aseta paikallinen muuttuja" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "Toiminto" +msgstr "Toiminto %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "Pura %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -13785,40 +13752,35 @@ msgstr "Hae VisualScriptistä" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Väistä" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Odota" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "Siirrä ruutua" +msgstr "Seuraava ruutu" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Physics Frame" -msgstr "Fysiikkaruutujen %" +msgstr "Seuraava fysiikkaruutu" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s sekuntia" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitSignal" -msgstr "Signaali" +msgstr "Odota signaalia" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitNodeSignal" -msgstr "Signaali" +msgstr "Odota solmun signaalia" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitInstanceSignal" -msgstr "Luo ilmentymä" +msgstr "Odota ilmentymän signaalia" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -14002,8 +13964,8 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "\"Target Sdk\" version must be greater or equal to \"Min Sdk\" version." msgstr "" -"\"Target Sdk\" versionumeron on oltava suurempi tai yhtä suuri kuin \"Min Sdk" -"\" versionumeron." +"\"Target Sdk\" versionumeron on oltava suurempi tai yhtä suuri kuin \"Min " +"Sdk\" versionumeron." #: platform/android/export/export_plugin.cpp msgid "" @@ -14183,10 +14145,6 @@ msgstr "App Store Team ID ei ole määritetty - ei voida konfiguroida projektia. msgid "Invalid Identifier:" msgstr "Virheellinen Identifier osio:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "Vaadittavaa ikonia ei ole määritetty esiasetuksissa." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Pysäytä HTTP-palvelin" @@ -14227,16 +14185,202 @@ msgstr "Ei voitu luoda HTTP-palvelimen hakemistoa:" msgid "Error starting HTTP server:" msgstr "Virhe käynnistettäessä HTTP-palvelinta:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Virheellinen projektin nimi." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Virheellinen geometria, ei voida luoda polygonia." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Kansiota ei voitu luoda." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Virheellinen kantapolku." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Resurssin lataaminen epäonnistui." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Resurssin lataaminen epäonnistui." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Virheellinen tiedostopääte." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Virheellinen tiedostopääte." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Kuvakkeita ei löytynyt." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Luodaan pienoiskuvaa" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Ei löydetty APK-vientimallia vientiä varten:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Virheellinen bundle-tunniste:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Notarisointi: koodin allekirjoitus tarvitaan." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Notarisointi: hardened runtime tarvitaan." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Notarisointi: hardened runtime tarvitaan." #: platform/osx/export/export.cpp @@ -14247,6 +14391,69 @@ msgstr "Notarointi: Apple ID nimeä ei ole määritetty." msgid "Notarization: Apple ID password not specified." msgstr "Notarointi: Apple ID salasanaa ei ole määritetty." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Paketin lyhyt nimi on virheellinen." @@ -14301,6 +14508,27 @@ msgstr "Virheellinen leveän 310x150 logon kuvakoko (pitäisi olla 310x150)." msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Virheellinen käynnistyskuvan kuvakoko (pitäisi olla 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Virheellinen polku." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Virheellinen tiedostopääte." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Tuotteen GUID (yleisesti yksilöllinen tunniste) on virheellinen." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14464,15 +14692,14 @@ msgstr "" "alla." #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " "CPUParticles2D\" toolbar option for this purpose." msgstr "" "GPU-pohjaiset partikkelit eivät ole tuettuja GLES2 näyttöajurilla.\n" -"Käytä sen sijaan CPUParticles2D solmua. Voit käyttää \"Muunna " -"CPUPartikkeleiksi\" toimintoa tähän tarkoitukseen." +"Käytä sen sijaan CPUParticles2D solmua. Voit käyttää työkalupalkin toimintoa " +"\"Muunna CPUParticles2D solmuksi\" tähän tarkoitukseen." #: scene/2d/particles_2d.cpp msgid "" @@ -14482,6 +14709,11 @@ msgid "" "You can use the \"Convert to CPUParticles2D\" toolbar option for this " "purpose." msgstr "" +"MacOS:llä Particles2D:n renderöinti on paljon hitaampaa kuin CPUParticles2D:" +"n, koska muunnoksen palautus on toteutettu CPU:lla GPU:n sijaan.\n" +"Harkitse CPUParticles2D solmun käyttöä silloin kun kohdealustana on macOS.\n" +"Voit käyttää työkalupalkin toimintoa \"Muunna CPUParticles2D solmuksi\" " +"tähän tarkoitukseen." #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" @@ -14739,15 +14971,14 @@ msgid "Only uniform scales are supported." msgstr "Vain uniform-skaalat ovat tuettuja." #: scene/3d/particles.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "GPU-pohjaiset partikkelit eivät ole tuettuja GLES2 näyttöajurilla.\n" -"Käytä sen sijaan CPUParticles solmua. Voit käyttää \"Muunna CPUPartikkeleiksi" -"\" toimintoa tähän tarkoitukseen." +"Käytä sen sijaan CPUParticles solmua. Voit käyttää työkalupalkin toimintoa " +"\"Muunna CPUParticles solmuksi\" tähän tarkoitukseen." #: scene/3d/particles.cpp msgid "" @@ -14756,6 +14987,11 @@ msgid "" "Consider using CPUParticles instead when targeting macOS.\n" "You can use the \"Convert to CPUParticles\" toolbar option for this purpose." msgstr "" +"MacOS:llä Particles:n renderöinti on paljon hitaampaa kuin CPUParticles:n, " +"koska muunnoksen palautus on toteutettu CPU:lla GPU:n sijaan.\n" +"Harkitse CPUParticles solmun käyttöä silloin kun kohdealustana on macOS.\n" +"Voit käyttää työkalupalkin toimintoa \"Muunna CPUParticles solmuksi\" tähän " +"tarkoitukseen." #: scene/3d/particles.cpp msgid "" @@ -15026,9 +15262,10 @@ msgstr "" "Tämä solmu on poistettu käytöstä. Käytä sen sijaan AnimationTree solmua." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Väri: #%s\n" @@ -15071,9 +15308,9 @@ msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" -"Työkaluvihjettä ei näytettä, sillä ohjaimen Mouse Filter asetus on \"Ignore" -"\". Ratkaistaksesi tämän, laita Mouse Filter asetukseksi \"Stop\" tai \"Pass" -"\"." +"Työkaluvihjettä ei näytettä, sillä ohjaimen Mouse Filter asetus on " +"\"Ignore\". Ratkaistaksesi tämän, laita Mouse Filter asetukseksi \"Stop\" " +"tai \"Pass\"." #: scene/gui/dialogs.cpp msgid "Alert!" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 200793ff14..1cab78fd72 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -506,8 +506,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1342,7 +1342,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2118,8 +2118,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3149,7 +3149,12 @@ msgid "Update Continuously" msgstr "Tuloy-tuloy" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" +msgstr "Baguhin" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3879,6 +3884,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3991,7 +4004,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4781,19 +4794,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12257,6 +12270,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13560,10 +13581,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13604,16 +13621,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13624,6 +13811,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13676,6 +13926,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14026,8 +14294,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14267,7 +14535,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 722d9bdbf8..03dff89a24 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -85,13 +85,16 @@ # Blackiris <divjvc@free.fr>, 2021. # Olivier Monnom <olivier.monnom@gmail.com>, 2021. # Timothée MB <timothee.me@gmail.com>, 2021. +# Maxime Leroy <lisacintosh@gmail.com>, 2022. +# Adi-df <adidf-web@laposte.net>, 2022. +# MinusKube <minuskube@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" -"Last-Translator: Nathan <bonnemainsnathan@gmail.com>\n" +"PO-Revision-Date: 2022-02-10 07:50+0000\n" +"Last-Translator: Maxime Leroy <lisacintosh@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -99,7 +102,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.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -109,7 +112,7 @@ msgstr "" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "Une chaîne de caractères de longueur 1 est attendue (un caractère)." +msgstr "Une chaîne de caractères de longueur 1 était attendue (un caractère)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -402,9 +405,8 @@ msgid "Duplicate Key(s)" msgstr "Dupliquer clé(s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add RESET Value(s)" -msgstr "Ajouter %d Trame(s)" +msgstr "Ajouter la valeur(s) RESET" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" @@ -581,9 +583,8 @@ msgstr "" "s’agit que d’une seule piste." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Add RESET Keys" -msgstr "Mettre à l’échelle les clés d’animation" +msgstr "Ajouter les clés RESET à l'animation" #: editor/animation_track_editor.cpp msgid "" @@ -592,8 +593,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1464,7 +1465,7 @@ msgid "Bus Options" msgstr "Options de bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Dupliquer" @@ -1622,7 +1623,7 @@ msgstr "Supprimer l'AutoLoad" #: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" -msgstr "Enable" +msgstr "Activer" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" @@ -2274,8 +2275,8 @@ msgstr "Descriptions des méthodes" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Il n'y a pas de description disponible pour cette méthode. Aidez-nous en " "[color=$color][url=$url]en créant[/url][/color] une !" @@ -2354,18 +2355,19 @@ msgid "Property:" msgstr "Propriété :" #: editor/editor_inspector.cpp -#, fuzzy msgid "Pin value" -msgstr "(valeur)" +msgstr "Épingler la valeur" #: editor/editor_inspector.cpp msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "" +"Épingler une valeur pour forcer son enregistrement même si elle est égale à " +"sa valeur par défaut." #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" -msgstr "" +msgstr "Épingler la valeur [Désativé par '%s' n'est que dans l'éditeur]" #: editor/editor_inspector.cpp editor/scene_tree_dock.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -2444,7 +2446,7 @@ msgstr "Monter" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" -msgstr "Node" +msgstr "Nœud" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" @@ -2770,7 +2772,7 @@ msgstr "La scène actuelle n'est pas enregistrée. Ouvrir quand même ?" #: editor/editor_node.cpp msgid "Can't undo while mouse buttons are pressed." -msgstr "Impossible d'annuler quand les boutons de la souris sont activés." +msgstr "Impossible d'annuler quand les boutons de la souris sont pressés." #: editor/editor_node.cpp msgid "Nothing to undo." @@ -2778,11 +2780,11 @@ msgstr "Rien à annuler." #: editor/editor_node.cpp msgid "Undo: %s" -msgstr "Annuler %s" +msgstr "Annuler : %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "Impossible de rétablir quand les boutons de la souris sont activés." +msgstr "Impossible de rétablir quand les boutons de la souris sont pressés." #: editor/editor_node.cpp msgid "Nothing to redo." @@ -2971,7 +2973,7 @@ msgstr "Supprimer la disposition" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "Par défaut" +msgstr "Défaut" #: editor/editor_node.cpp editor/editor_resource_picker.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp @@ -3138,9 +3140,8 @@ msgid "Install Android Build Template..." msgstr "Installer un modèle de compilation Android..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Ouvrir le dossier de données de l'éditeur" +msgstr "Ouvrir le dossier de données utilisateur" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3231,7 +3232,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Force Shader Fallbacks" -msgstr "" +msgstr "Forcer les replis du shader" #: editor/editor_node.cpp msgid "" @@ -3242,6 +3243,13 @@ msgid "" "Asynchronous shader compilation must be enabled in the project settings for " "this option to make a difference." msgstr "" +"Lorsque cette option est activée, les shaders seront utilisés sous leur " +"forme de fallback (soit visibles via un ubershader, soit cachés) pendant " +"toute la durée de l'exécution.\n" +"Ceci est utile pour vérifier l'aspect et les performances des fallbacks, qui " +"sont normalement affichés brièvement.\n" +"La compilation asynchrone des shaders doit être activée dans les paramètres " +"du projet pour que cette option fasse une différence." #: editor/editor_node.cpp msgid "Synchronize Scene Changes" @@ -3406,10 +3414,16 @@ msgid "Update Continuously" msgstr "Mettre à jour en continu" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Mettre à jour quand modifié" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Changements de matériau :" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Cacher l'indicateur d'activité" @@ -3762,7 +3776,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "Chargement rapide" +msgstr "Chargement Rapide" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -3855,9 +3869,8 @@ msgstr "Importer à partir d'un nœud :" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Erreur" +msgstr "Erreur %s" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4188,6 +4201,14 @@ msgstr "Le nom contient des caractères invalides." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4306,7 +4327,7 @@ msgstr "Trier par date de modification (plus récent au moins récent)" msgid "Sort by First Modified" msgstr "Trier par date de modification (moins récent au plus récent)" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Dupliquer…" @@ -4648,6 +4669,8 @@ msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." msgstr "" +"Sélectionnez un fichier de ressource dans le système de fichier ou depuis " +"l'inspecteur pour ajuster les préférences d'importation." #: editor/inspector_dock.cpp msgid "Failed to load resource." @@ -5124,6 +5147,10 @@ msgid "Rename Animation" msgstr "Renommer l'animation" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Dupliquer l'animation" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Mélange suivant modifié" @@ -5136,10 +5163,6 @@ msgid "Load Animation" msgstr "Charger l'animation" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Dupliquer l'animation" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Aucune animation à copier !" @@ -8479,16 +8502,15 @@ msgstr "Basculer en vue libre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Decrease Field of View" -msgstr "" +msgstr "Réduire le champ de vision" #: editor/plugins/spatial_editor_plugin.cpp msgid "Increase Field of View" -msgstr "" +msgstr "Augmenter le champ de vision" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Reset Field of View to Default" -msgstr "Réinitialiser aux valeurs par défaut" +msgstr "Rétablir le champ de vision par défaut" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9226,12 +9248,11 @@ msgstr "Ajouter un type" #: editor/plugins/theme_editor_plugin.cpp msgid "Filter the list of types or create a new custom type:" -msgstr "" +msgstr "Filtrer la liste des types ou créer un nouveau type personnalisé :" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Available Node-based types:" -msgstr "Profils disponibles :" +msgstr "Types disponibles basés sur des nœuds :" #: editor/plugins/theme_editor_plugin.cpp msgid "Type name is empty!" @@ -9865,9 +9886,8 @@ msgid "TileSet" msgstr "TileSet" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." -msgstr "Aucun addon VCS n'est disponible." +msgstr "Aucun greffon VCS n'est disponible." #: editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -9877,53 +9897,48 @@ msgstr "Erreur" msgid "" "Remote settings are empty. VCS features that use the network may not work." msgstr "" +"Les préférences pour les dépôts distants sont vides. Des problèmes peuvent " +"subvenir pour les fonctionnalités utilisant le réseau." #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "Aucun nom renseigné." +msgstr "Aucun message de commit spécifié." #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "Enregistrer" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Changements de shader :" +msgstr "Modifications pré-commitées" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Changements de shader :" +msgstr "Modifications non pré-commitées" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "Enregistrer" +msgstr "Commit :" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "Date :" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "Sous-arbre" +msgstr "Sous-titre :" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "Voulez-vous retirer la branche %s ?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "Voulez-vous vraiment créer plus un type vide ?" +msgstr "Voulez-vous vraiment retirer le dépôt distant %s ?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "Appliquer la réinitialisation" +msgstr "Appliquer" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9934,148 +9949,132 @@ msgid "Initialize" msgstr "Initialiser" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "Supprimer un point" +msgstr "Identification distante" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "Renommer" +msgstr "Nom d'utilisateur" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "Mot de passe" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "Chemin de la clé publique SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "Sélectionner le chemin de la clé publique SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "Chemin de la clé privée SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "Sélectionner le chemin de la clé privée SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "Phrase d'authentification SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "Détecter de nouveaux changements" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "Quitter et sauvegarder les modifications ?" +msgstr "Annuler toutes les modifications" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "Stockage des modifications locales…" +msgstr "Pré-commiter tous les modifications" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "Changements de matériau :" +msgstr "Retirer les modifications pré-commitées" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "Commiter les changements" +msgstr "Message du commit" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "Commiter les changements" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "Enregistrer" +msgstr "Liste des commits" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "Valider la taille des listes" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Correspondances :" +msgstr "Branches" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "Créer un nouveau projet" +msgstr "Créer une nouvelle branche" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "Supprimer la piste d’animation" +msgstr "Supprimer la branche" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "Nom de la branche" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" -msgstr "Distant" +msgstr "Dépôts distants" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "Créer un nouveau projet" +msgstr "Créer une nouvelle branche" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "Supprimer l'item" +msgstr "Retirer le dépôt distant" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Distant " +msgstr "Nom du dépôt distant" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "Distant " +msgstr "URL du dépôt distant" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "Actualiser" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "Récupérer" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "Pousser" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "Maillage source :" +msgstr "Force-pousser" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -10095,22 +10094,19 @@ msgstr "Changement de type" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "Non-fusionné" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "Affichage" +msgstr "Affichage :" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "Diviser le chemin" +msgstr "Divisé" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "Modifié" +msgstr "Unifié" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -12276,6 +12272,11 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"Vous ne pouvez pas enregistrer cette branche où l'enfant est déjà dans une " +"scène instanciée.\n" +"Pour sauvegarder cette branche dans sa propre scène, ouvrez la scène " +"originale, cliquez-droit sur cette branche, puis sélectionnez \"Sauvegarder " +"la branche comme scène\"." #: editor/scene_tree_dock.cpp msgid "" @@ -12283,6 +12284,11 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"Vous ne pouvez pas enregistrer cette branche qui fait partie d'une scène " +"héritée.\n" +"Pour sauvegarder cette branche dans sa propre scène, ouvrez la scène " +"originale, cliquez-droit sur cette branche, puis sélectionnez \"Sauvegarder " +"la branche comme scène\"." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -12960,6 +12966,16 @@ msgstr "Définir le rayon de la sphère de l'occulteur" msgid "Set Occluder Sphere Position" msgstr "Définir la position de la sphère de l'occulteur" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Définir la position du point du Portal" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Définir la position du point de la courbe" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Changer le rayon du cylindre" @@ -13678,38 +13694,36 @@ msgid "Edit Member" msgstr "Modifier le membre" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "Définir l'expression" +msgstr "Expression" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "Retour" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "animation" +msgstr "Condition" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "" +msgstr "if (cond) is :" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "While" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "while (cond) :" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "Itérateur" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "for (elem) in (input) :" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -13725,79 +13739,71 @@ msgstr "L'itérateur est devenu invalide : " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "Séquence" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "Renommer le dossier :" +msgstr "dans l'ordre :" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "Tangage :" +msgstr "Switch" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" -msgstr "" +msgstr "'input' est :" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "Types :" +msgstr "Changer le type" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "Est-ce %s ?" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "On %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "On Self" -msgstr "Self" +msgstr "On Self" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "Au caractère %s" +msgstr "Soustraire %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "Multiplier %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "Diviser %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "Ajouter %s" +msgstr "Module de %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "ShiftLeft %s" -msgstr "Définir %s" +msgstr "Décalage %s vers la gauche" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "Décaler %s vers la droite" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "Épinglé %s" +msgstr "Et par bit %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" -msgstr "" +msgstr "Ou par bit %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitXor %s" -msgstr "" +msgstr "Ou-exclusif par bit %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -13822,19 +13828,16 @@ msgid "Invalid index property name '%s' in node %s." msgstr "Nom de propriété invalide « %s » dans le nœud %s." #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Emit %s" -msgstr "Définir %s" +msgstr "Émettre %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Fonctions" +msgstr "Fonction" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Compose Array" -msgstr "Redimensionner le tableau" +msgstr "Composer le tableau" #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -13846,7 +13849,7 @@ msgstr ": Arguments invalides : " #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" -msgstr "" +msgstr "a if cond, else b" #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " @@ -13857,64 +13860,52 @@ msgid "VariableSet not found in script: " msgstr "VariableSet introuvable dans le script : " #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "Recharger" +msgstr "Précharger" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Z Index" +msgstr "Récupérer la position" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Z Index" +msgstr "Définir pour la position" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "Constante" +msgstr "Constante globale" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "Constante" +msgstr "Constante de classe" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "Constante" +msgstr "Constante Basique" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "Constante" +msgstr "Constante de Math" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Engine Singleton" -msgstr "Activé le Singleton GDNative" +msgstr "Singleton du moteur de jeu" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "Nœud TimeSeek" +msgstr "Le nœud de la scène" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "Édition de l'arbre de scène" +msgstr "L'arbre de la scène" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Self" -msgstr "Self" +msgstr "Récupérer Self" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "Couper les nœuds" +msgstr "Nœud Personnalisé" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -13931,33 +13922,28 @@ msgstr "" "out), ou une chaîne (erreur)." #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "SubCall" -msgstr "Appels" +msgstr "Sous-appel" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Constantes" +msgstr "Construire %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "Utiliser les coordonées locales" +msgstr "Obtenir Variable locale" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "Utiliser les coordonées locales" +msgstr "Définir variable locale" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "Action" +msgstr "L'action %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "Déconstruire %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -13965,40 +13951,35 @@ msgstr "Rechercher VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Yield" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Wait" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "Déplacer le cadre" +msgstr "Image suivante" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Physics Frame" -msgstr "Image physique %" +msgstr "Image physique suivante" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s seconde(s)" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitSignal" -msgstr "Signaux" +msgstr "WaitSignal" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitNodeSignal" -msgstr "Signaux" +msgstr "WaitNodeSignal" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitInstanceSignal" -msgstr "Instance" +msgstr "WaitInstanceSignal" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -14380,10 +14361,6 @@ msgstr "App Store Team ID non spécifié - ne peut pas configurer le projet." msgid "Invalid Identifier:" msgstr "Identifiant invalide :" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "L'icône requise n'est pas spécifiée dans le préréglage." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Arrêter le serveur HTTP" @@ -14424,16 +14401,202 @@ msgstr "Impossible de créer le répertoire du serveur HTTP :" msgid "Error starting HTTP server:" msgstr "Erreur de démarrage du serveur HTTP :" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nom du projet invalide." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Géométrie invalide, impossible de créer le polygone." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Impossible de créer le dossier." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Chemin de base invalide." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Impossible de charger la ressource." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Impossible de charger la ressource." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Extension invalide." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Extension invalide." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Pas d'icônes trouvées." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Création de l'aperçu" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Impossible de trouver le modèle de l'APK à exporter :\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Identificateur de bundle non valide :" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Certification : signature du code requise." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Certification : exécution renforcée requise." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Certification : exécution renforcée requise." #: platform/osx/export/export.cpp @@ -14444,6 +14607,69 @@ msgstr "Certification : Identifiant Apple ID non spécifié." msgid "Notarization: Apple ID password not specified." msgstr "Certification : Mot de passe Apple ID non spécifié." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nom abrégé du paquet invalide." @@ -14509,6 +14735,27 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" "Les dimensions du splash screen sont invalides (doivent être de 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Chemin invalide." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Extension invalide." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "GUID produit invalide." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14640,13 +14887,15 @@ msgstr "" #: scene/2d/navigation_agent_2d.cpp msgid "The NavigationAgent2D can be used only under a Node2D node." -msgstr "" +msgstr "Le NavigationAgent2D ne peut être utilisé que sous un nœud Node2D." #: scene/2d/navigation_obstacle_2d.cpp msgid "" "The NavigationObstacle2D only serves to provide collision avoidance to a " "Node2D object." msgstr "" +"Un NavigationObstacle2D ne peut éviter les collisions qu'avec les nœuds " +"Node2D." #: scene/2d/navigation_polygon.cpp msgid "" @@ -14673,7 +14922,6 @@ msgstr "" "d'un nœud de type ParallaxBackground." #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " @@ -14682,7 +14930,7 @@ msgstr "" "Les particules de type GPU ne sont pas supportées par le pilote graphique " "GLES2.\n" "Utilisez le nœud CPUParticles2D à la place. Vous pouvez utiliser l'option « " -"Convertir en CPUParticles » pour ce faire." +"Convertir en CPUParticles2D » de la barre d'outils à cette fin." #: scene/2d/particles_2d.cpp msgid "" @@ -14692,6 +14940,11 @@ msgid "" "You can use the \"Convert to CPUParticles2D\" toolbar option for this " "purpose." msgstr "" +"Sur macOS, le rendu Particles2D est beaucoup plus lent que CPUParticles2D en " +"raison du retour de transformation implémenté sur le CPU au lieu du GPU.\n" +"Envisagez d'utiliser CPUParticles2D à la place lorsque vous ciblez macOS.\n" +"Vous pouvez utiliser l'option de barre d'outils \"Convertir en " +"CPUParticles2D\" à cette fin." #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" @@ -14925,7 +15178,7 @@ msgstr "" #: scene/3d/navigation_agent.cpp msgid "The NavigationAgent can be used only under a spatial node." -msgstr "" +msgstr "Le NavigationAgent ne peut être utilisé que sous un nœud spatial." #: scene/3d/navigation_mesh_instance.cpp msgid "" @@ -14940,6 +15193,8 @@ msgid "" "The NavigationObstacle only serves to provide collision avoidance to a " "spatial object." msgstr "" +"Un NavigationObstacle ne peut éviter les collisions qu'avec les nœuds " +"Spatial." #: scene/3d/occluder.cpp msgid "No shape is set." @@ -14947,19 +15202,18 @@ msgstr "Aucune forme n'est définie." #: scene/3d/occluder.cpp msgid "Only uniform scales are supported." -msgstr "Seules les échelles uniformes sont prises en charge." +msgstr "Seules les mises à l'échelle uniformes sont prises en charge." #: scene/3d/particles.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "Les particules de type GPU ne sont pas supportées par le pilote graphique " "GLES2.\n" "Utilisez le nœud CPUParticles à la place. Vous pouvez utiliser l'option « " -"Convertir en CPUParticles » pour ce faire." +"Convertir en CPUParticles » de la barre d'outils à cette fin." #: scene/3d/particles.cpp msgid "" @@ -14968,6 +15222,12 @@ msgid "" "Consider using CPUParticles instead when targeting macOS.\n" "You can use the \"Convert to CPUParticles\" toolbar option for this purpose." msgstr "" +"Sous macOS, le rendu de Particles est beaucoup plus lent que celui de " +"CPUParticles en raison de l'implémentation du retour de transformation sur " +"le CPU au lieu du GPU.\n" +"Pensez à utiliser CPUParticles à la place lorsque vous ciblez macOS.\n" +"Vous pouvez utiliser l'option \"Convertir en CPUParticles\" de la barre " +"d'outils à cette fin." #: scene/3d/particles.cpp msgid "" @@ -15066,7 +15326,7 @@ msgid "" "Room convex hull contains a large number of planes.\n" "Consider simplifying the room bound in order to increase performance." msgstr "" -"La coque convexe de la pièce contient un grand nombre de plans.\n" +"L'enveloppe convexe de la pièce contient un grand nombre de plans.\n" "Envisagez de simplifier la limite de la pièce afin d'augmenter les " "performances." @@ -15197,8 +15457,8 @@ msgid "" "this environment's Background Mode to Canvas (for 2D scenes)." msgstr "" "Ce WorldEnvironment est ignoré. Ajoutez une caméra (pour les scènes 3D) ou " -"définissez la propriété \"Background Mode\" de cet environnement sur \"Canvas" -"\" (pour les scènes 2D)." +"définissez la propriété \"Background Mode\" de cet environnement sur " +"\"Canvas\" (pour les scènes 2D)." #: scene/animation/animation_blend_tree.cpp msgid "On BlendTree node '%s', animation not found: '%s'" @@ -15248,9 +15508,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Ce nœud est désormais déprécié. Utilisez AnimationTree à la place." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Couleur : #%s\n" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 03611eed78..4db0862314 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -497,8 +497,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1334,7 +1334,7 @@ msgid "Bus Options" msgstr "Cruthaigh" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2109,8 +2109,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3136,7 +3136,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3860,6 +3864,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3972,7 +3984,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4762,19 +4774,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12221,6 +12233,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13523,10 +13543,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13567,16 +13583,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13587,6 +13773,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13639,6 +13888,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13989,8 +14256,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14230,7 +14497,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/gl.po b/editor/translations/gl.po index f98288945e..b88f8f0430 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -506,8 +506,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1382,7 +1382,7 @@ msgid "Bus Options" msgstr "Opcións de Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplicar" @@ -2183,8 +2183,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Actualmente non hai unha descripción desta propiedade. Axúdanos [color=" -"$color][url=$url]contribuíndo cunha descripción[/url][/color]!" +"Actualmente non hai unha descripción desta propiedade. Axúdanos " +"[color=$color][url=$url]contribuíndo cunha descripción[/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2192,8 +2192,8 @@ msgstr "Descrición de Métodos" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Actualmente non hai unha descripción deste método. Axúdanos [color=$color]" "[url=$url]contribuíndo cunha descripción[/url][/color]!" @@ -2830,8 +2830,9 @@ msgid "" "Error loading scene, it must be inside the project path. Use 'Import' to " "open the scene, then save it inside the project path." msgstr "" -"Erro cargando a escena: debe estar dentro da ruta do proxecto. Usa \"Importar" -"\" para abrir a escena, e despois gardala dentro da ruta do proxecto." +"Erro cargando a escena: debe estar dentro da ruta do proxecto. Usa " +"\"Importar\" para abrir a escena, e despois gardala dentro da ruta do " +"proxecto." #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" @@ -3317,10 +3318,16 @@ msgid "Update Continuously" msgstr "Actualizar de Maneira Continua" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Actualizar Cando Sexa Necesario" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Parámetro Cambiado" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "" @@ -4077,6 +4084,14 @@ msgstr "O nome contén caracteres inválidos." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4198,7 +4213,7 @@ msgstr "Derradeira Modificación" msgid "Sort by First Modified" msgstr "Derradeira Modificación" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplicar..." @@ -5003,6 +5018,10 @@ msgid "Rename Animation" msgstr "Renomear Animación" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplicar Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "" @@ -5015,10 +5034,6 @@ msgid "Load Animation" msgstr "Cargar Animación" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplicar Animación" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "" @@ -11259,8 +11274,8 @@ msgid "" "the \"Application\" category." msgstr "" "Non se pode executar o proxecto: non hai unha escena principal definida.\n" -"Por favor, selecciona unha escena principal en \"Configuración do Proxecto" -"\", na categoría \"Aplicación\"." +"Por favor, selecciona unha escena principal en \"Configuración do " +"Proxecto\", na categoría \"Aplicación\"." #: editor/project_manager.cpp msgid "" @@ -12741,6 +12756,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14094,11 +14117,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" -"As iconas requeridas non están especificadas nos axustes de exportación." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14143,16 +14161,195 @@ msgstr "Non se puido crear cartafol." msgid "Error starting HTTP server:" msgstr "Erro ao gardar TileSet!" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nome de Proxecto Inválido." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Non se puido crear cartafol." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Ruta base inválida." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Fallou a carga do Recurso." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Fallou a carga do Recurso." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Extensión inválida." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Extensión inválida." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Non se atopou ningún sub-recurso." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Creando Miniatura" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14163,6 +14360,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -14215,6 +14475,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Ruta inválida." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Extensión inválida." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Nome de Proxecto Inválido." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14604,8 +14885,8 @@ msgstr "" #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "As partículas baseadas na GPU non están soportas por o controlador de vídeo " "de GLES2.\n" @@ -14859,7 +15140,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/he.po b/editor/translations/he.po index 73da4945f9..c7966a9536 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -520,8 +520,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -529,8 +529,8 @@ msgstr "" "\n" "להפעלת האפשרות להוספת רצועות מותאמות-אישית, יש לקבוע בהגדרות ייבוא של הסצנה " "את\n" -"\"הנפשה > אחסון\" ל-\"קבצים\", להפעיל את \"הנפשה > השאר רצועות מותאמות-אישית" -"\", ולבסוף לייבא מחדש.\n" +"\"הנפשה > אחסון\" ל-\"קבצים\", להפעיל את \"הנפשה > השאר רצועות " +"מותאמות-אישית\", ולבסוף לייבא מחדש.\n" "דרך אחרת, להשתמש בהגדרות ייבוא אשר מייבאים הנפשות לקבצים נפרדים." #: editor/animation_track_editor.cpp @@ -1374,7 +1374,7 @@ msgid "Bus Options" msgstr "אפשרויות אפיק" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "שכפול" @@ -1773,8 +1773,8 @@ msgid "" "Allows to configure import settings for individual assets. Requires the " "FileSystem dock to function." msgstr "" -"מאפשר התאמת הגדרות ייבוא עבור משאבים בודדים. דורש את השימוש בחלון מערכת-" -"הקבצים." +"מאפשר התאמת הגדרות ייבוא עבור משאבים בודדים. דורש את השימוש בחלון " +"מערכת-הקבצים." #: editor/editor_feature_profile.cpp msgid "(current)" @@ -2157,8 +2157,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"כרגע אין תיאור למאפיין זה. בבקשה עזור לנו על-ידי [color=$color][url=" -"$url]כתיבת תיאור[/url][/color]!" +"כרגע אין תיאור למאפיין זה. בבקשה עזור לנו על-ידי [color=$color]" +"[url=$url]כתיבת תיאור[/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2166,11 +2166,11 @@ msgstr "תיאורי מתודות" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"כרגע אין תיאור למתודה זו. בבקשה עזור לנו על-ידי [color=$color][url=" -"$url]כתיבת תיאור [/url][/color]!" +"כרגע אין תיאור למתודה זו. בבקשה עזור לנו על-ידי [color=$color]" +"[url=$url]כתיבת תיאור [/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -3257,10 +3257,16 @@ msgid "Update Continuously" msgstr "עדכון רציף" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "עדכון בעת שינוי" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "שינויי חומרים" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "הסתרת מחוון העדכון" @@ -4032,6 +4038,14 @@ msgstr "השם מכיל תווים שגויים." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4154,7 +4168,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "שכפול…" @@ -5003,6 +5017,10 @@ msgid "Rename Animation" msgstr "שינוי שם הנפשה" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "שכפול הנפשה" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "המיזוג הבא השתנה" @@ -5015,10 +5033,6 @@ msgid "Load Animation" msgstr "טעינת הנפשה" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "שכפול הנפשה" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "אין הנפשה להעתקה!" @@ -12895,6 +12909,14 @@ msgstr "שינוי רדיוס לצורת גליל" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "שינוי רדיוס גליל" @@ -14064,8 +14086,8 @@ msgid "" "Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " "project setting (changed in Godot 3.2.2).\n" msgstr "" -"מודול \"GodotPaymentV3\" לא חוקי נמצא בהגדרת המיזם ב-\"אנדרואיד/מודולים" -"\" (שינוי בגודו 3.2.2).\n" +"מודול \"GodotPaymentV3\" לא חוקי נמצא בהגדרת המיזם " +"ב-\"אנדרואיד/מודולים\" (שינוי בגודו 3.2.2).\n" #: platform/android/export/export_plugin.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." @@ -14276,10 +14298,6 @@ msgstr "לא צוין App Store Team ID - לא ניתן להגדיר את המי msgid "Invalid Identifier:" msgstr "מזהה לא חוקי:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "סמליל נדרש אינו מוגדר בהגדרות יצוא." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "עצירת שרת HTTP" @@ -14324,17 +14342,197 @@ msgstr "לא ניתן ליצור תיקייה." msgid "Error starting HTTP server:" msgstr "שגיאה בשמירת הסצנה." +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "שם שגוי." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "לא ניתן ליצור תיקייה." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "נתיב בסיס לא חוקי." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "טעינת המשאב נכשלה." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "טעינת המשאב נכשלה." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "סיומת לא חוקית." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "סיומת לא חוקית." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "לא נמצא!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "יצירת תמונה ממוזערת" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "לא ניתן לפתוח תבנית לייצוא:" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "מזהה לא חוקי:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14345,6 +14543,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "שם קצר של חבילה לא חוקי." @@ -14399,6 +14660,27 @@ msgstr "מידות תמונת לוגו רחבה 310x150 לא חוקיות (צר msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "מידות תמונת פתיח לא חוקיות (צריכות להיות 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "נתיב לא חוקי." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "סיומת לא חוקית." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "GUID מוצר לא חוקי." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14431,8 +14713,8 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionPolygon2D משמש רק להספקת צורת התנגשות למפרק היורש מ-" -"CollisionObject2D. השימוש בו הוא רק כילד של Area2D, StaticBody2D, " +"CollisionPolygon2D משמש רק להספקת צורת התנגשות למפרק היורש " +"מ-CollisionObject2D. השימוש בו הוא רק כילד של Area2D, StaticBody2D, " "RigidBody2D, KinematicBody2D וכו'." #: scene/2d/collision_polygon_2d.cpp @@ -14453,8 +14735,8 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D משמש רק להספקת צורת התנגשות למפרק היורש מ-" -"CollisionObject2D. השימוש בו הוא רק כילד של Area2D, StaticBody2D, " +"CollisionShape2D משמש רק להספקת צורת התנגשות למפרק היורש " +"מ-CollisionObject2D. השימוש בו הוא רק כילד של Area2D, StaticBody2D, " "RigidBody2D, KinematicBody2D וכו'." #: scene/2d/collision_shape_2d.cpp @@ -14701,8 +14983,8 @@ msgid "" "CollisionObject derived node. Please only use it as a child of Area, " "StaticBody, RigidBody, KinematicBody, etc. to give them a shape." msgstr "" -"CollisionPolygon2D משמש רק להספקת צורת התנגשות למפרק היורש מ-" -"CollisionObject2D. השימוש בו הוא רק כצאצא של Area2D, StaticBody2D, " +"CollisionPolygon2D משמש רק להספקת צורת התנגשות למפרק היורש " +"מ-CollisionObject2D. השימוש בו הוא רק כצאצא של Area2D, StaticBody2D, " "RigidBody2D, KinematicBody2D וכו'." #: scene/3d/collision_polygon.cpp @@ -14805,8 +15087,8 @@ msgstr "" #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "חלקיקים מבוססי GPU אינם נתמכים על-ידי מנהל ווידאו GLES2.\n" "השתמש בצומת CPUParticles במקום. למטרה זו האפשרות \"המר לחלקיקים של CPU\" " @@ -14989,8 +15271,8 @@ msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"יש ליצור או להגדיר משאב SpriteFrames במאפיין \"Frames\" כדי ש-" -"AnimatedSprite3D יציג תמוניות." +"יש ליצור או להגדיר משאב SpriteFrames במאפיין \"Frames\" כדי " +"ש-AnimatedSprite3D יציג תמוניות." #: scene/3d/vehicle_body.cpp msgid "" @@ -15066,9 +15348,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "מפרק זה הוצא משימוש. יש להשתמש ב-AnimationTree במקום." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "צבע: #%s\n" diff --git a/editor/translations/hi.po b/editor/translations/hi.po index 65e129c224..eb5c524b8a 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -515,8 +515,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1384,7 +1384,7 @@ msgid "Bus Options" msgstr "बस विकल्प" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "प्रतिलिपि" @@ -2186,8 +2186,8 @@ msgstr "मेथड विवरण" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "वर्तमान में मेथड का विवरण नहीं. आप हमें [color=$color][url=$url]योगदान करके[/url][/" "color] मदत कर सकते है!" @@ -3284,7 +3284,13 @@ msgid "Update Continuously" msgstr "लगातार अपडेट करें" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" +msgstr "जब बदला अद्यतन" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" msgstr "जब बदला अद्यतन" #: editor/editor_node.cpp @@ -4063,6 +4069,14 @@ msgstr "नाम मे अमान्य अक्षर मौजूद." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4181,7 +4195,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "डुप्लिकेट..." @@ -4981,19 +4995,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12662,6 +12676,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14017,10 +14039,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "गलत फॉण्ट का आकार |" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14065,17 +14083,195 @@ msgstr "फ़ोल्डर नही बना सकते." msgid "Error starting HTTP server:" msgstr "त्रुटि बचत टाइलसेट!" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "गलत फॉण्ट का आकार |" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "फ़ोल्डर नही बना सकते." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "गलत फॉण्ट का आकार |" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "डिस्कनेक्ट" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "गलत फॉण्ट का आकार |" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "गलत फॉण्ट का आकार |" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "सब-रिसोर्स नहीं मिला." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "थंबनेल बनाना" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "गलत फॉण्ट का आकार |" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14086,6 +14282,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14143,6 +14402,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "अमान्य रास्ता।" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "गलत फॉण्ट का आकार |" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "गलत फॉण्ट का आकार |" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14495,8 +14775,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14738,7 +15018,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index b722aa151a..91849fe548 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -17,8 +17,8 @@ msgstr "" "Language: hr\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp @@ -501,8 +501,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1354,7 +1354,7 @@ msgid "Bus Options" msgstr "Opcije Klase" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Dupliciraj" @@ -2135,8 +2135,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3168,8 +3168,14 @@ msgid "Update Continuously" msgstr "Kontinuirano ažuriraj" #: editor/editor_node.cpp -msgid "Update When Changed" -msgstr "" +#, fuzzy +msgid "Update All Changes" +msgstr "Promijeni" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Promijeni" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -3901,6 +3907,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4014,7 +4028,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4811,6 +4825,10 @@ msgid "Rename Animation" msgstr "Preimenuj animaciju" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Dupliciraj Animaciju" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "" @@ -4823,10 +4841,6 @@ msgid "Load Animation" msgstr "Učitaj Animaciju" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Dupliciraj Animaciju" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Nema animacije za kopirati!" @@ -12328,6 +12342,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13639,10 +13661,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13684,16 +13702,190 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nevažeće ime." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Nevažeće ime." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Nevažeće ime." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Nevažeće ime." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13704,6 +13896,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13756,6 +14011,26 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Nevažeće ime." + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Nevažeće ime." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14106,8 +14381,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14347,7 +14622,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 9130ef9507..85150bd14d 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -526,8 +526,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1392,7 +1392,7 @@ msgid "Bus Options" msgstr "Busz Beállítások" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Megkettőzés" @@ -2206,8 +2206,8 @@ msgstr "Metódus leírások" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Ennek a metódusnak jelenleg nincs leírása. Segítsen minket azzal, hogy " "[color=$color][url=$url]hozzájárul eggyel[/url][/color]!" @@ -3332,10 +3332,16 @@ msgid "Update Continuously" msgstr "Folyamatos frissítés" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Frissítés, ha megváltozik" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "A paraméter megváltozott" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Frissítési forgó elrejtése" @@ -4106,6 +4112,14 @@ msgstr "A név érvénytelen karaktereket tartalmaz." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4219,7 +4233,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Megkettőzés..." @@ -5024,6 +5038,10 @@ msgid "Rename Animation" msgstr "Animáció Átnevezése" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Animáció Megkettőzése" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Következő Megváltozott Keverése" @@ -5036,10 +5054,6 @@ msgid "Load Animation" msgstr "Animáció Betöltése" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Animáció Megkettőzése" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Nincs másolható animáció!" @@ -12665,6 +12679,16 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "Be-Görbe Pozíció Beállítása" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Görbe Pont Pozíció Beállítása" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Görbe Pont Pozíció Beállítása" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14015,10 +14039,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Érvénytelen azonosító:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14063,17 +14083,196 @@ msgstr "Nem sikerült létrehozni a mappát." msgid "Error starting HTTP server:" msgstr "Hiba TileSet mentésekor!" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Érvénytelen projektnév." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Nem sikerült létrehozni a mappát." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Érvénytelen Alapútvonal." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Nem sikerült betölteni az erőforrást." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Nem sikerült betölteni az erőforrást." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Érvénytelen kiterjesztés." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Érvénytelen kiterjesztés." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Nincs Találat!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Indexkép Létrehozása" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Érvénytelen azonosító:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14084,6 +14283,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Érvénytelen rövid csomagnév." @@ -14136,6 +14398,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Érvénytelen útvonal." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Érvénytelen kiterjesztés." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Érvénytelen termék GUID." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14488,8 +14771,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14729,7 +15012,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/id.po b/editor/translations/id.po index 524562bec9..6955f05f3a 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -537,8 +537,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1401,7 +1401,7 @@ msgid "Bus Options" msgstr "Pilihan Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Gandakan" @@ -2208,8 +2208,8 @@ msgstr "Deskripsi Method" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Untuk saat ini tidak ada deskripsi metode ini. Tolong bantu kita dengan " "[color=$color][url=$url]kontribusi[/url][/color]!" @@ -3324,10 +3324,16 @@ msgid "Update Continuously" msgstr "Perbarui Terus-menerus" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Perbarui Saat Berubah" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Perubahan Material:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Sembunyikan Spinner Pembaruan" @@ -4093,6 +4099,14 @@ msgstr "Nama mengandung karakter tidak valid." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4210,7 +4224,7 @@ msgstr "Urut dari Terakhir Diubah" msgid "Sort by First Modified" msgstr "Urut dari Pertama Diubah" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Gandakan..." @@ -5016,6 +5030,10 @@ msgid "Rename Animation" msgstr "Ubah Nama Animasi" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Gandakan Animasi" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Baur Pergantian Selanjutnya" @@ -5028,10 +5046,6 @@ msgid "Load Animation" msgstr "Muat Animasi" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Gandakan Animasi" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Tidak ada animasi untuk disalin!" @@ -12861,6 +12875,16 @@ msgstr "Ubah Radius Bentuk Silinder" msgid "Set Occluder Sphere Position" msgstr "Atur Posisi Kurva Dalam" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Atur Posisi Titik Kurva" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Atur Posisi Titik Kurva" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Ubah Radius Silinder" @@ -14254,10 +14278,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Identifier tidak valid:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "Ikon yang dibutuhkan tidak ditentukan dalam preset." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Hentikan Server HTTP" @@ -14300,17 +14320,200 @@ msgstr "Tidak dapat menciptakan direktori server HTTP:" msgid "Error starting HTTP server:" msgstr "Kesalahan memulai server HTTP:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nama Proyek Tidak Valid." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Geometri tidak valid, tidak dapat membuat poligon." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Tidak dapat membuat folder." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Basis lokasinya tidak valid." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Gagal memuat resource." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Gagal memuat resource." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Ekstensi tidak valid." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Ekstensi tidak valid." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Ikon tidak ditemukan." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Membuat Thumbnail" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Tidak dapat menemukan contoh APK untuk ekspor:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Identifier tidak valid:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14321,6 +14524,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nama pendek paket tidak valid." @@ -14373,6 +14639,27 @@ msgstr "Dimensi gambar logo 310x150 lebarnya tidak valid (harus 310x150)." msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Dimensi gambar splash screen tidak valid (harus 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Path tidak valid." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Ekstensi tidak valid." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "GUID produk tidak valid." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14813,8 +15100,8 @@ msgstr "" #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "Partikel berbasis GPU tidak didukung oleh driver video GLES2.\n" "Gunakan CPUParticles saja. Anda dapat menggunakan opsi \"Konversikan ke " @@ -15083,9 +15370,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Node ini telah usang. Gunakan AnimationTree sebagai gantinya." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Warna:#%s\n" diff --git a/editor/translations/is.po b/editor/translations/is.po index 773a89394f..824f7a7248 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -526,8 +526,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1370,7 +1370,7 @@ msgid "Bus Options" msgstr "Val á kvarða" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2148,8 +2148,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3182,7 +3182,11 @@ msgid "Update Continuously" msgstr "Samfellt" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3911,6 +3915,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4023,7 +4035,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Duplicate..." msgstr "Hreyfimynd Tvöfalda Lykla" @@ -4821,19 +4833,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12381,6 +12393,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13699,10 +13719,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13743,16 +13759,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13763,6 +13949,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13815,6 +14064,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14165,8 +14432,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14406,7 +14673,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 0d2c6a07e6..3da90af619 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -37,7 +37,7 @@ # Stefano Merazzi <asso99@hotmail.com>, 2019. # Sinapse X <sinapsex13@gmail.com>, 2019. # Micila Micillotto <micillotto@gmail.com>, 2019, 2020, 2021. -# Mirko Soppelsa <miknsop@gmail.com>, 2019, 2020, 2021. +# Mirko Soppelsa <miknsop@gmail.com>, 2019, 2020, 2021, 2022. # No <kingofwizards.kw7@gmail.com>, 2019. # StarFang208 <polaritymanx@yahoo.it>, 2019. # Katia Piazza <gydey@ridiculousglitch.com>, 2019, 2021. @@ -65,13 +65,14 @@ # Fabio Plos <altre0cose@gmail.com>, 2021. # Theraloss <danilo.polani@gmail.com>, 2021. # Pietro Grungo <pietro.grungo@libero.it>, 2021. +# Alfonso Scarpino <alfonso.scarpino@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-06 01:53+0000\n" -"Last-Translator: Riteo Siuga <riteo@posteo.net>\n" +"PO-Revision-Date: 2022-01-31 22:50+0000\n" +"Last-Translator: Mirko <miknsop@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -79,7 +80,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.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -381,9 +382,8 @@ msgid "Duplicate Key(s)" msgstr "Duplica i fotogrammi chiave selezionati" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add RESET Value(s)" -msgstr "Aggiungi %d frame" +msgstr "Aggiungi valore(i) di RESET" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" @@ -560,9 +560,8 @@ msgstr "" "si tratta di una singola traccia." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Add RESET Keys" -msgstr "Scala delle chiavi d'animazione" +msgstr "Aggiungi chiavi di RESET animazione" #: editor/animation_track_editor.cpp msgid "" @@ -571,8 +570,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1438,7 +1437,7 @@ msgid "Bus Options" msgstr "Opzioni Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplica" @@ -1550,7 +1549,7 @@ msgstr "Nome non valido." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "Non può iniziare con una cifra." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -1949,7 +1948,7 @@ msgstr "Rendi attuale" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp msgid "Import" -msgstr "Importa" +msgstr "Importazione" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" @@ -2186,9 +2185,8 @@ msgid "Properties" msgstr "Proprietà" #: editor/editor_help.cpp -#, fuzzy msgid "overrides %s:" -msgstr "sovrascrivi:" +msgstr "sovrascrive %s:" #: editor/editor_help.cpp msgid "default:" @@ -2248,11 +2246,11 @@ msgstr "Descrizioni del metodo" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Al momento non esiste alcuna descrizione per questo metodo. Aiutaci [color=" -"$color][url=$url]aggiungendone una[/url][/color]!" +"Al momento non esiste alcuna descrizione per questo metodo. Aiutaci " +"[color=$color][url=$url]aggiungendone una[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -2328,18 +2326,19 @@ msgid "Property:" msgstr "Proprietà:" #: editor/editor_inspector.cpp -#, fuzzy msgid "Pin value" -msgstr "(valore)" +msgstr "Fissa valore" #: editor/editor_inspector.cpp msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "" +"Fissare un valore ne forza il salvataggio anche se è uguale al valore " +"predefinito." #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" -msgstr "" +msgstr "Fissa valore [Disabilitato perché '%s' è solo per l'editor]" #: editor/editor_inspector.cpp editor/scene_tree_dock.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -2354,26 +2353,23 @@ msgstr "Imposta più valori:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "" +msgstr "%s fissato" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "" +msgstr "%s non fissato" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" -msgstr "Copia Proprietà" +msgstr "Copia proprietà" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" -msgstr "Incolla Proprietà" +msgstr "Incolla proprietà" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "Copia il percorso dello script" +msgstr "Copia il percorso della proprietà" #: editor/editor_log.cpp msgid "Output:" @@ -2850,8 +2846,8 @@ msgstr "Impossibile trovare il campo dello script per l'estensione in: \"%s\"." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." msgstr "" -"Impossibile caricare lo script di un componente aggiuntivo dal percorso: \"%s" -"\"." +"Impossibile caricare lo script di un componente aggiuntivo dal percorso: " +"\"%s\"." #: editor/editor_node.cpp msgid "" @@ -2873,8 +2869,8 @@ msgstr "" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" -"Impossibile caricare lo script di un componente aggiuntivo dal percorso: \"%s" -"\" Lo script non è in modalità strumento." +"Impossibile caricare lo script di un componente aggiuntivo dal percorso: " +"\"%s\" Lo script non è in modalità strumento." #: editor/editor_node.cpp msgid "" @@ -3110,9 +3106,8 @@ msgid "Install Android Build Template..." msgstr "Installa il modello di costruzione per Android…" #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Apri la cartella dei dati dell'editor" +msgstr "Apri la cartella dei dati utente" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3200,7 +3195,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Force Shader Fallbacks" -msgstr "" +msgstr "Forza fallback dello shader" #: editor/editor_node.cpp msgid "" @@ -3211,6 +3206,13 @@ msgid "" "Asynchronous shader compilation must be enabled in the project settings for " "this option to make a difference." msgstr "" +"Quando questa opzione è abilitata, gli shader verranno utilizzati nella loro " +"forma di fallback (visibili tramite un ubershader o nascosti) durante tutto " +"il tempo di esecuzione.\n" +"Ciò è utile per verificare l'aspetto e le prestazioni dei fallback, che " +"normalmente vengono visualizzati brevemente.\n" +"La compilazione asincrona degli shader deve essere abilitata nelle " +"impostazioni del progetto affinché questa opzione abbia effetto." #: editor/editor_node.cpp msgid "Synchronize Scene Changes" @@ -3375,10 +3377,16 @@ msgid "Update Continuously" msgstr "Aggiorna continuamente" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Aggiorna quando modificata" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Cambiamenti dei materiali:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Nascondi la rotella di aggiornamento" @@ -3596,14 +3604,12 @@ msgid "Average Time (ms)" msgstr "Tempo medio (ms)" #: editor/editor_profiler.cpp -#, fuzzy msgid "Frame %" -msgstr "% fotogramma" +msgstr "Fotogramma %" #: editor/editor_profiler.cpp -#, fuzzy msgid "Physics Frame %" -msgstr "% fotogramma fisico" +msgstr "Fotogramma fisico %" #: editor/editor_profiler.cpp msgid "Inclusive" @@ -3827,9 +3833,8 @@ msgstr "Importa Da Nodo:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Errore" +msgstr "Errore %s" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -3877,9 +3882,8 @@ msgid "Request failed." msgstr "Richiesta fallita." #: editor/export_template_manager.cpp -#, fuzzy msgid "Request ended up in a redirect loop." -msgstr "Richiesta bloccata in un ciclo di reindirizzamento." +msgstr "La richiesta è finita in un ciclo di reindirizzamento." #: editor/export_template_manager.cpp msgid "Request failed:" @@ -3906,11 +3910,10 @@ msgid "Error getting the list of mirrors." msgstr "Errore nella ricezione della lista dei mirror." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error parsing JSON with the list of mirrors. Please report this issue!" msgstr "" -"Errore elaborazione JSON della lista dei mirror. Si prega di segnalare " -"questo problema!" +"Errore nell'elaborazione del JSON della lista dei mirror. Si prega di " +"segnalare questo problema!" #: editor/export_template_manager.cpp msgid "Best available mirror" @@ -3967,24 +3970,23 @@ msgid "SSL Handshake Error" msgstr "Errore Handshake SSL" #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't open the export templates file." -msgstr "Impossibile aprire zip dei template d'esportazione." +msgstr "Impossibile aprire il file di esportazione dei modelli." #: editor/export_template_manager.cpp -#, fuzzy msgid "Invalid version.txt format inside the export templates file: %s." -msgstr "Formato di version.txt non valido nei templates: %s." +msgstr "" +"Formato di version.txt non valido nel file di esportazione dei modelli: %s." #: editor/export_template_manager.cpp -#, fuzzy msgid "No version.txt found inside the export templates file." -msgstr "Non é stato trovato version.txt all'interno di templates." +msgstr "" +"Non è stato trovato version.txt all'interno del file di esportazione dei " +"modelli." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for extracting templates:" -msgstr "Errore di creazione del percorso per i template:" +msgstr "Errore nella creazione del percorso per l'estrazione dei modelli:" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" @@ -3995,9 +3997,8 @@ msgid "Importing:" msgstr "Importo:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove templates for the version '%s'?" -msgstr "Rimuovere versione \"%s\" del template?" +msgstr "Rimuovere i modelli per la versione '%s'?" #: editor/export_template_manager.cpp msgid "Uncompressing Android Build Sources" @@ -4020,9 +4021,8 @@ msgid "Export templates are installed and ready to be used." msgstr "I modelli d'esportazione sono installati e pronti all'uso." #: editor/export_template_manager.cpp -#, fuzzy msgid "Open Folder" -msgstr "Apri file" +msgstr "Apri cartella" #: editor/export_template_manager.cpp msgid "Open the folder containing installed templates for the current version." @@ -4034,23 +4034,20 @@ msgid "Uninstall" msgstr "Disinstalla" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall templates for the current version." -msgstr "Disinstalla template dalla versione attuale." +msgstr "Disinstalla i modelli per la versione attuale." #: editor/export_template_manager.cpp msgid "Download from:" msgstr "Scarica da:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Open in Web Browser" -msgstr "Esegui nel Browser" +msgstr "Apri nel browser web" #: editor/export_template_manager.cpp -#, fuzzy msgid "Copy Mirror URL" -msgstr "Copia Errore" +msgstr "Copia URL mirror" #: editor/export_template_manager.cpp msgid "Download and Install" @@ -4071,9 +4068,8 @@ msgstr "" "sviluppo." #: editor/export_template_manager.cpp -#, fuzzy msgid "Install from File" -msgstr "Installa da File" +msgstr "Installa da file" #: editor/export_template_manager.cpp msgid "Install templates from a local file." @@ -4085,7 +4081,6 @@ msgid "Cancel" msgstr "Annulla" #: editor/export_template_manager.cpp -#, fuzzy msgid "Cancel the download of the templates." msgstr "Annulla lo scaricamento dei modelli." @@ -4168,6 +4163,14 @@ msgstr "Il nome contiene caratteri non validi." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4283,11 +4286,10 @@ msgid "Sort by Last Modified" msgstr "Ordina per Ultima Modifica" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Sort by First Modified" -msgstr "Ordina per Prima Modifica" +msgstr "Ordina per primo modificato" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplica..." @@ -4388,9 +4390,8 @@ msgid "Replace..." msgstr "Sostituisci..." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Replace in Files" -msgstr "Sostituisci tutti" +msgstr "Sostituisci nei file" #: editor/find_in_files.cpp msgid "Find: " @@ -4401,9 +4402,8 @@ msgid "Replace: " msgstr "Sostituisci: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace All (NO UNDO)" -msgstr "Sostituisci tutti" +msgstr "Sostituisci tutto (NESSUN ANNULLA)" #: editor/find_in_files.cpp msgid "Searching..." @@ -4770,7 +4770,6 @@ msgid "Create points." msgstr "Crea punti." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "" "Edit points.\n" "LMB: Move Point\n" @@ -5105,6 +5104,10 @@ msgid "Rename Animation" msgstr "Rinomina Animazione" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplica Animazione" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Fondi il Successivo Cambiato" @@ -5117,10 +5120,6 @@ msgid "Load Animation" msgstr "Carica Animazione" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplica Animazione" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Nessuna animazione da copiare!" @@ -5685,7 +5684,7 @@ msgstr "Ultimo" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" -msgstr "Tutti" +msgstr "Tutto" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search templates, projects, and demos" @@ -6170,7 +6169,6 @@ msgid "Toggle smart snapping." msgstr "Commuta lo scatto intelligente." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" msgstr "Usa lo scatto intelligente" @@ -6180,7 +6178,6 @@ msgid "Toggle grid snapping." msgstr "Commuta la griglia magnetica." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" msgstr "Usa la griglia magnetica" @@ -6320,7 +6317,6 @@ msgid "Always Show Grid" msgstr "Mostra sempre Griglia" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show Helpers" msgstr "Mostra guide" @@ -8495,7 +8491,6 @@ msgid "Focus Selection" msgstr "Centra la Selezione" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Toggle Freelook" msgstr "Commuta la vista libera" @@ -8515,10 +8510,9 @@ msgstr "Ripristina le impostazioni predefinite" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform" -msgstr "Trasforma" +msgstr "Trasformazione" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Object to Floor" msgstr "Scatta l'oggetto sul suolo" @@ -11801,8 +11795,8 @@ msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'." msgstr "" -"Nome azione non valida. Non può essere vuoto né contenere \"/\", \":\", \"=" -"\", \"\\\" o \"\"\"." +"Nome azione non valida. Non può essere vuoto né contenere \"/\", \":\", " +"\"=\", \"\\\" o \"\"\"." #: editor/project_settings_editor.cpp msgid "Add Input Action" @@ -11886,6 +11880,7 @@ msgid "Action:" msgstr "Azione:" #: editor/project_settings_editor.cpp +#, fuzzy msgid "Action" msgstr "Azione" @@ -13003,6 +12998,16 @@ msgstr "Imposta Raggio della Sfera Occlusore" msgid "Set Occluder Sphere Position" msgstr "Imposta Posizione della Sfera Occlusore" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Imposta Posizione Punto Portale" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Imposta Posizione Punto Curva" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Modifica Raggio del Cilindro" @@ -13731,7 +13736,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy msgid "Condition" -msgstr "animazione" +msgstr "Condizione" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" @@ -13777,7 +13782,7 @@ msgstr "Rinomina cartella:" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy msgid "Switch" -msgstr "Inclinazione:" +msgstr "Switch" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" @@ -13901,7 +13906,7 @@ msgstr "VariableSet non trovato nello script: " #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "Preload" -msgstr "Ricarica" +msgstr "Preload" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -14010,8 +14015,9 @@ msgid "Yield" msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp +#, fuzzy msgid "Wait" -msgstr "" +msgstr "Wait" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy @@ -14417,10 +14423,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Identificatore non valido:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "L'icona richiesta non è specificata nel preset." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Ferma il server HTTP" @@ -14461,16 +14463,202 @@ msgstr "Impossibile creare la directory per il server HTTP:" msgid "Error starting HTTP server:" msgstr "Errore all'avvio del server HTTP:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nome del progetto non valido." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Geometria non valida, impossibile creare il poligono." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Impossibile creare la cartella." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Percorso di base non valido." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Caricamento della risorsa fallito." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Caricamento della risorsa fallito." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Estensione non valida." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Estensione non valida." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Nessuna icona trovata." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Creando la miniatura" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Impossibile trovare il template APK per l'esportazione:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Identificatore del bundle non valido:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Autenticazione: è richiesta la firma del codice." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Autenticazione: è richiesto un runtime rafforzato." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Autenticazione: è richiesto un runtime rafforzato." #: platform/osx/export/export.cpp @@ -14481,6 +14669,69 @@ msgstr "Autenticazione: nome Apple ID non specificato." msgid "Notarization: Apple ID password not specified." msgstr "Autenticazione: password Apple ID non specificato." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nome breve del pacchetto non valido." @@ -14547,6 +14798,27 @@ msgstr "" "Dimensioni per l'immagine dello splash screen non valide (dovrebbero essere " "620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Percorso non valido." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Estensione non valida." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "GUID prodotto invalido." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14991,8 +15263,8 @@ msgstr "Solo scale uniformi sono supportate." #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "Le particelle basate su GPU non sono supportate dal driver video GLES2.\n" "Utilizzare invece il nodo CPUParticles. A tale scopo è possibile utilizzare " @@ -15285,9 +15557,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Questo nodo è stato deprecato. Usa invece un AnimationTree." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Colore: #%s\n" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 1e6c425b50..de6c22ce1a 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -18,7 +18,7 @@ # sugusan <sugusan.development@gmail.com>, 2018, 2019, 2021. # Nathan Lovato <nathan.lovato.art@gmail.com>, 2018. # nyanode <akaruooyagi@yahoo.co.jp>, 2018. -# nitenook <admin@alterbaum.net>, 2018, 2019, 2020, 2021. +# nitenook <admin@alterbaum.net>, 2018, 2019, 2020, 2021, 2022. # Rob Matych <robertsmatych@gmail.com>, 2018. # Hidetsugu Takahashi <manzyun@gmail.com>, 2019. # Wataru Onuki <watonu@magadou.com>, 2019. @@ -26,22 +26,24 @@ # Takuya Watanabe <watanabe@zblog.sakura.ne.jp>, 2019. # Sodium11 <Sodium11.for.gitserver@gmail.com>, 2019. # leela <53352@protonmail.com>, 2019. -# Tarou Yamada <mizuningyou@yahoo.co.jp>, 2019, 2021. +# Tarou Yamada <mizuningyou@yahoo.co.jp>, 2019, 2021, 2022. # kazuma kondo <kazmax7@gmail.com>, 2019. # Akihiro Ogoshi <technical@palsystem-game.com>, 2019, 2020. -# Wataru Onuki <bettawat@yahoo.co.jp>, 2020, 2021. +# Wataru Onuki <bettawat@yahoo.co.jp>, 2020, 2021, 2022. # sporeball <sporeballdev@gmail.com>, 2020. # BinotaLIU <me@binota.org>, 2020, 2021. # 都築 本成 <motonari728@gmail.com>, 2021. # Nanjakkun <nanjakkun@gmail.com>, 2021. # Lemoney <railkill@gmail.com>, 2021. +# Hiroki Taira <hrk4649@gmail.com>, 2022. +# Juto <mvobujd237@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-12-16 14:06+0000\n" -"Last-Translator: nitenook <admin@alterbaum.net>\n" +"PO-Revision-Date: 2022-02-14 22:08+0000\n" +"Last-Translator: Wataru Onuki <bettawat@yahoo.co.jp>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" "Language: ja\n" @@ -49,7 +51,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.10-dev\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -72,7 +74,7 @@ msgstr "式中の無効な入力 %i (渡されていません)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "インスタンスがNULLの(渡されていない)ため、selfは使用できません。" +msgstr "インスタンスがNULLの(渡されていない)ため、selfは使用できません" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -536,8 +538,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1400,7 +1402,7 @@ msgid "Bus Options" msgstr "バス オプション" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "複製" @@ -1512,7 +1514,7 @@ msgstr "無効な名前です。" #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "数字で始めることはできません。" #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -2142,9 +2144,8 @@ msgid "Properties" msgstr "プロパティ" #: editor/editor_help.cpp -#, fuzzy msgid "overrides %s:" -msgstr "上書き:" +msgstr "%s を上書き:" #: editor/editor_help.cpp msgid "default:" @@ -2204,8 +2205,8 @@ msgstr "メソッドの説明" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "現在、このメソッドの説明はありません。[color=$color][url=$url]貢献[/url][/" "color]して私たちを助けてください!" @@ -2317,19 +2318,16 @@ msgid "Unpinned %s" msgstr "" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" msgstr "プロパティをコピー" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" msgstr "プロパティを貼り付け" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "スクリプトのパスをコピー" +msgstr "プロパティのパスをコピー" #: editor/editor_log.cpp msgid "Output:" @@ -2564,8 +2562,7 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" -"このリソースはインポートされたシーンに属しているため、編集することができませ" -"ん。\n" +"このリソースはインポートされたシーンに属しているため、編集できません。\n" "このワークフローをよりよく理解するために、シーンの読み込みに関連するドキュメ" "ントをお読みください。" @@ -2633,11 +2630,11 @@ msgstr "クイックオープン..." #: editor/editor_node.cpp msgid "Quick Open Scene..." -msgstr "シーンのクイックオープン..." +msgstr "シーンをクイックオープン..." #: editor/editor_node.cpp msgid "Quick Open Script..." -msgstr "スクリプトのクイックオープン..." +msgstr "スクリプトをクイックオープン..." #: editor/editor_node.cpp msgid "Save & Close" @@ -2664,8 +2661,8 @@ msgid "" "A root node is required to save the scene. You can add a root node using the " "Scene tree dock." msgstr "" -"シーンを保存するにはルートノードが必要です。シーンツリーのドックから、ルート" -"ノードを追加することができます。" +"シーンを保存するにはルートノードが必要です。シーンツリーのドックからルート" +"ノードを追加できます。" #: editor/editor_node.cpp msgid "Save Scene As..." @@ -3054,9 +3051,8 @@ msgid "Install Android Build Template..." msgstr "Androidビルドテンプレートのインストール..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "エディターのデータフォルダーを開く" +msgstr "ユーザーデータフォルダーを開く" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3208,7 +3204,7 @@ msgstr "スクリーンショットを撮る" #: editor/editor_node.cpp msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" -"スクリーンショットは エディターのデータ / 設定フォルダー に保存されています。" +"スクリーンショットはエディターのデータ / 設定フォルダーに保存されます。" #: editor/editor_node.cpp msgid "Toggle Fullscreen" @@ -3320,10 +3316,16 @@ msgid "Update Continuously" msgstr "継続的に更新" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "変更時に更新" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "マテリアルの変更:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "アップデートスピナーを非表示" @@ -3765,9 +3767,8 @@ msgstr "ノードからインポート:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "エラー" +msgstr "%s エラー" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4091,6 +4092,14 @@ msgstr "名前に使用できない文字が含まれています。" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4209,7 +4218,7 @@ msgstr "更新日時が新しい順で並び替え" msgid "Sort by First Modified" msgstr "更新日時が古い順で並び替え" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "複製..." @@ -4309,9 +4318,8 @@ msgid "Replace..." msgstr "置換..." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Replace in Files" -msgstr "すべて置換" +msgstr "複数ファイル内で置換" #: editor/find_in_files.cpp msgid "Find: " @@ -4322,9 +4330,8 @@ msgid "Replace: " msgstr "置換: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace All (NO UNDO)" -msgstr "すべて置換" +msgstr "すべて置換 (元に戻せません)" #: editor/find_in_files.cpp msgid "Searching..." @@ -4549,6 +4556,8 @@ msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." msgstr "" +"ファイルシステムや Inspector にある Resource ファイルを選択してインポート設定" +"を調整してください。" #: editor/inspector_dock.cpp msgid "Failed to load resource." @@ -5015,6 +5024,10 @@ msgid "Rename Animation" msgstr "アニメーションの名前を変更" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "アニメーションを複製" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "次の変更をブレンド" @@ -5027,10 +5040,6 @@ msgid "Load Animation" msgstr "アニメーション読み込み" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "アニメーションを複製" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "コピーするアニメーションがありません!" @@ -6008,9 +6017,8 @@ msgid "Alt+Drag: Move selected node." msgstr "Alt+ドラッグ: 選択したノードを移動。" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Scale selected node." -msgstr "Alt+ドラッグ: 選択したノードを移動。" +msgstr "Alt+ドラッグ: 選択した Node を移動。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "V: Set selected node's pivot position." @@ -6143,9 +6151,8 @@ msgstr "選択したオブジェクトの位置をロック (移動不可能に #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected Node(s)" -msgstr "選択対象をロック" +msgstr "選択 Node をロック" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6154,9 +6161,8 @@ msgstr "選択したオブジェクトをロック解除 (移動可能にする) #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected Node(s)" -msgstr "選択対象をロック解除" +msgstr "選択 Node をロック解除" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6165,9 +6171,8 @@ msgstr "オブジェクトの子を選択不可にする。" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected Node(s)" -msgstr "選択対象をグループ化" +msgstr "選択 Node をグループ化" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6176,9 +6181,8 @@ msgstr "オブジェクトの子を選択可能に戻す。" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected Node(s)" -msgstr "選択対象をグループ解除" +msgstr "選択 Node をグループ解除" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton Options" @@ -6903,7 +6907,7 @@ msgstr "ナビゲーションポリゴンを生成" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" -msgstr "CPUパーティクルに変換" +msgstr "CPUParticlesに変換" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generating Visibility Rect" @@ -7824,9 +7828,8 @@ msgid "Find in Files..." msgstr "複数ファイル内を検索..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Replace in Files..." -msgstr "置換..." +msgstr "複数ファイル内で置換..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" @@ -8353,16 +8356,15 @@ msgstr "フリールックのオン / オフ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Decrease Field of View" -msgstr "" +msgstr "視野を狭める" #: editor/plugins/spatial_editor_plugin.cpp msgid "Increase Field of View" -msgstr "" +msgstr "視野を広げる" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Reset Field of View to Default" -msgstr "デフォルトに戻す" +msgstr "視野をデフォルトに戻す" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9091,22 +9093,19 @@ msgstr "タイプを追加" #: editor/plugins/theme_editor_plugin.cpp msgid "Filter the list of types or create a new custom type:" -msgstr "" +msgstr "タイプのリストをフィルタするか新規カスタムタイプを作成する:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Available Node-based types:" -msgstr "利用可能なプロファイル:" +msgstr "利用可能な Node ベースのタイプ:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Type name is empty!" -msgstr "ファイル名が空です。" +msgstr "タイプ名が空です!" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Are you sure you want to create an empty type?" -msgstr "複数のプロジェクトを開いてもよろしいですか?" +msgstr "空のタイプを作成しますか?" #: editor/plugins/theme_editor_plugin.cpp msgid "Confirm Item Rename" @@ -9742,53 +9741,49 @@ msgstr "エラー" msgid "" "Remote settings are empty. VCS features that use the network may not work." msgstr "" +"リモート設定が空です。このネットワークを使用するVCSの機能は動作しないかもしれ" +"ません。" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "名前が付いていません。" +msgstr "コミットメッセージがありません。" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "コミット" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "シェーダーの変更:" +msgstr "ステージ済の変更" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "シェーダーの変更:" +msgstr "未ステージの変更" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "コミット" +msgstr "コミット:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "日付:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "サブツリー" +msgstr "サブタイトル:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "%s ブランチを削除しますか?" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "複数のプロジェクトを開いてもよろしいですか?" +msgstr "リモートの %s ブランチを削除しますか?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "リセット" +msgstr "適用" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9799,148 +9794,133 @@ msgid "Initialize" msgstr "初期化" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "ポイントを削除" +msgstr "リモートログイン" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "名前の変更" +msgstr "ユーザー名" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "パスワード" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "SSH 公開鍵パス" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "SSH 公開鍵パスを選択してください" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "SSH 秘密鍵パス" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "SSH 秘密鍵パスを選択してください" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "SSH パスフレーズ" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "新しい変更点を検出" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "変更を保存して閉じますか?" +msgstr "すべての変更を破棄" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "ローカルの変更を保存..." +msgstr "変更をステージに上げる" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "マテリアルの変更:" +msgstr "すべての変更をステージから下げる" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy msgid "Commit Message" -msgstr "変更をコミットする" +msgstr "メッセージをコミットする" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "変更をコミットする" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "コミット" +msgstr "コミットリスト" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "コミットリストサイズ" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "一致:" +msgstr "ブランチ" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "新規プロジェクトを作成" +msgstr "新規ブランチを作成" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "アニメーショントラックを除去" +msgstr "ブランチを削除" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "ブランチ名" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" msgstr "リモート" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "新規プロジェクトを作成" +msgstr "新規リモートを作成" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "アイテムを除去" +msgstr "リモートを削除" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "リモート " +msgstr "リモート名" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "リモート " +msgstr "リモート URL" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "フェッチ" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "プル" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "プッシュ" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "ソースメッシュ:" +msgstr "強制プッシュ" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -9960,22 +9940,19 @@ msgstr "タイプ変更" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "未マージ" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "ビュー" +msgstr "ビュー:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "パスを分割" +msgstr "分割" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "変更済み" +msgstr "統合済み" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -12111,6 +12088,9 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"すでにインスタンス化したシーンの子であるブランチは保存できません。\n" +"このブランチを自身のシーンで保存するには、元のシーンを開き、ブランチを右ク" +"リックして、\"ブランチをシーンとして保存\"を選択してください。" #: editor/scene_tree_dock.cpp msgid "" @@ -12118,6 +12098,9 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"継承シーンの一部であるブランチは保存できません。\n" +"このブランチを自身のシーンで保存するには、元のシーンを開き、ブランチを右ク" +"リックして、\"ブランチをシーンとして保存\"を選択してください。" #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -12793,6 +12776,16 @@ msgstr "オクルーダーの球形の半径をセット" msgid "Set Occluder Sphere Position" msgstr "オクルーダーの球形の位置をセット" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Portal ポイントの位置を設定" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "カーブポイントの位置を設定" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "円柱の半径を変更" @@ -12863,7 +12856,7 @@ msgstr "ライブラリ: " #: modules/gdnative/register_types.cpp msgid "GDNative" -msgstr "GDNative" +msgstr "\\ GDNative" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -13128,7 +13121,7 @@ msgstr "分割中..." #: modules/navigation/navigation_mesh_generator.cpp msgid "Creating contours..." -msgstr "輪郭を作成しています..." +msgstr "輪郭を生成中..." #: modules/navigation/navigation_mesh_generator.cpp msgid "Creating polymesh..." @@ -13508,18 +13501,16 @@ msgid "Edit Member" msgstr "メンバーを編集" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "式を設定" +msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "Return(戻り値)" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "アニメーション" +msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" @@ -13535,7 +13526,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "イテレータ" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" @@ -13558,23 +13549,20 @@ msgid "Sequence" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "フォルダー名を変更:" +msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "ピッチ:" +msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "型:" +msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" @@ -13585,14 +13573,12 @@ msgid "On %s" msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "On Self" -msgstr "自己" +msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "文字 %s" +msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" @@ -13603,23 +13589,20 @@ msgid "Divide %s" msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "%s を追加" +msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "ShiftLeft %s" -msgstr "%s を設定" +msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "%s を追加" +msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" @@ -13797,7 +13780,7 @@ msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Wait(待機)" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy @@ -13976,8 +13959,8 @@ msgid "" "\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VrApi\" " "or \"OpenXR\"." msgstr "" -"\"Hand Tracking\" は \"Xr Mode\" が \"Oculus Mobile VrApi\" または \"OpenXR" -"\" の場合にのみ有効です。" +"\"Hand Tracking\" は \"Xr Mode\" が \"Oculus Mobile VrApi\" または " +"\"OpenXR\" の場合にのみ有効です。" #: platform/android/export/export_plugin.cpp msgid "\"Passthrough\" is only valid when \"Xr Mode\" is \"OpenXR\"." @@ -14183,10 +14166,6 @@ msgstr "App Store チームID が未指定 - プロジェクトを構成でき msgid "Invalid Identifier:" msgstr "無効な識別子:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "必須アイコンがプリセットに指定されていません。" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "HTTPサーバーを止める" @@ -14227,16 +14206,202 @@ msgstr "HTTPサーバーのディレクトリの作成に失敗:" msgid "Error starting HTTP server:" msgstr "HTTPサーバーの開始に失敗:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "無効なプロジェクト名です。" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "ジオメトリが無効です。ポリゴンを作成できません。" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "フォルダーを作成できませんでした。" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "無効なベースパスです。" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "リソースの読み込みに失敗しました。" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "リソースの読み込みに失敗しました。" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "無効な拡張子です。" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "無効な拡張子です。" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "アイコンが見つかりませんでした。" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "サムネイルを作成中" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"エクスポートするテンプレートAPKが見つかりませんでした:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "無効なバンドルID:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Notarization: コード署名が必要です。" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Notarization: hardened runtime が必要です。" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Notarization: hardened runtime が必要です。" #: platform/osx/export/export.cpp @@ -14247,6 +14412,69 @@ msgstr "Notarization: Apple ID 名が指定されていません。" msgid "Notarization: Apple ID password not specified." msgstr "Notarization: Apple ID パスワードが指定されていません。" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "パッケージのショートネームが無効です。" @@ -14306,6 +14534,27 @@ msgstr "" "スプラッシュスクリーンの画像サイズが無効です(縦横620x300でなければなりませ" "ん)。" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "パスが無効です。" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "無効な拡張子です。" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "無効なプロダクト GUIDです。" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14432,13 +14681,15 @@ msgstr "この遮蔽用のオクルーダーポリゴンは空です。ポリゴ #: scene/2d/navigation_agent_2d.cpp msgid "The NavigationAgent2D can be used only under a Node2D node." -msgstr "" +msgstr "NavigationAgent2D は Node2Dノードの下でのみ使用可能です。" #: scene/2d/navigation_obstacle_2d.cpp msgid "" "The NavigationObstacle2D only serves to provide collision avoidance to a " "Node2D object." msgstr "" +"NavigationObstacle2D はコリジョン回避を Node2D オブジェクトに提供するためだけ" +"に機能します。" #: scene/2d/navigation_polygon.cpp msgid "" @@ -14464,7 +14715,6 @@ msgstr "" "のみ動作します。" #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " @@ -14472,8 +14722,8 @@ msgid "" msgstr "" "GPUベースのパーティクルは、GLES2ビデオドライバーではサポートされていませ" "ん。\n" -"代わりにCPUParticles2Dノードを使用してください。この目的のために \"CPUパー" -"ティクルに変換\" オプションを使用できます。" +"代わりにCPUParticles2Dノードを使用してください。この目的のために " +"\"CPUParticles2D に変換\" オプションを使用できます。" #: scene/2d/particles_2d.cpp msgid "" @@ -14483,6 +14733,12 @@ msgid "" "You can use the \"Convert to CPUParticles2D\" toolbar option for this " "purpose." msgstr "" +"macOSでは、トランスフォームフィードバックがGPUではなくCPUで実装されているた" +"め、Particles2D のレンダリングは CPUParticles2D よりとても低速です。\n" +"macOS をターゲットにする場合は CPUParticles2D を使用することを検討くださ" +"い。\n" +"この目的のために \"CPUParticles2D に変換\" ツールバーオプションを使用すること" +"が可能です。" #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" @@ -14713,7 +14969,7 @@ msgstr "90度を超える角度のスポットライトは、シャドウを投 #: scene/3d/navigation_agent.cpp msgid "The NavigationAgent can be used only under a spatial node." -msgstr "" +msgstr "NavigationAgent はSpatialノードの下でのみ使用されます。" #: scene/3d/navigation_mesh_instance.cpp msgid "" @@ -14728,6 +14984,8 @@ msgid "" "The NavigationObstacle only serves to provide collision avoidance to a " "spatial object." msgstr "" +"NavigationObstacle はSpatialなオブジェクトにコリジョン回避を提供するためだけ" +"に機能します。" #: scene/3d/occluder.cpp msgid "No shape is set." @@ -14738,16 +14996,15 @@ msgid "Only uniform scales are supported." msgstr "uniform スケールのみサポートされています。" #: scene/3d/particles.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "GPUベースのパーティクルは、GLES2ビデオドライバーではサポートされていませ" "ん。\n" -"代わりにCPUParticlesノードを使用してください。この目的のために \"CPUパーティ" -"クルに変換\" オプションを使用できます。" +"代わりにCPUParticlesノードを使用してください。この目的のために \"CPUParticles" +"に変換\" ツールバーオプションを使用できます。" #: scene/3d/particles.cpp msgid "" @@ -14756,6 +15013,10 @@ msgid "" "Consider using CPUParticles instead when targeting macOS.\n" "You can use the \"Convert to CPUParticles\" toolbar option for this purpose." msgstr "" +"macOSでは、トランスフォームフィードバックがGPUではなくCPUで実装されているた" +"め、Particles のレンダリングは CPUParticles よりとても低速です。\n" +"macOS をターゲットにする場合は CPUParticles を使用することを検討ください。\n" +"この目的のために \"CPUParticles に変換\" ツールバーオプションを使用できます。" #: scene/3d/particles.cpp msgid "" @@ -15025,9 +15286,10 @@ msgstr "" "このノードは非推奨になりました。代わりにAnimationTreeを使用してください。" #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "色: #%s\n" @@ -15179,7 +15441,7 @@ msgid "" "'SamplerPort'." msgstr "" "サンプラーポートは接続されていますが、使用されていません。ソースを " -"'SamplerPort'に変更すること検討してください。" +"'SamplerPort'に変更することを検討してください。" #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." diff --git a/editor/translations/ka.po b/editor/translations/ka.po index d436b3b6d1..b3d35a3311 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -540,8 +540,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1428,7 +1428,7 @@ msgid "Bus Options" msgstr "აღწერა:" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2220,8 +2220,8 @@ msgstr "აღწერა:" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3268,8 +3268,14 @@ msgid "Update Continuously" msgstr "უწყვეტი" #: editor/editor_node.cpp -msgid "Update When Changed" -msgstr "" +#, fuzzy +msgid "Update All Changes" +msgstr "ახალი %s შექმნა" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "ახალი %s შექმნა" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -4009,6 +4015,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4128,7 +4142,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4951,19 +4965,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12666,6 +12680,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14003,10 +14025,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "არასწორი ფონტის ზომა." -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14047,17 +14065,193 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "არასწორი ფონტის ზომა." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "არასწორი ფონტის ზომა." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "კავშირის გაწყვეტა" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "არასწორი ფონტის ზომა." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "არასწორი ფონტის ზომა." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "მუდმივი" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "არასწორი ფონტის ზომა." #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14068,6 +14262,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14125,6 +14382,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "არასწორი ფონტის ზომა." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "არასწორი ფონტის ზომა." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "არასწორი ფონტის ზომა." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14475,8 +14753,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14720,7 +14998,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/km.po b/editor/translations/km.po index db013eeb5d..a386fd1188 100644 --- a/editor/translations/km.po +++ b/editor/translations/km.po @@ -496,8 +496,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1331,7 +1331,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2104,8 +2104,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3130,7 +3130,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3855,6 +3859,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3967,7 +3979,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4753,19 +4765,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12199,6 +12211,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13491,10 +13511,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13535,16 +13551,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13555,6 +13741,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13607,6 +13856,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13957,8 +14224,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14198,7 +14465,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index d35224bd42..0312c7fd92 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -29,13 +29,14 @@ # 신동규 <rlsl0422@gmail.com>, 2021. # Kiroo <elusive1102@naver.com>, 2021. # JumpJetAvocado <dwkng@jbnu.ac.kr>, 2021. +# Lee Minhak <minarihak@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-11-22 20:39+0000\n" -"Last-Translator: JumpJetAvocado <dwkng@jbnu.ac.kr>\n" +"PO-Revision-Date: 2022-02-04 13:45+0000\n" +"Last-Translator: Lee Minhak <minarihak@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\n" @@ -43,7 +44,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.10-dev\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -532,8 +533,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -542,8 +543,8 @@ msgstr "" "\n" "저장 기능을 활성화하려면 커스텀 트랙을 추가하고, 씬의 가져오기 설정으로 가" "서\n" -"\"Animation > Storage\" 설정을 \"Files\"로, \"Animation > Keep Custom Tracks" -"\" 설정을 활성화한 뒤, 다시 가져오십시오.\n" +"\"Animation > Storage\" 설정을 \"Files\"로, \"Animation > Keep Custom " +"Tracks\" 설정을 활성화한 뒤, 다시 가져오십시오.\n" "아니면 가져오기 프리셋으로 애니메이션을 별도의 파일로 가져올 수도 있습니다." #: editor/animation_track_editor.cpp @@ -1392,7 +1393,7 @@ msgid "Bus Options" msgstr "버스 옵션" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "복제" @@ -1504,7 +1505,7 @@ msgstr "올바르지 않은 이름입니다." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "숫자로 시작할 수 없습니다." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -2130,7 +2131,7 @@ msgstr "속성" #: editor/editor_help.cpp #, fuzzy msgid "overrides %s:" -msgstr "오버라이드:" +msgstr "오버라이드 %s:" #: editor/editor_help.cpp msgid "default:" @@ -2191,8 +2192,8 @@ msgstr "메서드 설명" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "현재 이 메서드의 설명이 없습니다. [color=$color][url=$url]관련 정보를 기여하" "여[/url][/color] 개선할 수 있도록 도와주세요!" @@ -2276,9 +2277,10 @@ msgid "Pin value" msgstr "(값)" #: editor/editor_inspector.cpp +#, fuzzy msgid "" "Pinning a value forces it to be saved even if it's equal to the default." -msgstr "" +msgstr "값을 고정하면 기본값과 같더라도 강제로 저장됩니다." #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" @@ -3301,10 +3303,16 @@ msgid "Update Continuously" msgstr "상시 업데이트" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "변경될 때 업데이트" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "머티리얼 바꾸기:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "업데이트 스피너 숨기기" @@ -4063,6 +4071,14 @@ msgstr "이름에 잘못된 문자가 있습니다." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4180,7 +4196,7 @@ msgstr "마지막으로 수정된 순서로 정렬" msgid "Sort by First Modified" msgstr "처음으로 수정된 순서로 정렬" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "복제..." @@ -4989,6 +5005,10 @@ msgid "Rename Animation" msgstr "애니메이션 이름 바꾸기" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "애니메이션 복제" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "혼합 다음으로 바뀜" @@ -5001,10 +5021,6 @@ msgid "Load Animation" msgstr "애니메이션 불러오기" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "애니메이션 복제" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "복사할 애니메이션이 없습니다!" @@ -12713,6 +12729,16 @@ msgstr "어클루더 구체 반지름 설정" msgid "Set Occluder Sphere Position" msgstr "어클루더 구체 위치 설정" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "포털 점 위치 설정" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "곡선 점 위치 설정" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "원기둥 반지름 바꾸기" @@ -14089,10 +14115,6 @@ msgstr "App Store 팀 ID를 지정하지 않았습니다 - 프로젝트를 구 msgid "Invalid Identifier:" msgstr "잘못된 식별자:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "요구하는 아이콘을 프리셋에서 지정하지 않았습니다." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "HTTP 서버 멈추기" @@ -14133,16 +14155,202 @@ msgstr "HTTP 서버 디렉토리를 만들 수 없음:" msgid "Error starting HTTP server:" msgstr "HTTP 서버를 시작하는 중 오류:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "잘못된 프로젝트 이름입니다." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "잘못된 지오메트리. 폴리곤을 만들 수 없습니다." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "폴더를 만들 수 없습니다." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "잘못된 기본 경로." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "리소스 불러오기에 실패했습니다." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "리소스 불러오기에 실패했습니다." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "잘못된 확장자." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "잘못된 확장자." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "아이콘을 찾을 수 없습니다." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "썸네일 만드는 중" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"내보낼 템플릿 APK를 찾을 수 없음:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "잘못된 bundle 식별자:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "공증: 코드 서명이 필요합니다." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "공증: 강화된 런타임이 필요합니다." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "공증: 강화된 런타임이 필요합니다." #: platform/osx/export/export.cpp @@ -14153,6 +14361,69 @@ msgstr "공증: Apple ID 이름이 지정되지 않았습니다." msgid "Notarization: Apple ID password not specified." msgstr "공증: Apple ID 비밀번호가 지정되지 않았습니다." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "잘못된 패키지 단축 이름." @@ -14205,6 +14476,27 @@ msgstr "잘못된 넓은 310x150 로고 이미지 크기 (310x150이어야 합 msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "잘못된 스플래시 스크린 이미지 크기 (620x300이어야 합니다)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "잘못된 경로." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "잘못된 확장자." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "잘못된 제품 GUID." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14561,8 +14853,8 @@ msgid "" "CPUParticles animation requires the usage of a SpatialMaterial whose " "Billboard Mode is set to \"Particle Billboard\"." msgstr "" -"CPUParticles 애니메이션을 사용하려면 Billboard Mode가 \"Particle Billboard" -"\"로 설정된 SpatialMaterial이 필요합니다." +"CPUParticles 애니메이션을 사용하려면 Billboard Mode가 \"Particle " +"Billboard\"로 설정된 SpatialMaterial이 필요합니다." #: scene/3d/gi_probe.cpp msgid "Plotting Meshes" @@ -14624,8 +14916,8 @@ msgstr "Uniform 스케일만 지원됩니다." #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "GPU 기반 파티클은 GLES2 비디오 드라이버에서 지원하지 않습니다.\n" "대신 CPUParticles 노드를 사용하세요. 이 경우 \"CPUParticles로 변환\" 설정을 " @@ -14661,8 +14953,8 @@ msgid "" "PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " "parent Path's Curve resource." msgstr "" -"PathFollow의 ROTATION_ORIENTED는 부모 Path의 Curve 리소스에서 \"Up Vector" -"\"가 켜져 있어야 합니다." +"PathFollow의 ROTATION_ORIENTED는 부모 Path의 Curve 리소스에서 \"Up " +"Vector\"가 켜져 있어야 합니다." #: scene/3d/physics_body.cpp msgid "" @@ -14838,8 +15130,8 @@ msgid "" "WorldEnvironment requires its \"Environment\" property to contain an " "Environment to have a visible effect." msgstr "" -"WorldEnvironment가 시각 이펙트를 갖도록 Environment를 갖고 있는 \"Environment" -"\" 속성이 필요합니다." +"WorldEnvironment가 시각 이펙트를 갖도록 Environment를 갖고 있는 " +"\"Environment\" 속성이 필요합니다." #: scene/3d/world_environment.cpp msgid "" @@ -14902,9 +15194,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "이 노드는 더 이상 사용할 수 없습니다. 대신 AnimationTree를 사용하세요." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "색상: #%s\n" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 53f33e0585..bdbebb1717 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -20,8 +20,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n%10>=2 && (n%100<10 || n" -"%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3;\n" +"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n%10>=2 && (n%100<10 || " +"n%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3;\n" "X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp @@ -515,8 +515,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1378,7 +1378,7 @@ msgid "Bus Options" msgstr "Aprašymas:" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplikuoti" @@ -2178,8 +2178,8 @@ msgstr "Aprašymas:" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3227,8 +3227,14 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" -msgstr "" +#, fuzzy +msgid "Update All Changes" +msgstr "Sukurti Naują" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Sukurti Naują" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -3984,6 +3990,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4103,7 +4117,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Duplicate..." msgstr "Duplikuoti" @@ -4926,19 +4940,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12645,6 +12659,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13988,10 +14010,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Netinkamas šrifto dydis." -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14033,17 +14051,193 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Netinkamas šrifto dydis." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Netinkamas šrifto dydis." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Atsijungti" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Netinkamas šrifto dydis." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Netinkamas šrifto dydis." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Konstanta" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Netinkamas šrifto dydis." #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14054,6 +14248,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14111,6 +14368,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Netinkamas šrifto dydis." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Netinkamas šrifto dydis." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Netinkamas šrifto dydis." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14461,8 +14739,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14707,7 +14985,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 4d888fb41d..2216810855 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -14,7 +14,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" +"PO-Revision-Date: 2022-02-14 22:08+0000\n" "Last-Translator: M E <gruffy7932@gmail.com>\n" "Language-Team: Latvian <https://hosted.weblate.org/projects/godot-engine/" "godot/lv/>\n" @@ -24,7 +24,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " "19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -328,7 +328,7 @@ msgstr "Dublicēt atslēgvietnes" #: editor/animation_track_editor.cpp msgid "Add RESET Value(s)" -msgstr "" +msgstr "Pievienot RESET vērtību(-as)" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" @@ -498,9 +498,8 @@ msgid "" msgstr "Šī iespēja nestrādā ar Bazjē rediģēšanu, jo tai ir tikai viens celiņš." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Add RESET Keys" -msgstr "Anim Mainīt Atslēgas Izmēru" +msgstr "Anim pievienot atiestat. atslēgas" #: editor/animation_track_editor.cpp msgid "" @@ -509,8 +508,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1108,7 +1107,7 @@ msgstr "Kļūme lādējot:" #: editor/dependency_editor.cpp msgid "Load failed due to missing dependencies:" -msgstr "Ielādēšana apturēta, jo trūkst ceļu uz pamata failiem:" +msgstr "Ielādēšana apturēta, jo trūkst pamata faili:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" @@ -1116,7 +1115,7 @@ msgstr "Atvērt jebkurā gadījumā" #: editor/dependency_editor.cpp msgid "Which action should be taken?" -msgstr "Kuru darbību izdarīt?" +msgstr "Kādu darbību veikt ?" #: editor/dependency_editor.cpp msgid "Fix Dependencies" @@ -1375,7 +1374,7 @@ msgid "Bus Options" msgstr "Kopnes Iestatījumi" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Izveidot dublikātu" @@ -1487,7 +1486,7 @@ msgstr "Nederīgs nosaukums." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "Nevar sākt ar ciparu." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -1711,7 +1710,7 @@ msgstr "Pielāgots atkļūdošanas šablons nav atrasts." #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom release template not found." -msgstr "Pielāgots relīzes sablons nav atrasts." +msgstr "Pielāgots relīzes šablons nav atrasts." #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:" @@ -2115,9 +2114,8 @@ msgid "Properties" msgstr "Iestatījumi" #: editor/editor_help.cpp -#, fuzzy msgid "overrides %s:" -msgstr "pārrakstīšana:" +msgstr "pārraksta %s:" #: editor/editor_help.cpp msgid "default:" @@ -2133,7 +2131,7 @@ msgstr "Motīva iestatījumi" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Colors" -msgstr "" +msgstr "Krāsas" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constants" @@ -2141,15 +2139,15 @@ msgstr "Konstantes" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Fonts" -msgstr "" +msgstr "Fonti" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Icons" -msgstr "" +msgstr "Ikonas" #: editor/editor_help.cpp msgid "Styles" -msgstr "" +msgstr "Stili" #: editor/editor_help.cpp msgid "Enumerations" @@ -2168,8 +2166,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Pašreiz šim mainīgajam nav apraksta. Lūdzu, palīdzi mums [color=$color][url=" -"$url]izveidot to[/url][/color]!" +"Pašreiz šim mainīgajam nav apraksta. Lūdzu, palīdzi mums [color=$color]" +"[url=$url]izveidot to[/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2177,11 +2175,11 @@ msgstr "Metožu Apraksts" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Pašreiz šai metodei nav apraksta. Lūdzu, palīdzi mums [color=$color][url=" -"$url]pievienojot vienu[/url][/color]!" +"Pašreiz šai metodei nav apraksta. Lūdzu, palīdzi mums [color=$color]" +"[url=$url]pievienojot vienu[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -2257,18 +2255,19 @@ msgid "Property:" msgstr "Parametrs:" #: editor/editor_inspector.cpp -#, fuzzy msgid "Pin value" -msgstr "(vērtība)" +msgstr "Piespraust vērtību" #: editor/editor_inspector.cpp msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "" +"Vērtības piespraušana liek to saglabāt, pat ja tā ir vienāda ar noklusējuma " +"vērtību." #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" -msgstr "" +msgstr "Pin vērtība [Atspējota, jo \"%s\" ir paredzēts tikai redaktoram]" #: editor/editor_inspector.cpp editor/scene_tree_dock.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -2283,26 +2282,23 @@ msgstr "Uzlikt vairākus:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "" +msgstr "Piesprausts %s" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "" +msgstr "Atsprausts %s" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" -msgstr "Kopēt iestatījumus" +msgstr "Kopēt mainīgo" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" -msgstr "Ielīmēt iestatījumus" +msgstr "Ielīmēt mainīgo" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "Kopēt mezgla ceļu" +msgstr "Kopēt mainīgā ceļu" #: editor/editor_log.cpp msgid "Output:" @@ -2536,18 +2532,25 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Šis resurss pieder ainai, kas ir importēta, tādēļ to nevar rediģēt.\n" +"Lūdzu, lasiet dokumentāciju par ainu importēšanu, lai labāk saprastu šo " +"darbplūsmu." #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it won't be kept when saving the current scene." msgstr "" +"Šis resurss pieder ainai, kas ir instancēta vai mantota.\n" +"Izmaiņas tajā netiks saglabātas, saglabājot pašreizējo ainu." #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"Šis resurss tika importēts, tāpēc to nevar rediģēt. Mainiet tā iestatījumus " +"importēšanas panelī un pēc tam importējiet atkārtoti." #: editor/editor_node.cpp msgid "" @@ -2567,6 +2570,9 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"Šis ir attālināts objekts, tāpēc tā izmaiņas netiks saglabātas.\n" +"Lūdzu, izlasiet dokumentāciju, kas attiecas uz atkļūdošanu, lai labāk " +"izprastu šo darbplūsmu." #: editor/editor_node.cpp msgid "There is no defined scene to run." @@ -2625,6 +2631,8 @@ msgid "" "A root node is required to save the scene. You can add a root node using the " "Scene tree dock." msgstr "" +"Lai saglabātu ainu, ir nepieciešams saknes mezgls. Saknes mezglu var " +"pievienot, izmantojot ainas koka doku." #: editor/editor_node.cpp msgid "Save Scene As..." @@ -2668,15 +2676,15 @@ msgstr "Atgriezts: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." -msgstr "" +msgstr "Nevar atgriezt, kad peles pogas ir nospiestas." #: editor/editor_node.cpp msgid "Nothing to redo." -msgstr "" +msgstr "Nav ko pārstrādāt." #: editor/editor_node.cpp msgid "Redo: %s" -msgstr "" +msgstr "Atkārtot: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -2691,6 +2699,8 @@ msgid "" "The current scene has unsaved changes.\n" "Reload the saved scene anyway? This action cannot be undone." msgstr "" +"Pašreizējai ainai ir nesaglabātas izmaiņas.\n" +"Vai tomēr pārlādēt saglabāto ainu? Šo darbību nevar atsaukt." #: editor/editor_node.cpp msgid "Quick Run Scene..." @@ -2747,7 +2757,7 @@ msgstr "Atvērt Aizvērto Ainu" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." -msgstr "" +msgstr "Nevar iespējot spraudni: '%s' konfigurācijas parsēšana neizdevās." #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: '%s'." @@ -2763,11 +2773,16 @@ msgid "" "error in that script.\n" "Disabling the addon at '%s' to prevent further errors." msgstr "" +"Nevar ielādēt spraudņa skriptu no: '%s'. Tā iemesls var būt kļūda šajā " +"slripta kodā.\n" +"Spraudnis '%s' atspējots, lai novērstu tupmākās kļūdas." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" +"Nevar ielādēt papildinājuma skriptu no ceļa: '%s' Bāzes tips nav " +"EditorPlugin." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." @@ -2779,12 +2794,16 @@ msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"Aina '%s' tika importēta automātiski, tāpēc to nevar modificēt.\n" +"Lai tajā veiktu izmaiņas, izveidojiet jaunu pārmantotu ainu." #: editor/editor_node.cpp msgid "" "Error loading scene, it must be inside the project path. Use 'Import' to " "open the scene, then save it inside the project path." msgstr "" +"Kļūda ielādējot ainu, tai jābūt projekta ceļā. Izmantojiet 'Importēt', lai " +"atvērtu ainu, pēc tam saglabājiet to projekta ceļā." #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" @@ -2800,6 +2819,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Galvenā aina vēl nav definēta, izvēlēties tagad?\n" +"To var mainīt vēlāk projekta Iestatījumos sadaļā 'aplikācija'." #: editor/editor_node.cpp msgid "" @@ -2807,6 +2828,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Izvēlētā aina '%s' nepastāv, izvēlieties derīgu?\n" +"To var mainīt vēlāk \"Projekta iestatījumi\" sadaļā 'lietojumprogramma'." #: editor/editor_node.cpp msgid "" @@ -2814,6 +2837,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Izvēlētā aina '%s' nav ainas fails, izvēlieties derīgu?\n" +"To var mainīt vēlāk projekta iestatījumos sadaļā 'aplikācija'." #: editor/editor_node.cpp msgid "Save Layout" @@ -2879,11 +2904,11 @@ msgstr "Doka pozīcija" #: editor/editor_node.cpp msgid "Distraction Free Mode" -msgstr "" +msgstr "Traucējumu brīvs režīms" #: editor/editor_node.cpp msgid "Toggle distraction-free mode." -msgstr "" +msgstr "Pārslēgt traucējumu brīvo režīmu." #: editor/editor_node.cpp msgid "Add a new scene." @@ -2915,7 +2940,7 @@ msgstr "Filtrēt failus..." #: editor/editor_node.cpp msgid "Operations with scene files." -msgstr "" +msgstr "Darbības ar ainas failiem." #: editor/editor_node.cpp msgid "New Scene" @@ -2927,7 +2952,7 @@ msgstr "Jauna mantota aina..." #: editor/editor_node.cpp msgid "Open Scene..." -msgstr "" +msgstr "Atvērt ainu..." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" @@ -2943,11 +2968,11 @@ msgstr "Konvertēt Uz..." #: editor/editor_node.cpp msgid "MeshLibrary..." -msgstr "" +msgstr "TīklaBibliotēka..." #: editor/editor_node.cpp msgid "TileSet..." -msgstr "" +msgstr "FlīžuKomplekts..." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -2993,9 +3018,8 @@ msgid "Install Android Build Template..." msgstr "Instalēt Android būves šablonu..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Atvērt redaktora datu mapi" +msgstr "Atvērt lietotāja datu mapi" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3217,7 +3241,7 @@ msgstr "Apstādināt ainu." #: editor/editor_node.cpp msgid "Play the edited scene." -msgstr "" +msgstr "Atskaņot rediģēto ainu." #: editor/editor_node.cpp msgid "Play Scene" @@ -3225,15 +3249,15 @@ msgstr "Spēlēt Ainu" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "" +msgstr "Atskaņot pielāgotu ainu" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "" +msgstr "Atskaņot pielāgotu ainu" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." -msgstr "" +msgstr "Lai nomainītu video draiveri, ir jāpārstartē redaktors." #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp @@ -3245,7 +3269,13 @@ msgid "Update Continuously" msgstr "Nepārtraukti Atjaunot" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" +msgstr "Atjaunot Kad Mainīts" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" msgstr "Atjaunot Kad Mainīts" #: editor/editor_node.cpp @@ -3262,7 +3292,7 @@ msgstr "Inspektors" #: editor/editor_node.cpp msgid "Expand Bottom Panel" -msgstr "" +msgstr "Izvērst apakšējo paneli" #: editor/editor_node.cpp msgid "Output" @@ -3274,15 +3304,15 @@ msgstr "Nesaglabāt" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." -msgstr "" +msgstr "Trūkst Android būves šablonu, lūdzu, instalējiet atbilstošos šablonus." #: editor/editor_node.cpp msgid "Manage Templates" -msgstr "" +msgstr "Pārvaldīt šablonus" #: editor/editor_node.cpp msgid "Install from file" -msgstr "" +msgstr "Instalēt no faila" #: editor/editor_node.cpp msgid "Select android sources file" @@ -3315,15 +3345,15 @@ msgstr "" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "" +msgstr "Importēr šablonus no ZIP faila" #: editor/editor_node.cpp msgid "Template Package" -msgstr "" +msgstr "Šablona pakotne" #: editor/editor_node.cpp modules/gltf/editor_scene_exporter_gltf_plugin.cpp msgid "Export Library" -msgstr "" +msgstr "Eksportēt bibliotēku" #: editor/editor_node.cpp msgid "Merge With Existing" @@ -3501,7 +3531,7 @@ msgstr "Rediģēt Tekstu:" #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" -msgstr "" +msgstr "Ieslēgts" #: editor/editor_properties.cpp msgid "Layer" @@ -3667,9 +3697,8 @@ msgstr "Importēt no mezgla:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Kļūda!" +msgstr "%s Kļūda" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -3980,6 +4009,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4092,7 +4129,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Dublicēt..." @@ -4189,9 +4226,8 @@ msgid "Replace..." msgstr "Aizvietot..." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Replace in Files" -msgstr "Aizvietot visu" +msgstr "Aizvietot failos" #: editor/find_in_files.cpp msgid "Find: " @@ -4202,9 +4238,8 @@ msgid "Replace: " msgstr "Aizvietot: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace All (NO UNDO)" -msgstr "Aizvietot visu" +msgstr "Aizvietot visu (Nevar atsaukt)" #: editor/find_in_files.cpp msgid "Searching..." @@ -4880,19 +4915,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -5845,9 +5880,8 @@ msgid "Alt+Drag: Move selected node." msgstr "Alt+Bīdīt: Pārvietot izvēlēto mezglu." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Scale selected node." -msgstr "Alt+Bīdīt: Pārvietot izvēlēto mezglu." +msgstr "Alt+Bīdīt: Pielāgo mērogu izvēlētajam mezglam." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "V: Set selected node's pivot position." @@ -5976,9 +6010,8 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected Node(s)" -msgstr "Dzēst mezglu(s)" +msgstr "Aizslēgt izvēlēto mezglu(s)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5987,9 +6020,8 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected Node(s)" -msgstr "Dzēst mezglu(s)" +msgstr "Atslēgt izvēlēto muzglu(s)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -7537,7 +7569,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" -msgstr "" +msgstr "Grāmatzīmes" #: editor/plugins/script_text_editor.cpp msgid "Breakpoints" @@ -7546,7 +7578,7 @@ msgstr "Pārrāvumpunkts" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Go To" -msgstr "" +msgstr "Iet uz" #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -7637,7 +7669,7 @@ msgstr "Doties uz iepriekšējo grāmatzīmi" #: editor/plugins/script_text_editor.cpp msgid "Remove All Bookmarks" -msgstr "" +msgstr "Noņemt visas grāmatzīmes" #: editor/plugins/script_text_editor.cpp msgid "Go to Function..." @@ -8869,9 +8901,8 @@ msgid "Available Node-based types:" msgstr "Pieejamie Profili:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Type name is empty!" -msgstr "Faila Nosaukums nav definēts." +msgstr "Tipa nosaukums ir tukšs!" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9491,19 +9522,16 @@ msgid "Commit" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Ēnotāja izmaiņas:" +msgstr "Soļu izmaiņas" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Ēnotāja izmaiņas:" +msgstr "Neiestudētas izmaiņas" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "Komūns" +msgstr "Izdarīt:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" @@ -9575,19 +9603,16 @@ msgid "Detect new changes" msgstr "Atrast jaunas izmaiņas" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "Aizvērt un saglabāt izmaiņas?" +msgstr "Atmest visas izmaiņas" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "Saglabā lokālās izmaiņas..." +msgstr "Visu izmaiņu posms" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "Saglabā lokālās izmaiņas..." +msgstr "Atcelt visas izmaiņas" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -9620,9 +9645,8 @@ msgid "30" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Sakritības:" +msgstr "Zari" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -9654,9 +9678,8 @@ msgid "Remove Remote" msgstr "Noņemt vienumu" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Mezgla Vārds:" +msgstr "Attālais vārds" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -9700,9 +9723,8 @@ msgid "Unmerged" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "Skatīt" +msgstr "Skatīt:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Split" @@ -12358,6 +12380,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13673,10 +13703,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Nederīgs Identifikators:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13717,16 +13743,193 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nederīgs projekta nosaukums." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Neizdevās izveidot mapi." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Nederīgs bāzes ceļš." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Bērna process savienots." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Nederīgs paplašinājums." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Nederīgs paplašinājums." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Izveido sīktēlu" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Nederīgs bunduļa identifikators:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13737,6 +13940,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nederīgs paketes īsais nosaukums." @@ -13789,6 +14055,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Nederīgs ceļš." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Nederīgs paplašinājums." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Nederīgs produkta GUID." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14139,8 +14426,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14380,7 +14667,7 @@ msgstr "Šis mezgls ir novecojis. Tā vietā izmanto AnimationTree." #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/mi.po b/editor/translations/mi.po index 52b6fecb05..745e54d697 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -488,8 +488,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1323,7 +1323,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2096,8 +2096,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3122,7 +3122,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3846,6 +3850,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3958,7 +3970,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4744,19 +4756,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12183,6 +12195,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13474,10 +13494,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13518,16 +13534,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13538,6 +13724,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13590,6 +13839,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13940,8 +14207,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14181,7 +14448,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/mk.po b/editor/translations/mk.po index 8448673f6c..38ee72ff58 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -496,8 +496,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1331,7 +1331,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2105,8 +2105,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3134,7 +3134,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3859,6 +3863,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3971,7 +3983,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4760,19 +4772,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12208,6 +12220,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13500,10 +13520,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13544,16 +13560,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13564,6 +13750,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13616,6 +13865,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13966,8 +14233,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14207,7 +14474,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index b6e14ce0cb..085e4e1af3 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -500,8 +500,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1336,7 +1336,7 @@ msgid "Bus Options" msgstr "പ്രവൃത്തികൾ:" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2110,8 +2110,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3141,7 +3141,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3866,6 +3870,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3978,7 +3990,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4768,19 +4780,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12216,6 +12228,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13513,10 +13533,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13557,16 +13573,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13577,6 +13763,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13629,6 +13878,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13979,8 +14246,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14220,7 +14487,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index 4e1324414e..d3faab3d90 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -496,8 +496,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1331,7 +1331,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2104,8 +2104,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3132,7 +3132,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3857,6 +3861,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3969,7 +3981,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4755,19 +4767,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12209,6 +12221,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13503,10 +13523,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13547,16 +13563,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13567,6 +13753,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13619,6 +13868,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13969,8 +14236,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14210,7 +14477,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 7fc1062ff2..71c60c4921 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -16,7 +16,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" +"PO-Revision-Date: 2022-02-03 13:04+0000\n" "Last-Translator: Keviindran Ramachandran <keviinx@yahoo.com>\n" "Language-Team: Malay <https://hosted.weblate.org/projects/godot-engine/godot/" "ms/>\n" @@ -25,7 +25,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -510,8 +510,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -520,8 +520,8 @@ msgstr "" "\n" "Untuk memberikan keupayaan untuk menambah trek tersuai, navigasi ke tetapan " "import adegan dan tetapkan\n" -"\"Animasi > Simpanan\" ke \"Fail\", aktifkan \"Animasi > Simpan Trek Tersuai" -"\", kemudian import semula.\n" +"\"Animasi > Simpanan\" ke \"Fail\", aktifkan \"Animasi > Simpan Trek " +"Tersuai\", kemudian import semula.\n" "Sebagai alternatif, gunakan pratetap import yang mengimportkan animasi untuk " "memisahkan fail." @@ -567,7 +567,7 @@ msgstr "FPS" #: editor/project_settings_editor.cpp editor/property_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Edit" -msgstr "Edit" +msgstr "Sunting" #: editor/animation_track_editor.cpp msgid "Animation properties." @@ -931,8 +931,8 @@ msgstr "Edit Sambungan:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" -"Adakah anda pasti anda mahu mengeluarkan semua sambungan dari isyarat \"% s" -"\"?" +"Adakah anda pasti anda mahu mengeluarkan semua sambungan dari isyarat \"% " +"s\"?" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" @@ -1377,7 +1377,7 @@ msgid "Bus Options" msgstr "Pilihan Bas" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Pendua" @@ -2181,8 +2181,8 @@ msgstr "Penerangan Kaedah" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Tiada keterangan untuk kaedah ini. Tolong bantu kami dengan [color=$color]" "[url=$url]menyumbang satu[/url][/color]!" @@ -3032,9 +3032,8 @@ msgid "Install Android Build Template..." msgstr "Pasang Templat Binaan Android..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Buka Folder Data Editor" +msgstr "Buka Folder Data Pengguna" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3305,10 +3304,16 @@ msgid "Update Continuously" msgstr "Kemas Kini Secara Berterusan" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Kemas Kini Apabila Diubah" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Perubahan Bahan:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Sembunyikan Spinner Kemas Kini" @@ -3754,9 +3759,8 @@ msgstr "Import Dari Nod:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Ralat!" +msgstr "%s Ralat" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4075,6 +4079,14 @@ msgstr "Nama mengandungi aksara yang tidak sah." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4193,7 +4205,7 @@ msgstr "Susun mengikut Terakhir Diubah Suai" msgid "Sort by First Modified" msgstr "Susun mengikut Pertama Diubah Suai" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Penduakan..." @@ -4471,7 +4483,7 @@ msgstr "Pengimport:" #: editor/import_defaults_editor.cpp msgid "Reset to Defaults" -msgstr "Set Semula ke Lalai" +msgstr "Memulihkan ke Keadaan Asli" #: editor/import_dock.cpp msgid "Keep File (No Import)" @@ -5007,6 +5019,10 @@ msgid "Rename Animation" msgstr "Namakan Semula Animasi" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Gandakan Animasi" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Adun Berubah Seterusnya" @@ -5019,10 +5035,6 @@ msgid "Load Animation" msgstr "Muatkan Animasi" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Gandakan Animasi" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Tiada animasi untuk disalin!" @@ -5393,35 +5405,35 @@ msgstr "Nod Blend4" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "TimeScale Node" -msgstr "" +msgstr "Nod TimeScale" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "TimeSeek Node" -msgstr "" +msgstr "Nod TimeSeek" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Transition Node" -msgstr "" +msgstr "Nod Peralihan" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Import Animations..." -msgstr "" +msgstr "Import Animasi..." #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Edit Node Filters" -msgstr "" +msgstr "Sunting Filter Nod" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Filters..." -msgstr "" +msgstr "Filter..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" -msgstr "" +msgstr "Kandungan:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "View Files" -msgstr "" +msgstr "Lihat Fail" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download" @@ -5429,7 +5441,7 @@ msgstr "Muat turun" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connection error, please try again." -msgstr "" +msgstr "Ralat sambungan, sila cuba lagi." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect." @@ -5437,11 +5449,11 @@ msgstr "Tidak dapat menyambung." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect to host:" -msgstr "" +msgstr "Tidak dapat menyambung ke hos:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response from host:" -msgstr "" +msgstr "Tiada respons daripada hos:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response." @@ -5449,7 +5461,7 @@ msgstr "Tiada jawapan." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve hostname:" -msgstr "" +msgstr "Tidak dapat menyelesaikan nama hos:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve." @@ -5457,31 +5469,31 @@ msgstr "Tidak dapat menyelesaikan." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, return code:" -msgstr "" +msgstr "Permintaan gagal, kod pulangan:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Cannot save response to:" -msgstr "" +msgstr "Tidak dapat menyimpan respons kepada:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Write error." -msgstr "" +msgstr "Ralat tulis." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" -msgstr "" +msgstr "Permintaan gagal, terlalu banyak ubah hala" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Redirect loop." -msgstr "" +msgstr "Ubah hala gelung." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, timeout" -msgstr "" +msgstr "Permintaan gagal, tamat masa" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Timeout." -msgstr "" +msgstr "Masa tamat." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" @@ -5489,409 +5501,416 @@ msgstr "Gagal:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." -msgstr "" +msgstr "Hash muat turun buruk, dengan andaian fail telah diusik." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" -msgstr "" +msgstr "Dijangka:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Got:" -msgstr "" +msgstr "Mendapat:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed SHA-256 hash check" -msgstr "" +msgstr "Semakan hash SHA-256 gagal" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" -msgstr "" +msgstr "Ralat Muat Turun Aset:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Downloading (%s / %s)..." -msgstr "" +msgstr "Memuat turun (%s / %s)..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Downloading..." -msgstr "" +msgstr "Memuat turun..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Resolving..." -msgstr "" +msgstr "Menyelesaikan..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Error making request" -msgstr "" +msgstr "Ralat membuat permintaan" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Idle" -msgstr "" +msgstr "Terbiar" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Install..." -msgstr "" +msgstr "Pasang..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" -msgstr "" +msgstr "Cuba semula" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download Error" -msgstr "" +msgstr "Ralat Muat Turun" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "" +msgstr "Muat turun untuk aset ini sedang dijalankan!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Recently Updated" -msgstr "" +msgstr "Dikemaskini Baru-baru Ini" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Least Recently Updated" -msgstr "" +msgstr "Paling Kurang Dikemaskini Baru-Baru Ini" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Name (A-Z)" -msgstr "" +msgstr "Nama (A-Z)" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Name (Z-A)" -msgstr "" +msgstr "Nama (Z-A)" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "License (A-Z)" -msgstr "Lesen" +msgstr "Lesen (A-Z)" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "License (Z-A)" -msgstr "Lesen" +msgstr "Lesen (Z-A)" #: editor/plugins/asset_library_editor_plugin.cpp msgid "First" -msgstr "" +msgstr "Pertama" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Previous" -msgstr "" +msgstr "Sebelum" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Next" -msgstr "" +msgstr "Seterusnya" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Last" -msgstr "" +msgstr "Terakhir" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" -msgstr "" +msgstr "Semua" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search templates, projects, and demos" -msgstr "" +msgstr "Cari templat, projek dan demo" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search assets (excluding templates, projects, and demos)" -msgstr "" +msgstr "Cari aset (tidak termasuk templat, projek dan demo)" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." -msgstr "" +msgstr "Import..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Plugins..." -msgstr "" +msgstr "Pemalam..." #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Sort:" -msgstr "" +msgstr "Isih:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Category:" -msgstr "" +msgstr "Kategori:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Site:" -msgstr "" +msgstr "Laman:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Support" -msgstr "" +msgstr "Sokongan" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Official" -msgstr "" +msgstr "Rasmi" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Testing" -msgstr "" +msgstr "Menguji" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Loading..." -msgstr "" +msgstr "Memuatkan..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" -msgstr "" +msgstr "Fail ZIP Aset" #: editor/plugins/audio_stream_editor_plugin.cpp msgid "Audio Preview Play/Pause" -msgstr "" +msgstr "Main/Jeda Pratonton Audio" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Can't determine a save path for lightmap images.\n" "Save your scene and try again." msgstr "" +"Tidak dapat menentukan laluan simpan untuk imej lightmap.\n" +"Simpan adegan anda dan cuba lagi." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "No meshes to bake. Make sure they contain an UV2 channel and that the 'Use " "In Baked Light' and 'Generate Lightmap' flags are on." msgstr "" +"Tiada mesh untuk di-bake. Pastikan ia mengandungi saluran UV2 dan bendera " +"'Use In Baked Light' dan 'Generate Lightman' dihidupkan." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed creating lightmap images, make sure path is writable." -msgstr "" +msgstr "Gagal mencipta imej lightmap, pastikan laluan boleh ditulis." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" -msgstr "" +msgstr "Gagal menentukan saiz lightmap. Saiz lightmap maksimum 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 "" +"Sesetengah mesh tidak sah. Pastikan nilai saluran UV2 terkandung dalam " +"kawasan 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 dibina tanpa sokongan ray tracing, lightmap tidak dapat di-bake." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" -msgstr "" +msgstr "Bake Lightmap" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Select lightmap bake file:" -msgstr "" +msgstr "Pilih fail lightmap bake:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Preview" -msgstr "" +msgstr "Pratonton" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" -msgstr "" +msgstr "Konfigurasikan Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Offset:" -msgstr "" +msgstr "Grid Offset:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Step:" -msgstr "" +msgstr "Langkah Grid:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Primary Line Every:" -msgstr "" +msgstr "Garis Utama Setiap:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "steps" -msgstr "" +msgstr "langkah-langkah" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" -msgstr "" +msgstr "Offset Putaran:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Step:" -msgstr "" +msgstr "Langkah Putaran:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale Step:" -msgstr "" +msgstr "Langkah Skala:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" -msgstr "" +msgstr "Alih Panduan Menegak" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Vertical Guide" -msgstr "" +msgstr "Cipta Panduan Menegak" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Remove Vertical Guide" -msgstr "" +msgstr "Keluarkan Panduan Menegak" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Horizontal Guide" -msgstr "" +msgstr "Alihkan Panduan Mendatar" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Horizontal Guide" -msgstr "" +msgstr "Cipta Panduan Mendatar" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" -msgstr "Buang Trek Anim" +msgstr "Keluarkan Panduan Mendatar" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Horizontal and Vertical Guides" -msgstr "" +msgstr "Cipta Panduan Mendatar dan Menegak" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" -msgstr "" +msgstr "Tetapkan Offset Pivot CanvasItem \"%s\" kepada (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate %d CanvasItems" -msgstr "" +msgstr "Putar %d CanvasItems" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate CanvasItem \"%s\" to %d degrees" -msgstr "" +msgstr "Putar CanvasItem \"%s\" ke %d darjah" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move CanvasItem \"%s\" Anchor" -msgstr "" +msgstr "Alih CanvasItem \"%s\" Anchor" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale Node2D \"%s\" to (%s, %s)" -msgstr "" +msgstr "Skala Node2D \"%s\" ke (%s, %s)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Resize Control \"%s\" to (%d, %d)" -msgstr "" +msgstr "Ubah Saiz Kawalan \"%s\" kepada (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale %d CanvasItems" -msgstr "" +msgstr "Skala %d CanvasItems" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale CanvasItem \"%s\" to (%s, %s)" -msgstr "" +msgstr "Skalakan CanvasItem \"%s\" kepada (%s, %s)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move %d CanvasItems" -msgstr "" +msgstr "Alihkan %d CanvasItems" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move CanvasItem \"%s\" to (%d, %d)" -msgstr "" +msgstr "Alihkan CanvasItem \"%s\" ke (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Locked" -msgstr "" +msgstr "Terkunci" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Grouped" -msgstr "Kumpulan" +msgstr "Terkumpul" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" "Children of containers have their anchors and margins values overridden by " "their parent." msgstr "" +"Anak-anak bekas mempunyai nilai sauh dan margin mereka yang ditindih oleh " +"ibu bapa mereka." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Presets for the anchors and margins values of a Control node." -msgstr "" +msgstr "Pratetap untuk nilai sauh dan margin bagi nod Control." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" "When active, moving Control nodes changes their anchors instead of their " "margins." msgstr "" +"Apabila aktif, mengalihkan nod Control mengubah sauh mereka dan bukannya " +"margin." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Top Left" -msgstr "" +msgstr "Atas Kiri" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Top Right" -msgstr "" +msgstr "Atas Kanan" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Bottom Right" -msgstr "" +msgstr "Bawah Kanan" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Bottom Left" -msgstr "" +msgstr "Bawah Kiri" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Left" -msgstr "" +msgstr "Tengah Kiri" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Top" -msgstr "" +msgstr "Tengah Atas" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Right" -msgstr "" +msgstr "Tengah Kanan" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Bottom" -msgstr "" +msgstr "Tengah Bawah" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center" -msgstr "" +msgstr "Tengah" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Left Wide" -msgstr "" +msgstr "Kiri Lebar" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Top Wide" -msgstr "" +msgstr "Atas Lebar" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Right Wide" -msgstr "" +msgstr "Kanan Lebar" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Bottom Wide" -msgstr "" +msgstr "Bawah Lebar" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "VCenter Wide" -msgstr "" +msgstr "VCenter Lebar" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "HCenter Wide" -msgstr "" +msgstr "HCenter Lebar" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Full Rect" -msgstr "" +msgstr "Penuh Rect" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Keep Ratio" -msgstr "" +msgstr "Kekalkan Nisbah" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" -msgstr "" +msgstr "Sauh sahaja" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors and Margins" -msgstr "" +msgstr "Tukar Sauh dan Margin" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors" -msgstr "" +msgstr "Tukar Sauh" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5899,6 +5918,9 @@ msgid "" "Project Camera Override\n" "Overrides the running project's camera with the editor viewport camera." msgstr "" +"Penggantian Kamera Projek\n" +"Menggantikan kamera projek yang sedang berjalan dengan kamera viewport " +"editor." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5907,120 +5929,120 @@ msgid "" "No project instance running. Run the project from the editor to use this " "feature." msgstr "" +"Penggantian Kamera Projek\n" +"Tiada instance projek berjalan. Jalankan projek daripada editor menggunakan " +"ciri ini." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" -msgstr "" +msgstr "Kunci Dipilih" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Unlock Selected" -msgstr "" +msgstr "Buka Kunci Dipilih" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected" -msgstr "Semua Pilihan" +msgstr "Kumpulan Dipilih" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected" -msgstr "Semua Pilihan" +msgstr "Nyahkumpulan Dipilih" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" -msgstr "" +msgstr "Tampal Pose" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Guides" -msgstr "Anim Ubah Penukaran" +msgstr "Kosongkan Panduan" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Custom Bone(s) from Node(s)" -msgstr "" +msgstr "Cipta Tulang(-tulang) Tersuai dari Nod(-nod)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Bones" -msgstr "Anim Ubah Penukaran" +msgstr "Kosongkan Tulang" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" -msgstr "" +msgstr "Buat Rantai IK" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear IK Chain" -msgstr "" +msgstr "Kosongkan Rantai IK" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" "Warning: Children of a container get their position and size determined only " "by their parent." msgstr "" +"Amaran: Kanak-kanak bekas mendapat kedudukan dan saiz mereka hanya " +"ditentukan oleh ibu bapa mereka." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp msgid "Zoom Reset" -msgstr "" +msgstr "Zum Set Semula" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Select Mode" -msgstr "" +msgstr "Pilih Mod" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Drag: Rotate selected node around pivot." -msgstr "" +msgstr "Seret: Putar nod terpilih di sekeliling pangsi." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Move selected node." -msgstr "Padam Rect yang dipilih." +msgstr "Alt+Seret: Pindahkan nod terpilih." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Scale selected node." -msgstr "Padam Rect yang dipilih." +msgstr "Alt+Seret: Skalakan nod terpilih." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "V: Set selected node's pivot position." -msgstr "Node yang dipilih bukan Viewport!" +msgstr "V: Tetapkan kedudukan pangsi nod terpilih." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Alt+RMB: Show list of all nodes at position clicked, including locked." msgstr "" +"Alt+RMB: Tunjukkan senarai semua nod pada kedudukan yang diklik, termasuk " +"yang dikunci." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "RMB: Add node at position clicked." -msgstr "" +msgstr "RMB: Tambah nod pada kedudukan yang diklik." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode" -msgstr "" +msgstr "Mod Alih" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Mode" -msgstr "" +msgstr "Mod Putar" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Mode" -msgstr "" +msgstr "Mod Skala" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Shift: Scale proportionally." -msgstr "" +msgstr "Shift: Skala secara berkadar." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6028,208 +6050,206 @@ msgid "" "Show a list of all objects at the position clicked\n" "(same as Alt+RMB in select mode)." msgstr "" +"Tunjukkan senarai semua objek pada kedudukan yang diklik\n" +"(sama seperti Alt+RMB dalam mod pilih)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Click to change object's rotation pivot." -msgstr "" +msgstr "Klik untuk menukar pangsi putaran objek." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan Mode" -msgstr "" +msgstr "Mod Pan" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Ruler Mode" -msgstr "" +msgstr "Mod Pembaris" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle smart snapping." -msgstr "" +msgstr "Togol snap pintar." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Smart Snap" -msgstr "" +msgstr "Gunakan Smart Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle grid snapping." -msgstr "" +msgstr "Togol grid menyentap." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Grid Snap" -msgstr "" +msgstr "Gunakan Grid Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" -msgstr "" +msgstr "Pilihan Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" -msgstr "" +msgstr "Gunakan Snap Putaran" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Scale Snap" -msgstr "" +msgstr "Gunakan Skala Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" -msgstr "" +msgstr "Snap Relatif" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" -msgstr "" +msgstr "Gunakan Pixel Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart Snapping" -msgstr "" +msgstr "Snap Pintar" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Configure Snap..." -msgstr "" +msgstr "Konfigurasikan Snap..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Parent" -msgstr "" +msgstr "Snap kepada Ibu Bapa" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Node Anchor" -msgstr "" +msgstr "Snap ke Anchor Nod" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Node Sides" -msgstr "" +msgstr "Snap ke Sisi Nod" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Node Center" -msgstr "" +msgstr "Snap ke Pusat Nod" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Other Nodes" -msgstr "" +msgstr "Snap ke Nod Lain" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Guides" -msgstr "" +msgstr "Snap ke Panduan" #: 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 "Kunci objek terpilih di tempatnya (tidak dapat dialihkan)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected Node(s)" -msgstr "Semua Pilihan" +msgstr "Kunci Nod Terpilih" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Unlock the selected object (can be moved)." -msgstr "" +msgstr "Buka kunci objek terpilih (boleh dialihkan)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected Node(s)" -msgstr "Gandakan Kunci Terpilih" +msgstr "Buka Kunci Nod Terpilih" #: 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 "Pastikan kanak-kanak objek tidak boleh dipilih." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected Node(s)" -msgstr "Semua Pilihan" +msgstr "Kumpulkan Nod Terpilih" #: 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 "Mengembalikan keupayaan kanak-kanak objek untuk dipilih." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected Node(s)" -msgstr "Semua Pilihan" +msgstr "Nyahkumpulkan Nod Terpilih" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton Options" -msgstr "" +msgstr "Pilihan Rangka" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Bones" -msgstr "" +msgstr "Tunjukkan Tulang-tulang" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make Custom Bone(s) from Node(s)" -msgstr "" +msgstr "Buat Tulang(-tulang) Tersuai dari Nod(-nod)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Custom Bones" -msgstr "" +msgstr "Kosongkan Tulang Tersuai" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "View" -msgstr "" +msgstr "Pandangan" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Always Show Grid" -msgstr "" +msgstr "Sentiasa Tunjukkan Grid" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" -msgstr "" +msgstr "Tunjukkan Pembantu" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Rulers" -msgstr "" +msgstr "Tunjukkan Pembaris" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Guides" -msgstr "" +msgstr "Tunjukkan Panduan" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Origin" -msgstr "" +msgstr "Tunjukkan Asal" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Viewport" -msgstr "" +msgstr "Tunjukkan Viewport" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Group And Lock Icons" -msgstr "" +msgstr "Tunjukkan Ikon Kumpulan Dan Kunci" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" -msgstr "" +msgstr "Pemilihan Pusat" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "" +msgstr "Pemilihan Bingkai" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" -msgstr "" +msgstr "Pratonton Skala Kanvas" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." -msgstr "" +msgstr "Topeng terjemahan untuk memasukkan kekunci." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation mask for inserting keys." -msgstr "" +msgstr "Topeng putaran untuk memasukkan kekunci." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale mask for inserting keys." -msgstr "" +msgstr "Topeng skala untuk memasukkan kekunci." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert keys (based on mask)." -msgstr "" +msgstr "Masukkan kekunci (berdasarkan topeng)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6238,328 +6258,326 @@ msgid "" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." msgstr "" +"Masukkan kekunci automatik apabila objek diterjemahkan, diputarkan atau " +"diskalakan (berdasarkan topeng).\n" +"Kekunci hanya ditambahkan pada trek sedia ada, tiada trek baru akan " +"dicipta.\n" +"Kekunci mesti dimasukkan secara manual untuk kali pertama." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Auto Insert Key" -msgstr "" +msgstr "Auto Masukkan Kunci" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Animation Key and Pose Options" -msgstr "" +msgstr "Pilihan Kunci Animasi dan Pose" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" -msgstr "" +msgstr "Masukkan Kunci (Trek Sedia Ada)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Copy Pose" -msgstr "" +msgstr "Salin Pose" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Pose" -msgstr "" +msgstr "Kosongkan Pose" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Add Node Here" -msgstr "Tambah Titik Nod" +msgstr "Tambah Nod Di Sini" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Instance Scene Here" -msgstr "Masukkan Kunci di Sini" +msgstr "Adegan Contoh Di Sini" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "" +msgstr "Darabkan langkah grid dengan 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "" +msgstr "Bahagikan langkah grid dengan 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan View" -msgstr "" +msgstr "Pandangan Pan" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 3.125%" -msgstr "" +msgstr "Zum ke 3.125%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 6.25%" -msgstr "" +msgstr "Zum ke 6.25%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 12.5%" -msgstr "" +msgstr "Zum ke 12.5%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 25%" -msgstr "Zum Keluar" +msgstr "Zum ke 25%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 50%" -msgstr "Zum Keluar" +msgstr "Zum ke 50%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 100%" -msgstr "Zum Keluar" +msgstr "Zum ke 100%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 200%" -msgstr "Zum Keluar" +msgstr "Zum ke 200%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 400%" -msgstr "Zum Keluar" +msgstr "Zum ke 400%" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom to 800%" -msgstr "Zum Keluar" +msgstr "Zum ke 800%" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 1600%" -msgstr "" +msgstr "Zum ke 1600%" #: editor/plugins/canvas_item_editor_plugin.cpp #: modules/visual_script/visual_script_func_nodes.cpp msgid "Add %s" -msgstr "" +msgstr "Tambah %s" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Adding %s..." -msgstr "" +msgstr "Menambah %s..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Cannot instantiate multiple nodes without root." -msgstr "" +msgstr "Tidak boleh instantiate berbilang nod tanpa akar." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Create Node" -msgstr "" +msgstr "Cipta Nod" #: 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 "Ralat membuat adegan dari %s" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Default Type" -msgstr "" +msgstr "Tukar Jenis Lalai" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" "Drag & drop + Shift : Add node as sibling\n" "Drag & drop + Alt : Change node type" msgstr "" +"Seret & lepas + Shift : Tambah nod sebagai adik-beradik\n" +"Seret & lepas + Alt : Tukar jenis nod" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Create Polygon3D" -msgstr "" +msgstr "Cipta Poligon3D" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly" -msgstr "" +msgstr "Edit Poli" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly (Remove Point)" -msgstr "" +msgstr "Edit Poli (Alih Keluar Titik)" #: editor/plugins/collision_shape_2d_editor_plugin.cpp msgid "Set Handle" -msgstr "" +msgstr "Tetapkan Pemegang" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" -msgstr "" +msgstr "Muatkan Topeng Pelepasan" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Restart" -msgstr "" +msgstr "Mula semula" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Clear Emission Mask" -msgstr "" +msgstr "Keluarkan Topeng Emission" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Particles" -msgstr "" +msgstr "Zarah" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generated Point Count:" -msgstr "" +msgstr "Kiraan Titik Dijana:" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Emission Mask" -msgstr "" +msgstr "Topeng Emission" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Solid Pixels" -msgstr "" +msgstr "Piksel Pepejal" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Border Pixels" -msgstr "" +msgstr "Piksel Sempadan" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Directed Border Pixels" -msgstr "" +msgstr "Piksel Sempadan Diarahkan" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Capture from Pixel" -msgstr "" +msgstr "Tangkap daripada Pixel" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Emission Colors" -msgstr "" +msgstr "Warna Emission" #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" -msgstr "" +msgstr "CPUParticles" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Mesh" -msgstr "" +msgstr "Cipta Titik Emission Daripada Mesh" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Node" -msgstr "" +msgstr "Cipta Titik Emission Daripada Nod" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 0" -msgstr "" +msgstr "Flat 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "" +msgstr "Flat 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" -msgstr "" +msgstr "Perlahan Masuk" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease Out" -msgstr "" +msgstr "Perlahan Keluar" #: editor/plugins/curve_editor_plugin.cpp msgid "Smoothstep" -msgstr "" +msgstr "Smoothstep" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Point" -msgstr "" +msgstr "Ubah Suai Titik Lengkung" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Tangent" -msgstr "" +msgstr "Ubah Suai Tangen Lengkung" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Curve Preset" -msgstr "" +msgstr "Muat Pratetap Lengkung" #: editor/plugins/curve_editor_plugin.cpp msgid "Add Point" msgstr "Tambah Titik" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Point" -msgstr "Buang Trek Anim" +msgstr "Buang Titik" #: editor/plugins/curve_editor_plugin.cpp msgid "Left Linear" -msgstr "" +msgstr "Linear Kiri" #: editor/plugins/curve_editor_plugin.cpp msgid "Right Linear" -msgstr "" +msgstr "Linear Kanan" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Preset" -msgstr "" +msgstr "Muatkan Pratetap" #: editor/plugins/curve_editor_plugin.cpp msgid "Remove Curve Point" -msgstr "" +msgstr "Keluarkan Titik Lengkung" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" -msgstr "" +msgstr "Togol Lengkung Linear Tangen" #: editor/plugins/curve_editor_plugin.cpp msgid "Hold Shift to edit tangents individually" -msgstr "" +msgstr "Tahan Shift untuk mengedit tangen secara individu" #: editor/plugins/curve_editor_plugin.cpp msgid "Right click to add point" -msgstr "" +msgstr "Klik kanan untuk menambah titik" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "" +msgstr "Panggang GI Probe" #: editor/plugins/gradient_editor_plugin.cpp msgid "Gradient Edited" -msgstr "" +msgstr "Kecerunan Disunting" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" -msgstr "" +msgstr "Item %d" #: editor/plugins/item_list_editor_plugin.cpp msgid "Items" -msgstr "" +msgstr "Item" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item List Editor" -msgstr "" +msgstr "Editor Senarai Item" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" -msgstr "" +msgstr "Cipta Poligon Occluder" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh is empty!" -msgstr "" +msgstr "Mesh kosong!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Couldn't create a Trimesh collision shape." -msgstr "" +msgstr "Tidak dapat mencipta bentuk perlanggaran Trimesh." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Trimesh Body" -msgstr "" +msgstr "Buat Badan Trimesh Statik" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "This doesn't work on scene root!" -msgstr "" +msgstr "Ini tidak berfungsi pada akar tempat adegan!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Shape" -msgstr "" +msgstr "Cipta Bentuk Statik Trimesh" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Can't create a single convex collision shape for the scene root." @@ -7552,7 +7570,6 @@ msgstr "" #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp #: editor/plugins/visual_shader_editor_plugin.cpp #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -#, fuzzy msgid "Search" msgstr "Cari" @@ -8006,38 +8023,32 @@ msgid "Yaw:" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size:" -msgstr "Saiz: " +msgstr "Saiz:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn:" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Material Changes:" -msgstr "Parameter Berubah" +msgstr "Perubahan Bahan:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Shader Changes:" -msgstr "Parameter Berubah" +msgstr "Perubahan Shader:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Surface Changes:" -msgstr "Parameter Berubah" +msgstr "Perubahan Permukaan:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Draw Calls:" -msgstr "Panggilan" +msgstr "Cabutan Panggilan:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Vertices:" -msgstr "Sifat-sifat" +msgstr "Bucu:" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" @@ -8707,9 +8718,8 @@ msgid "{num} constant(s)" msgstr "Pemalar" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "No constants found." -msgstr "Pemalar Sahaja" +msgstr "Tiada pemalar ditemui." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} font(s)" @@ -8756,9 +8766,8 @@ msgid "Importing items {n}/{n}" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Updating the editor" -msgstr "Keluar dari editor?" +msgstr "Mengemaskini editor" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8845,19 +8854,16 @@ msgid "" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Collapse types." -msgstr "Runtuhkan Semua" +msgstr "Lipat jenis." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Expand types." -msgstr "Kembangkan Semua" +msgstr "Kembangkan jenis." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select all Theme items." -msgstr "Pilih Fail Templat" +msgstr "Pilih semua benda Tema." #: editor/plugins/theme_editor_plugin.cpp msgid "Select With Data" @@ -9013,9 +9019,8 @@ msgid "Add StyleBox Item" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Items:" -msgstr "Keluarkan Item" +msgstr "Keluarkan Benda:" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" @@ -9041,9 +9046,8 @@ msgid "Old Name:" msgstr "Nama Nod:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Import Items" -msgstr "Import Sebagai:" +msgstr "Import Benda" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9123,9 +9127,8 @@ msgid "Show default type items alongside items that have been overridden." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Override All" -msgstr "ganti:" +msgstr "Gantikan Semua" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." @@ -9149,9 +9152,8 @@ msgid "Add, remove, organize and import Theme items." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Preview" -msgstr "Pratonton:" +msgstr "Tambah Pratonton" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -9159,9 +9161,8 @@ msgid "Default Preview" msgstr "Lalai" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Select UI Scene:" -msgstr "Simpan Adegan" +msgstr "Pilih Adegan UI:" #: editor/plugins/theme_editor_preview.cpp msgid "" @@ -9726,9 +9727,8 @@ msgid "Unstaged Changes" msgstr "Parameter Berubah" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "Komuniti" +msgstr "Commit:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" @@ -9805,9 +9805,8 @@ msgid "Discard all changes" msgstr "Parameter Berubah" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "Menyimpan perubahan tempatan..." +msgstr "Peringkat semua perubahan" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -9845,9 +9844,8 @@ msgid "30" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Padanan:" +msgstr "Ranting" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -9879,9 +9877,8 @@ msgid "Remove Remote" msgstr "Keluarkan Item" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Nama Nod:" +msgstr "Nama Remote" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -12600,6 +12597,15 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Cipta Poligon Occluder" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13655,9 +13661,8 @@ msgid "Exporting APK..." msgstr "Eksport..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Uninstalling..." -msgstr "Nyahpasang" +msgstr "Menyahpasang..." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -13665,9 +13670,8 @@ msgid "Installing to device, please wait..." msgstr "Mengambil maklumat cermin, sila tunggu..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not install to device: %s" -msgstr "Tidak dapat memulakan subproses!" +msgstr "Tidak dapat memasang ke peranti: %s" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -13797,11 +13801,8 @@ msgid "Signing debug %s..." msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signing release %s..." -msgstr "" -"Mengimbas Fail,\n" -"Sila Tunggu..." +msgstr "Menandatangani keluaran %s..." #: platform/android/export/export_plugin.cpp msgid "Could not find keystore, unable to export." @@ -13887,9 +13888,8 @@ msgid "" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: %s" -msgstr "Kandungan Pakej:" +msgstr "Pakej tidak ditemui: %s" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -13916,9 +13916,8 @@ msgid "Adding files..." msgstr "Tapis Fail-fail..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files" -msgstr "Tidak dapat memulakan subproses!" +msgstr "Tidak dapat mengeksport fail projek" #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -13944,10 +13943,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13973,35 +13968,210 @@ msgid "Could not write file:" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file:" -msgstr "Tidak dapat mencipta folder." +msgstr "Tidak dapat membaca fail:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell:" -msgstr "Tidak dapat mencipta folder." +msgstr "Tidak dapat membaca shell HTML:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory:" -msgstr "Tidak dapat mencipta folder." +msgstr "Tidak dapat mencipta direktori server HTTP:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server:" -msgstr "Ralat semasa menyimpan TileSet!" +msgstr "Ralat memulakan server HTTP:" + +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nama kumpulan tidak sah." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Tidak dapat mencipta folder." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Nama tidak sah." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Gagal untuk memuatkan sumber." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Gagal untuk memuatkan sumber." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Nama tidak sah." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Nama kumpulan tidak sah." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Tiada sub-sumber dijumpai." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Mencipta Gambar Kecil" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14012,6 +14182,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -14064,6 +14297,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Nama tidak sah." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Versi Terpasang Lain:" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Nama kumpulan tidak sah." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14133,11 +14387,11 @@ msgstr "Nod A dan Nod B mestilah PhysicsBody2Ds" #: scene/2d/joints_2d.cpp msgid "Node A must be a PhysicsBody2D" -msgstr "" +msgstr "Nod A mestilah PhysicsBody2D" #: scene/2d/joints_2d.cpp msgid "Node B must be a PhysicsBody2D" -msgstr "" +msgstr "Nod B mestilah PhysicsBody2D" #: scene/2d/joints_2d.cpp msgid "Joint is not connected to two PhysicsBody2Ds" @@ -14414,8 +14668,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14655,7 +14909,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" @@ -14814,4 +15068,4 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "Pemalar tidak dapat diubah suai." diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 0849aa8c03..025abad2dc 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -21,13 +21,14 @@ # slasken06 <ask.skivdal@gmail.com>, 2021. # Daniel Skogly <daniel@klungo.no>, 2021. # Imre Kristoffer Eilertsen <imreeil42@gmail.com>, 2022. +# Edvard Ekrem Sæther <edvardekrem@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" -"Last-Translator: Imre Kristoffer Eilertsen <imreeil42@gmail.com>\n" +"PO-Revision-Date: 2022-01-24 02:05+0000\n" +"Last-Translator: Edvard Ekrem Sæther <edvardekrem@gmail.com>\n" "Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/godot-" "engine/godot/nb_NO/>\n" "Language: nb\n" @@ -35,7 +36,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.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -339,7 +340,7 @@ msgstr "Dupliser Nøkler" #: editor/animation_track_editor.cpp msgid "Add RESET Value(s)" -msgstr "" +msgstr "Legg Til RESET-Verdi(er)" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" @@ -395,9 +396,8 @@ msgstr "Kan ikke åpne '%s'." #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "animation" -msgstr "Animasjon" +msgstr "animasjon" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." @@ -405,9 +405,8 @@ msgstr "AnimasjonAvspiller kan ikke animere seg selv, kun andre avspillere." #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp -#, fuzzy msgid "property '%s'" -msgstr "Egenskapen «%s» eksisterer ikke." +msgstr "egenskap '%s'" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -524,8 +523,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -534,8 +533,8 @@ msgstr "" "\n" "For å legge til egendefinerte spor, gå til scenens importinstillinger og " "sett\n" -"\"Animasjon > Lagring\" til \"Filer\", aktiver \"Animasjon > Behold egne spor" -"\", og importer på nytt.\n" +"\"Animasjon > Lagring\" til \"Filer\", aktiver \"Animasjon > Behold egne " +"spor\", og importer på nytt.\n" "Alternativt, bruk et importoppsett som importerer animasjonen som separate " "filer." @@ -544,9 +543,8 @@ msgid "Warning: Editing imported animation" msgstr "Advarsel: Redigerer importert animasjon" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select an AnimationPlayer node to create and edit animations." -msgstr "Velg en AnimationPlayer fra scenetreet for å endre animasjoner." +msgstr "Velg en AnimationPlayer-node for å lage og redigere animasjoner." #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -562,9 +560,8 @@ msgid "Snap:" msgstr "Steg:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation step value." -msgstr "Animasjonstre er gyldig." +msgstr "Animasjonstrinnverdi." #: editor/animation_track_editor.cpp msgid "Seconds" @@ -591,9 +588,8 @@ msgid "Animation properties." msgstr "Animasjon egenskaper." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Copy Tracks" -msgstr "Kopier Parametre" +msgstr "Kopier Spor" #: editor/animation_track_editor.cpp msgid "Scale Selection" @@ -708,9 +704,8 @@ msgid "Copy" msgstr "Kopier" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Kutt Noder" +msgstr "Velg Alle/Ingen" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -816,9 +811,8 @@ msgid "Method in target node must be specified." msgstr "Metode i målnoden må spesifiseres." #: editor/connections_dialog.cpp -#, fuzzy msgid "Method name must be a valid identifier." -msgstr "Navn er ikke en gyldig identifikator:" +msgstr "Metodenavnet må være en gyldig identifikator." #: editor/connections_dialog.cpp #, fuzzy @@ -1422,7 +1416,7 @@ msgid "Bus Options" msgstr "Bus valg" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Dupliser" @@ -2264,8 +2258,8 @@ msgstr "Metodebeskrivelse:" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Det finnes i øyeblikket ingen beskrivelse av denne metoden. Hjelp til ved å " "[colour=$color][url=$url]bidra med en[/url][/color]!" @@ -3404,11 +3398,16 @@ msgstr "Kontinuerlig" #: editor/editor_node.cpp #, fuzzy -msgid "Update When Changed" +msgid "Update All Changes" msgstr "Oppdater Endringer" #: editor/editor_node.cpp #, fuzzy +msgid "Update Vital Changes" +msgstr "Forandre" + +#: editor/editor_node.cpp +#, fuzzy msgid "Hide Update Spinner" msgstr "Deaktiver Oppdateringsspinner" @@ -4198,6 +4197,14 @@ msgstr "Navn inneholder ugyldige tegn." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4324,7 +4331,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Duplicate..." msgstr "Duplisér" @@ -5189,6 +5196,10 @@ msgid "Rename Animation" msgstr "Endre navn på Animasjon" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Dupliser Animasjon" + +#: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Blend Next Changed" msgstr "Blend Neste Endret" @@ -5202,10 +5213,6 @@ msgid "Load Animation" msgstr "Last Animasjon" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Dupliser Animasjon" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Ingen animasjon å kopiere!" @@ -13166,6 +13173,16 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "Fjern Funksjon" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Fjern Funksjon" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Fjern Funksjon" + #: modules/csg/csg_gizmos.cpp #, fuzzy msgid "Change Cylinder Radius" @@ -14571,10 +14588,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Navn er ikke en gyldig identifikator:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14622,17 +14635,197 @@ msgstr "Kunne ikke opprette mappe." msgid "Error starting HTTP server:" msgstr "Feil ved lagring av TextFile:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Prosjektnavn:" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Kunne ikke opprette mappe." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Ugyldig Filsti." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Kunne ikke laste ressurs." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Kunne ikke laste ressurs." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Må ha en gyldig filutvidelse." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Må ha en gyldig filutvidelse." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Ikke funnet!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Lager Thumbnail" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "Kunne ikke opprette mappe." + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Navn er ikke en gyldig identifikator:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14643,6 +14836,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14701,6 +14957,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Ugyldig Filsti." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Må ha en gyldig filutvidelse." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Prosjektnavn:" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -15055,8 +15332,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -15300,7 +15577,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index f7f68d55f8..c8e602d3ce 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -53,13 +53,15 @@ # Daan van Luijk <daanvl@outlook.be>, 2021. # Dani Verschoor <daniverschoor@outlook.com>, 2021. # naan <xlightfox@hotmail.com>, 2021. +# Tim Visee <tim+weblate@visee.me>, 2022. +# Ferhat Geçdoğan <ferhatgectao@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-12-31 08:52+0000\n" -"Last-Translator: naan <xlightfox@hotmail.com>\n" +"PO-Revision-Date: 2022-01-30 07:16+0000\n" +"Last-Translator: Ferhat Geçdoğan <ferhatgectao@gmail.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" "Language: nl\n" @@ -67,7 +69,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.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -373,7 +375,7 @@ msgstr "Sleutel(s) dupliceren" #: editor/animation_track_editor.cpp #, fuzzy msgid "Add RESET Value(s)" -msgstr "Voeg %d Frame(s) toe" +msgstr "Voeg RESET Frame(s) toe" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" @@ -556,8 +558,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1427,7 +1429,7 @@ msgid "Bus Options" msgstr "Audiobusopties" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Dupliceren" @@ -1539,7 +1541,7 @@ msgstr "Ongeldige naam." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "Kan niet beginnen met een cijfer." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -1807,7 +1809,7 @@ msgstr "Laat u 3D scenes weergeven en bewerken." msgid "Allows to edit scripts using the integrated script editor." msgstr "" "Staat toe het script aan te passen door middel van de geïntegreerde script " -"editor" +"editor." #: editor/editor_feature_profile.cpp msgid "Provides built-in access to the Asset Library." @@ -1844,7 +1846,8 @@ msgstr "(geen)" #: editor/editor_feature_profile.cpp msgid "Remove currently selected profile, '%s'? Cannot be undone." msgstr "" -"Verwijder huidig geselecteerde profiel, '%s'? Kan niet worden ongedaan." +"Verwijder huidig geselecteerde profiel, '%s'? Kan niet ongedaan gemaakt " +"worden." #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -1971,7 +1974,7 @@ msgstr "Editor Profielen beheren" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" -msgstr "Huidige map selecteren" +msgstr "Huidige Map Selecteren" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File exists, overwrite?" @@ -2166,9 +2169,8 @@ msgid "Properties" msgstr "Eigenschappen" #: editor/editor_help.cpp -#, fuzzy msgid "overrides %s:" -msgstr "overschreven:" +msgstr "overschrijft %s:" #: editor/editor_help.cpp msgid "default:" @@ -2183,28 +2185,24 @@ msgid "Theme Properties" msgstr "Thema-eigenschappen" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Colors" -msgstr "Kleur" +msgstr "Kleuren" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constants" msgstr "Constanten" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Fonts" -msgstr "Lettertype" +msgstr "Lettertypes" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Icons" -msgstr "Icoon" +msgstr "Iconen" #: editor/editor_help.cpp -#, fuzzy msgid "Styles" -msgstr "Stijl" +msgstr "Stijlen" #: editor/editor_help.cpp msgid "Enumerations" @@ -2232,8 +2230,8 @@ msgstr "Methodebeschrijvingen" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Er is momenteel geen beschrijving voor deze methode. Help ons alstublieft " "door [color=$color][url=$url]een bijdrage te leveren[/url][/color]!" @@ -2312,9 +2310,8 @@ msgid "Property:" msgstr "Eigenschap:" #: editor/editor_inspector.cpp -#, fuzzy msgid "Pin value" -msgstr "(waarde)" +msgstr "Waarde vastzetten" #: editor/editor_inspector.cpp msgid "" @@ -2338,26 +2335,23 @@ msgstr "Zet Meerdere:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "" +msgstr "Vastgezet %s" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "" +msgstr "Losgemaakt %s" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" -msgstr "Eigenschappen" +msgstr "Kopieer Eigenschap" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" -msgstr "Eigenschappen" +msgstr "Plak Eigenschap" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "Kopieer Script Pad" +msgstr "Kopieer Eigenschap Pad" #: editor/editor_log.cpp msgid "Output:" @@ -2405,7 +2399,7 @@ msgstr "Omhoog" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" -msgstr "Knoop" +msgstr "Knooppunt" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" @@ -2732,25 +2726,25 @@ msgstr "" #: editor/editor_node.cpp msgid "Nothing to undo." -msgstr "" +msgstr "Niks om ongedaan te maken." #: editor/editor_node.cpp -#, fuzzy msgid "Undo: %s" -msgstr "Ongedaan maken" +msgstr "Ongedaan maken: %s" #: editor/editor_node.cpp msgid "Can't redo while mouse buttons are pressed." msgstr "" #: editor/editor_node.cpp +#, fuzzy msgid "Nothing to redo." -msgstr "" +msgstr "Niks om opnieuw te doen." #: editor/editor_node.cpp #, fuzzy msgid "Redo: %s" -msgstr "Opnieuw" +msgstr "Opnieuw doen: %s" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." @@ -3100,9 +3094,8 @@ msgid "Orphan Resource Explorer..." msgstr "Beheer ongebruikte bronnen..." #: editor/editor_node.cpp -#, fuzzy msgid "Reload Current Project" -msgstr "Project hernoemen" +msgstr "Huidig Project Herladen" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -3271,13 +3264,12 @@ msgid "Help" msgstr "Help" #: editor/editor_node.cpp -#, fuzzy msgid "Online Documentation" -msgstr "Open Godot online documentatie" +msgstr "Online Documentatie" #: editor/editor_node.cpp msgid "Questions & Answers" -msgstr "" +msgstr "Vragen & Antwoorden" #: editor/editor_node.cpp msgid "Report a Bug" @@ -3285,7 +3277,7 @@ msgstr "Meld een probleem" #: editor/editor_node.cpp msgid "Suggest a Feature" -msgstr "" +msgstr "Stel een Feature voor" #: editor/editor_node.cpp msgid "Send Docs Feedback" @@ -3296,9 +3288,8 @@ msgid "Community" msgstr "Gemeenschap" #: editor/editor_node.cpp -#, fuzzy msgid "About Godot" -msgstr "Over" +msgstr "Over Godot" #: editor/editor_node.cpp msgid "Support Godot Development" @@ -3354,10 +3345,16 @@ msgid "Update Continuously" msgstr "Continu Bijwerken" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Bijwerken indien gewijzigd" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Materiaal Wijzigingen" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Update spinner verbergen" @@ -3371,7 +3368,7 @@ msgstr "Inspecteur" #: editor/editor_node.cpp msgid "Expand Bottom Panel" -msgstr "Vergroot onderste paneel" +msgstr "Vergroot Onderste Paneel" #: editor/editor_node.cpp msgid "Output" @@ -3392,7 +3389,6 @@ msgid "Manage Templates" msgstr "Sjablonen beheren" #: editor/editor_node.cpp -#, fuzzy msgid "Install from file" msgstr "Installeer Vanuit Bestand" @@ -3488,9 +3484,8 @@ msgid "Select" msgstr "Selecteer" #: editor/editor_node.cpp -#, fuzzy msgid "Select Current" -msgstr "Huidige map selecteren" +msgstr "Huidige Selecteren" #: editor/editor_node.cpp msgid "Open 2D Editor" @@ -3554,14 +3549,12 @@ msgid "Update" msgstr "Update" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Version" -msgstr "Versie:" +msgstr "Versie" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Author" -msgstr "Auteurs" +msgstr "Auteur" #: editor/editor_plugin_settings.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp @@ -3573,14 +3566,12 @@ msgid "Measure:" msgstr "Meting:" #: editor/editor_profiler.cpp -#, fuzzy msgid "Frame Time (ms)" -msgstr "Frame Tijd (sec)" +msgstr "Frame Tijd (ms)" #: editor/editor_profiler.cpp -#, fuzzy msgid "Average Time (ms)" -msgstr "Gemiddelde Tijd (sec)" +msgstr "Gemiddelde Tijd (ms)" #: editor/editor_profiler.cpp msgid "Frame %" @@ -3712,7 +3703,7 @@ msgstr "" #: editor/editor_resource_picker.cpp msgid "Quick Load" -msgstr "" +msgstr "Snel Laden" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" @@ -3733,7 +3724,6 @@ msgid "Paste" msgstr "Plakken" #: editor/editor_resource_picker.cpp editor/property_editor.cpp -#, fuzzy msgid "Convert to %s" msgstr "Omzetten naar %s" @@ -3807,9 +3797,8 @@ msgstr "Vanuit knoop importeren:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Fout" +msgstr "%s Fout" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -3850,12 +3839,12 @@ msgstr "Kan hostname niet herleiden:" #: editor/export_template_manager.cpp #, fuzzy msgid "Can't connect to the mirror." -msgstr "Kan niet verbinden met host:" +msgstr "Kan niet verbinden met host." #: editor/export_template_manager.cpp #, fuzzy msgid "No response from the mirror." -msgstr "Geen antwoord van host:" +msgstr "Geen antwoord van host." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3868,9 +3857,8 @@ msgid "Request ended up in a redirect loop." msgstr "Aanvraag mislukt, te veel redirects" #: editor/export_template_manager.cpp -#, fuzzy msgid "Request failed:" -msgstr "Aanvraag Mislukt." +msgstr "Aanvraag mislukt:" #: editor/export_template_manager.cpp msgid "Download complete; extracting templates..." @@ -4025,9 +4013,8 @@ msgid "Uninstall templates for the current version." msgstr "Initiële waarde van teller" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download from:" -msgstr "Downloadfout" +msgstr "Downloaden van:" #: editor/export_template_manager.cpp #, fuzzy @@ -4153,6 +4140,14 @@ msgstr "Naam bevat ongeldige tekens." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4274,7 +4269,7 @@ msgstr "Laatst bewerkt" msgid "Sort by First Modified" msgstr "Laatst bewerkt" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Dupliceren..." @@ -5090,6 +5085,10 @@ msgid "Rename Animation" msgstr "Animatie Hernoemen" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Dupliceer Animatie" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Meng met volgende aanpassing" @@ -5102,10 +5101,6 @@ msgid "Load Animation" msgstr "Animatie laden" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Dupliceer Animatie" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Geen animatie om te kopiëren!" @@ -8926,7 +8921,7 @@ msgstr "Geen deel-hulpbronnen gevonden." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} currently selected" -msgstr "" +msgstr "{num} momenteel geselecteerd" #: editor/plugins/theme_editor_plugin.cpp msgid "Nothing was selected for the import." @@ -13008,6 +13003,16 @@ msgstr "Wijzig Cylinder Vorm Radius" msgid "Set Occluder Sphere Position" msgstr "Zet Curve In Positie" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Zet Curve Punt Positie" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Zet Curve Punt Positie" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Wijzig Cylinder Straal" @@ -14408,10 +14413,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Ongeldige identifier:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "Vereist icoon is niet gespecificeerd in de preset." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Stop HTTP Server" @@ -14457,17 +14458,198 @@ msgstr "Map kon niet gemaakt worden." msgid "Error starting HTTP server:" msgstr "Fout bij het opslaan van de scène." +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Ongeldige projectnaam." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Ongeldige geometrie, kan geen polygon creëren." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Map kon niet gemaakt worden." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Ongeldig basis Pad." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Bron laden mislukt." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Bron laden mislukt." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Ongeldige extentie." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Ongeldige extentie." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Niet gevonden!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Thumbnail Aan Het Maken" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "Kon template niet openen voor export:" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Ongeldige identifier:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14478,6 +14660,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Ongeldige pakket korte naam." @@ -14537,6 +14782,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Ongeldige afmetingen van splash screen afbeelding (moet 620×300 zijn)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Ongeldig pad." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Ongeldige extentie." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Ongeldig product GUID." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14965,8 +15231,8 @@ msgstr "" #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "Op GPU-gebaseerde particles worden niet ondersteund door het GLES2 grafische " "stuurprogramma.\n" @@ -15232,9 +15498,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Deze knoop is verouderd. Gebruik in plaats daarvan AnimationTree." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Kleur: #%s\n" diff --git a/editor/translations/or.po b/editor/translations/or.po index fb6c7ff0c2..3cea395fb0 100644 --- a/editor/translations/or.po +++ b/editor/translations/or.po @@ -494,8 +494,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1329,7 +1329,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2102,8 +2102,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3128,7 +3128,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3852,6 +3856,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3964,7 +3976,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4750,19 +4762,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12189,6 +12201,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13480,10 +13500,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13524,16 +13540,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13544,6 +13730,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13596,6 +13845,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13946,8 +14213,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14187,7 +14454,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 1f10b9f3a5..0117a72a86 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -24,7 +24,7 @@ # Sebastian Pasich <sebastian.pasich@gmail.com>, 2017, 2019, 2020. # siatek papieros <sbigneu@gmail.com>, 2016. # Zatherz <zatherz@linux.pl>, 2017, 2020, 2021. -# Tomek <kobewi4e@gmail.com>, 2018, 2019, 2020, 2021. +# Tomek <kobewi4e@gmail.com>, 2018, 2019, 2020, 2021, 2022. # Wojcieh Er Zet <wojcieh.rzepecki@gmail.com>, 2018. # Dariusz Siek <dariuszynski@gmail.com>, 2018, 2019, 2020, 2021. # Szymon Nowakowski <smnbdg13@gmail.com>, 2019. @@ -53,13 +53,15 @@ # Mateusz Żak <matisgramy@gmail.com>, 2021. # voltinus <voltinusmail@gmail.com>, 2021. # Lech Migdal <lech.migdal@gmail.com>, 2022. +# Piotr <promantix@gmail.com>, 2022. +# Igor Kordiukiewicz <igorkordiukiewicz@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" -"Last-Translator: Lech Migdal <lech.migdal@gmail.com>\n" +"PO-Revision-Date: 2022-01-26 19:55+0000\n" +"Last-Translator: Igor Kordiukiewicz <igorkordiukiewicz@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -68,7 +70,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -371,9 +373,8 @@ msgid "Duplicate Key(s)" msgstr "Duplikuj klucz(e)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add RESET Value(s)" -msgstr "Dodaj %d klatek" +msgstr "Dodaj wartość(i) RESET" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" @@ -545,9 +546,8 @@ msgstr "" "Ta opcja nie działa dla edycji Beziera, ponieważ jest to tylko jedna ścieżka." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Add RESET Keys" -msgstr "Przeskaluj klatki kluczowe" +msgstr "Dodaj klucze animacji RESET" #: editor/animation_track_editor.cpp msgid "" @@ -556,8 +556,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -566,8 +566,8 @@ msgstr "" "\n" "By umożliwić dodawanie własnych ścieżek, przejdź do ustawień importu i " "zmień\n" -"\"Animation > Storage\" na \"Files\", włącz \"Animation > Keep Custom Tracks" -"\", a potem importuj ponownie.\n" +"\"Animation > Storage\" na \"Files\", włącz \"Animation > Keep Custom " +"Tracks\", a potem importuj ponownie.\n" "Alternatywnie, użyj profilu importu, który importuje animacje do oddzielnych " "plików." @@ -1419,7 +1419,7 @@ msgid "Bus Options" msgstr "Opcje magistrali" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplikuj" @@ -1728,8 +1728,9 @@ msgid "" "Target platform requires 'ETC2' or 'PVRTC' texture compression for GLES3. " "Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." msgstr "" -"Platforma docelowa wymaga dla GLES3 kompresji tekstur \"ETC2\" lub \"PVRTC" -"\". Włącz \"Import Etc 2\" lub \"Import Pvrtc\" w Ustawieniach Projektu." +"Platforma docelowa wymaga dla GLES3 kompresji tekstur \"ETC2\" lub " +"\"PVRTC\". Włącz \"Import Etc 2\" lub \"Import Pvrtc\" w Ustawieniach " +"Projektu." #: editor/editor_export.cpp msgid "" @@ -2206,8 +2207,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Obecnie nie ma opisu dla tej właściwości. Pomóż nam, [color=$color][url=" -"$url]wysyłając ją[/url][/color]!" +"Obecnie nie ma opisu dla tej właściwości. Pomóż nam, [color=$color]" +"[url=$url]wysyłając ją[/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2215,11 +2216,11 @@ msgstr "Opisy metod" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Obecnie nie ma opisu dla tej metody. Pomóż nam, [color=$color][url=" -"$url]wysyłając ją[/url][/color]!" +"Obecnie nie ma opisu dla tej metody. Pomóż nam, [color=$color]" +"[url=$url]wysyłając ją[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -2295,18 +2296,18 @@ msgid "Property:" msgstr "Właściwość:" #: editor/editor_inspector.cpp -#, fuzzy msgid "Pin value" -msgstr "(wartość)" +msgstr "Przypnij wartość" #: editor/editor_inspector.cpp msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "" +"Przypięcie wartości wymusza zapisanie jej, nawet jeśli jest równa domyślniej." #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" -msgstr "" +msgstr "Przypnij wartość [Niedostępne, ponieważ \"%s\" jest tylko dla edytora]" #: editor/editor_inspector.cpp editor/scene_tree_dock.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -2321,26 +2322,23 @@ msgstr "Ustaw wiele:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "" +msgstr "Przypięto %s" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "" +msgstr "Odpięto %s" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" -msgstr "Skopiuj właściwości" +msgstr "Kopiuj właściwość" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" -msgstr "Wklej właściwości" +msgstr "Wklej właściwość" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "Skopiuj ścieżkę skryptu" +msgstr "Skopiuj ścieżkę właściwości" #: editor/editor_log.cpp msgid "Output:" @@ -3066,9 +3064,8 @@ msgid "Install Android Build Template..." msgstr "Zainstaluj szablon eksportu dla Androida..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Otwórz folder danych edytora" +msgstr "Otwórz folder danych użytkownika" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3330,10 +3327,16 @@ msgid "Update Continuously" msgstr "Aktualizuj ciągle" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Aktualizuj przy zmianie" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Zmiany materiału:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Ukryj wiatraczek aktualizacji" @@ -3775,9 +3778,8 @@ msgstr "Zaimportuj z węzła:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Błąd" +msgstr "Błąd %s" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4100,6 +4102,14 @@ msgstr "Nazwa zawiera niedozwolone znaki." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4218,7 +4228,7 @@ msgstr "Ostatnie zmodyfikowane" msgid "Sort by First Modified" msgstr "Pierwsze zmodyfikowane" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplikuj..." @@ -4319,9 +4329,8 @@ msgid "Replace..." msgstr "Zamień..." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Replace in Files" -msgstr "Zastąp wszystkie" +msgstr "Zastąp w plikach" #: editor/find_in_files.cpp msgid "Find: " @@ -4332,9 +4341,8 @@ msgid "Replace: " msgstr "Zastąp: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace All (NO UNDO)" -msgstr "Zastąp wszystkie" +msgstr "Zastąp wszystkie (NIE MOŻNA COFNĄĆ)" #: editor/find_in_files.cpp msgid "Searching..." @@ -4560,6 +4568,8 @@ msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." msgstr "" +"Wybierz plik zasobu z systemu plików lub z inspektoraby zmienić ustawienia " +"importu." #: editor/inspector_dock.cpp msgid "Failed to load resource." @@ -5031,6 +5041,10 @@ msgid "Rename Animation" msgstr "Zmień nazwę animacji" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplikuj animację" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Zmieszaj kolejną po zmianach" @@ -5043,10 +5057,6 @@ msgid "Load Animation" msgstr "Wczytaj animację" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplikuj animację" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Brak animacji do skopiowania!" @@ -6062,7 +6072,7 @@ msgstr "Tryb skalowania" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Shift: Scale proportionally." -msgstr "" +msgstr "Shift: Skaluj proporcjonalnie." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6161,9 +6171,8 @@ msgstr "Zablokuj wybrany obiekt w miejscu (nie można go przesuwać)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected Node(s)" -msgstr "Zablokuj wybrane" +msgstr "Zablokuj zaznaczone węzły" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6172,9 +6181,8 @@ msgstr "Odblokuj wybrany obiekt (można go przesuwać)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected Node(s)" -msgstr "Odblokuj wybrane" +msgstr "Odblokuj zaznaczone węzły" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6183,9 +6191,8 @@ msgstr "Zablokuj selekcję węzłów podrzędnych." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected Node(s)" -msgstr "Grupuj wybrane" +msgstr "Grupuj zaznaczone węzły" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6194,9 +6201,8 @@ msgstr "Odblokuj selekcję węzłów podrzędnych." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected Node(s)" -msgstr "Rozgrupuj wybrane" +msgstr "Rozgrupuj zaznaczone węzły" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton Options" @@ -7841,9 +7847,8 @@ msgid "Find in Files..." msgstr "Znajdź w plikach..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Replace in Files..." -msgstr "Zamień..." +msgstr "Zamień w plikach..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" @@ -8371,11 +8376,11 @@ msgstr "Przełącz swobodny widok" #: editor/plugins/spatial_editor_plugin.cpp msgid "Decrease Field of View" -msgstr "" +msgstr "Zmniejsz pole widzenia" #: editor/plugins/spatial_editor_plugin.cpp msgid "Increase Field of View" -msgstr "" +msgstr "Zwiększ pole widzenia" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -9786,7 +9791,7 @@ msgstr "Commit" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "Data:" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -9827,23 +9832,23 @@ msgstr "Zmień nazwę" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "Hasło" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "Ścieżka do publicznego klucza SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "Wybierz ścieżkę do publicznego klucza SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "Ścieżka do prywatnego klucza SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "Wybierz ścieżkę do prywatnego klucza SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" @@ -9888,15 +9893,15 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -9915,7 +9920,7 @@ msgstr "Usuń ścieżkę animacji" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "Nazwa gałęzi" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -10857,16 +10862,16 @@ msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Tylko tryb fragmentów/światła) (Wektor) Suma bezwzględnej pochodnej po \"x" -"\" i \"y\"." +"(Tylko tryb fragmentów/światła) (Wektor) Suma bezwzględnej pochodnej po " +"\"x\" i \"y\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." msgstr "" -"(Tylko tryb fragmentów/światła) (Skalar) Suma bezwzględnej pochodnej po \"x" -"\" i \"y\"." +"(Tylko tryb fragmentów/światła) (Skalar) Suma bezwzględnej pochodnej po " +"\"x\" i \"y\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -11476,8 +11481,8 @@ msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" msgstr "" -"Niepoprawna nazwa akcji. Nie może być pusta ani zawierać \"/\", \":\", \"=" -"\", \"\\\" lub \"" +"Niepoprawna nazwa akcji. Nie może być pusta ani zawierać \"/\", \":\", " +"\"=\", \"\\\" lub \"" #: editor/project_settings_editor.cpp msgid "An action with the name '%s' already exists." @@ -11624,8 +11629,8 @@ msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'." msgstr "" -"Niepoprawna nazwa akcji. Nie może być pusta ani zawierać \"/\", \":\", \"=" -"\", \"\\\" lub \"." +"Niepoprawna nazwa akcji. Nie może być pusta ani zawierać \"/\", \":\", " +"\"=\", \"\\\" lub \"." #: editor/project_settings_editor.cpp msgid "Add Input Action" @@ -12819,6 +12824,16 @@ msgstr "Ustaw promień sfery przesłaniacza" msgid "Set Occluder Sphere Position" msgstr "Ustaw pozycję sfery przesłaniacza" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Ustaw pozycję punktu portalu" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Ustaw pozycje punktu krzywej" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Zmień promień cylindra" @@ -13536,7 +13551,7 @@ msgstr "Ustaw wyrażenie" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "Wróć" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy @@ -13549,7 +13564,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "Dopóki" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" @@ -13557,7 +13572,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "Iterator" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" @@ -13577,7 +13592,7 @@ msgstr "Iterator stał się nieprawidłowy: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "Sekwencja" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy @@ -13820,7 +13835,7 @@ msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Czekaj" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy @@ -14206,10 +14221,6 @@ msgstr "App Store Team ID nie podany - nie można skonfigurować projektu." msgid "Invalid Identifier:" msgstr "Niepoprawny identyfikator:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "Wymagana ikona nie jest podana w profilu eksportu." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Zatrzymaj serwer HTTP" @@ -14250,16 +14261,202 @@ msgstr "Nie udało się utworzyć folderu serwera HTTP:" msgid "Error starting HTTP server:" msgstr "Błąd uruchamiania serwera HTTP:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nieprawidłowa nazwa projektu." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Nieprawidłowa geometria, nie można utworzyć wielokąta." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Nie można utworzyć katalogu." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Niepoprawna ścieżka bazowa." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Nie udało się wczytać zasobu." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Nie udało się wczytać zasobu." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Niepoprawne rozszerzenie." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Niepoprawne rozszerzenie." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Nie znaleziono ikon." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Tworzenie miniatury" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Nie udało się znaleźć szablonu APK do eksportu:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Nieprawidłowy identyfikator paczki:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Poświadczenie: wymagane podpisanie kodu." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Poświadczenie: wymagane wzmocnione środowisko wykonawcze." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Poświadczenie: wymagane wzmocnione środowisko wykonawcze." #: platform/osx/export/export.cpp @@ -14270,6 +14467,69 @@ msgstr "Poświadczenie: Nazwa Apple ID nie podana." msgid "Notarization: Apple ID password not specified." msgstr "Poświadczenie: Hasło Apple ID nie podane." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Niepoprawna krótka nazwa paczki." @@ -14330,6 +14590,27 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" "Nieprawidłowe wymiary obrazka ekranu powitalnego (powinno być 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Niepoprawna ścieżka." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Niepoprawne rozszerzenie." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Nieprawidłowy GUID produktu." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14770,8 +15051,8 @@ msgstr "Obsługiwane są tylko jednolite skale." #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "Cząsteczki oparte o GPU są nieobsługiwane przez sterownik wideo GLES2.\n" "Użyj zamiast tego węzła CPUParticles. Możesz użyć do tego celu opcji " @@ -14808,8 +15089,8 @@ msgid "" "PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " "parent Path's Curve resource." msgstr "" -"Właściwość ROTATION_ORIENTED węzła PathFollow wymaga włączonego \"Up Vector" -"\" w zasobie Curve jego nadrzędnego węzła Path." +"Właściwość ROTATION_ORIENTED węzła PathFollow wymaga włączonego \"Up " +"Vector\" w zasobie Curve jego nadrzędnego węzła Path." #: scene/3d/physics_body.cpp msgid "" @@ -15054,9 +15335,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Ten węzeł jest przestarzały. Zamiast tego użyj AnimationTree." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Kolor: #%s\n" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index daa3074190..8dcc5099cb 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -524,8 +524,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1379,7 +1379,7 @@ msgid "Bus Options" msgstr "Yar, Blow th' Selected Down!" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2181,8 +2181,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3231,7 +3231,12 @@ msgstr "" #: editor/editor_node.cpp #, fuzzy -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "Change" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" msgstr "Change" #: editor/editor_node.cpp @@ -3988,6 +3993,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4104,7 +4117,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4935,19 +4948,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12674,6 +12687,16 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "Discharge ye' Signal" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Discharge ye' Signal" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Discharge ye' Signal" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14052,10 +14075,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Yer name's got no valid identifier:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14098,17 +14117,192 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Yer index property name be thrown overboard!" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr ": Evil arguments: " + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Slit th' Node" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Yer Calligraphy be wrongly sized." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Yer Calligraphy be wrongly sized." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Yer name's got no valid identifier:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14119,6 +14313,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14174,6 +14431,27 @@ msgstr "Yer wide 310x150 logo image dimensions aint' 310x150!" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Yer splash screen image dimensions aint' 620x300!" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr ": Evil arguments: " + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Yer Calligraphy be wrongly sized." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Yer product GUID be evil." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14524,8 +14802,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14766,7 +15044,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/pt.po b/editor/translations/pt.po index 443974d90c..94dc606a58 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -24,7 +24,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" +"PO-Revision-Date: 2022-01-19 22:07+0000\n" "Last-Translator: João Lopes <linux-man@hotmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot/pt/>\n" @@ -33,7 +33,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -520,8 +520,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1387,7 +1387,7 @@ msgid "Bus Options" msgstr "Opções de Barramento" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplicar" @@ -1679,10 +1679,10 @@ msgid "" "Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" -"Plataforma Alvo exige compressão de textura 'ETC' para o driver de recurso " +"Plataforma Alvo exige compressão de textura 'ETC' para o driver de reserva " "em GLES2.\n" -"Ative 'Importar Etc' nas Configurações do Projeto, ou desative 'Driver de " -"Recurso ativo'." +"Ative 'Import Etc' nas Configurações do Projeto, ou desative 'Driver " +"Fallback Enabled'." #: editor/editor_export.cpp msgid "" @@ -1707,10 +1707,10 @@ msgid "" "Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" -"Plataforma Alvo exige compressão de textura 'PVRTC' para o driver de recurso " +"Plataforma Alvo exige compressão de textura 'PVRTC' para o driver de reserva " "em GLES2.\n" -"Ative 'Importar Pvrtc' nas Configurações do Projeto, ou desative 'Driver de " -"Recurso Ativo'." +"Ative 'Import Pvrtc' nas Configurações do Projeto, ou desative 'Driver " +"Fallback Enabled'." #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -1842,7 +1842,7 @@ msgstr "Propriedades da Classe:" #: editor/editor_feature_profile.cpp msgid "Main Features:" -msgstr "Características Principais:" +msgstr "Funcionalidades Principais:" #: editor/editor_feature_profile.cpp msgid "Nodes and Classes:" @@ -1915,7 +1915,7 @@ msgstr "Novo nome do perfil:" #: editor/editor_feature_profile.cpp msgid "Godot Feature Profile" -msgstr "Perfil de Características Godot" +msgstr "Perfil de Funcionalidades Godot" #: editor/editor_feature_profile.cpp msgid "Import Profile(s)" @@ -1927,7 +1927,7 @@ msgstr "Exportar Perfil" #: editor/editor_feature_profile.cpp msgid "Manage Editor Feature Profiles" -msgstr "Gerir Editor de Perfis" +msgstr "Gerir Editor Perfis de Funcionalidades" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -2187,11 +2187,11 @@ msgstr "Descrições do Método" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Atualmente não existe descrição para este Método. Por favor ajude-nos [color=" -"$color][url=$url]a contribuir com uma[/url][/color]!" +"Atualmente não existe descrição para este Método. Por favor ajude-nos " +"[color=$color][url=$url]a contribuir com uma[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -2836,8 +2836,8 @@ msgid "" "category." msgstr "" "Não foi definida nenhuma cena principal. Selecionar uma?\n" -"Poderá alterá-la depois nas \"Configurações do Projeto\", na categoria " -"'Application'." +"Poderá alterá-la depois nas \"Configurações do Projeto\" dentro da categoria " +"'application'." #: editor/editor_node.cpp msgid "" @@ -2846,7 +2846,8 @@ msgid "" "category." msgstr "" "A cena selecionada '%s' não existe, selecionar uma válida?\n" -"Poderá alterá-la depois em \"application\", na categoria 'Application'." +"Poderá alterá-la depois em \"Configurações do Projeto\" dentro da categoria " +"'application'." #: editor/editor_node.cpp msgid "" @@ -2856,8 +2857,8 @@ msgid "" msgstr "" "A cena selecionada '%s' não é um ficheiro de cena, selecione um ficheiro " "válido?\n" -"Poderá alterá-la depois em \"Configurações do Projeto\", na categoria " -"'Application." +"Poderá alterá-la depois em \"Configurações do Projeto\" dentro da categoria " +"'application." #: editor/editor_node.cpp msgid "Save Layout" @@ -3037,9 +3038,8 @@ msgid "Install Android Build Template..." msgstr "Instalar Modelo Android de Compilação..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Abrir Pasta de Dados do Editor" +msgstr "Abrir Pasta de Dados do Utilizador" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3122,12 +3122,12 @@ msgid "" "When this option is enabled, navigation meshes and polygons will be visible " "in the running project." msgstr "" -"Com esta opção ativa, malhas de navegação e polígonos serão visíveis no " -"projeto em execução." +"Quando esta opção é ativada, malhas de navegação e polígonos serão visíveis " +"no projeto em execução." #: editor/editor_node.cpp msgid "Force Shader Fallbacks" -msgstr "Forçar Shader de Recurso" +msgstr "Forçar Shader de Reserva" #: editor/editor_node.cpp msgid "" @@ -3138,6 +3138,12 @@ msgid "" "Asynchronous shader compilation must be enabled in the project settings for " "this option to make a difference." msgstr "" +"Quando esta opção é ativada, shaders serão usados no modo de reserva " +"(visível via ubershader ou escondido) durante o tempo de execução.\n" +"É útil para verificar o aspeto e performance do modo reserva, que é " +"habitualmente mostrado brevemente.\n" +"A compilação de shader assíncrono tem de ser ativada na configuração do " +"projeto para esta opção ter efeito." #: editor/editor_node.cpp msgid "Synchronize Scene Changes" @@ -3150,7 +3156,7 @@ msgid "" "When used remotely on a device, this is more efficient when the network " "filesystem option is enabled." msgstr "" -"Quando esta opção está ativada, quaisquer alterações feitas a uma cena no " +"Quando esta opção é ativada, quaisquer alterações feitas a uma cena no " "editor serão propagadas no projeto em execução.\n" "Quando é usada remotamente num aparelho, é mais eficiente quando a opção do " "sistema de ficheiros em rede está ativa." @@ -3166,8 +3172,8 @@ msgid "" "When used remotely on a device, this is more efficient when the network " "filesystem option is enabled." msgstr "" -"Com esta opção ativa, qualquer Script guardado será recarregado no jogo em " -"execução.\n" +"Quando esta opção é ativada, qualquer Script guardado será recarregado no " +"jogo em execução.\n" "Quando usada num aparelho remoto, é mais eficiente quando a opção sistema de " "ficheiros em rede está ativa." @@ -3210,7 +3216,7 @@ msgstr "Abrir Pasta de Configurações do Editor" #: editor/editor_node.cpp msgid "Manage Editor Features..." -msgstr "Gerir Características do Editor..." +msgstr "Gerir Editor Funcionalidades..." #: editor/editor_node.cpp msgid "Manage Export Templates..." @@ -3302,10 +3308,16 @@ msgid "Update Continuously" msgstr "Atualização Contínua" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Atualizar quando há Alterações" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Mudanças de Material:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Esconder Roleta de Atualização" @@ -3389,7 +3401,7 @@ msgstr "Exportar Biblioteca" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "Combinar com o Existente" +msgstr "Mesclar com o Existente" #: editor/editor_node.cpp msgid "Apply MeshInstance Transforms" @@ -3749,9 +3761,8 @@ msgstr "Importar do Nó:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Erro" +msgstr "%s Erro" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4079,6 +4090,14 @@ msgstr "O nome contém caracteres inválidos." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4197,7 +4216,7 @@ msgstr "Ordenar por Último Modificado" msgid "Sort by First Modified" msgstr "Ordenar por Primeiro Modificado" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplicar..." @@ -5007,6 +5026,10 @@ msgid "Rename Animation" msgstr "Renomear Animação" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplicar Animação" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Misturar Seguinte Alterado" @@ -5019,10 +5042,6 @@ msgid "Load Animation" msgstr "Carregar Animação" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplicar Animação" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Nenhuma animação para copiar!" @@ -5922,7 +5941,7 @@ msgid "" msgstr "" "Sobreposição da Câmara do Projeto.\n" "Nenhuma instância do projeto em execução. Execute o projeto pelo editor para " -"usar este recurso." +"usar esta funcionalidade." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9376,7 +9395,7 @@ msgstr "Criar a partir da Cena" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from Scene" -msgstr "Combinar a partir da Cena" +msgstr "Mesclar a partir da Cena" #: editor/plugins/tile_set_editor_plugin.cpp msgid "New Single Tile" @@ -9536,7 +9555,7 @@ msgstr "Criar a partir de cena? Irá sobrescrever todos os tiles atuais." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" -msgstr "Combinar a partir da cena?" +msgstr "Mesclar a partir da cena?" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Texture" @@ -9701,9 +9720,8 @@ msgid "TileSet" msgstr "TileSet" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." -msgstr "Não existem addons VCS disponíveis." +msgstr "Não existem plugins VCS disponíveis." #: editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -9713,53 +9731,48 @@ msgstr "Erro" msgid "" "Remote settings are empty. VCS features that use the network may not work." msgstr "" +"Configuração remota vazia. Funcionalidades VCS que usam a rede podem não " +"funcionar." #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "Nome não fornecido." +msgstr "Nenhuma mensagem de gravação fornecida." #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "Gravar" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Mudanças do Shader:" +msgstr "Alterações Aplicadas" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Mudanças do Shader:" +msgstr "Alterações Não Aplicadas" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "Gravar" +msgstr "Gravar:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "Data:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "Sub-árvore" +msgstr "Subtítulo:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "Deseja remover o ramo %s?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "Está seguro que quer criar um tipo vazio?" +msgstr "Quer remover o remoto %s?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "Aplicar Reinicialização" +msgstr "Aplicar" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9770,148 +9783,132 @@ msgid "Initialize" msgstr "Inicializar" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "Remover Ponto" +msgstr "Login Remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "Renomear" +msgstr "Nome de Utilizador" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "Senha" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "Caminho da Chave Pública SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "Selecione caminho da chave pública SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "Caminho da Chave Privada SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "Selecione caminho da chave privada SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "Passphrase SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "Detetar novas alterações" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "Fechar e guardar alterações?" +msgstr "Descartar todas as alterações" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "A armazenar alterações locais..." +msgstr "Aplicar todas as alterações" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "Mudanças de Material:" +msgstr "Desaplicar todas as alterações" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "Gravar Alterações" +msgstr "Gravar Mensagem" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "Gravar Alterações" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "Gravar" +msgstr "Gravar Lista" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "Gravar tamanho da lista" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Correspondências:" +msgstr "Ramos" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "Criar novo Projeto" +msgstr "Criar Novo Ramo" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "Remover Pista de Animação" +msgstr "Remover Ramo" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "Nome do Ramo" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" -msgstr "Remoto" +msgstr "Remotos" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "Criar novo Projeto" +msgstr "Criar Novo Remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "Remover item" +msgstr "Remover Remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Remoto " +msgstr "Nome do Remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "Remoto " +msgstr "URL do Remoto" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "Trazer" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "Puxar" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "Impulso" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "Fonte Malha:" +msgstr "Forçar Impulso" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -9931,22 +9928,19 @@ msgstr "Mudança de tipo" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "Desmesclado" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "Vista" +msgstr "Vista:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "Separar Caminho" +msgstr "Separar" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "Modificado" +msgstr "Unificado" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -10933,7 +10927,7 @@ msgstr "" #: editor/project_export.cpp msgid "Features" -msgstr "Características" +msgstr "Funcionalidades" #: editor/project_export.cpp msgid "Custom (comma-separated):" @@ -10941,7 +10935,7 @@ msgstr "Personalizado (separados por vírgula):" #: editor/project_export.cpp msgid "Feature List:" -msgstr "Lista de Características:" +msgstr "Lista de Funcionalidades:" #: editor/project_export.cpp msgid "Script" @@ -11019,8 +11013,8 @@ msgstr "Erro ao abrir ficheiro comprimido (não está no formato ZIP)." msgid "" "Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." msgstr "" -"Ficheiro de projeto \".zip\" inválido, não contém um ficheiro \"project.godot" -"\"." +"Ficheiro de projeto \".zip\" inválido, não contém um ficheiro \"project." +"godot\"." #: editor/project_manager.cpp msgid "Please choose an empty folder." @@ -11150,7 +11144,7 @@ msgid "" "Not recommended for web games" msgstr "" "Qualidade visual superior\n" -"Todas as características disponíveis\n" +"Todas as funcionalidades disponíveis\n" "Incompatível com hardware antigo\n" "Não recomendado para jogos Web" @@ -11166,7 +11160,7 @@ msgid "" "Recommended for web games" msgstr "" "Qualidade visual inferior\n" -"Algumas características indisponíveis\n" +"Algumas funcionalidades indisponíveis\n" "Funciona na maioria do hardware\n" "Recomendado para jogos Web" @@ -11595,7 +11589,7 @@ msgstr "Evento Ação de Entrada movido" #: editor/project_settings_editor.cpp msgid "Override for Feature" -msgstr "Sobrepor por Característica" +msgstr "Sobrepor por Funcionalidade" #: editor/project_settings_editor.cpp msgid "Add %d Translations" @@ -12088,6 +12082,9 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"Incapaz de guardar um ramo filho de uma cena já instanciada.\n" +"Para guardar este ramo na sua própria cena, abra a cena original, clique " +"direito neste ramo e selecione \"Guardar Ramo como Cena\"." #: editor/scene_tree_dock.cpp msgid "" @@ -12095,6 +12092,9 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"Incapaz de guardar um ramo que é parte de uma cena herdada.\n" +"Para guardar este ramo na sua própria cena, abra a cena original, clique " +"direito neste ramo e selecione \"Guardar Ramo como Cena\"." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -12237,7 +12237,7 @@ msgstr "Tornar Raiz da Cena" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" -msgstr "Combinar a partir da Cena" +msgstr "Mesclar a Partir da Cena" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Save Branch as Scene" @@ -12770,6 +12770,16 @@ msgstr "Definir Raio da Esfera do Oclusor" msgid "Set Occluder Sphere Position" msgstr "Definir Posição da Esfera do Oclusor" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Definir Posição do Ponto do Portal" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Definir posição do Ponto da curva" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Mudar Raio do Cilindro" @@ -13481,38 +13491,36 @@ msgid "Edit Member" msgstr "Editar Membro" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "Definir expressão" +msgstr "Expressão" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "Voltar" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "animação" +msgstr "Condição" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "" +msgstr "se (cond) é:" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "Enquanto" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "enquanto (cond):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "Iterador" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "para (elem) em (input):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -13528,79 +13536,71 @@ msgstr "O iterador tornou-se inválido: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "Sequência" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "Renomear diretoria:" +msgstr "em ordem:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "Inclinação:" +msgstr "Alternar" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" -msgstr "" +msgstr "'input' é:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "Tipos:" +msgstr "Conversão de Tipo" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "É %s?" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "Em %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "On Self" -msgstr "Auto" +msgstr "Nele Próprio" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "No carácter %s" +msgstr "Subtrair %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "Multiplicar %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "Dividir %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "Adicionar %s" +msgstr "Mod %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "ShiftLeft %s" -msgstr "Definir %s" +msgstr "ShiftLeft %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "ShiftRight %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "Fixado %s" +msgstr "BitAnd %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" -msgstr "" +msgstr "BitOr %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitXor %s" -msgstr "" +msgstr "BitXor %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -13625,19 +13625,16 @@ msgid "Invalid index property name '%s' in node %s." msgstr "Nome de propriedade índice '%s' inválido no nó %s." #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Emit %s" -msgstr "Definir %s" +msgstr "Emitir %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Funções" +msgstr "Função" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Compose Array" -msgstr "Redimensionar Array" +msgstr "Compor Array" #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -13649,7 +13646,7 @@ msgstr ": Argumentos inválidos: " #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" -msgstr "" +msgstr "a se cond, senão b" #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " @@ -13660,64 +13657,52 @@ msgid "VariableSet not found in script: " msgstr "VariableSet não encontrado no script: " #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "Recarregar" +msgstr "Pré-carregar" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Índice Z" +msgstr "Obter Índice" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Índice Z" +msgstr "Definir Índice" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "Constante" +msgstr "Constante Global" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "Constante" +msgstr "Constante de Classe" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "Constante" +msgstr "Constante Básica" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "Constante" +msgstr "Constante Matemática" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Engine Singleton" -msgstr "Ativa Singleton GDNative" +msgstr "Obter Singleton do Motor" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "Nó TimeSeek" +msgstr "Obter Nó da Cena" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "Edição da Árvore de Cena" +msgstr "Obter Árvore da Cena" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Self" -msgstr "Auto" +msgstr "Obter Próprio" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "Cortar Nós" +msgstr "CustomNode" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -13733,33 +13718,28 @@ msgstr "" "ou cadeia (error)." #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "SubCall" -msgstr "Chamadas" +msgstr "SubCall" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Constantes" +msgstr "Construir %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "Usar Espaço Local" +msgstr "Obter Var Local" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "Usar Espaço Local" +msgstr "Definir Var Local" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "Ação" +msgstr "Ação %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "Desconstruir %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -13767,40 +13747,35 @@ msgstr "Procurar VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Yield" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Esperar" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "Mover Frame" +msgstr "Próximo Frame" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Physics Frame" -msgstr "Frame de Física %" +msgstr "Próximo Frame de Física" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s sec(s)" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitSignal" -msgstr "Sinal" +msgstr "WaitSignal" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitNodeSignal" -msgstr "Sinal" +msgstr "WaitNodeSignal" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitInstanceSignal" -msgstr "Instância" +msgstr "WaitInstanceSignal" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -14162,10 +14137,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Identificador Inválido:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "O ícone obrigatório não está especificado na predefinição." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Parar Servidor HTTP" @@ -14206,16 +14177,202 @@ msgstr "Incapaz de criar diretoria do servidor HTTP:" msgid "Error starting HTTP server:" msgstr "Erro ao iniciar servidor HTTP:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nome do projeto inválido." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Geometria inválida, incapaz de criar polígono." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Não consegui criar pasta." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Caminho base inválido." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Falha ao carregar recurso." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Falha ao carregar recurso." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Extensão inválida." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Extensão inválida." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Ícones não encontrados." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "A criar miniatura" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Incapaz de encontrar modelo APK para exportar:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Identificador de pacote inválido:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Notarização: assinatura de código necessária." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Notarização: hardened runtime necessário." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Notarização: hardened runtime necessário." #: platform/osx/export/export.cpp @@ -14226,6 +14383,69 @@ msgstr "Notarização: nome Apple ID não especificado." msgid "Notarization: Apple ID password not specified." msgstr "Notarização: senha Apple ID não especificada." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nome curto de pacote inválido." @@ -14284,13 +14504,34 @@ msgstr "Dimensão inválida da imagem do logótipo 310x150 (deve ser 310x150)." msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Dimensões inválidas da imagem do ecrã inicial (deve ser 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Caminho inválido." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Extensão inválida." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "GUID do produto inválido." + #: 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 "" -"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade \"Frames" -"\" para que AnimatedSprite mostre frames." +"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade " +"\"Frames\" para que AnimatedSprite mostre frames." #: scene/2d/canvas_modulate.cpp msgid "" @@ -14419,6 +14660,8 @@ msgid "" "The NavigationObstacle2D only serves to provide collision avoidance to a " "Node2D object." msgstr "" +"NavigationObstacle2D serve apenas para fornecer prevenção de colisão a um " +"objeto Node2D." #: scene/2d/navigation_polygon.cpp msgid "" @@ -14444,7 +14687,6 @@ msgstr "" "ParallaxBackground." #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " @@ -14462,6 +14704,12 @@ msgid "" "You can use the \"Convert to CPUParticles2D\" toolbar option for this " "purpose." msgstr "" +"No macOS a renderização de Particles2D é muito mais lenta do que a de " +"CPUParticles2D devido a transformações serem implementadas no CPU e não no " +"GPU.\n" +"Considere usar CPUParticles2D quando desenvolver para macOS.\n" +"Pode usar a opção \"Converter em CPUParticles2D\" da barra de ferramentas " +"para este propósito." #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" @@ -14686,7 +14934,7 @@ msgstr "Uma SpotLight com ângulo superior a 90 graus não cria sombras." #: scene/3d/navigation_agent.cpp msgid "The NavigationAgent can be used only under a spatial node." -msgstr "" +msgstr "O NavigationAgent pode ser apenas usado dentro de um nó espacial." #: scene/3d/navigation_mesh_instance.cpp msgid "" @@ -14701,6 +14949,8 @@ msgid "" "The NavigationObstacle only serves to provide collision avoidance to a " "spatial object." msgstr "" +"NavigationObstacle serve apenas para fornecer prevenção de colisão a um " +"objeto espacial." #: scene/3d/occluder.cpp msgid "No shape is set." @@ -14711,11 +14961,10 @@ msgid "Only uniform scales are supported." msgstr "Apenas são suportadas escalas uniformes." #: scene/3d/particles.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "Partículas baseadas em GPU não são suportadas pelo driver de vídeo GLES2.\n" "Use o nó CPUParticles. Pode usar a opção \"Converter em CPUParticles\" para " @@ -14728,6 +14977,12 @@ msgid "" "Consider using CPUParticles instead when targeting macOS.\n" "You can use the \"Convert to CPUParticles\" toolbar option for this purpose." msgstr "" +"No macOS a renderização de Particles é muito mais lenta do que a de " +"CPUParticles devido a transformações serem implementadas no CPU e não no " +"GPU.\n" +"Considere usar CPUParticles quando desenvolver para macOS.\n" +"Pode usar a opção \"Converter em CPUParticles\" da barra de ferramentas para " +"este propósito." #: scene/3d/particles.cpp msgid "" @@ -14916,8 +15171,8 @@ msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade \"Frames" -"\" de forma a que AnimatedSprite3D mostre frames." +"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade " +"\"Frames\" de forma a que AnimatedSprite3D mostre frames." #: scene/3d/vehicle_body.cpp msgid "" @@ -14997,9 +15252,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Este nó foi descontinuado. Use antes AnimationTree." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Cor: #%s\n" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index b60b09c80e..5d3f9ee158 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -117,7 +117,7 @@ # Arthur Phillip D. Silva <artphil.dev@gmail.com>, 2021. # Gustavo HM 102 <gustavohm102@gmail.com>, 2021. # Douglas Leão <djlsplays@gmail.com>, 2021. -# PauloFRs <paulofr1@hotmail.com>, 2021. +# PauloFRs <paulofr1@hotmail.com>, 2021, 2022. # Diego Bloise <diego-dev@outlook.com>, 2021. # Alkoarism <Alkoarism@gmail.com>, 2021. # リーLee <kaualee304@gmail.com>, 2021. @@ -133,13 +133,14 @@ # Orangotango De tanga <luizinho0045@gmail.com>, 2021. # Felipe SiFa <felipe@logus.digital>, 2022. # Gabriel Gian <gabrielgian@live.com>, 2022. +# waleson azevedo pessoa de melo <walesonmelo23@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2022-01-07 11:42+0000\n" -"Last-Translator: Felipe SiFa <felipe@logus.digital>\n" +"PO-Revision-Date: 2022-02-14 22:08+0000\n" +"Last-Translator: PauloFRs <paulofr1@hotmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -147,7 +148,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.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -449,9 +450,8 @@ msgid "Duplicate Key(s)" msgstr "Duplicar Chave(s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add RESET Value(s)" -msgstr "Adicionar %d Frame(s)" +msgstr "Adicionar valor(es) de RESET" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" @@ -627,7 +627,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy msgid "Anim Add RESET Keys" -msgstr "Alterar Escala das Chaves na Anim" +msgstr "Anim Adicionar teclas de RESET" #: editor/animation_track_editor.cpp msgid "" @@ -636,8 +636,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1501,7 +1501,7 @@ msgid "Bus Options" msgstr "Opções do canal" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplicar" @@ -1613,7 +1613,7 @@ msgstr "Nome Inválido." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "Não pode começar com um dígito." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -2241,9 +2241,8 @@ msgid "Properties" msgstr "Propriedades" #: editor/editor_help.cpp -#, fuzzy msgid "overrides %s:" -msgstr "sobrescrever:" +msgstr "substitui %s:" #: editor/editor_help.cpp msgid "default:" @@ -2303,11 +2302,11 @@ msgstr "Descrições do Método" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Atualmente não existe descrição para este método. Por favor nos ajude [color=" -"$color][url=$url]contribuindo uma[/url][/color]!" +"Atualmente não existe descrição para este método. Por favor nos ajude " +"[color=$color][url=$url]contribuindo uma[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -2385,16 +2384,17 @@ msgstr "Propriedade:" #: editor/editor_inspector.cpp #, fuzzy msgid "Pin value" -msgstr "(valor)" +msgstr "Valor do pino" #: editor/editor_inspector.cpp msgid "" "Pinning a value forces it to be saved even if it's equal to the default." -msgstr "" +msgstr "Fixar um valor força-o a ser salvo mesmo que seja igual ao padrão." #: editor/editor_inspector.cpp +#, fuzzy msgid "Pin value [Disabled because '%s' is editor-only]" -msgstr "" +msgstr "Valor do pino [Desativado porque '%s' é somente editor]" #: editor/editor_inspector.cpp editor/scene_tree_dock.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -2409,26 +2409,23 @@ msgstr "Definir Múltiplos:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "" +msgstr "%s fixado" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "" +msgstr "%s não fixado" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" msgstr "Copiar Propriedades" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" msgstr "Colar Propriedades" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "Copiar Caminho do Script" +msgstr "Copiar Caminho da Propriedade" #: editor/editor_log.cpp msgid "Output:" @@ -3161,9 +3158,8 @@ msgid "Install Android Build Template..." msgstr "Instalar Modelo de Compilação Android..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Abrir a Pasta de dados do Editor" +msgstr "Abrir Pasta de Dados do Usuário" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3252,7 +3248,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Force Shader Fallbacks" -msgstr "" +msgstr "Forçar Fallbacks do Shader" #: editor/editor_node.cpp msgid "" @@ -3263,6 +3259,13 @@ msgid "" "Asynchronous shader compilation must be enabled in the project settings for " "this option to make a difference." msgstr "" +"Quando esta opção estiver habilitada, os shaders serão usados em seu " +"formulário de fallback (visível por meio de um ubershader ou oculto) durante " +"todo o tempo de execução.\n" +"Isso é útil para verificar a aparência e o desempenho de fallbacks, que " +"normalmente são exibidos brevemente.\n" +"A compilação de sombreador assíncrono deve ser habilitada nas configurações " +"do projeto para que esta opção faça a diferença." #: editor/editor_node.cpp msgid "Synchronize Scene Changes" @@ -3426,10 +3429,16 @@ msgid "Update Continuously" msgstr "Atualizar Continuamente" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Atualizar quando Alterado" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Alterações de Material:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Ocultar Spinner de Atualização" @@ -3875,9 +3884,8 @@ msgstr "Importar a Partir do Nó:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Erro" +msgstr "Erro %s" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4209,6 +4217,14 @@ msgstr "Nome contém caracteres inválidos." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4327,7 +4343,7 @@ msgstr "Ordenar por Último Modificado" msgid "Sort by First Modified" msgstr "Ordenar por Primeiro Modificado" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplicar..." @@ -4428,9 +4444,8 @@ msgid "Replace..." msgstr "Substituir..." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Replace in Files" -msgstr "Substituir Tudo" +msgstr "Substituir em Arquivos" #: editor/find_in_files.cpp msgid "Find: " @@ -4441,9 +4456,8 @@ msgid "Replace: " msgstr "Substituir: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace All (NO UNDO)" -msgstr "Substituir Tudo" +msgstr "Substituir tudo (SEM DESFAZER)" #: editor/find_in_files.cpp msgid "Searching..." @@ -4669,6 +4683,8 @@ msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." msgstr "" +"Selecione um arquivo de recurso no sistema de arquivos ou no inspetor para " +"ajustar as configurações de importação." #: editor/inspector_dock.cpp msgid "Failed to load resource." @@ -5141,6 +5157,10 @@ msgid "Rename Animation" msgstr "Renomear Animação" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplicar Animação" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Misturar com o Próximo Alterado" @@ -5153,10 +5173,6 @@ msgid "Load Animation" msgstr "Carregar Animação" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplicar Animação" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Nenhuma animação para copiar!" @@ -5727,7 +5743,7 @@ msgstr "Todos" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search templates, projects, and demos" -msgstr "Pesquisar modelos, projetos e demonstrações" +msgstr "Pesquisar modelos, projetos, e demonstrações" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Search assets (excluding templates, projects, and demos)" @@ -6139,9 +6155,8 @@ msgid "Alt+Drag: Move selected node." msgstr "Alt+Arrastar: Mover nó selecionado." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Scale selected node." -msgstr "Alt+Arrastar: Mover nó selecionado." +msgstr "Alt+Arrastar: Dimensionar o nó selecionado." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "V: Set selected node's pivot position." @@ -6175,7 +6190,7 @@ msgstr "Modo de Escalonamento" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Shift: Scale proportionally." -msgstr "" +msgstr "Shift: Dimensiona proporcionalmente." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6274,9 +6289,8 @@ msgstr "Travar o objeto selecionado no local (não pode ser movido)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected Node(s)" -msgstr "Fixar Seleção" +msgstr "Bloquear nós selecionados" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6285,9 +6299,8 @@ msgstr "Destravar o objeto selecionado (pode ser movido)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected Node(s)" -msgstr "Destravar Selecionado" +msgstr "Desbloqueie os nós selecionados" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6296,9 +6309,8 @@ msgstr "Garante que os filhos do objeto não sejam selecionáveis." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected Node(s)" -msgstr "Agrupar Selecionados" +msgstr "Agrupar nós selecionados" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6307,9 +6319,8 @@ msgstr "Restaura a habilidade dos filhos do objeto de serem selecionados." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected Node(s)" -msgstr "Desagrupar Selecionados" +msgstr "Desagrupar nós selecionados" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton Options" @@ -7954,9 +7965,8 @@ msgid "Find in Files..." msgstr "Procurar nos Arquivos..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Replace in Files..." -msgstr "Substituir..." +msgstr "Substituir em Arquivos..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" @@ -8484,16 +8494,15 @@ msgstr "Alternar Visão Livre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Decrease Field of View" -msgstr "" +msgstr "Diminuir o Campo de Visão" #: editor/plugins/spatial_editor_plugin.cpp msgid "Increase Field of View" -msgstr "" +msgstr "Aumentar o Campo de Visão" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Reset Field of View to Default" -msgstr "Redefinir padrões" +msgstr "Redefinir o Campo de Visão para o Padrão" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9223,22 +9232,19 @@ msgstr "Adicionar Modelo" #: editor/plugins/theme_editor_plugin.cpp msgid "Filter the list of types or create a new custom type:" -msgstr "" +msgstr "Filtre a lista de tipos ou crie um novo tipo personalizado:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Available Node-based types:" -msgstr "Perfis Disponíveis:" +msgstr "Tipos baseados em nós disponíveis:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Type name is empty!" -msgstr "O nome do arquivo está vazio." +msgstr "O nome do tipo está vazio!" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Are you sure you want to create an empty type?" -msgstr "Tem certeza de que quer abrir mais de um projeto?" +msgstr "Tem certeza de que deseja criar um tipo vazio?" #: editor/plugins/theme_editor_plugin.cpp msgid "Confirm Item Rename" @@ -9857,9 +9863,8 @@ msgid "TileSet" msgstr "Conjunto de Telha" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." -msgstr "Nenhum complemento VCS está disponível." +msgstr "Nenhum plug-in VCS está disponível." #: editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -9869,53 +9874,48 @@ msgstr "Erro" msgid "" "Remote settings are empty. VCS features that use the network may not work." msgstr "" +"As configurações remotas estão vazias. Os recursos VCS que usam a rede podem " +"não funcionar." #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "Nenhum nome fornecido." +msgstr "Nenhuma mensagem de commit foi fornecida." #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "Confirmação" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Alterações de Shader:" +msgstr "Mudanças em fases" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Alterações de Shader:" +msgstr "Mudanças Não Fásicas" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "Confirmação" +msgstr "Commit:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "Encontro:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "Subárvore" +msgstr "Subtítulo:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "Deseja remover a ramificação %s?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "Tem certeza de que quer abrir mais de um projeto?" +msgstr "Deseja remover o controle remoto %s?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "Redefinir" +msgstr "Aplicar" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9926,106 +9926,96 @@ msgid "Initialize" msgstr "Inicializar" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "Remover Ponto" +msgstr "Login remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "Renomear" +msgstr "Nome do usuário" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "Senha" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "Caminho da chave pública SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "Selecione o caminho da chave pública SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "Caminho da chave privada SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "Selecione o caminho da chave privada SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "SSH Passphrase" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "Detectar novas mudanças" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "Fechar e salvar alterações?" +msgstr "Descartar todas as alterações" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "Armazenando alterações locais..." +msgstr "Preparar todas as alterações" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "Alterações de Material:" +msgstr "Desfaça todas as alterações" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "Confirmar Mudanças" +msgstr "Mensagem de Commit" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "Confirmar Mudanças" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "Confirmação" +msgstr "Lista de compromissos" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "Confirmar tamanho da lista" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Correspondências:" +msgstr "Ramos" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "Criar Novo Projeto" +msgstr "Criar Novo Ramo" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "Remover Trilha da Anim" +msgstr "Remover Ramo" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "Nome do Ramo" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -10033,41 +10023,36 @@ msgid "Remotes" msgstr "Remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "Criar Novo Projeto" +msgstr "Criar Novo Remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "Remover Item" +msgstr "Remover remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Remoto " +msgstr "Nome Remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "Remoto " +msgstr "URL do Remoto" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "Buscar" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "Puxar" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "Empurre" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "Malha de Origem:" +msgstr "Forçar Push" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -10087,22 +10072,19 @@ msgstr "Alteração de tipo" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "Não mesclado" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "Visualizar" +msgstr "Visualizar:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "Dividir Caminho" +msgstr "Dividir" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "Modificado" +msgstr "Unificado" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -10126,7 +10108,7 @@ msgstr "Booleano" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sampler" -msgstr "Sampler" +msgstr "Amostrador" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -10138,7 +10120,7 @@ msgstr "Adicionar porta de saída" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change input port type" -msgstr "Alterar tipo da porta de entrada" +msgstr "Alterar o tipo de porta de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change output port type" @@ -10182,7 +10164,7 @@ msgstr "Adicionar Nó ao Visual Shader" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Node(s) Moved" -msgstr "Node(s) Movidos" +msgstr "Nó(s) Movidos" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Duplicate Nodes" @@ -10191,7 +10173,7 @@ msgstr "Duplicar Nó(s)" #: editor/plugins/visual_shader_editor_plugin.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Paste Nodes" -msgstr "Colar Nodes" +msgstr "Colar Nós" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Delete Nodes" @@ -10291,7 +10273,7 @@ msgstr "Cor constante." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color uniform." -msgstr "Uniformidade de cor." +msgstr "Cor uniforme." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the %s comparison between two parameters." @@ -10694,8 +10676,8 @@ msgstr "" "OuterProduct trata o primeiro parâmetro \"c\" como um vetor coluna (matriz " "com uma coluna) e o segundo parâmetro \"r\" como um vetor linha (matriz com " "uma linha) e faz uma matriz algébrica linear multiplicar \"c * r\", " -"produzindo uma matriz cujo número de linhas é o número de componentes em \"c" -"\" e cujo número de colunas é o número de componentes em \"r\"." +"produzindo uma matriz cujo número de linhas é o número de componentes em " +"\"c\" e cujo número de colunas é o número de componentes em \"r\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." @@ -12250,6 +12232,10 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"Não é possível salvar um branch que é filho de uma cena já instanciada.\n" +"Para salvar esta ramificação em sua própria cena, abra a cena original, " +"clique com o botão direito nesta ramificação e selecione \"Salvar " +"ramificação como cena\"." #: editor/scene_tree_dock.cpp msgid "" @@ -12257,6 +12243,10 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"Não é possível salvar uma ramificação que faz parte de uma cena herdada.\n" +"Para salvar esta ramificação em sua própria cena, abra a cena original, " +"clique com o botão direito nesta ramificação e selecione \"Salvar " +"ramificação como cena\"." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -12931,6 +12921,16 @@ msgstr "Definir Raio Da Esfera Do Oclusor" msgid "Set Occluder Sphere Position" msgstr "Definir Posição Da Esfera Do Oclusor" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Definir Posição Do Ponto Do Portal" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Definir Posição do Ponto da Curva" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Alterar Raio do Cilindro" @@ -13183,7 +13183,7 @@ msgstr "Atribua um recurso MeshLibrary a este GridMap para usar seus meshes." #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "Iniciar pré-cálculo" +msgstr "Iniciar bake" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" @@ -13643,34 +13643,32 @@ msgid "Edit Member" msgstr "Editar Membro" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "Definir expressão" +msgstr "Expressão" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "Retornar" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "animação" +msgstr "Condição" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "" +msgstr "if (cond) is:" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "Enquanto" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "while(cond):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "Iterador" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" @@ -13690,7 +13688,7 @@ msgstr "Iterador tornou-se inválido: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "Seqüência" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy @@ -13698,18 +13696,16 @@ msgid "in order:" msgstr "Renomear pasta:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "Tom:" +msgstr "Switch" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "Modelos:" +msgstr "Tipo de Projeção" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" @@ -13934,7 +13930,7 @@ msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Esperar" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy @@ -14089,7 +14085,7 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "Missing 'build-tools' directory!" -msgstr "Diretório 'ferramentas-da-plataforma' está faltando!" +msgstr "Diretório 'build-tools' está faltando!" #: platform/android/export/export_plugin.cpp msgid "Unable to find Android SDK build-tools' apksigner command." @@ -14155,8 +14151,8 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "\"Target Sdk\" version must be greater or equal to \"Min Sdk\" version." msgstr "" -"Versão do \"Target Sdk\" precisa ser igual ou maior que a versão do \"Min Sdk" -"\"." +"Versão do \"Target Sdk\" precisa ser igual ou maior que a versão do \"Min " +"Sdk\"." #: platform/android/export/export_plugin.cpp msgid "" @@ -14337,10 +14333,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "O nome não é um identificador válido:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "Ícone necessário não especificado na predefinição." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Parar Servidor HTTP" @@ -14381,16 +14373,202 @@ msgstr "Não foi possível criar o diretório do servidor HTTP:" msgid "Error starting HTTP server:" msgstr "Erro ao iniciar servidor HTTP:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nome de projeto inválido." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Geometria inválida, não é possível criar o polígono." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Não foi possível criar a pasta." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Caminho base inválido." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Falha ao carregar recurso." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Falha ao carregar recurso." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Extensão inválida." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Extensão inválida." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Ícones não encontrados." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Criando Miniatura" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Não foi possível encontrar o modelo de APK para exportar:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Identificador de pacote inválido:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Notarização: assinatura de código necessária." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Notarização: requer tempo de execução reforçado." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Notarização: requer tempo de execução reforçado." #: platform/osx/export/export.cpp @@ -14401,6 +14579,69 @@ msgstr "Notarização: Nome do Apple ID não especificado." msgid "Notarization: Apple ID password not specified." msgstr "Notarização: Senha do Apple ID não especificada." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nome de pacote inválido." @@ -14453,6 +14694,27 @@ msgstr "Dimensões inválidas de logo retangular de 310x150 (deve ser 310x150)." msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Dimensões inválidas da tela de abertura (deve ser 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Caminho inválido." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Extensão inválida." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "GUID de produto inválido." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14888,8 +15150,8 @@ msgstr "Apenas escalas uniformes são suportadas." #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "Partículas baseadas em GPU não são suportadas pelo driver de vídeo GLES2.\n" "Use o nó CPUParticles como substituto. Você pode usar a opção \"Converter " @@ -15091,8 +15353,8 @@ msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"Um recurso SpriteFrames deve ser criado ou definido na propriedade \"Frames" -"\" para que o nó AnimatedSprite3D mostre quadros." +"Um recurso SpriteFrames deve ser criado ou definido na propriedade " +"\"Frames\" para que o nó AnimatedSprite3D mostre quadros." #: scene/3d/vehicle_body.cpp msgid "" @@ -15173,9 +15435,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Este nó foi descontinuado. Use AnimationTree em vez disso." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Cor: #%s\n" @@ -15235,7 +15498,7 @@ msgstr "Deve usar uma extensão válida." #: scene/gui/graph_edit.cpp msgid "Enable grid minimap." -msgstr "Ativar mini mapa em grade." +msgstr "Ativar minimap em grade." #: scene/gui/nine_patch_rect.cpp msgid "" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index 216de7fab1..1c63a57d74 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -520,8 +520,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1389,7 +1389,7 @@ msgid "Bus Options" msgstr "Opțiuni Pistă Audio" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplicat" @@ -2198,8 +2198,8 @@ msgstr "Descrierile Metodei" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Nu există în prezent nici o descriere pentru această metodă. Te rog ajută-ne " "de prin a [color = $color] [url = $url] contribui cu una [/ URL] [/ color]!" @@ -3319,10 +3319,16 @@ msgid "Update Continuously" msgstr "Actualizare continuă" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Actualizează Doar La Modificare" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Modificări ale Actualizării" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Dezactivează Cercul de Actualizare" @@ -4088,6 +4094,14 @@ msgstr "Numele furnizat conține caractere nevalide." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4201,7 +4215,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplicați..." @@ -5030,6 +5044,10 @@ msgid "Rename Animation" msgstr "Redenumește Animația" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplicare Animație" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Amestecă Următoarea Schimbare" @@ -5042,10 +5060,6 @@ msgid "Load Animation" msgstr "Încarcă Animație" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplicare Animație" - -#: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "No animation to copy!" msgstr "EROARE: Nicio copie a animației!" @@ -12943,6 +12957,16 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "Setare Curbă În Poziție" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Setare poziție punct de curbă" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Setare poziție punct de curbă" + #: modules/csg/csg_gizmos.cpp #, fuzzy msgid "Change Cylinder Radius" @@ -14316,10 +14340,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Identificator nevalid:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14364,17 +14384,196 @@ msgstr "Directorul nu a putut fi creat." msgid "Error starting HTTP server:" msgstr "Eroare la scrierea TextFile:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Nume de Proiect Nevalid." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Directorul nu a putut fi creat." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Cale nevalidă." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Încărcarea resursei a eșuat." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Încărcarea resursei a eșuat." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Trebuie să utilizaţi o extensie valida." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Trebuie să utilizaţi o extensie valida." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Nu s-a găsit nici o sub-resursă." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Creând Thumbnail" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Identificator nevalid:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14385,6 +14584,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14443,6 +14705,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Cale nevalidă." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Trebuie să utilizaţi o extensie valida." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Nume de Proiect Nevalid." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14795,8 +15078,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -15039,7 +15322,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index d8ca320413..77e4143911 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -101,12 +101,13 @@ # mrvladus <mrvladus@yandex.ru>, 2021. # DΞLTΛ <craftercrafter43@gmail.com>, 2021. # AngryPhilomel <an.aries@icloud.com>, 2021. +# Russkikh Michail <summersay415@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" +"PO-Revision-Date: 2022-02-10 07:50+0000\n" "Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" @@ -114,9 +115,9 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.10.1\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -605,8 +606,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -848,7 +849,7 @@ msgstr "Заменить всё" #: editor/code_editor.cpp msgid "Selection Only" -msgstr "Только выделять" +msgstr "Только выделенное" #: editor/code_editor.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/text_editor.cpp @@ -1468,7 +1469,7 @@ msgid "Bus Options" msgstr "Параметры шины" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Дублировать" @@ -2262,8 +2263,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"В настоящее время отсутствует описание этого свойства. Пожалуйста [color=" -"$color][url=$url]помогите нам[/url][/color]!" +"В настоящее время отсутствует описание этого свойства. Пожалуйста " +"[color=$color][url=$url]помогите нам[/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2271,11 +2272,11 @@ msgstr "Описания методов" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"В настоящее время отсутствует описание этого метода. Пожалуйста [color=" -"$color][url=$url]помогите нам[/url][/color]!" +"В настоящее время отсутствует описание этого метода. Пожалуйста " +"[color=$color][url=$url]помогите нам[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -3124,9 +3125,8 @@ msgid "Install Android Build Template..." msgstr "Установить шаблон сборки Android..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Открыть папку данных редактора" +msgstr "Открыть папку данных пользователя" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3395,10 +3395,16 @@ msgid "Update Continuously" msgstr "Непрерывное обновление" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Обновлять при изменениях" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Материалов изменено:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Скрыть индикатор обновлений" @@ -3843,9 +3849,8 @@ msgstr "Импортировать из узла:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Ошибка" +msgstr "Ошибка %s" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4169,6 +4174,14 @@ msgstr "Имя содержит недопустимые символы." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4287,7 +4300,7 @@ msgstr "Сортировать по последнему изменению" msgid "Sort by First Modified" msgstr "Сортировать по первому изменению" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Дублировать..." @@ -5096,6 +5109,10 @@ msgid "Rename Animation" msgstr "Переименовать анимацию" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Дублировать анимацию" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Изменена последующая анимация" @@ -5108,10 +5125,6 @@ msgid "Load Animation" msgstr "Загрузить анимацию" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Дублировать анимацию" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Нет анимации для копирования!" @@ -7977,7 +7990,7 @@ msgstr "2D скелет" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Reset to Rest Pose" -msgstr "Создать позу покоя" +msgstr "Задать позу покоя" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Overwrite Rest Pose" @@ -9803,9 +9816,8 @@ msgid "TileSet" msgstr "Набор тайлов" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." -msgstr "Нет доступных VCS плагинов." +msgstr "Нет доступных плагинов VCS." #: editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -9815,53 +9827,47 @@ msgstr "Ошибка" msgid "" "Remote settings are empty. VCS features that use the network may not work." msgstr "" +"Удалённые настройки пусты. Функции VCS, использующие сеть, могут не работать." #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "Не предоставлено имя." +msgstr "Не указано сообщение коммита." #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "Коммит" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Шейдеров изменено:" +msgstr "Изменения в индексе" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Шейдеров изменено:" +msgstr "Изменения не в индексе" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "Коммит" +msgstr "Коммит:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "Дата:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "Поддерево" +msgstr "Подзаголовок:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "Вы хотите удалить ветку %s?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "Вы уверены, что хотите создать пустой тип?" +msgstr "Вы хотите удалить отслеживаемую ветку %s?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "Применить сброс" +msgstr "Применить" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9872,148 +9878,132 @@ msgid "Initialize" msgstr "Инициализировать" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "Удалить точку" +msgstr "Удалённый вход" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "Переименовать" +msgstr "Имя пользователя" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "Пароль" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "Путь к открытому ключу SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "Выберите путь к открытому ключу SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "Путь к закрытому ключу SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "Выберите путь к закрытому ключу SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "Парольная фраза SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "Проверить изменения" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "Закрыть и сохранить изменения?" +msgstr "Отменить все изменения" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "Сохранение локальных изменений..." +msgstr "Индексировать все изменения" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "Материалов изменено:" +msgstr "Убрать из индекса все изменения" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "Закоммитить изменения" +msgstr "Сообщение коммита" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "Закоммитить изменения" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "Коммит" +msgstr "Список коммитов" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "Размер списка коммитов" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Совпадения:" +msgstr "Ветки" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "Создать новый проект" +msgstr "Создать новую ветку" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "Удалить дорожку" +msgstr "Удалить ветку" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "Имя ветки" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" -msgstr "Удаленный" +msgstr "Внешние репозитории" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "Создать новый проект" +msgstr "Добавить внешний репозиторий" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "Удалить элемент" +msgstr "Удалить внешний репозиторий" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Удаленный " +msgstr "Название внешнего репозитория" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "Удаленный " +msgstr "URL внешнего репозитория" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "Извлечь" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "Получить" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "Отправить" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "Исходная полисетка:" +msgstr "Принудительно отправить" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -10033,22 +10023,19 @@ msgstr "Изменить тип" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "Необъединён" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "Вид" +msgstr "Вид:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "Разделить путь" +msgstr "Раздельный" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "Изменён" +msgstr "Единый" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -12890,6 +12877,16 @@ msgstr "Задать радиус сферы окклюдера" msgid "Set Occluder Sphere Position" msgstr "Задать положение сферы окклюдера" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Задать положение точки портала" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Установить положение точки кривой" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Изменить радиус цилиндра" @@ -13601,38 +13598,36 @@ msgid "Edit Member" msgstr "Редактировать элемент" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "Задать выражение" +msgstr "Выражение" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "Возврат" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "анимация" +msgstr "Условие" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "" +msgstr "Если (условие):" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "Пока" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "пока (условие):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "Итератор" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "для (элемент) в (вход):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -13648,79 +13643,71 @@ msgstr "Итератор стал недействительным: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "Последовательность" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "Переименование папки:" +msgstr "в порядке:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "Высота:" +msgstr "Множественный выбор" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" -msgstr "" +msgstr "«вход» равен:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "Типы:" +msgstr "Приведение типа" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "%s истинно?" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "На %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "On Self" -msgstr "Субъект" +msgstr "На себя" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "На символе %s" +msgstr "Вычесть %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "Умножить %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "Разделить %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "Добавить %s" +msgstr "Остаток от деления %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "ShiftLeft %s" -msgstr "Задать %s" +msgstr "Сдвиг влево %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "Сдвиг вправо %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "Закреплено %s" +msgstr "Побитовое И %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" -msgstr "" +msgstr "Побитовое ИЛИ %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitXor %s" -msgstr "" +msgstr "Побитовое Исключающее ИЛИ %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -13745,19 +13732,16 @@ msgid "Invalid index property name '%s' in node %s." msgstr "Недопустимое имя свойства-индекса «%s» в узле %s." #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Emit %s" -msgstr "Задать %s" +msgstr "Излучить %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Функции" +msgstr "Функция" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Compose Array" -msgstr "Изменить размер массива" +msgstr "Создать массив" #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -13769,7 +13753,7 @@ msgstr ": Недопустимые аргументы: " #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" -msgstr "" +msgstr "a если условие, иначе b" #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " @@ -13780,64 +13764,52 @@ msgid "VariableSet not found in script: " msgstr "VariableSet не найден в скрипте: " #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "Перезагрузить" +msgstr "Предзагрузить" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Z-индекс" +msgstr "Получить индекс" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Z-индекс" +msgstr "Задать индекс" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "Константа" +msgstr "Глобальная константа" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "Константа" +msgstr "Константа класса" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "Константа" +msgstr "Базовая константа" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "Константа" +msgstr "Математическая константа" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Engine Singleton" -msgstr "Включён GDNative синглтон" +msgstr "Получить синглтон движка" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "TimeSeek узел" +msgstr "Получить узел сцены" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "Редактирование дерева сцены" +msgstr "Получить дерево сцены" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Self" -msgstr "Субъект" +msgstr "Получить себя" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "Вырезать узлы" +msgstr "Пользовательский узел" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -13853,33 +13825,28 @@ msgstr "" "out) или строка (error)." #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "SubCall" -msgstr "Вызовы" +msgstr "Подвызов" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Константы" +msgstr "Составить %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "Использовать локальное пространство" +msgstr "Получить локальную переменную" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "Использовать локальное пространство" +msgstr "Задать локальную переменную" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "Действие" +msgstr "Действие %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "Разобрать %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -13887,40 +13854,35 @@ msgstr "Искать VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Приостановить" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Ждать" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "Переместить кадр" +msgstr "Следующий кадр" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Physics Frame" -msgstr "Кадр физики %" +msgstr "Следующий физический кадр" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s сек" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitSignal" -msgstr "Сигнал" +msgstr "Ждать сигнал" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitNodeSignal" -msgstr "Сигнал" +msgstr "Ждать сигнал узла" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitInstanceSignal" -msgstr "Добавить экземпляр" +msgstr "Ждать сигнал объекта" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -14278,10 +14240,6 @@ msgstr "App Store Team ID не указан - невозможно настро msgid "Invalid Identifier:" msgstr "Неверный идентификатор:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "Требуемый значок не указан в предустановке." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Остановить HTTP-сервер" @@ -14322,16 +14280,202 @@ msgstr "Не удалось создать каталог HTTP-сервера:" msgid "Error starting HTTP server:" msgstr "Ошибка запуска HTTP-сервера:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Недопустимое имя проекта." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Некорректная геометрия, нельзя создать полигональную сетку." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Невозможно создать папку." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Недопустимый базовый путь." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Не удалось загрузить ресурс." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Не удалось загрузить ресурс." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Недопустимое расширение." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Недопустимое расширение." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Иконки не найдены." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Создание эскизов" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Не удалось найти шаблон APK для экспорта:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Неверный идентификатор пакета:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Предупреждение: требуется подписание кода." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Предупреждение: требуется усиленный рантайм." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Предупреждение: требуется усиленный рантайм." #: platform/osx/export/export.cpp @@ -14342,6 +14486,69 @@ msgstr "Предупреждение: имя Apple ID не указано." msgid "Notarization: Apple ID password not specified." msgstr "Предупреждение: пароль Apple ID не указан." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Недопустимое короткое имя пакета." @@ -14394,6 +14601,27 @@ msgstr "Неверные размеры широкого логотипа 310x15 msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Неверные размеры заставки (должны быть 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Недопустимый путь." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Недопустимое расширение." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Неверный GUID продукта." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14559,15 +14787,14 @@ msgstr "" "узла ParallaxBackground." #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " "CPUParticles2D\" toolbar option for this purpose." msgstr "" "GPU-частицы не поддерживаются видеодрайвером GLES2.\n" -"Вместо этого используйте узел CPUParticles2D. Для этого можно " -"воспользоваться опцией «Преобразовать в CPUParticles»." +"Вместо этого используйте узел CPUParticles2D. Для этой цели вы можете " +"использовать опцию «Преобразовать в CPUParticles2D» панели инструментов." #: scene/2d/particles_2d.cpp msgid "" @@ -14577,6 +14804,13 @@ msgid "" "You can use the \"Convert to CPUParticles2D\" toolbar option for this " "purpose." msgstr "" +"В macOS отрисовка Particles2D выполняется намного медленнее, чем " +"CPUParticles2D, из-за того что обратная связь преобразования реализуется на " +"CPU, а не на GPU.\n" +"Рассмотрите возможность использования CPUParticles2D вместо Particles2D при " +"работе с macOS.\n" +"Для этой цели вы можете воспользоваться опцией «Преобразовать в " +"CPUParticles2D» панели инструментов." #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" @@ -14833,15 +15067,14 @@ msgid "Only uniform scales are supported." msgstr "Поддерживается только масштабирование uniform." #: scene/3d/particles.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "GPU-частицы не поддерживаются видеодрайвером GLES2.\n" -"Вместо этого используйте узел CPUParticles. Для этого можно воспользоваться " -"опцией «Преобразовать в CPUParticles»." +"Вместо этого используйте узел CPUParticles. Для этой цели вы можете " +"воспользоваться опцией «Преобразовать в CPUParticles» панели инструментов." #: scene/3d/particles.cpp msgid "" @@ -14850,6 +15083,13 @@ msgid "" "Consider using CPUParticles instead when targeting macOS.\n" "You can use the \"Convert to CPUParticles\" toolbar option for this purpose." msgstr "" +"В macOS отрисовка Particles выполняется намного медленнее, чем CPUParticles, " +"из-за того что обратная связь преобразования реализуется на CPU, а не на " +"GPU.\n" +"Рассмотрите возможность использования CPUParticles вместо Particles при " +"работе с macOS.\n" +"Для этой цели вы можете воспользоваться опцией «Преобразовать в " +"CPUParticles» панели инструментов." #: scene/3d/particles.cpp msgid "" @@ -15120,9 +15360,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Этот узел был удален. Вместо этого используйте AnimationTree." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Цвет: #%s\n" diff --git a/editor/translations/si.po b/editor/translations/si.po index f3802b7346..178bcfdfad 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -518,8 +518,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1357,7 +1357,7 @@ msgid "Bus Options" msgstr "ශ්රිත:" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2132,8 +2132,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3164,7 +3164,11 @@ msgid "Update Continuously" msgstr "අඛණ්ඩව" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3891,6 +3895,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4003,7 +4015,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4801,19 +4813,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12314,6 +12326,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13626,10 +13646,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13670,16 +13686,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13690,6 +13876,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13742,6 +13991,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14092,8 +14359,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14333,7 +14600,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index f7acfad23a..d502613ca1 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -512,8 +512,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1382,7 +1382,7 @@ msgid "Bus Options" msgstr "Možnosti pre Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplikovať" @@ -2191,8 +2191,8 @@ msgstr "Popisky Metód" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Zatiaľ tu není žiadny popisok pre túto metódu. Prosím pomôžte nám pomocou " "[color=$color][url=$url]prispetím jedného[/url][/color]!" @@ -3303,10 +3303,16 @@ msgid "Update Continuously" msgstr "Aktualizovať priebežne" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Aktualizovať po Zmene" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Parameter sa Zmenil" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Skryť aktualizáciu Spinner" @@ -4092,6 +4098,14 @@ msgstr "Meno obsahuje neplatné písmená." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4211,7 +4225,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplikovať..." @@ -5026,6 +5040,10 @@ msgid "Rename Animation" msgstr "Premenovať Animáciu" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplikovať Animáciu" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Blend sa Ďalej Zmenil" @@ -5038,10 +5056,6 @@ msgid "Load Animation" msgstr "Načítať Animáciu" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplikovať Animáciu" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Žiadne animácie na skopírovanie!" @@ -12842,6 +12856,16 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "Všetky vybrané" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Všetky vybrané" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Všetky vybrané" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14217,10 +14241,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Nesprávna veľkosť písma." -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14266,17 +14286,196 @@ msgstr "Priečinok sa nepodarilo vytvoriť." msgid "Error starting HTTP server:" msgstr "Error pri ukladaní TileSet-u!" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Neplatné meno skupiny." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Priečinok sa nepodarilo vytvoriť." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Neplatný Názov." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Nepodarilo sa načítať prostriedok." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Nepodarilo sa načítať prostriedok." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Nesprávna veľkosť písma." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Nesprávna veľkosť písma." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Nenašli sa žiadne \"sub-resources\"." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Vytváranie Náhľadu" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Nesprávna veľkosť písma." #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14287,6 +14486,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14344,6 +14606,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Neplatná cesta." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Nesprávna veľkosť písma." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Nesprávna veľkosť písma." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14710,8 +14993,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14952,7 +15235,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index 3c6fc8e571..551b2a5c91 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -26,8 +26,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3;\n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" "X-Generator: Weblate 4.5-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp @@ -544,8 +544,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1441,7 +1441,7 @@ msgid "Bus Options" msgstr "Možnosti Vodila" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Podvoji" @@ -2265,8 +2265,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Trenutno ni opisa za to lastnost. Pomagajte nam s [color=$color][url=" -"$url]prispevkom[/url][/color]!" +"Trenutno ni opisa za to lastnost. Pomagajte nam s [color=$color]" +"[url=$url]prispevkom[/url][/color]!" #: editor/editor_help.cpp #, fuzzy @@ -2275,11 +2275,11 @@ msgstr "Opis Metode:" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Trenutno ni opisa za to metodo. Pomagajte nam s [color=$color][url=" -"$url]prispevkom[/url][/color]!" +"Trenutno ni opisa za to metodo. Pomagajte nam s [color=$color]" +"[url=$url]prispevkom[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -3423,11 +3423,16 @@ msgstr "Neprekinjeno" #: editor/editor_node.cpp #, fuzzy -msgid "Update When Changed" +msgid "Update All Changes" msgstr "Posodobi Spremembe" #: editor/editor_node.cpp #, fuzzy +msgid "Update Vital Changes" +msgstr "Spremebe v Shader" + +#: editor/editor_node.cpp +#, fuzzy msgid "Hide Update Spinner" msgstr "Onemogoči Posodobitve Kolesca" @@ -4202,6 +4207,14 @@ msgstr "Ime vsebuje neveljavne znake." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4325,7 +4338,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Podvoji..." @@ -5202,6 +5215,10 @@ msgid "Rename Animation" msgstr "Preimenuj Animacijo" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Podvoji Animacijo" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Naslednjo Mešanje se je Spremenilo" @@ -5214,10 +5231,6 @@ msgid "Load Animation" msgstr "Naloži Animacijo" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Podvoji Animacijo" - -#: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "No animation to copy!" msgstr "NAPAKA: Ni animacije za kopiranje!" @@ -13183,6 +13196,16 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "Nastavi Krivuljo na Položaj" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Nastavi Položaj Krivuljne Točke" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Nastavi Položaj Krivuljne Točke" + #: modules/csg/csg_gizmos.cpp #, fuzzy msgid "Change Cylinder Radius" @@ -14575,10 +14598,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Ime ni pravilen identifikator:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14623,17 +14642,196 @@ msgstr "Mape ni mogoče ustvariti." msgid "Error starting HTTP server:" msgstr "Napaka pri shranjevanju PloščnegaNiza!" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Neveljavno Ime Projekta." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Mape ni mogoče ustvariti." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Neveljavna Pot." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Napaka pri nalaganju vira." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Napaka pri nalaganju vira." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Uporabiti moraš valjavno razširitev." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Uporabiti moraš valjavno razširitev." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Ni Zadetka!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Ustvarjanje Sličic" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Ime ni pravilen identifikator:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14644,6 +14842,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14702,6 +14963,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Neveljavna Pot." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Uporabiti moraš valjavno razširitev." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Neveljavno Ime Projekta." + #: scene/2d/animated_sprite.cpp #, fuzzy msgid "" @@ -15072,8 +15354,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -15322,7 +15604,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index 6e4a0c84fe..b4115a9c60 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -503,8 +503,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1378,7 +1378,7 @@ msgid "Bus Options" msgstr "Përshkrimi i Klasës" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Dyfisho" @@ -2208,8 +2208,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Nuk ka për momentin përshkrim për këtë veti. Të lutem na ndihmo duke [color=" -"$color][url=$url]contributing one[/url][/color]!" +"Nuk ka për momentin përshkrim për këtë veti. Të lutem na ndihmo duke " +"[color=$color][url=$url]contributing one[/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2217,8 +2217,8 @@ msgstr "Përshkrimi i Metodës" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Nuk ka për momentin një përshkrim për këtë metod. Të lutem na ndihmo duke " "[color=$color][url=$url]contributing one[/url][/color]!" @@ -3359,7 +3359,12 @@ msgstr "I Vazhdueshëm" #: editor/editor_node.cpp #, fuzzy -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "Përditëso Ndryshimet" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" msgstr "Përditëso Ndryshimet" #: editor/editor_node.cpp @@ -4141,6 +4146,14 @@ msgstr "Emri permban karaktere të pasakta." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4260,7 +4273,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Dyfisho..." @@ -5086,19 +5099,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12780,6 +12793,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14135,10 +14156,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14183,16 +14200,195 @@ msgstr "Nuk mund të krijoj folderin." msgid "Error starting HTTP server:" msgstr "Gabim gjatë ruajtjes së TileSet-it!" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Emri i grupit i pasakt." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Nuk mund të krijoj folderin." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Rruga e pasaktë." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Dështoi të ngarkojë resursin." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Dështoi të ngarkojë resursin." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Duhet të perdorësh një shtesë të lejuar." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Duhet të perdorësh një shtesë të lejuar." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Konstantet" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Duke Krijuar Kornizat" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14203,6 +14399,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14257,6 +14516,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Rruga e pasaktë." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Duhet të perdorësh një shtesë të lejuar." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Emri i grupit i pasakt." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14609,8 +14889,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14850,7 +15130,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index 95723f17e4..fab8794167 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -18,8 +18,8 @@ msgstr "" "Language: sr_Cyrl\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.9-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp @@ -566,8 +566,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1497,7 +1497,7 @@ msgid "Bus Options" msgstr "Поставке баса" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Дуплирај" @@ -2363,8 +2363,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Тренутно нема описа ове особине. Молимо помозите нама тако што ћете [color=" -"$color][url=$url]написати једну[/url][/color]!" +"Тренутно нема описа ове особине. Молимо помозите нама тако што ћете " +"[color=$color][url=$url]написати једну[/url][/color]!" #: editor/editor_help.cpp #, fuzzy @@ -2373,11 +2373,11 @@ msgstr "Описи Метода" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Тренутно нема описа ове методе. Молимо помозите нама тако што ћете [color=" -"$color][url=$url]написати једну[/url][/color]!" +"Тренутно нема описа ове методе. Молимо помозите нама тако што ћете " +"[color=$color][url=$url]написати једну[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -3553,11 +3553,16 @@ msgstr "Трајан" #: editor/editor_node.cpp #, fuzzy -msgid "Update When Changed" +msgid "Update All Changes" msgstr "Ажурирај промене" #: editor/editor_node.cpp #, fuzzy +msgid "Update Vital Changes" +msgstr "Промене материјала" + +#: editor/editor_node.cpp +#, fuzzy msgid "Hide Update Spinner" msgstr "Искључи индикатор ажурирања" @@ -4399,6 +4404,14 @@ msgstr "Дато име садржи неважећа слова." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4526,7 +4539,7 @@ msgstr "Задњи Измењен" msgid "Sort by First Modified" msgstr "Задњи Измењен" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Duplicate..." msgstr "Дуплирај" @@ -5445,6 +5458,10 @@ msgid "Rename Animation" msgstr "Преименуј анимацију" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Дуплирај анимацију" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Промена следеће анимације" @@ -5457,10 +5474,6 @@ msgid "Load Animation" msgstr "Учитај анимацију" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Дуплирај анимацију" - -#: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "No animation to copy!" msgstr "Грешка: нема анимације за копирање!" @@ -14306,6 +14319,16 @@ msgstr "Промени Опсег Цилиндар Облика" msgid "Set Occluder Sphere Position" msgstr "Постави почетну позицију криве" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Постави позицију тачке криве" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Постави позицију тачке криве" + #: modules/csg/csg_gizmos.cpp #, fuzzy msgid "Change Cylinder Radius" @@ -15825,11 +15848,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Неважећи идентификатор:" -#: platform/iphone/export/export.cpp -#, fuzzy -msgid "Required icon is not specified in the preset." -msgstr "Неопходна иконица није наведена у подешавању." - #: platform/javascript/export/export.cpp #, fuzzy msgid "Stop HTTP Server" @@ -15880,17 +15898,198 @@ msgstr "Неуспех при прављењу директоријума." msgid "Error starting HTTP server:" msgstr "Грешка памћена сцена." +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Неважеће име." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Неважећа геометрија, неуспешно креирање многоугла." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Неуспех при прављењу директоријума." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Неважећа основна путања." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Грешка при учитавању ресурса." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Грешка при учитавању ресурса." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Мора се користити важећа екстензија." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Мора се користити важећа екстензија." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Није пронађено!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Прављење приказа" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "Неуспешно отварање нацрта за извоз:" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Неважећи идентификатор:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -15901,6 +16100,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -15966,6 +16228,27 @@ msgstr "Неважеће димензије слике за широки лог msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Неважеће димензије слике за уводни екран (треба да буде 620*300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Неважећи пут." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Мора се користити важећа екстензија." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Неважећи GUID продукт." + #: scene/2d/animated_sprite.cpp #, fuzzy msgid "" @@ -16435,8 +16718,8 @@ msgstr "" #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "GPU-базиране честице нису подржане од стране GLES2 видео управљача." #: scene/3d/particles.cpp @@ -16718,7 +17001,7 @@ msgstr "Овај члан је застарео. Користи AnimationTree к #, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Боја: #%s\n" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index a3db7ebbae..e4a6a62ec9 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -19,8 +19,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 3.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp @@ -521,8 +521,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1365,7 +1365,7 @@ msgid "Bus Options" msgstr "Funkcije:" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2144,8 +2144,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3180,8 +3180,14 @@ msgid "Update Continuously" msgstr "Neprekidna" #: editor/editor_node.cpp -msgid "Update When Changed" -msgstr "" +#, fuzzy +msgid "Update All Changes" +msgstr "Napravi" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Napravi" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -3910,6 +3916,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4022,7 +4036,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4823,19 +4837,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12431,6 +12445,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13755,10 +13777,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13799,16 +13817,187 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Kontanta" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13819,6 +14008,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13871,6 +14123,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14221,8 +14491,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14462,7 +14732,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 87d39fb5ee..9645a3adff 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -526,8 +526,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1395,7 +1395,7 @@ msgid "Bus Options" msgstr "Buss-alternativ" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Duplicera" @@ -2214,8 +2214,8 @@ msgstr "Metodbeskrivning" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Det finns för närvarande ingen beskrivning för denna metod. Snälla hjälp oss " "genom att [color=$color][url=$url]bidra med en[/url][/color]!" @@ -3345,10 +3345,15 @@ msgstr "Kontinuerlig" #: editor/editor_node.cpp #, fuzzy -msgid "Update When Changed" +msgid "Update All Changes" msgstr "Uppdatera Ändringar" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Materialförändringar:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "" @@ -4113,6 +4118,14 @@ msgstr "Namnet innehåller ogiltiga tecken." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4237,7 +4250,7 @@ msgstr "Senast Ändrad" msgid "Sort by First Modified" msgstr "Senast Ändrad" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Duplicera..." @@ -5091,6 +5104,10 @@ msgid "Rename Animation" msgstr "Byt namn på Animation" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplicera Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "" @@ -5103,10 +5120,6 @@ msgid "Load Animation" msgstr "Ladda Animation" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Duplicera Animation" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Ingen animation finns att kopiera!" @@ -12944,6 +12957,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14311,10 +14332,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Ogiltig identifierare:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14357,17 +14374,197 @@ msgstr "Kunde inte skapa HTTP-serverkatalog:" msgid "Error starting HTTP server:" msgstr "Fel vid start av HTTP-server:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Ogiltigt projektnamn." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Kunde inte skapa mapp." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Ogiltig Sökväg." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Misslyckades att ladda resurs." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Misslyckades att ladda resurs." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Måste använda en giltigt filändelse." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Måste använda en giltigt filändelse." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Hittades inte!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Skapar Miniatyr" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "Kunde inte öppna mall för export:" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Ogiltig identifierare:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14378,6 +14575,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14434,6 +14694,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Ogiltig Sökväg." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Måste använda en giltigt filändelse." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Ogiltig produkt GUID." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14808,8 +15089,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -15055,7 +15336,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/ta.po b/editor/translations/ta.po index 4de4a497eb..6a737cca56 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -519,8 +519,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1359,7 +1359,7 @@ msgid "Bus Options" msgstr "அனைத்து தேர்வுகள்" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2135,8 +2135,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3166,7 +3166,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3894,6 +3898,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4006,7 +4018,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #, fuzzy msgid "Duplicate..." msgstr "அசைவூட்டு போலிபச்சாவிகள்" @@ -4802,19 +4814,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12318,6 +12330,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13630,10 +13650,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13674,16 +13690,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13694,6 +13880,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13746,6 +13995,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14096,8 +14363,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14337,7 +14604,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index 8c86f7f276..f329a3c39f 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -497,8 +497,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1332,7 +1332,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2105,8 +2105,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3132,7 +3132,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3856,6 +3860,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3968,7 +3980,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4754,19 +4766,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12197,6 +12209,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13494,10 +13514,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13538,16 +13554,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13558,6 +13744,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13610,6 +13859,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13960,8 +14227,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14201,7 +14468,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index 4f1443f031..3359054a03 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -519,8 +519,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1385,7 +1385,7 @@ msgid "Bus Options" msgstr "ตัวเลือก Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "ทำซ้ำ" @@ -2189,8 +2189,8 @@ msgstr "รายละเอียดเมท็อด" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "เมท็อดนี้ยังไม่มีคำอธิบาย โปรดช่วย[color=$color][url=$url]แก้ไข[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3276,10 +3276,16 @@ msgid "Update Continuously" msgstr "อัพเดทอย่างต่อเนื่อง" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "อัพเดทเมื่อเปลี่ยนแปลง" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "จำนวนครั้งที่เปลี่ยนวัสดุ" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "ซ่อนตัวหมุนการอัพเดท" @@ -4055,6 +4061,14 @@ msgstr "อักษรบางตัวใช้ไม่ได้" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4175,7 +4189,7 @@ msgstr "แก้ไขล่าสุด" msgid "Sort by First Modified" msgstr "แก้ไขล่าสุด" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "ทำซ้ำ..." @@ -4979,6 +4993,10 @@ msgid "Rename Animation" msgstr "เปลี่ยนชื่อแอนิเมชัน" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "ทำซ้ำแอนิเมชัน" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "แก้ไขการผสานไปข้างหน้า" @@ -4991,10 +5009,6 @@ msgid "Load Animation" msgstr "โหลดแอนิเมชัน" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "ทำซ้ำแอนิเมชัน" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "ไม่มีแอนิเมชันให้คัดลอก!" @@ -12782,6 +12796,16 @@ msgstr "ปรับรัศมีทรงแคปซูล" msgid "Set Occluder Sphere Position" msgstr "กำหนดเส้นโค้งขาเข้า" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "กำหนดพิกัดจุดเส้นโค้ง" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "กำหนดพิกัดจุดเส้นโค้ง" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "ปรับรัศมีทรงกระบอก" @@ -13937,8 +13961,8 @@ msgid "" "Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " "project setting (changed in Godot 3.2.2).\n" msgstr "" -"โมดูล \"GodotPaymentV3\" ที่ไม่ถูกต้องได้รวมอยู่ในการตั้งค่าโปรเจกต์ \"android/modules" -"\" (เปลี่ยนแปลงใน Godot 3.2.2)\n" +"โมดูล \"GodotPaymentV3\" ที่ไม่ถูกต้องได้รวมอยู่ในการตั้งค่าโปรเจกต์ \"android/" +"modules\" (เปลี่ยนแปลงใน Godot 3.2.2)\n" #: platform/android/export/export_plugin.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." @@ -14149,10 +14173,6 @@ msgstr "App Store Team ID ยังไม่ได้ระบุ - ไม่ส msgid "Invalid Identifier:" msgstr "ระบุไม่ถูกต้อง:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "ไอคอนที่จำเป็นไม่ได้ระบุไว้ในพรีเซ็ต" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "หยุดเซิฟเวอร์ HTTP" @@ -14197,17 +14217,200 @@ msgstr "ไม่สามารถสร้างโฟลเดอร์" msgid "Error starting HTTP server:" msgstr "ผิดพลาดขณะบันทึกฉาก" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "ชื่อโปรเจกต์ไม่ถูกต้อง" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "รูปเรขาคณิตผิดพลาด ไม่สามารถสร้างโพลีกอน" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "ไม่สามารถสร้างโฟลเดอร์" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "ตำแหน่งฐานไม่ถูกต้อง" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "โหลดทรัพยากรไม่ได้" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "โหลดทรัพยากรไม่ได้" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "นามสกุลไม่ถูกต้อง" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "นามสกุลไม่ถูกต้อง" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "ไม่พบ!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "กำลังสร้างรูปตัวอย่าง" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"ไม่พบเทมเพลต APK สำหรับการส่งออก:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "ระบุไม่ถูกต้อง:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14218,6 +14421,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "ชื่อแพ็คเกจแบบสั้นผิดพลาด" @@ -14270,6 +14536,27 @@ msgstr "ขนาดโลโก้กว้าง 310x150 ผิดพลาด msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "ขนาดรูปหน้าจอเริ่มโปรแกรมผิดพลาด (ต้องเป็น 620x300)" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "ตำแหน่งผิดพลาด" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "นามสกุลไม่ถูกต้อง" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "GUID ของโปรแกรมไม่ถูกต้อง" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14664,8 +14951,8 @@ msgstr "" #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "ไดรเวอร์ GLES2 ไม่สนับสนุนระบบพาร์ติเคิลโดยใช้การ์ดจอ\n" "ใช้โหนด CPUParticles แทน คุณสามารถใช้ตัวเลือก \"แปลงเป็น CPUParticles\" ได้" @@ -14920,9 +15207,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "โหนดนี้เลิกใช้งานแล้ว ใช้โหนด AnimationTree แทน" #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "สี: #%s\n" diff --git a/editor/translations/tl.po b/editor/translations/tl.po index ecf0928c49..3384446e1d 100644 --- a/editor/translations/tl.po +++ b/editor/translations/tl.po @@ -511,8 +511,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -930,8 +930,8 @@ msgstr "Ayusin Ang Pagkakabit:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" -"Tiyak ka bang gusto mong alisin lahat ng mga pagkakabit mula sa hudyat \"%s" -"\"?" +"Tiyak ka bang gusto mong alisin lahat ng mga pagkakabit mula sa hudyat " +"\"%s\"?" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" @@ -1370,7 +1370,7 @@ msgid "Bus Options" msgstr "Kaayusan ng Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Doblehin" @@ -2148,8 +2148,8 @@ msgstr "Panglalarawan ng mga Method" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Kasalukuyang walang paglalarawan sa method na ito. Maaring tulungan kami sa " "pamamagitan ng [color=$color][url=$url]pag-kontribyut[/url][/color]!" @@ -3189,8 +3189,14 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" -msgstr "" +#, fuzzy +msgid "Update All Changes" +msgstr "Pansinin ang anumang pagbabago" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Pansinin ang anumang pagbabago" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -3914,6 +3920,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4026,7 +4040,7 @@ msgstr "Ayusin ayon sa Huling Binago" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4814,19 +4828,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12294,6 +12308,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13611,10 +13633,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13655,16 +13673,190 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Nabigong lumikha ng folder." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Di-wastong pangalan." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Di-wastong pangalan." + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Ginagawa ang Thumbnail" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13675,6 +13867,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13727,6 +13982,25 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Di-wastong pangalan." + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14077,8 +14351,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14318,9 +14592,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "" #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Kulay: #%s\n" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index f318616c3e..87535e17f4 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -66,13 +66,16 @@ # Aysu Toprak <moonwater99@hotmail.com>, 2021. # Yusuf Yavuzyigit <yusufyavuzyigit25@gmail.com>, 2021. # seckiyn <kyofl6@gmail.com>, 2022. +# Amigos Sus <amigossus66@gmail.com>, 2022. +# Ferhat Geçdoğan <ferhatgectao@gmail.com>, 2022. +# Recep GUCLUER <rgucluer@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-03 03:55+0000\n" -"Last-Translator: seckiyn <kyofl6@gmail.com>\n" +"PO-Revision-Date: 2022-02-13 20:11+0000\n" +"Last-Translator: Recep GUCLUER <rgucluer@gmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -80,7 +83,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.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -89,7 +92,7 @@ msgstr "convert() için geçersiz türde argüman, TYPE_* sabitlerini kullanın. #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "1 uzunluğunda bir metin bekleniyor (bir karakter)." +msgstr "1(bir) karakter uzunluğunda bir dize bekleniyor ." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -107,7 +110,7 @@ msgstr "self kullanılamaz çünkü örnek boş (geçilmedi)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "\"%s\" düğümünde geçersiz işlem '%s' ve '%s'." +msgstr "\"%s\" işlecinde geçersiz terimler, '%s' ve '%s'." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" @@ -382,9 +385,8 @@ msgid "Duplicate Key(s)" msgstr "Yinelenen Anahtar(lar)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add RESET Value(s)" -msgstr "%d Çerçeve[ler]'i ekle" +msgstr "SIFIRLAMA Değer(ler)'i ekle" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" @@ -556,9 +558,8 @@ msgstr "" "Bu seçenek yalnızca tek izli olduğundan, Bezier düzenlemede işe yaramaz." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Add RESET Keys" -msgstr "Animasyon Anahtarı Ölçekle" +msgstr "Animasyon SIFIRLAMA Anahtarları Ekle" #: editor/animation_track_editor.cpp msgid "" @@ -567,8 +568,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1432,7 +1433,7 @@ msgid "Bus Options" msgstr "Bus ayarları" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Çoğalt" @@ -1544,7 +1545,7 @@ msgstr "Geçersiz ad." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "Basamak ile başlayamaz." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -2175,7 +2176,7 @@ msgstr "Özellikler" #: editor/editor_help.cpp #, fuzzy msgid "overrides %s:" -msgstr "üzerine yaz:" +msgstr "% üzerine yazılmışlar:" #: editor/editor_help.cpp msgid "default:" @@ -2206,9 +2207,8 @@ msgid "Icons" msgstr "Simgeler" #: editor/editor_help.cpp -#, fuzzy msgid "Styles" -msgstr "Yoldam" +msgstr "Stiller" #: editor/editor_help.cpp msgid "Enumerations" @@ -2236,8 +2236,8 @@ msgstr "Yöntem Açıklamaları" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "Bu metot için henüz bir açıklama yok. Bize [color=$color][url=$url]katkıda " "bulunarak[/url][/color] yardım edebilirsiniz!" @@ -2316,18 +2316,19 @@ msgid "Property:" msgstr "Özellik:" #: editor/editor_inspector.cpp -#, fuzzy msgid "Pin value" -msgstr "(değer)" +msgstr "İğneleme değeri" #: editor/editor_inspector.cpp msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "" +"Bir değeri iğnelemek onu varsayılana eşit olsa bile kaydedilmesine zorlar." #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" msgstr "" +"Değer sabitle [Devre dışı bırakıldı çünkü '%s' sadece editör için aktiftir]" #: editor/editor_inspector.cpp editor/scene_tree_dock.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -2342,26 +2343,23 @@ msgstr "Çoklu Ayarla:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "" +msgstr "% Sabitlenmişler" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "" +msgstr "%Sabitlenmemişler" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" -msgstr "Özellikleri Kopyala" +msgstr "Özelliği Kopyala" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" -msgstr "Özellikleri Yapıştır" +msgstr "Özelliği Yapıştır" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "Betik Yolunu Kopyala" +msgstr "Özellik Yolunu Kopyala" #: editor/editor_log.cpp msgid "Output:" @@ -3087,9 +3085,8 @@ msgid "Install Android Build Template..." msgstr "Android İnşa Şablonunu Yükle ..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Düzenleyici Verileri Klasörünü Aç" +msgstr "Kullanıcı Veri Klasörünü Aç" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3179,7 +3176,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Force Shader Fallbacks" -msgstr "" +msgstr "Shader Yedeklerini Zorla" #: editor/editor_node.cpp msgid "" @@ -3190,6 +3187,13 @@ msgid "" "Asynchronous shader compilation must be enabled in the project settings for " "this option to make a difference." msgstr "" +"Bu seçenek etkinleştirildiğinde, tüm çalışma sürelerinde gölgelendiriciler " +"güvenli ayarlarında (UberShader ile görünür olacak veya gizli " +"kalacak)kullanılacaklar.\n" +"Bu, normalde hızlıca görüntülenen güvenli ayarların görünüm ve performansını " +"kontrol etmede kullanışlıdır.\n" +"Bu seçeneğin bir fark yaratabilmesi için proje ayarlarında asenkron " +"gölgelendirme derlemesinin etkinleştirilmesi gerekir." #: editor/editor_node.cpp msgid "Synchronize Scene Changes" @@ -3354,10 +3358,16 @@ msgid "Update Continuously" msgstr "Sürekli Güncelle" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Değişiklik Olduğunda Güncelle" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Materyal Değişiklikleri:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Güncelleme Topacını Gizle" @@ -3801,9 +3811,8 @@ msgstr "Düğümden İçe Aktar:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Hata" +msgstr "%s Hatası" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4128,6 +4137,14 @@ msgstr "İsim geçersiz karkterler içeriyor." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4246,7 +4263,7 @@ msgstr "Son Değişiklik Tarihi'ne göre sırala" msgid "Sort by First Modified" msgstr "İlk Değişiklik Tarihi'ne göre sırala" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Çoğalt..." @@ -4347,9 +4364,8 @@ msgid "Replace..." msgstr "Değiştir..." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Replace in Files" -msgstr "Tümünü Değiştir" +msgstr "Dosyaiçlerinde Değiştir" #: editor/find_in_files.cpp msgid "Find: " @@ -4360,9 +4376,8 @@ msgid "Replace: " msgstr "Değiştir: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace All (NO UNDO)" -msgstr "Tümünü Değiştir" +msgstr "Tümünü Değiştir (GERİ ALMA YOK)" #: editor/find_in_files.cpp msgid "Searching..." @@ -4590,6 +4605,8 @@ msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." msgstr "" +"İçe aktarma ayarlarını yapmak için dosya sisteminde ve ya kontrolcüde bir " +"kaynak dosyası seçin." #: editor/inspector_dock.cpp msgid "Failed to load resource." @@ -5057,6 +5074,10 @@ msgid "Rename Animation" msgstr "Animasyonu Yeniden Adlandır" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Animasyonu Çoğalt" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Sonraki Değişeni Karıştır" @@ -5069,10 +5090,6 @@ msgid "Load Animation" msgstr "Animasyon Yükle" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Animasyonu Çoğalt" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Kopyalanacak animasyon yok!" @@ -6051,9 +6068,8 @@ msgid "Alt+Drag: Move selected node." msgstr "Alt+Sürükle: Seçili düğümü taşıyın." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Scale selected node." -msgstr "Alt+Sürükle: Seçili düğümü taşıyın." +msgstr "Alt+Sürükle: Seçili düğümü boyutlandırın." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "V: Set selected node's pivot position." @@ -6087,7 +6103,7 @@ msgstr "Esnetme Şekli" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Shift: Scale proportionally." -msgstr "" +msgstr "Shift: Orantılı olarak boyutlandır." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6186,9 +6202,8 @@ msgstr "Seçilen nesneyi yerine kilitleyin (taşınamaz)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected Node(s)" -msgstr "Seçimi Kilitle" +msgstr "Seçilmiş Düğüm/leri Kilitle" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6197,9 +6212,8 @@ msgstr "Seçilen nesnenin kilidini açın (taşınabilir)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected Node(s)" -msgstr "Seçim Kilidini Aç" +msgstr "Seçilmiş Düğüm/leri Aç" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6208,9 +6222,8 @@ msgstr "Nesnenin çocuğunun seçilemez olduğundan kuşkusuz olur." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected Node(s)" -msgstr "Seçilenleri Grupla" +msgstr "Seçilen Düğümleri Grupla" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6219,9 +6232,8 @@ msgstr "Nesnenin çocuğunun seçilebilme yeteneğini geri kazandırır." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected Node(s)" -msgstr "Seçilen Grubu Dağıt" +msgstr "Seçilen Düğümleri Dağıt" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton Options" @@ -7320,7 +7332,7 @@ msgstr "Izgara Ayarları" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Snap" -msgstr "Yapış" +msgstr "Tutunma" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" @@ -7861,9 +7873,8 @@ msgid "Find in Files..." msgstr "Dosyalarda Bul..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Replace in Files..." -msgstr "Değiştir..." +msgstr "Dosyalariçinde Değiştir..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" @@ -8390,16 +8401,15 @@ msgstr "Serbest Bakış Aç / Kapat" #: editor/plugins/spatial_editor_plugin.cpp msgid "Decrease Field of View" -msgstr "" +msgstr "Görüş Alanını Azalt" #: editor/plugins/spatial_editor_plugin.cpp msgid "Increase Field of View" -msgstr "" +msgstr "Görüş Alanını Artır" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Reset Field of View to Default" -msgstr "Varsayılanlara dön" +msgstr "Varsayılan Görüş Alanına Dön" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9129,22 +9139,19 @@ msgstr "Tür Ekle" #: editor/plugins/theme_editor_plugin.cpp msgid "Filter the list of types or create a new custom type:" -msgstr "" +msgstr "Tip listesini süz veya yeni bir özel tip oluştur." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Available Node-based types:" -msgstr "Kullanılabilir Profiller:" +msgstr "Kullanılabilir Düğüm-tabanlı Türler:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Type name is empty!" -msgstr "Dosya ismi boş." +msgstr "Tür adı boş!" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Are you sure you want to create an empty type?" -msgstr "Birden fazla proje açmakta kararlı mısınız?" +msgstr "Boş bir tip oluşturmak istediğinize emin misiniz ?" #: editor/plugins/theme_editor_plugin.cpp msgid "Confirm Item Rename" @@ -9767,9 +9774,8 @@ msgid "TileSet" msgstr "DöşemeTakımı" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." -msgstr "Hiçbir VCS eklentisi mevcut değil." +msgstr "Hiçbir VKS eklentisi mevcut değil." #: editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -9778,54 +9784,47 @@ msgstr "Hata" #: editor/plugins/version_control_editor_plugin.cpp msgid "" "Remote settings are empty. VCS features that use the network may not work." -msgstr "" +msgstr "Remote ayarları boş. Ağ kullanan VKS özellikleri çalışmayabilir." #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "Sağlanan isim yok." +msgstr "Herhangi bir taahhüt mesajı verilmedi." #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "İşle" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Gölgelendirici Değişiklikleri:" +msgstr "Onaya hazırlanan Değişiklikler" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Gölgelendirici Değişiklikleri:" +msgstr "Aşamasız Değişiklikler" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "İşle" +msgstr "İşleme:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "Tarih:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "Altağaç" +msgstr "Altyazı:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "%s dalını silmek istiyor musun?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "Birden fazla proje açmakta kararlı mısınız?" +msgstr "%s uzak kod deposunu kaldırmak istiyor musunuz ?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "Sıfırla" +msgstr "Uygula" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9836,148 +9835,132 @@ msgid "Initialize" msgstr "Etkinleştir" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "Noktayı kaldır" +msgstr "Uzak Giriş" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "Yeniden Adlandır" +msgstr "Kullanıcı adı" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "Şifre" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "SSH Genel Anahtar Yolu" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "SSH genel anahtar yolu seç" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "SSH Özel Anahtar Yolu" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "SSH özel anahtar yolu seç" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "SSH Parolası" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "Yeni değişiklikleri tespit et" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "Kapa ve değişiklikleri kaydet?" +msgstr "Tüm değişiklikleri sil" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "Yerel değişiklikler kayıt ediliyor..." +msgstr "Tüm değişiklikleri işlemeye hazırla" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "Materyal Değişiklikleri:" +msgstr "Tüm İşleme Hazırlıklarını Geri Al" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "Değişiklikleri İşle" +msgstr "İşleme Mesajı" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "Değişiklikleri İşle" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "İşle" +msgstr "İşlemler Listesi" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "İşlem listesi boyutu" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Eşleşmeler:" +msgstr "Dallar" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "Yeni Proje Oluştur" +msgstr "Yeni Dal Oluştur" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "Animasyon İzini Kaldır" +msgstr "Dalı Sil" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "Dal Adı" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" -msgstr "Uzak" +msgstr "Uzak Kod Depoları" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "Yeni Proje Oluştur" +msgstr "Yeni Uzak Depo Oluştur" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "Öğeyi Kaldır" +msgstr "Uzak Depoyu Kaldır" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Uzak " +msgstr "Uzak Depo Adı" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "Uzak " +msgstr "Uzak Depo URL'si" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "Çek" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "Çek" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "Gönder" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "Kaynak Örüntü:" +msgstr "Zorla Gönder" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -9997,22 +9980,19 @@ msgstr "Türdeğiştir" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "Birleştirilmemiş" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "Görüş" +msgstr "Görüş:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "Yolu Ayır" +msgstr "Ayır" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "Değişti" +msgstr "Birleşik" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -12834,6 +12814,16 @@ msgstr "Engelleyici Silindir Yarıçapını Ayarla" msgid "Set Occluder Sphere Position" msgstr "Engelleyici Küre Konumunu Ayarla" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Portal Noktası Konumunu Ayarla" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Eğri Noktası Konumu Ayarla" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Silindir Yarıçapını Değiştir" @@ -13543,18 +13533,16 @@ msgid "Edit Member" msgstr "Üye Düzenle" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "İfadeyi ayarla" +msgstr "İfade" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "Dön" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "animasyon" +msgstr "Koşul" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" @@ -13590,7 +13578,7 @@ msgstr "Yineleyici geçersiz durumda: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "Dizi" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy @@ -13598,18 +13586,16 @@ msgid "in order:" msgstr "Klasör yeniden adlandırma:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "Perde:" +msgstr "Değiştir" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "Türler:" +msgstr "Tür Değişimi" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" @@ -13625,22 +13611,20 @@ msgid "On Self" msgstr "Kendi" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "%s karakterinde" +msgstr "%s'ı çıkar" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "%s'ı Çarp" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "%s'ı Böl" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "Ekle %s" +msgstr "%s'in Modunu Al" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -13652,17 +13636,16 @@ msgid "ShiftRight %s" msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "Ekle %s" +msgstr "%s'ın BitAnd'ını Al" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" -msgstr "" +msgstr "%s'ın BitOr'unu Al" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitXor %s" -msgstr "" +msgstr "%s'ın BitXor'unu Al" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -13692,9 +13675,8 @@ msgid "Emit %s" msgstr "Ayarla %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Function" -msgstr "İşlevler" +msgstr "Fonksiyon" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -13722,54 +13704,44 @@ msgid "VariableSet not found in script: " msgstr "VariableSet betikte bulunamadı: " #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "Yeniden Yükle" +msgstr "Önceden Yükle" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Derinlik İndeksi" +msgstr "İndeksi Al" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Derinlik İndeksi" +msgstr "İndeksi Ayarla" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "Sabit" +msgstr "Genel Sabit" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "Sabit" +msgstr "Sınıf Sabiti" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "Sabit" +msgstr "Basit Sabit" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "Sabit" +msgstr "Matematik Sabiti" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Engine Singleton" -msgstr "GDNative İskelet Etkinleştirildi" +msgstr "Motor İskeletini Al" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "TimeSeek Düğümü" +msgstr "Sahne Düğümünü Al" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "Sahne Ağacı Düzenleme" +msgstr "Sahne Ağacını Al" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -13777,9 +13749,8 @@ msgid "Get Self" msgstr "Kendi" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "Düğümleri Kes" +msgstr "ÖzelSınıf" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -13799,19 +13770,16 @@ msgid "SubCall" msgstr "Çağrılar" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Sabitler" +msgstr "%s'ı Oluştur" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "Yerel Ekseni Kullan" +msgstr "Yerel Değişkeni Al" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "Yerel Ekseni Kullan" +msgstr "Yerel Değişkeni Ayarla" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -13820,7 +13788,7 @@ msgstr "Eylem" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "%s'ı Yapısını Ayır" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -13832,31 +13800,27 @@ msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Bekle" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "Çerçeveyi Taşı" +msgstr "Sonraki Çerçeve" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Physics Frame" -msgstr "Fizik Kare %" +msgstr "Sonraki Fizik Çerçevesi" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s saniye/ler" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitSignal" -msgstr "Sinyal" +msgstr "BeklemeSinyali" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitNodeSignal" -msgstr "Sinyal" +msgstr "DüğümBeklemeSinyali" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy @@ -14009,13 +13973,12 @@ msgstr "" "Eklentileri kullanabilmek için \"Özel Derleme Kullan\" seçeneği aktif olmalı." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VrApi\" " "or \"OpenXR\"." msgstr "" -"\"El Takibi(Hand Tracking)\" sadece \"Xr Modu\" \"Oculus Mobile VR\" " -"olduğunda geçerlidir." +"\"El Takibi (Hand Tracking)\" sadece \"Xr Modu\" \"Oculus Mobile VR\" ya da " +"\"OpenXR\" olduğunda geçerlidir." #: platform/android/export/export_plugin.cpp msgid "\"Passthrough\" is only valid when \"Xr Mode\" is \"OpenXR\"." @@ -14222,10 +14185,6 @@ msgstr "App Store Ekip Kimliği belirtilmedi - proje yapılandırılamıyor." msgid "Invalid Identifier:" msgstr "Geçersiz Tanımlayıcı:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "Ön ayarda gerekli simge belirtilmemiş." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "HTTP sunucuyu durdur" @@ -14266,16 +14225,202 @@ msgstr "HTTP sunucu klasörü oluşturulamadı:" msgid "Error starting HTTP server:" msgstr "HTTP sunucusu başlatılırken hata:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Geçersiz Proje Adı." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Geçersiz geometri, çokgen oluşturulamıyor." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Klasör oluşturulamadı." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Geçersiz ana yol." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Kaynak yükleme başarısız oldu." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Kaynak yükleme başarısız oldu." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Geçersiz uzantı." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Geçersiz uzantı." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Simge bulunamadı." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Küçük Bediz Oluşturuluyor" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Dışa aktarılacak şablon APK bulunamadı:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Geçersiz paket tanımlayıcısı:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Noter tasdiki: kod imzalama gerekli." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Noter onayı: sertleştirilmiş çalışma zamanı gerekli." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Noter onayı: sertleştirilmiş çalışma zamanı gerekli." #: platform/osx/export/export.cpp @@ -14286,6 +14431,69 @@ msgstr "Noter tasdik: Apple Kimliği adı belirtilmedi." msgid "Notarization: Apple ID password not specified." msgstr "Noter tasdik: Apple Kimliği parolası belirtilmedi." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Geçersiz paket kısa ismi." @@ -14338,6 +14546,27 @@ msgstr "Geçersiz kare 310x150 belirtkenin bediz boyutları (310x150 olmalı)." msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Geçersiz açılış görüntülüğü bediz boyutları (620x300 olmalı)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Geçersiz yol." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Geçersiz uzantı." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Geçersiz ürün GUID'i." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14465,7 +14694,7 @@ msgstr "Bu engelleyici için engelleyici çokgeni boş. Lütfen bir çokgen çiz #: scene/2d/navigation_agent_2d.cpp msgid "The NavigationAgent2D can be used only under a Node2D node." -msgstr "" +msgstr "NavigationAgent2D sadece Node2D düğümünün altında kullanılabilir." #: scene/2d/navigation_obstacle_2d.cpp msgid "" @@ -14498,15 +14727,14 @@ msgstr "" "çalışır." #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " "CPUParticles2D\" toolbar option for this purpose." msgstr "" "GPU tabanlı parçacıklar GLES2 video sürücüsü tarafından desteklenmez.\n" -"Bunun yerine CPUParçacıklar2B düğümünü kullanın. Bu amaçla " -"\"CPUParçacıklar'a Dönüştür\" seçeneğini kullanabilirsiniz." +"Bunun yerine CPUParticles2D düğümünü kullanın. Bunun için \"CPUParticles2D'a " +"Dönüştür\" seçeneğini kullanabilirsiniz." #: scene/2d/particles_2d.cpp msgid "" @@ -14746,7 +14974,7 @@ msgstr "90 dereceden geniş açılı SpotIşık gölge oluşturamaz." #: scene/3d/navigation_agent.cpp msgid "The NavigationAgent can be used only under a spatial node." -msgstr "" +msgstr "NavigationAgent sadece Spatial düğümünün altında kullanılabilir." #: scene/3d/navigation_mesh_instance.cpp msgid "" @@ -14774,8 +15002,8 @@ msgstr "Yalnızca tek tip ölçekler desteklenir." #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "GPU tabanlı parçacıklar GLES2 video sürücüsü tarafından desteklenmez.\n" "Bunun yerine CPUParçacık düğümünü kullanın. Bu amaçla \"CPUParçacık'a " @@ -14813,8 +15041,8 @@ msgid "" "PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " "parent Path's Curve resource." msgstr "" -"YolTakibet'in DÖNME_ODAKLI öğesi, üst Yol'un Eğri kaynağında \"Yukarı Vektör" -"\" özelliğinin etkinleştirilmesini gerektiriyor." +"YolTakibet'in DÖNME_ODAKLI öğesi, üst Yol'un Eğri kaynağında \"Yukarı " +"Vektör\" özelliğinin etkinleştirilmesini gerektiriyor." #: scene/3d/physics_body.cpp msgid "" @@ -15059,9 +15287,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Bu düğüm kullanımdan kaldırıldı. Bunun yerine AnimasyonAğacı kullanın." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Renk: #%s\n" diff --git a/editor/translations/tt.po b/editor/translations/tt.po index abbc0eed73..8459c61d41 100644 --- a/editor/translations/tt.po +++ b/editor/translations/tt.po @@ -497,8 +497,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1332,7 +1332,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2105,8 +2105,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3131,7 +3131,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3855,6 +3859,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3967,7 +3979,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4753,19 +4765,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12194,6 +12206,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13485,10 +13505,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13529,16 +13545,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13549,6 +13735,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13601,6 +13850,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13951,8 +14218,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14192,7 +14459,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/tzm.po b/editor/translations/tzm.po index e83ce5dc02..3b2ebd6275 100644 --- a/editor/translations/tzm.po +++ b/editor/translations/tzm.po @@ -495,8 +495,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1330,7 +1330,7 @@ msgid "Bus Options" msgstr "" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2103,8 +2103,8 @@ msgstr "" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3129,7 +3129,11 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" msgstr "" #: editor/editor_node.cpp @@ -3853,6 +3857,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -3965,7 +3977,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4751,19 +4763,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12190,6 +12202,14 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "" +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13481,10 +13501,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13525,16 +13541,186 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13545,6 +13731,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -13597,6 +13846,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -13947,8 +14214,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14188,7 +14455,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index e1d0021c08..63a2ecc734 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -17,12 +17,13 @@ # Микола Тимошенко <9081@ukr.net>, 2020. # Miroslav <zinmirx@gmail.com>, 2020. # IllusiveMan196 <hamsterrv@gmail.com>, 2021. +# KazanskiyMaks <kazanskiy.maks@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" +"PO-Revision-Date: 2022-01-24 02:05+0000\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" @@ -30,9 +31,9 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.10.1\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -523,8 +524,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1390,7 +1391,7 @@ msgid "Bus Options" msgstr "Параметри шини" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Дублювати" @@ -2116,6 +2117,7 @@ msgstr "Клас:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp #: editor/script_create_dialog.cpp +#, fuzzy msgid "Inherits:" msgstr "Успадковує:" @@ -2197,11 +2199,11 @@ msgstr "Описи методів" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"У поточній версії немає опису цього методу. Будь ласка, [color=$color][url=" -"$url]створіть його[/url][/color]!" +"У поточній версії немає опису цього методу. Будь ласка, [color=$color]" +"[url=$url]створіть його[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -2882,8 +2884,9 @@ msgstr "Видалити компонування" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp +#, fuzzy msgid "Default" -msgstr "Типовий" +msgstr "За замовчуванням" #: editor/editor_node.cpp editor/editor_resource_picker.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp @@ -3050,9 +3053,8 @@ msgid "Install Android Build Template..." msgstr "Встановити шаблон збирання для Android…" #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "Відкриття теки даних редактора" +msgstr "Відкриття теки даних користувача" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3323,10 +3325,16 @@ msgid "Update Continuously" msgstr "Оновлювати неперервно" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Оновлювати при зміні" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Зміни матеріалу:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Приховати оновлення лічильника" @@ -3772,9 +3780,8 @@ msgstr "Імпортувати з вузла:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "Помилка" +msgstr "Помилка %s" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4099,6 +4106,14 @@ msgstr "Назва містить некоректні символи." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4217,7 +4232,7 @@ msgstr "Упорядкувати за останнім внесенням змі msgid "Sort by First Modified" msgstr "Упорядкувати за початковим внесенням змін" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Дублювати..." @@ -5033,6 +5048,10 @@ msgid "Rename Animation" msgstr "Перейменувати анімацію" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Дублювати анімацію" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Змінена подальша анімація" @@ -5045,10 +5064,6 @@ msgid "Load Animation" msgstr "Завантажити анімацію" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Дублювати анімацію" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Немає анімації для копіювання!" @@ -6495,7 +6510,7 @@ msgstr "Плаский 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "Плаский 1" +msgstr "Площина 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -9748,9 +9763,8 @@ msgid "TileSet" msgstr "Набір плиток" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." -msgstr "Немає доступних доданків систем керування версіями." +msgstr "Немає доступних додатків систем керування версіями." #: editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -9760,53 +9774,48 @@ msgstr "Помилка" msgid "" "Remote settings are empty. VCS features that use the network may not work." msgstr "" +"Параметри віддаленого сховища є порожніми. Можливості системи керування " +"версіями, які використовують мережу, можуть не працювати." #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "Ім'я не вказано." +msgstr "Не було надано повідомлення про внесок." #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "Внесок" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "Зміни шейдерів:" +msgstr "Етапні зміни" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "Зміни шейдерів:" +msgstr "Неетапні зміни" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "Внесок" +msgstr "Внесок:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "Дата:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "Піддерево" +msgstr "Підзаголовок:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "Хочете вилучити гілку %s?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "Ви справді хочете створити порожній тип?" +msgstr "Ви справді хочете вилучити віддалене сховище %s?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "Застосувати скидання" +msgstr "Застосувати" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9817,148 +9826,132 @@ msgid "Initialize" msgstr "Ініціалізувати" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "Вилучити точку" +msgstr "Ім'я користувача віддаленого сховища" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "Перейменувати" +msgstr "Користувач" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "Пароль" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "Шлях до відкритого ключа SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "Виберіть шлях до відкритого ключа SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "Шлях до закритого ключа SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "Виберіть шлях до закритого ключа SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "Пароль SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "Виявити зміни" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "Закрити та зберегти зміни?" +msgstr "Відкинути усі зміни" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "Збереження локальних змін..." +msgstr "Створити етап з усіх змін" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "Зміни матеріалу:" +msgstr "Скасувати етап з усіх змін" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "Внести зміни" +msgstr "Повідомлення внеску" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "Внести зміни" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "Внесок" +msgstr "Список внеску" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "Розмір списку внеску" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "Збіги:" +msgstr "Гілки" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "Створити новий проєкт" +msgstr "Створити гілку" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "Видалити доріжку" +msgstr "Вилучити гілку" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "Назва гілки" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" -msgstr "Віддалений" +msgstr "Віддалені сховища" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "Створити новий проєкт" +msgstr "Створити віддалене сховище" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "Вилучити елемент" +msgstr "Вилучити віддалене сховище" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "Віддалений " +msgstr "Назва віддаленого сховища" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "Віддалений " +msgstr "Адреса віддаленого сховища" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "Отримати" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "Отримати" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "Записати" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "Початкова сітка:" +msgstr "Примусово записати" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -9978,22 +9971,19 @@ msgstr "Зміна типу" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "Необ'єднано" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "Перегляд" +msgstr "Перегляд:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "Розділити шлях" +msgstr "Розділити" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "Змінено" +msgstr "Уніфіковано" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -12837,6 +12827,16 @@ msgstr "Змінити радіус сфери закупорювання" msgid "Set Occluder Sphere Position" msgstr "Встановити позицію сфери закупорювання" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Задати положення точки порталу" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Задати положення точки кривої" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Змінити радіус циліндра" @@ -13551,38 +13551,36 @@ msgid "Edit Member" msgstr "Редагувати член" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "Встановити вираз" +msgstr "Вираз" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "Повернутися" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "анімація" +msgstr "Умова" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "" +msgstr "якщо (cond) має значення:" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "Доки" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "доки (cond):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "ітератор" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "для (elem) у (input):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -13598,79 +13596,71 @@ msgstr "Ітератор став недійсним: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "Послідовність" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "Перейменування теки:" +msgstr "у порядку:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "Тон:" +msgstr "Перемкнутися" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" -msgstr "" +msgstr "«input» має значення:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "Типи:" +msgstr "Виклик типу" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "Чи %s?" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "При %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "On Self" -msgstr "Цей об'єкт" +msgstr "На собі" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "На символі %s" +msgstr "Відняти %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "Помножити на %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "Поділити на %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "Додати %s" +msgstr "Поділити націло %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "ShiftLeft %s" -msgstr "Встановити %s" +msgstr "Зсунути ліворуч %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "Зсунути праворуч %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "Пришпилено %s" +msgstr "Побітове «І» %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" -msgstr "" +msgstr "Побітове «АБО» %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitXor %s" -msgstr "" +msgstr "Побітове «Виключне АБО» %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -13695,19 +13685,16 @@ msgid "Invalid index property name '%s' in node %s." msgstr "Некоректна назва властивості індексу, «%s», у вузлі %s." #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Emit %s" -msgstr "Встановити %s" +msgstr "Надіслати %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Функції" +msgstr "Функція" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Compose Array" -msgstr "Змінити розмір масиву" +msgstr "Композитний масив" #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -13719,7 +13706,7 @@ msgstr ": Неприпустимі аргументи: " #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" -msgstr "" +msgstr "a якщо cond, інакше b" #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " @@ -13730,64 +13717,52 @@ msgid "VariableSet not found in script: " msgstr "Не знайдено VariableSet у скрипті: " #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "Перезавантажити" +msgstr "Попередньо завантажити" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Z-індекс" +msgstr "Отримати індекс" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Z-індекс" +msgstr "Встановити індекс" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "Сталий" +msgstr "Загальна стала" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "Сталий" +msgstr "Стала класу" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "Сталий" +msgstr "Базова стала" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "Сталий" +msgstr "Математична стала" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Engine Singleton" -msgstr "Увімкнений одинак GDNative" +msgstr "Отримати синглтон рушія" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "Вузол пошуку часу" +msgstr "Отримати вузол сцени" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "Редагування ієрархії сцени" +msgstr "Отримати ієрархію сцен" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Self" -msgstr "Цей об'єкт" +msgstr "Отримати себе" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "Вирізати вузли" +msgstr "Нетиповий вузол" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -13802,33 +13777,28 @@ msgstr "" "out) або рядок (error)." #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "SubCall" -msgstr "Виклики" +msgstr "Підвиклик" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Константи" +msgstr "Побудувати %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "Використати локальний простір" +msgstr "Отримати локальну змінну" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "Використати локальний простір" +msgstr "Встановити локальну змінну" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "Дія" +msgstr "Дія %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "Деконструювати %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -13836,40 +13806,35 @@ msgstr "Шукати VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Результат" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "Очікування" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "Пересунути кадр" +msgstr "Наступний кадр" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Physics Frame" -msgstr "Фізичний кадр %" +msgstr "Наступний фізичний кадр" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s секунд" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitSignal" -msgstr "Сигнал" +msgstr "Очікування сигналу" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitNodeSignal" -msgstr "Сигнал" +msgstr "Очікування сигналу вузла" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitInstanceSignal" -msgstr "Екземпляр" +msgstr "Очікування сигналу екземпляра" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -14243,10 +14208,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "Некоректний ідентифікатор:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "У шаблоні не вказано потрібної піктограми." - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Зупинити HTTP-сервер" @@ -14287,16 +14248,202 @@ msgstr "Не вдалося створити каталог на сервері msgid "Error starting HTTP server:" msgstr "Помилка під час спроби запуску сервера HTTP:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Некоректна назва проєкту." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Некоректна геометрія, неможливо створити багатокутник." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Неможливо створити теку." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Некоректний базовий шлях." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Не вдалося завантажити ресурс." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Не вдалося завантажити ресурс." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Некоректний суфікс." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Некоректний суфікс." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Піктограм не знайдено." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Створюємо мініатюру" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"Не вдалося знайти шаблон APK для експортування:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "Некоректний ідентифікатор пакунка:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "Засвідчення: потрібен код підписування." #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "Засвідчення: потрібне стійке середовище запуску." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "Засвідчення: потрібне стійке середовище запуску." #: platform/osx/export/export.cpp @@ -14307,6 +14454,69 @@ msgstr "Засвідчення: не вказано назву ідентифі msgid "Notarization: Apple ID password not specified." msgstr "Засвідчення: не вказано пароль до ідентифікатора Apple." +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Некоректна скорочена назва пакунка." @@ -14369,6 +14579,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Некоректні розмірності зображення вікна вітання (мають бути 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Неправильний шлях." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Некоректний суфікс." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "Некоректний GUID продукту." + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14531,16 +14762,15 @@ msgstr "" "ParallaxBackground." #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " "CPUParticles2D\" toolbar option for this purpose." msgstr "" -"У драйвері GLES2 не передбачено підтримки часток із обробкою за допомогою " -"графічного процесора.\n" +"У відеодрайвері GLES2 не передбачено підтримки часток із обробкою за " +"допомогою графічного процесора.\n" "Вам слід скористатися вузлом CPUParticles2D. Для цього можете вибрати пункт " -"«Перетворити на CPUParticles»." +"«Перетворити на CPUParticles2D» на панелі інструментів." #: scene/2d/particles_2d.cpp msgid "" @@ -14550,6 +14780,12 @@ msgid "" "You can use the \"Convert to CPUParticles2D\" toolbar option for this " "purpose." msgstr "" +"У macOS обробка Particles2D є набагато повільнішою за CPUParticles2D через " +"те, що відгук перетворення реалізовано на загальному процесорі, а не на " +"графічному процесорі.\n" +"Вам варто скористатися CPUParticles2D, якщо метою є запуск на macOS.\n" +"Ви можете скористатися для цього пунктом панелі інструментів «Перетворити на " +"CPUParticles2D»." #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" @@ -14806,16 +15042,15 @@ msgid "Only uniform scales are supported." msgstr "Передбачено підтримку лише однорідних масштабів." #: scene/3d/particles.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" -"У драйвері GLES2 не передбачено підтримки часток із обробкою за допомогою " -"графічного процесора.\n" +"У відеодрайвері GLES2 не передбачено підтримки часток із обробкою за " +"допомогою графічного процесора.\n" "Вам слід скористатися вузлом CPUParticles. Для цього можете вибрати пункт " -"«Перетворити на CPUParticles»." +"«Перетворити на CPUParticles» на панелі інструментів." #: scene/3d/particles.cpp msgid "" @@ -14824,6 +15059,12 @@ msgid "" "Consider using CPUParticles instead when targeting macOS.\n" "You can use the \"Convert to CPUParticles\" toolbar option for this purpose." msgstr "" +"У macOS обробка Particles є набагато повільнішою за CPUParticles через те, " +"що відгук перетворення реалізовано на загальному процесорі, а не на " +"графічному процесорі.\n" +"Вам варто скористатися CPUParticles, якщо метою є запуск на macOS.\n" +"Ви можете скористатися для цього пунктом панелі інструментів «Перетворити на " +"CPUParticles»." #: scene/3d/particles.cpp msgid "" @@ -15103,9 +15344,10 @@ msgstr "" "Цей вузол вважається застарілим. Скористайтеся замість нього AnimationTree." #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "Колір: #%s\n" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index a93f7f85b5..90156465b3 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -504,8 +504,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1355,7 +1355,7 @@ msgid "Bus Options" msgstr "سب سکریپشن بنائیں" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "" @@ -2151,8 +2151,8 @@ msgstr "سب سکریپشن بنائیں" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3193,8 +3193,14 @@ msgid "Update Continuously" msgstr "" #: editor/editor_node.cpp -msgid "Update When Changed" -msgstr "" +#, fuzzy +msgid "Update All Changes" +msgstr "سب سکریپشن بنائیں" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "سب سکریپشن بنائیں" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -3935,6 +3941,14 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4054,7 +4068,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "" @@ -4869,19 +4883,19 @@ msgid "Rename Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -12560,6 +12574,16 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr ".تمام کا انتخاب" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr ".تمام کا انتخاب" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr ".تمام کا انتخاب" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -13905,10 +13929,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -13952,16 +13972,187 @@ msgstr "" msgid "Error starting HTTP server:" msgstr "" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "سب سکریپشن بنائیں" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -13972,6 +14163,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" @@ -14024,6 +14278,24 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14374,8 +14646,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -14615,7 +14887,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index f9bec13fd9..12cb91b7f9 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -522,8 +522,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1389,7 +1389,7 @@ msgid "Bus Options" 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 +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "Nhân đôi" @@ -2188,8 +2188,8 @@ msgstr "Mô tả phương thức" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"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!" @@ -3285,10 +3285,16 @@ msgid "Update Continuously" msgstr "Cập nhật Liên tục" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "Cập nhật khi có thay đổi" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "Đối số đã thay đổi" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "Ẩn cái xoay xoay cập nhật" @@ -4063,6 +4069,14 @@ msgstr "Tên có chứa kí tự không hợp lệ." #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4183,7 +4197,7 @@ msgstr "Sửa đổi lần cuối" msgid "Sort by First Modified" msgstr "Sửa đổi lần cuối" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "Nhân đôi..." @@ -4990,6 +5004,10 @@ msgid "Rename Animation" msgstr "Đổi tên Hoạt ảnh" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Nhân bản Hoạt ảnh" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "Chuyển đổi animation Tiếp theo Thay đổi" @@ -5002,10 +5020,6 @@ msgid "Load Animation" msgstr "Nạp Hoạt ảnh" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "Nhân bản Hoạt ảnh" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "Không có hoạt ảnh để sao chép!" @@ -12831,6 +12845,16 @@ msgstr "Chỉnh bán kính hình trụ" msgid "Set Occluder Sphere Position" msgstr "Đặt vị trí điểm uốn" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "Đặt vị trí điểm uốn" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "Đặt vị trí điểm uốn" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "Thay Đổi Bán Kính Hình Trụ" @@ -14227,10 +14251,6 @@ msgstr "App Store Team ID không được chỉ định - không thể cấu hì msgid "Invalid Identifier:" msgstr "Định danh không hợp lệ:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "Dừng Máy chủ HTTP" @@ -14275,17 +14295,198 @@ msgstr "Không thể tạo folder." msgid "Error starting HTTP server:" msgstr "Lỗi khi lưu scene." +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "Tên dự án không hợp lệ." + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "Hình không hợp lệ, không thể tạo đa giác." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "Không thể tạo folder." + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "Đường dẫn sai." + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "Nạp tài nguyên thất bại." + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "Nạp tài nguyên thất bại." + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "Tên đuôi không hợp lệ." + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "Tên đuôi không hợp lệ." + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "Không tìm thấy tài nguyên phụ." + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "Tạo hình thu nhỏ" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "Không thể mở bản mẫu để xuất:" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "Định danh không hợp lệ:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14296,6 +14497,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Gói có tên ngắn không hợp lệ." @@ -14348,13 +14612,34 @@ msgstr "Kích thước ảnh logo 310x150 không hợp lệ (phải là 310x150) msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Ảnh mở màn có kích thước không hợp lệ (phải là 620x300)." +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "Đường dẫn sai." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "Tên đuôi không hợp lệ." + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "GUID sản phẩm không hợp lệ." + #: 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." +"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 "" @@ -14754,8 +15039,8 @@ msgstr "" #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "Video driver GLES2 không hỗ trợ hạt dựa trên bộ xử lí GPU.\n" "Thay vào đó hãy dùng nút CPUParticles2D. Bạn có thể dùng tùy chọn \"Chuyển " @@ -15005,7 +15290,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 314cc33f9f..0675b564d3 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -88,7 +88,7 @@ msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2022-01-12 16:52+0000\n" +"PO-Revision-Date: 2022-02-12 21:43+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" @@ -97,7 +97,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.10.1\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -580,16 +580,16 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" "此动画属于导入的场景,因此不会保存对导入轨道的更改。\n" "\n" "要启用添加自定义轨道的功能,可以在场景的导入设置中将\n" -"“Animation > Storage” 设为 “ Files”,并启用 “Animation > Keep Custom " -"Tracks”,然后重新导入。\n" +"“Animation > Storage”设为“Files”,并启用“Animation > Keep Custom Tracks”,然" +"后重新导入。\n" "或者也可以使用将动画导入为单独文件的导入预设。" #: editor/animation_track_editor.cpp @@ -1432,7 +1432,7 @@ msgid "Bus Options" msgstr "总线选项" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "创建副本" @@ -2215,8 +2215,8 @@ msgstr "方法说明" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "当前没有此方法的说明。请帮我们[color=$color][url=$url]贡献一个[/url][/" "color]!" @@ -3034,9 +3034,8 @@ msgid "Install Android Build Template..." msgstr "安装 Android 构建模板..." #: editor/editor_node.cpp -#, fuzzy msgid "Open User Data Folder" -msgstr "打开 “编辑器数据” 文件夹" +msgstr "打开 “用户数据” 文件夹" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3291,10 +3290,16 @@ msgid "Update Continuously" msgstr "持续更新" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "当有更改时更新" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "材质变更:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "隐藏更新旋转图" @@ -3726,9 +3731,8 @@ msgstr "从节点中导入:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "错误" +msgstr "%s 错误" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." @@ -4041,6 +4045,14 @@ msgstr "名称包含无效字符。" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4092,7 +4104,7 @@ msgstr "添加到收藏" #: editor/filesystem_dock.cpp msgid "Remove from Favorites" -msgstr "从收藏中删除" +msgstr "从收藏中移除" #: editor/filesystem_dock.cpp msgid "Edit Dependencies..." @@ -4158,7 +4170,7 @@ msgstr "按最近修改" msgid "Sort by First Modified" msgstr "按最早修改" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "复制为..." @@ -4954,6 +4966,10 @@ msgid "Rename Animation" msgstr "重命名动画" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "复制动画" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "混合下一步变更" @@ -4966,10 +4982,6 @@ msgid "Load Animation" msgstr "加载动画" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "复制动画" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "没有需要复制的动画!" @@ -9602,7 +9614,6 @@ msgid "TileSet" msgstr "图块集" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." msgstr "没有可用的 VCS 插件。" @@ -9613,54 +9624,47 @@ msgstr "错误" #: editor/plugins/version_control_editor_plugin.cpp msgid "" "Remote settings are empty. VCS features that use the network may not work." -msgstr "" +msgstr "远程仓库设置为空。使用网络的 VCS 特性可能无法工作。" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "没有提供名称。" +msgstr "未提供提交消息。" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "提交" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "着色器变更:" +msgstr "暂存修改" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "着色器变更:" +msgstr "撤销暂存修改" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit:" -msgstr "提交" +msgstr "提交:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "日期:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "子树" +msgstr "副标题:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "是否要移除 %s 分支?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "确定要创建空类型吗?" +msgstr "是否要移除 %s 远程仓库?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "应用重置" +msgstr "应用" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -9671,148 +9675,132 @@ msgid "Initialize" msgstr "初始化" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "移除点" +msgstr "远程仓库登录" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Username" -msgstr "重命名" +msgstr "用户名" #: editor/plugins/version_control_editor_plugin.cpp msgid "Password" -msgstr "" +msgstr "密码" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" -msgstr "" +msgstr "SSH 公钥路径" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" -msgstr "" +msgstr "选择 SSH 公钥路径" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Private Key Path" -msgstr "" +msgstr "SSH 私钥路径" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH private key path" -msgstr "" +msgstr "选择 SSH 私钥路径" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "SSH 密码" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" msgstr "检测新变化" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Discard all changes" -msgstr "关闭并保存更改吗?" +msgstr "丢弃所有修改" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage all changes" -msgstr "保存本地更改..." +msgstr "暂存所有修改" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstage all changes" -msgstr "材质变更:" +msgstr "撤销暂存所有修改" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "提交变更" +msgstr "提交消息" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" -msgstr "提交变更" +msgstr "提交修改" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "提交" +msgstr "提交列表" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "" +msgstr "提交列表大小" #: editor/plugins/version_control_editor_plugin.cpp msgid "10" -msgstr "" +msgstr "10" #: editor/plugins/version_control_editor_plugin.cpp msgid "20" -msgstr "" +msgstr "20" #: editor/plugins/version_control_editor_plugin.cpp msgid "30" -msgstr "" +msgstr "30" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Branches" -msgstr "匹配项:" +msgstr "分支" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "新建项目" +msgstr "新建分支" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "移除动画轨道" +msgstr "移除分支" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" -msgstr "" +msgstr "分支名称" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" -msgstr "远程" +msgstr "远程仓库" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "新建项目" +msgstr "新建远程仓库" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "移除项目" +msgstr "移除远程仓库" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" -msgstr "远程 " +msgstr "远程仓库名称" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote URL" -msgstr "远程 " +msgstr "远程仓库 URL" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "抓取" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "拉取" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "" +msgstr "推送" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Force Push" -msgstr "源网格:" +msgstr "强制推送" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" @@ -9820,7 +9808,7 @@ msgstr "已修改" #: editor/plugins/version_control_editor_plugin.cpp msgid "Renamed" -msgstr "更名" +msgstr "已更名" #: editor/plugins/version_control_editor_plugin.cpp msgid "Deleted" @@ -9832,22 +9820,19 @@ msgstr "类型更改" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" -msgstr "" +msgstr "未合并" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "View:" -msgstr "视图" +msgstr "查看:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "拆分路径" +msgstr "拆分" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "已修改" +msgstr "联合" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -9879,7 +9864,7 @@ msgstr "添加输入端口" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" -msgstr "增加输出端口" +msgstr "添加输出端口" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change input port type" @@ -10447,7 +10432,7 @@ msgstr "计算变换的倒数。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the transpose of a transform." -msgstr "计算一个变换的转置。" +msgstr "计算变换的转置。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -10664,7 +10649,7 @@ msgstr "(仅限片段/光照模式)(标量)使用本地差分的“ x” msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." -msgstr "(仅适用于片段/光照模式)(向量)使用局部差分的“y”导数。" +msgstr "(仅限片段/光照模式)(向量)使用局部差分的“y”导数。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -10787,7 +10772,7 @@ msgid "" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" "筛选导出非资源文件或文件夹\n" -"(使用英文逗号分隔,如:*.json, *.txt, docs/* )" +"(以英文逗号分隔,如:*.json, *.txt, docs/* )" #: editor/project_export.cpp msgid "" @@ -11287,7 +11272,7 @@ msgstr "重命名输入事件" #: editor/project_settings_editor.cpp msgid "Change Action deadzone" -msgstr "修改动作盲区" +msgstr "修改动作死区" #: editor/project_settings_editor.cpp msgid "Add Input Action Event" @@ -11509,7 +11494,7 @@ msgstr "动作" #: editor/project_settings_editor.cpp msgid "Deadzone" -msgstr "盲区" +msgstr "死区" #: editor/project_settings_editor.cpp msgid "Device:" @@ -12602,6 +12587,16 @@ msgstr "设置遮挡球体半径" msgid "Set Occluder Sphere Position" msgstr "设置遮挡球体位置" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "设置入口顶点位置" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "设置曲线的顶点位置" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "修改圆柱体半径" @@ -13300,38 +13295,36 @@ msgid "Edit Member" msgstr "编辑成员" #: modules/visual_script/visual_script_expression.cpp -#, fuzzy msgid "Expression" -msgstr "设置表达式" +msgstr "表达式" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "返回" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Condition" -msgstr "动画" +msgstr "条件" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "" +msgstr "如果 cond 是:" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "循环" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "只要 cond 成立:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "迭代器" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "对 input 中的每一个 elem:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -13347,79 +13340,71 @@ msgstr "迭代器失效: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "序列" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "重命名文件夹:" +msgstr "按顺序:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "俯仰角:" +msgstr "切换" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" -msgstr "" +msgstr "“input”是:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "类型:" +msgstr "类型转换" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "是 %s 吗?" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "对 %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "On Self" -msgstr "仅自己" +msgstr "对自身" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "位于字符 %s" +msgstr "将 %s 减去" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "将 %s 乘以" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "将 %s 除以" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "添加 %s" +msgstr "将 %s 求模" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "ShiftLeft %s" -msgstr "设置 %s" +msgstr "将 %s 向左移位" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "将 %s 向右移位" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "将 %s 固定" +msgstr "将 %s 按位与" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" -msgstr "" +msgstr "将 %s 按位或" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitXor %s" -msgstr "" +msgstr "将 %s 按位异或" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -13444,19 +13429,16 @@ msgid "Invalid index property name '%s' in node %s." msgstr "节点 “%s” 的索引属性名 “%s” 无效。" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Emit %s" -msgstr "设置 %s" +msgstr "触发 %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Function" msgstr "函数" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Compose Array" -msgstr "调整数组大小" +msgstr "组成数组" #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -13468,7 +13450,7 @@ msgstr ": 无效参数: " #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" -msgstr "" +msgstr "如果 cond 则 a,否则 b" #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " @@ -13479,64 +13461,52 @@ msgid "VariableSet not found in script: " msgstr "脚本中未找到 VariableSet: " #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "重新加载" +msgstr "预加载" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Z 索引" +msgstr "获取索引" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Z 索引" +msgstr "设置索引" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "常量" +msgstr "全局常量" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "常量" +msgstr "类常量" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "常量" +msgstr "基本常量" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "常量" +msgstr "数学常量" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Engine Singleton" -msgstr "启用的 GDNative 单例" +msgstr "获取引擎单例" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "TimeSeek 节点" +msgstr "获取场景节点" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "场景树编辑" +msgstr "获取场景树" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Self" -msgstr "仅自己" +msgstr "获取自身" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "剪切节点" +msgstr "自定义节点" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -13546,36 +13516,31 @@ msgstr "自定义节点不包含 _step() 方法,不能生成图像。" msgid "" "Invalid return value from _step(), must be integer (seq out), or string " "(error)." -msgstr "_step() 的返回值无效,必须是整形 (Seq Out) 或字符串 (Error)。" +msgstr "_step() 的返回值无效,必须是整型(Seq Out)或字符串(Error)。" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "SubCall" -msgstr "调用" +msgstr "子调用" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "常量" +msgstr "构造 %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "使用本地空间" +msgstr "获取局部变量" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "使用本地空间" +msgstr "设置局部变量" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "动作" +msgstr "动作 %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "解构 %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -13583,40 +13548,35 @@ msgstr "搜索 VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Yield" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "" +msgstr "等待" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "移动帧" +msgstr "下一帧" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Physics Frame" -msgstr "物理帧 %" +msgstr "下一物理帧" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s 秒" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitSignal" -msgstr "信号" +msgstr "等待信号" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitNodeSignal" -msgstr "信号" +msgstr "等待节点信号" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitInstanceSignal" -msgstr "实例化" +msgstr "等待实例信号" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -13950,10 +13910,6 @@ msgstr "未指定 App Store Team ID - 无法配置项目。" msgid "Invalid Identifier:" msgstr "无效的标识符:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "预设中未指定必需的图标。" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "停止 HTTP 服务器" @@ -13994,16 +13950,202 @@ msgstr "无法创建 HTTP 服务器目录:" msgid "Error starting HTTP server:" msgstr "启动 HTTP 服务器时出错:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "项目名称无效。" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "无效的几何体,无法创建多边形。" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "无法创建文件夹。" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "无效的基本路径。" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "加载资源失败。" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "加载资源失败。" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "扩展名无效。" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "扩展名无效。" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "没有图标。" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "正在创建缩略图" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"找不到导出模板 APK:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "无效的包标识符:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "公证:需要代码签名。" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "公证:需要加强的运行时环境。" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "公证:需要加强的运行时环境。" #: platform/osx/export/export.cpp @@ -14014,6 +14156,69 @@ msgstr "公证:未指定 Apple ID 名称。" msgid "Notarization: Apple ID password not specified." msgstr "公证:未指定 Apple ID 密码。" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "无效的包短名称。" @@ -14066,6 +14271,27 @@ msgstr "宽幅 310x150 Logo 图片尺寸无效(应为 310x150)。" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "启动画面图片尺寸无效(应为 620x300)。" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "路径无效。" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "扩展名无效。" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "产品 GUID 无效。" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14211,14 +14437,14 @@ msgstr "" "ParallaxLayer 类型的节点必须作为 ParallaxBackground 的子节点才能正常工作。" #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " "CPUParticles2D\" toolbar option for this purpose." msgstr "" "基于 GPU 的粒子不受 GLES2 视频驱动程序的支持。\n" -"改为使用 CPUParticles2D 节点。为此,可以使用 “转换为 CPUParticles” 选项。" +"改为使用 CPUParticles2D 节点。为此,可以使用工具栏上的“转换为 " +"CPUParticles2D”选项。" #: scene/2d/particles_2d.cpp msgid "" @@ -14228,6 +14454,10 @@ msgid "" "You can use the \"Convert to CPUParticles2D\" toolbar option for this " "purpose." msgstr "" +"在 macOS 上,渲染 Particles2D 比 CPUParticles2D 要慢上很多,因为变换反馈是在 " +"CPU 上实现的,而不是 GPU。\n" +"以 macOS 为目标时,请考虑使用 CPUParticles2D。\n" +"为此,可以使用工具栏上的“转换为 CPUParticles2D”选项。" #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" @@ -14459,14 +14689,14 @@ msgid "Only uniform scales are supported." msgstr "仅支持统一的缩放。" #: scene/3d/particles.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "基于 GPU 的粒子不受 GLES2 视频驱动程序的支持。\n" -"改为使用 CPUParticles 节点。为此,您可以使用 “转换为 CPUParticles” 选项。" +"改为使用 CPUParticles 节点。为此,可以使用工具栏上的“转换为 CPUParticles”选" +"项。" #: scene/3d/particles.cpp msgid "" @@ -14475,6 +14705,10 @@ msgid "" "Consider using CPUParticles instead when targeting macOS.\n" "You can use the \"Convert to CPUParticles\" toolbar option for this purpose." msgstr "" +"在 macOS 上,渲染 Particles 比 CPUParticles 要慢上很多,因为变换反馈是在 CPU " +"上实现的,而不是 GPU。\n" +"以 macOS 为目标时,请考虑使用 CPUParticles。\n" +"为此,可以使用工具栏上的“转换为 CPUParticles”选项。" #: scene/3d/particles.cpp msgid "" @@ -14664,8 +14898,8 @@ msgid "" "VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " "it as a child of a VehicleBody." msgstr "" -"VehicleWheel 为 VehicleBody 提供一个车轮系统 (Wheel System)。请将它作为 " -"VehicleBody 的子节点。" +"VehicleWheel 是用来为 VehicleBody 提供车轮系统的。请将它用作 VehicleBody 的子" +"节点。" #: scene/3d/world_environment.cpp msgid "" @@ -14733,14 +14967,15 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "该节点已废弃。请使用 AnimationTree 代替。" #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "颜色:#%s\n" "鼠标左键:设置颜色\n" -"鼠标右键:删除预设" +"鼠标右键:移除预设" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." @@ -14776,8 +15011,8 @@ msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" -"由于该控件的 Mouse Filter 设置为 “Ignore” 因此将不会显示高亮工具提示。将 " -"Mouse Filter 设置为 “Stop” 或 “Pass” 可修正此问题。" +"由于该控件的 Mouse Filter 设置为“Ignore”因此将不会显示高亮工具提示。将 Mouse " +"Filter 设置为“Stop”或“Pass”可修正此问题。" #: scene/gui/dialogs.cpp msgid "Alert!" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index a6ee771fa8..3e58cca1e2 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -538,8 +538,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1424,7 +1424,7 @@ msgid "Bus Options" msgstr "選項" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "再製" @@ -2260,8 +2260,8 @@ msgstr "描述:" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -3361,7 +3361,12 @@ msgstr "連續" #: editor/editor_node.cpp #, fuzzy -msgid "Update When Changed" +msgid "Update All Changes" +msgstr "當改變時更新" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" msgstr "當改變時更新" #: editor/editor_node.cpp @@ -4155,6 +4160,14 @@ msgstr "名字含有無效字符。" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4274,7 +4287,7 @@ msgstr "" msgid "Sort by First Modified" msgstr "" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "再製..." @@ -5144,19 +5157,19 @@ msgid "Rename Animation" msgstr "重新命名動畫" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Blend Next Changed" +msgid "Duplicate Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Change Blend Time" +msgid "Blend Next Changed" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Load Animation" +msgid "Change Blend Time" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" +msgid "Load Animation" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp @@ -13121,6 +13134,16 @@ msgstr "" msgid "Set Occluder Sphere Position" msgstr "只限選中" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "只限選中" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "只限選中" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "" @@ -14507,10 +14530,6 @@ msgstr "" msgid "Invalid Identifier:" msgstr "無效字型" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "" @@ -14559,17 +14578,197 @@ msgstr "無法新增資料夾" msgid "Error starting HTTP server:" msgstr "儲存TileSet時出現錯誤!" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "無效名稱" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "無法新增資料夾" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "有效的路徑" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "資源加載失敗。" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "資源加載失敗。" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "無效副檔名" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "無效副檔名" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "找不到!" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "正在建立縮圖" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "無法新增資料夾" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid bundle identifier:" msgstr "無效字型" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "" #: platform/osx/export/export.cpp @@ -14580,6 +14779,69 @@ msgstr "" msgid "Notarization: Apple ID password not specified." msgstr "" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." @@ -14638,6 +14900,27 @@ msgstr "" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "有效的路徑" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "無效副檔名" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "無效字型" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14990,8 +15273,8 @@ msgstr "" #: scene/3d/particles.cpp msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" #: scene/3d/particles.cpp @@ -15235,7 +15518,7 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index ba318ee632..e58704257e 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -28,13 +28,14 @@ # meowmeowmeowcat <meowmeowcat1211@gmail.com>, 2021. # anthonychen <anton1554970211@126.com>, 2021. # Chia-Hsiang Cheng <cche0109@student.monash.edu>, 2021. +# 曹恩逢 <nelson22768384@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-12-14 15:28+0000\n" -"Last-Translator: anthonychen <anton1554970211@126.com>\n" +"PO-Revision-Date: 2022-02-12 21:43+0000\n" +"Last-Translator: 曹恩逢 <nelson22768384@gmail.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -42,7 +43,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.10-dev\n" +"X-Generator: Weblate 4.11-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -527,8 +528,8 @@ msgid "" "\n" "To enable the ability to add custom tracks, navigate to the scene's import " "settings and set\n" -"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" -"\", then re-import.\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" @@ -1379,7 +1380,7 @@ msgid "Bus Options" msgstr "匯流排選項" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_dock.cpp msgid "Duplicate" msgstr "重複" @@ -1491,7 +1492,7 @@ msgstr "無效的名稱。" #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "" +msgstr "無法以數字開頭。" #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -2166,8 +2167,8 @@ msgstr "方法說明" #: editor/editor_help.cpp msgid "" -"There is currently no description for this method. Please help us by [color=" -"$color][url=$url]contributing one[/url][/color]!" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" "該方法目前沒有說明。請幫我們[color=$color][url=$url]貢獻一個[/url][/color]!" @@ -3241,10 +3242,16 @@ msgid "Update Continuously" msgstr "持續更新" #: editor/editor_node.cpp -msgid "Update When Changed" +#, fuzzy +msgid "Update All Changes" msgstr "更改時更新" #: editor/editor_node.cpp +#, fuzzy +msgid "Update Vital Changes" +msgstr "材質變更:" + +#: editor/editor_node.cpp msgid "Hide Update Spinner" msgstr "隱藏更新旋轉圖" @@ -3991,6 +3998,14 @@ msgstr "名稱包含無效字元。" #: editor/filesystem_dock.cpp msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" "The following files or folders conflict with items in the target location " "'%s':\n" "\n" @@ -4108,7 +4123,7 @@ msgstr "按最後修改時間排序" msgid "Sort by First Modified" msgstr "按最早修改時間排序" -#: editor/filesystem_dock.cpp +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate..." msgstr "重複..." @@ -4906,6 +4921,10 @@ msgid "Rename Animation" msgstr "重新命名動畫" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "重複動畫" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" msgstr "混合下一個更改" @@ -4918,10 +4937,6 @@ msgid "Load Animation" msgstr "載入動畫" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Duplicate Animation" -msgstr "重複動畫" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" msgstr "無動畫可複製!" @@ -12558,6 +12573,16 @@ msgstr "設定遮擋球體半徑" msgid "Set Occluder Sphere Position" msgstr "設定遮擋球體位置" +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Polygon Point Position" +msgstr "設定入口控制點位置" + +#: editor/spatial_editor_gizmos.cpp +#, fuzzy +msgid "Set Occluder Hole Point Position" +msgstr "設定曲線控制點位置" + #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" msgstr "更改圓柱體半徑" @@ -13906,10 +13931,6 @@ msgstr "尚未設定 App Store Team ID - 無法設定專案。" msgid "Invalid Identifier:" msgstr "無效的識別符:" -#: platform/iphone/export/export.cpp -msgid "Required icon is not specified in the preset." -msgstr "必須在預設設定中指定必填圖示。" - #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" msgstr "停止 HTTP 伺服器" @@ -13950,16 +13971,202 @@ msgstr "無法建立HTTP伺服器目錄:" msgid "Error starting HTTP server:" msgstr "啟動HTTP伺服器時發生錯誤:" +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, no exe name." +msgstr "無效的專案名稱。" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid Info.plist, can't load." +msgstr "無效的幾何圖形,無法建立多邊形。" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to create \"%s\" subfolder." +msgstr "無法新增資料夾。" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid binary format." +msgstr "無效的基礎路徑。" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to process nested resources." +msgstr "加載資源失敗。" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Failed to get CodeResources hash." +msgstr "加載資源失敗。" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +#, fuzzy +msgid "Invalid entitlements file." +msgstr "無效的副檔名。" + +#: platform/osx/export/codesign.cpp +#, fuzzy +msgid "Invalid executable file." +msgstr "無效的副檔名。" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Note: The notarization process generally takes less than an hour. When the " +"process is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "No identity found." +msgstr "未發現任何圖示。" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Creating app bundle" +msgstr "正在建立縮圖" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Could not find template app to export:" +msgstr "" +"找不到樣板APK以匯出:\n" +"%s" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary '%s' not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" msgstr "無效的捆綁識別符:" #: platform/osx/export/export.cpp -msgid "Notarization: code signing required." +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Code signing is required for notarization." msgstr "公證:需要程式碼簽署。" #: platform/osx/export/export.cpp -msgid "Notarization: hardened runtime required." +#, fuzzy +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "公證:需要強化執行階段(Hardened Runtime)。" + +#: platform/osx/export/export.cpp +#, fuzzy +msgid "Notarization: Timestamp runtime is required for notarization." msgstr "公證:需要強化執行階段(Hardened Runtime)。" #: platform/osx/export/export.cpp @@ -13970,6 +14177,69 @@ msgstr "公證:未指定Apple ID名稱。" msgid "Notarization: Apple ID password not specified." msgstr "公證:未指定Apple ID密碼。" +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + #: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "無效的套件段名稱。" @@ -14022,6 +14292,27 @@ msgstr "無效的寬 310x150 LOGO 圖片尺寸(需為 310x150)。" msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "無效的啟動畫面圖片尺寸(應為 620x300)。" +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid icon path:" +msgstr "無效的路徑。" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid file version:" +msgstr "無效的副檔名。" + +#: platform/windows/export/export.cpp +#, fuzzy +msgid "Invalid product version:" +msgstr "無效的產品 GUID。" + #: scene/2d/animated_sprite.cpp msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -14417,8 +14708,8 @@ msgstr "僅支援均等縮放。" #, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" -"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" -"\" toolbar option for this purpose." +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." msgstr "" "GLES2 視訊驅動程式不支援基於 GPU 的粒子。\n" "請改為使用 CPUParticles 節點。可使用「Convert to CPUParticles」選項。" @@ -14688,9 +14979,10 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "該節點已停止維護,請改為使用 AnimationTree。" #: scene/gui/color_picker.cpp +#, fuzzy msgid "" "Color: #%s\n" -"LMB: Set color\n" +"LMB: Apply color\n" "RMB: Remove preset" msgstr "" "色彩: #%s\n" |