From 6ad82aba3bf6444982b31dd54964740ff1cc780b Mon Sep 17 00:00:00 2001 From: Geekotron Date: Sun, 23 Jun 2024 00:54:01 -0600 Subject: [PATCH] Allow tool scripts to alter transform of Node3DEditorViewport camera --- editor/plugins/node_3d_editor_plugin.cpp | 21 ++++++++++++++++++++- editor/plugins/node_3d_editor_plugin.h | 5 +++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index c321ff1db5..95a54d36b9 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -590,7 +590,8 @@ void Node3DEditorViewport::_update_camera(real_t p_interp_delta) { } if (!equal || p_interp_delta == 0 || is_orthogonal != orthogonal) { - camera->set_global_transform(to_camera_transform(camera_cursor)); + last_camera_transform = to_camera_transform(camera_cursor); + camera->set_global_transform(last_camera_transform); if (orthogonal) { float half_fov = Math::deg_to_rad(get_fov()) / 2.0; @@ -2908,6 +2909,11 @@ void Node3DEditorViewport::_notification(int p_what) { } } + if (_camera_moved_externally()) { + // If camera moved after this plugin last set it, presumably a tool script has moved it, accept the new camera transform as the cursor position. + _apply_camera_transform_to_cursor(); + } + _update_camera(delta); const HashMap &selection = editor_selection->get_selection(); @@ -3376,6 +3382,19 @@ void Node3DEditorViewport::_draw() { } } +bool Node3DEditorViewport::_camera_moved_externally() { + Transform3D t = camera->get_global_transform(); + return !t.is_equal_approx(last_camera_transform); +} + +void Node3DEditorViewport::_apply_camera_transform_to_cursor() { + // Effectively the reverse of to_camera_transform, use camera transform to set cursor position and rotation. + Transform3D camera_transform = camera->get_camera_transform(); + cursor.pos = camera_transform.origin; + cursor.x_rot = -camera_transform.basis.get_euler().x; + cursor.y_rot = -camera_transform.basis.get_euler().y; +} + void Node3DEditorViewport::_menu_option(int p_option) { EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); switch (p_option) { diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index 27db7f27f3..243a712c3a 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -445,6 +445,11 @@ private: Transform3D to_camera_transform(const Cursor &p_cursor) const; void _draw(); + // These allow tool scripts to set the 3D cursor location by updating the camera transform. + Transform3D last_camera_transform; + bool _camera_moved_externally(); + void _apply_camera_transform_to_cursor(); + void _surface_mouse_enter(); void _surface_mouse_exit(); void _surface_focus_enter();