@@ -1988,16 +1988,49 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
19881988
19891989 bool node_selected = get_selected_count () > 0 ;
19901990
1991- if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM && !b-> is_alt_pressed () ) {
1991+ if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM) {
19921992 // Single item selection.
19931993 clicked = _select_ray (b->get_position ());
19941994
19951995 if (clicked.is_valid () && !editor_selection->is_selected (ObjectDB::get_instance<Node>(clicked))) {
1996- selection_in_progress = true ;
1997- break ;
1996+ if (!node_selected || (!b->is_alt_pressed () && !(spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT && b->is_command_or_control_pressed ()))) {
1997+ selection_in_progress = true ;
1998+ break ;
1999+ }
19982000 }
19992001
20002002 if (clicked.is_null ()) {
2003+ if (node_selected) {
2004+ TransformMode mode = TRANSFORM_NONE;
2005+
2006+ if (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT) {
2007+ if (b->is_command_or_control_pressed ()) {
2008+ mode = TRANSFORM_ROTATE;
2009+ } else if (b->is_alt_pressed ()) {
2010+ mode = TRANSFORM_TRANSLATE;
2011+ }
2012+ } else if (b->is_alt_pressed ()) {
2013+ switch (spatial_editor->get_tool_mode ()) {
2014+ case Node3DEditor::TOOL_MODE_ROTATE:
2015+ mode = TRANSFORM_ROTATE;
2016+ break ;
2017+ case Node3DEditor::TOOL_MODE_MOVE:
2018+ mode = TRANSFORM_TRANSLATE;
2019+ break ;
2020+ case Node3DEditor::TOOL_MODE_SCALE:
2021+ mode = TRANSFORM_SCALE;
2022+ break ;
2023+ default :
2024+ break ;
2025+ }
2026+ }
2027+
2028+ if (mode != TRANSFORM_NONE) {
2029+ begin_transform (mode, false );
2030+ break ;
2031+ }
2032+ }
2033+
20012034 // Default to region select.
20022035 cursor.region_select = true ;
20032036 cursor.region_begin = b->get_position ();
@@ -2006,19 +2039,43 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
20062039 }
20072040 }
20082041
2009- if (!clicked_wants_append && 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)) {
2010- begin_transform (TRANSFORM_ROTATE, false );
2011- break ;
2012- }
2013-
2014- if (!clicked_wants_append && node_selected && spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_MOVE) {
2015- begin_transform (TRANSFORM_TRANSLATE, false );
2016- break ;
2017- }
2042+ if (clicked.is_valid () && !clicked_wants_append) {
2043+ bool is_clicked_node_selected = editor_selection->is_selected (ObjectDB::get_instance<Node>(clicked));
2044+ TransformMode mode = TRANSFORM_NONE;
2045+
2046+ switch (spatial_editor->get_tool_mode ()) {
2047+ case Node3DEditor::TOOL_MODE_SELECT:
2048+ if (b->is_command_or_control_pressed () && node_selected) {
2049+ mode = TRANSFORM_ROTATE;
2050+ } else if (b->is_alt_pressed () && node_selected) {
2051+ mode = TRANSFORM_TRANSLATE;
2052+ } else if (is_clicked_node_selected) {
2053+ mode = TRANSFORM_TRANSLATE;
2054+ }
2055+ break ;
2056+ case Node3DEditor::TOOL_MODE_ROTATE:
2057+ if (is_clicked_node_selected || (b->is_alt_pressed () && node_selected)) {
2058+ mode = TRANSFORM_ROTATE;
2059+ }
2060+ break ;
2061+ case Node3DEditor::TOOL_MODE_MOVE:
2062+ if (is_clicked_node_selected || (b->is_alt_pressed () && node_selected)) {
2063+ mode = TRANSFORM_TRANSLATE;
2064+ }
2065+ break ;
2066+ case Node3DEditor::TOOL_MODE_SCALE:
2067+ if (is_clicked_node_selected || (b->is_alt_pressed () && node_selected)) {
2068+ mode = TRANSFORM_SCALE;
2069+ }
2070+ break ;
2071+ default :
2072+ break ;
2073+ }
20182074
2019- if (!clicked_wants_append && node_selected && spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SCALE) {
2020- begin_transform (TRANSFORM_SCALE, false );
2021- break ;
2075+ if (mode != TRANSFORM_NONE) {
2076+ begin_transform (mode, false );
2077+ break ;
2078+ }
20222079 }
20232080
20242081 surface->queue_redraw ();
@@ -2046,7 +2103,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
20462103 if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM) {
20472104 selection_in_progress = false ;
20482105
2049- if (clicked.is_valid ()) {
2106+ if (clicked.is_valid () && _edit. mode == TRANSFORM_NONE ) {
20502107 _select_clicked (false );
20512108 }
20522109
@@ -2178,9 +2235,14 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
21782235 }
21792236
21802237 if (clicked.is_valid () && movement_threshold_passed && (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_MOVE)) {
2181- _compute_edit (_edit.original_mouse_pos );
2182- clicked = ObjectID ();
2183- _edit.mode = TRANSFORM_TRANSLATE;
2238+ bool is_select_mode = (spatial_editor->get_tool_mode () == Node3DEditor::TOOL_MODE_SELECT);
2239+ bool is_clicked_selected = editor_selection->is_selected (ObjectDB::get_instance<Node>(clicked));
2240+
2241+ if (_edit.mode == TRANSFORM_NONE && (is_select_mode || is_clicked_selected)) {
2242+ _compute_edit (_edit.original_mouse_pos );
2243+ clicked = ObjectID ();
2244+ _edit.mode = TRANSFORM_TRANSLATE;
2245+ }
21842246 }
21852247
21862248 if (_edit.mode == TRANSFORM_NONE || _edit.numeric_input != 0 || _edit.numeric_next_decimal != 0 ) {
0 commit comments