@@ -1295,7 +1295,7 @@ bool Node3DEditorViewport::_transform_gizmo_select(const Vector2 &p_screenpos, b
12951295
12961296 Transform3D gt = spatial_editor->get_gizmo_transform ();
12971297
1298- if (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_MOVE) {
1298+ if (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_TRANSFORM || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_MOVE) {
12991299 int col_axis = -1 ;
13001300 real_t col_d = 1e20 ;
13011301
@@ -1361,7 +1361,7 @@ bool Node3DEditorViewport::_transform_gizmo_select(const Vector2 &p_screenpos, b
13611361 }
13621362 }
13631363
1364- if (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_ROTATE) {
1364+ if (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_TRANSFORM || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_ROTATE) {
13651365 int col_axis = -1 ;
13661366
13671367 Vector3 hit_position;
@@ -1947,7 +1947,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
19471947
19481948 bool node_selected = get_selected_count () > 0 ;
19491949
1950- if (node_selected && ((spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT && b->is_command_or_control_pressed ()) || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_ROTATE)) {
1950+ if (node_selected && ((spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_TRANSFORM && b->is_command_or_control_pressed ()) || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_ROTATE)) {
19511951 begin_transform (TRANSFORM_ROTATE, false );
19521952 break ;
19531953 }
@@ -1968,7 +1968,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
19681968
19691969 selection_in_progress = true ;
19701970
1971- if (clicked.is_null ()) {
1971+ if (clicked.is_null () || spatial_editor-> get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT ) {
19721972 // Default to region select.
19731973 cursor.region_select = true ;
19741974 cursor.region_begin = b->get_position ();
@@ -1997,15 +1997,15 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
19971997 if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM) {
19981998 selection_in_progress = false ;
19991999
2000- if (clicked.is_valid ()) {
2000+ if (clicked.is_valid () && !movement_threshold_passed ) {
20012001 _select_clicked (false );
2002- }
2003-
2004- if (cursor.region_select ) {
2002+ } else if (cursor.region_select ) {
20052003 _select_region ();
2006- cursor.region_select = false ;
20072004 surface->queue_redraw ();
20082005 }
2006+
2007+ movement_threshold_passed = false ;
2008+ cursor.region_select = false ;
20092009 }
20102010
20112011 if (!_edit.instant && _edit.mode != TRANSFORM_NONE) {
@@ -2115,7 +2115,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
21152115 if (change_nav_from_shortcut != NAVIGATION_NONE) {
21162116 nav_mode = change_nav_from_shortcut;
21172117 } else {
2118- const bool movement_threshold_passed = _edit.original_mouse_pos .distance_to (_edit.mouse_pos ) > 8 * EDSCALE;
2118+ movement_threshold_passed = _edit.original_mouse_pos .distance_to (_edit.mouse_pos ) > 8 * EDSCALE;
21192119
21202120 if (selection_in_progress && movement_threshold_passed && clicked.is_valid ()) {
21212121 if (clicked_wants_append || !editor_selection->is_selected (Object::cast_to<Node>(ObjectDB::get_instance (clicked)))) {
@@ -2131,7 +2131,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
21312131 return ;
21322132 }
21332133
2134- if (clicked.is_valid () && movement_threshold_passed) {
2134+ if (clicked.is_valid () && movement_threshold_passed && spatial_editor-> get_tool_mode () != Node3DEditor::TOOL_MODE_SELECT ) {
21352135 _compute_edit (_edit.original_mouse_pos );
21362136 clicked = ObjectID ();
21372137 _edit.mode = TRANSFORM_TRANSLATE;
@@ -3349,7 +3349,7 @@ void Node3DEditorViewport::_draw() {
33493349 get_theme_stylebox (SNAME (" FocusViewport" ), EditorStringName (EditorStyles))->draw (surface->get_canvas_item (), r);
33503350 }
33513351
3352- if (cursor.region_select ) {
3352+ if (cursor.region_select && movement_threshold_passed ) {
33533353 const Rect2 selection_rect = Rect2 (cursor.region_begin , cursor.region_end - cursor.region_begin );
33543354
33553355 surface->draw_rect (
@@ -4117,11 +4117,11 @@ void Node3DEditorViewport::update_transform_gizmo_view() {
41174117 axis_angle.basis .scale (scale);
41184118 axis_angle.origin = xform.origin ;
41194119 RenderingServer::get_singleton ()->instance_set_transform (move_gizmo_instance[i], axis_angle);
4120- RenderingServer::get_singleton ()->instance_set_visible (move_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_MOVE));
4120+ RenderingServer::get_singleton ()->instance_set_visible (move_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_TRANSFORM || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_MOVE));
41214121 RenderingServer::get_singleton ()->instance_set_transform (move_plane_gizmo_instance[i], axis_angle);
4122- RenderingServer::get_singleton ()->instance_set_visible (move_plane_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_MOVE));
4122+ RenderingServer::get_singleton ()->instance_set_visible (move_plane_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_TRANSFORM || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_MOVE));
41234123 RenderingServer::get_singleton ()->instance_set_transform (rotate_gizmo_instance[i], axis_angle);
4124- RenderingServer::get_singleton ()->instance_set_visible (rotate_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_ROTATE));
4124+ RenderingServer::get_singleton ()->instance_set_visible (rotate_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_TRANSFORM || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_ROTATE));
41254125 RenderingServer::get_singleton ()->instance_set_transform (scale_gizmo_instance[i], axis_angle);
41264126 RenderingServer::get_singleton ()->instance_set_visible (scale_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SCALE));
41274127 RenderingServer::get_singleton ()->instance_set_transform (scale_plane_gizmo_instance[i], axis_angle);
@@ -4139,7 +4139,7 @@ void Node3DEditorViewport::update_transform_gizmo_view() {
41394139 xform.orthonormalize ();
41404140 xform.basis .scale (scale);
41414141 RenderingServer::get_singleton ()->instance_set_transform (rotate_gizmo_instance[3 ], xform);
4142- RenderingServer::get_singleton ()->instance_set_visible (rotate_gizmo_instance[3 ], spatial_editor->is_gizmo_visible () && !_edit.instant && transform_gizmo_visible && !collision_reposition && (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_ROTATE));
4142+ RenderingServer::get_singleton ()->instance_set_visible (rotate_gizmo_instance[3 ], spatial_editor->is_gizmo_visible () && !_edit.instant && transform_gizmo_visible && !collision_reposition && (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_TRANSFORM || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_ROTATE));
41434143}
41444144
41454145void Node3DEditorViewport::set_state (const Dictionary &p_state) {
@@ -6796,6 +6796,7 @@ void Node3DEditor::_menu_item_pressed(int p_option) {
67966796 EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton ();
67976797 switch (p_option) {
67986798 case MENU_TOOL_SELECT:
6799+ case MENU_TOOL_TRANSFORM:
67996800 case MENU_TOOL_MOVE:
68006801 case MENU_TOOL_ROTATE:
68016802 case MENU_TOOL_SCALE:
@@ -8208,6 +8209,7 @@ void Node3DEditor::_add_environment_to_scene(bool p_already_added_sun) {
82088209
82098210void Node3DEditor::_update_theme () {
82108211 tool_button[TOOL_MODE_SELECT]->set_button_icon (get_editor_theme_icon (SNAME (" ToolSelect" )));
8212+ tool_button[TOOL_MODE_TRANSFORM]->set_button_icon (get_editor_theme_icon (SNAME (" ToolTransform" )));
82118213 tool_button[TOOL_MODE_MOVE]->set_button_icon (get_editor_theme_icon (SNAME (" ToolMove" )));
82128214 tool_button[TOOL_MODE_ROTATE]->set_button_icon (get_editor_theme_icon (SNAME (" ToolRotate" )));
82138215 tool_button[TOOL_MODE_SCALE]->set_button_icon (get_editor_theme_icon (SNAME (" ToolScale" )));
@@ -8895,11 +8897,20 @@ Node3DEditor::Node3DEditor() {
88958897 tool_button[TOOL_MODE_SELECT]->set_theme_type_variation (SceneStringName (FlatButton));
88968898 tool_button[TOOL_MODE_SELECT]->set_pressed (true );
88978899 tool_button[TOOL_MODE_SELECT]->connect (SceneStringName (pressed), callable_mp (this , &Node3DEditor::_menu_item_pressed).bind (MENU_TOOL_SELECT));
8898- tool_button[TOOL_MODE_SELECT]->set_shortcut (ED_SHORTCUT (" spatial_editor/tool_select" , TTRC (" Select Mode" ), Key::Q , true ));
8900+ tool_button[TOOL_MODE_SELECT]->set_shortcut (ED_SHORTCUT (" spatial_editor/tool_select" , TTRC (" Select Mode" ), Key::V , true ));
88998901 tool_button[TOOL_MODE_SELECT]->set_shortcut_context (this );
8900- tool_button[TOOL_MODE_SELECT]->set_tooltip_text (keycode_get_string ((Key)KeyModifierMask::CMD_OR_CTRL) + TTR ( " Drag: Rotate selected node around pivot. " ) + " \n " + TTR (" Alt+RMB: Show list of all nodes at position clicked, including locked." ) + " \n " + TTR (" (Available in all modes.)" ));
8902+ tool_button[TOOL_MODE_SELECT]->set_tooltip_text (TTR (" Alt+RMB: Show list of all nodes at position clicked, including locked." ) + " \n " + TTR (" (Available in all modes.)" ));
89018903 main_menu_hbox->add_child (memnew (VSeparator));
89028904
8905+ tool_button[TOOL_MODE_TRANSFORM] = memnew (Button);
8906+ main_menu_hbox->add_child (tool_button[TOOL_MODE_TRANSFORM]);
8907+ tool_button[TOOL_MODE_TRANSFORM]->set_toggle_mode (true );
8908+ tool_button[TOOL_MODE_TRANSFORM]->set_theme_type_variation (SceneStringName (FlatButton));
8909+ tool_button[TOOL_MODE_TRANSFORM]->connect (SceneStringName (pressed), callable_mp (this , &Node3DEditor::_menu_item_pressed).bind (MENU_TOOL_TRANSFORM));
8910+ tool_button[TOOL_MODE_TRANSFORM]->set_shortcut (ED_SHORTCUT (" spatial_editor/tool_transform" , TTRC (" Transform Mode" ), Key::Q, true ));
8911+ tool_button[TOOL_MODE_TRANSFORM]->set_shortcut_context (this );
8912+ tool_button[TOOL_MODE_TRANSFORM]->set_tooltip_text (keycode_get_string ((Key)KeyModifierMask::CMD_OR_CTRL) + TTR (" Drag: Rotate selected node around pivot." ) + " \n " + TTR (" Alt+RMB: Show list of all nodes at position clicked, including locked." ) + " \n " + TTR (" (Available in all modes.)" ));
8913+
89038914 tool_button[TOOL_MODE_MOVE] = memnew (Button);
89048915 main_menu_hbox->add_child (tool_button[TOOL_MODE_MOVE]);
89058916 tool_button[TOOL_MODE_MOVE]->set_toggle_mode (true );
0 commit comments