Merge pull request #109469 from ryevdokimov/fix-previews

Fix cinematic preview causing the editor redraw continuously and aspect ratio not updating in camera preview
This commit is contained in:
Thaddeus Crews 2025-08-12 11:46:40 -05:00
commit 8aa37cab89
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC
2 changed files with 35 additions and 7 deletions

View file

@ -3048,6 +3048,7 @@ void Node3DEditorViewport::_notification(int p_what) {
switch (p_what) { switch (p_what) {
case NOTIFICATION_TRANSLATION_CHANGED: { case NOTIFICATION_TRANSLATION_CHANGED: {
_update_name(); _update_name();
_update_centered_labels();
message_time = MIN(message_time, 0.001); // Make it disappear. message_time = MIN(message_time, 0.001); // Make it disappear.
Key key = (OS::get_singleton()->has_feature("macos") || OS::get_singleton()->has_feature("web_macos") || OS::get_singleton()->has_feature("web_ios")) ? Key::META : Key::CTRL; Key key = (OS::get_singleton()->has_feature("macos") || OS::get_singleton()->has_feature("web_macos") || OS::get_singleton()->has_feature("web_ios")) ? Key::META : Key::CTRL;
@ -3154,9 +3155,11 @@ void Node3DEditorViewport::_notification(int p_what) {
//then switch the viewport's camera to the scene's viewport camera //then switch the viewport's camera to the scene's viewport camera
if (previewing != nullptr) { if (previewing != nullptr) {
previewing->disconnect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); previewing->disconnect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
previewing->disconnect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
} }
previewing = cam; previewing = cam;
previewing->connect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); previewing->connect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
previewing->connect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), cam->get_camera()); RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), cam->get_camera());
surface->queue_redraw(); surface->queue_redraw();
} }
@ -3335,13 +3338,6 @@ void Node3DEditorViewport::_notification(int p_what) {
Math::remap(fps, 110, 10, 0, 1))); Math::remap(fps, 110, 10, 0, 1)));
} }
bool show_cinema = view_display_menu->get_popup()->is_item_checked(view_display_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) { if (lock_rotation) {
float locked_half_width = locked_label->get_size().width / 2.0f; float locked_half_width = locked_label->get_size().width / 2.0f;
locked_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -locked_half_width); locked_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -locked_half_width);
@ -3425,6 +3421,8 @@ void Node3DEditorViewport::_notification(int p_what) {
} break; } break;
case NOTIFICATION_THEME_CHANGED: { case NOTIFICATION_THEME_CHANGED: {
_update_centered_labels();
view_display_menu->set_button_icon(get_editor_theme_icon(SNAME("GuiTabMenuHl"))); view_display_menu->set_button_icon(get_editor_theme_icon(SNAME("GuiTabMenuHl")));
preview_camera->set_button_icon(get_editor_theme_icon(SNAME("Camera3D"))); preview_camera->set_button_icon(get_editor_theme_icon(SNAME("Camera3D")));
Control *gui_base = EditorNode::get_singleton()->get_gui_base(); Control *gui_base = EditorNode::get_singleton()->get_gui_base();
@ -3885,6 +3883,10 @@ void Node3DEditorViewport::_menu_option(int p_option) {
previewing_cinema = true; previewing_cinema = true;
_toggle_cinema_preview(current); _toggle_cinema_preview(current);
cinema_label->set_visible(current);
_update_centered_labels();
surface->queue_redraw();
if (current) { if (current) {
preview_camera->hide(); preview_camera->hide();
} else { } else {
@ -4065,6 +4067,20 @@ void Node3DEditorViewport::_preview_exited_scene() {
view_display_menu->show(); view_display_menu->show();
} }
void Node3DEditorViewport::_preview_camera_property_changed() {
if (previewing) {
surface->queue_redraw();
}
}
void Node3DEditorViewport::_update_centered_labels() {
if (cinema_label->is_visible()) {
cinema_label->reset_size();
float cinema_half_width = cinema_label->get_size().width / 2.0f;
cinema_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -cinema_half_width);
}
}
void Node3DEditorViewport::_init_gizmo_instance(int p_idx) { void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
uint32_t layer = 1 << (GIZMO_BASE_LAYER + p_idx); uint32_t layer = 1 << (GIZMO_BASE_LAYER + p_idx);
@ -4158,6 +4174,7 @@ void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) {
if (!p_activate) { if (!p_activate) {
previewing->disconnect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); previewing->disconnect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
previewing->disconnect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
previewing = nullptr; previewing = nullptr;
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), camera->get_camera()); //restore RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), camera->get_camera()); //restore
if (!preview) { if (!preview) {
@ -4168,6 +4185,7 @@ void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) {
} else { } else {
previewing = preview; previewing = preview;
previewing->connect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); previewing->connect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
previewing->connect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), preview->get_camera()); //replace RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), preview->get_camera()); //replace
surface->queue_redraw(); surface->queue_redraw();
} }
@ -4180,6 +4198,7 @@ void Node3DEditorViewport::_toggle_cinema_preview(bool p_activate) {
if (!previewing_cinema) { if (!previewing_cinema) {
if (previewing != nullptr) { if (previewing != nullptr) {
previewing->disconnect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); previewing->disconnect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
previewing->disconnect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
} }
previewing = nullptr; previewing = nullptr;
@ -4431,6 +4450,12 @@ void Node3DEditorViewport::set_state(const Dictionary &p_state) {
int idx = view_display_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW); int idx = view_display_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW);
view_display_menu->get_popup()->set_item_checked(idx, previewing_cinema); view_display_menu->get_popup()->set_item_checked(idx, previewing_cinema);
cinema_label->set_visible(previewing_cinema);
if (previewing_cinema) {
_update_centered_labels();
surface->queue_redraw();
}
} }
if (preview_camera->is_connected(SceneStringName(toggled), callable_mp(this, &Node3DEditorViewport::_toggle_camera_preview))) { if (preview_camera->is_connected(SceneStringName(toggled), callable_mp(this, &Node3DEditorViewport::_toggle_camera_preview))) {
@ -4441,6 +4466,7 @@ void Node3DEditorViewport::set_state(const Dictionary &p_state) {
if (Object::cast_to<Camera3D>(pv)) { if (Object::cast_to<Camera3D>(pv)) {
previewing = Object::cast_to<Camera3D>(pv); previewing = Object::cast_to<Camera3D>(pv);
previewing->connect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); previewing->connect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
previewing->connect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), previewing->get_camera()); //replace RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), previewing->get_camera()); //replace
surface->queue_redraw(); surface->queue_redraw();
previewing_camera = true; previewing_camera = true;

View file

@ -482,6 +482,8 @@ private:
bool previewing_cinema = false; bool previewing_cinema = false;
bool _is_node_locked(const Node *p_node) const; bool _is_node_locked(const Node *p_node) const;
void _preview_exited_scene(); void _preview_exited_scene();
void _preview_camera_property_changed();
void _update_centered_labels();
void _toggle_camera_preview(bool); void _toggle_camera_preview(bool);
void _toggle_cinema_preview(bool); void _toggle_cinema_preview(bool);
void _init_gizmo_instance(int p_idx); void _init_gizmo_instance(int p_idx);