Fix cinematic preview causing the editor redraw continuously and aspect ratio not updating in camera preview

This commit is contained in:
robert yevdokimov
2025-08-09 21:12:47 +04:00
parent a3b42d85d2
commit edee07bb62
2 changed files with 35 additions and 7 deletions

View File

@@ -2986,6 +2986,7 @@ void Node3DEditorViewport::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_TRANSLATION_CHANGED: {
_update_name();
_update_centered_labels();
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;
@@ -3092,9 +3093,11 @@ void Node3DEditorViewport::_notification(int p_what) {
//then switch the viewport's camera to the scene's viewport camera
if (previewing != nullptr) {
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->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());
surface->queue_redraw();
}
@@ -3273,13 +3276,6 @@ void Node3DEditorViewport::_notification(int p_what) {
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) {
float locked_half_width = locked_label->get_size().width / 2.0f;
locked_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -locked_half_width);
@@ -3363,6 +3359,8 @@ void Node3DEditorViewport::_notification(int p_what) {
} break;
case NOTIFICATION_THEME_CHANGED: {
_update_centered_labels();
view_display_menu->set_button_icon(get_editor_theme_icon(SNAME("GuiTabMenuHl")));
preview_camera->set_button_icon(get_editor_theme_icon(SNAME("Camera3D")));
Control *gui_base = EditorNode::get_singleton()->get_gui_base();
@@ -3823,6 +3821,10 @@ void Node3DEditorViewport::_menu_option(int p_option) {
previewing_cinema = true;
_toggle_cinema_preview(current);
cinema_label->set_visible(current);
_update_centered_labels();
surface->queue_redraw();
if (current) {
preview_camera->hide();
} else {
@@ -4003,6 +4005,20 @@ void Node3DEditorViewport::_preview_exited_scene() {
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) {
uint32_t layer = 1 << (GIZMO_BASE_LAYER + p_idx);
@@ -4096,6 +4112,7 @@ void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) {
if (!p_activate) {
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;
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), camera->get_camera()); //restore
if (!preview) {
@@ -4106,6 +4123,7 @@ void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) {
} else {
previewing = preview;
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
surface->queue_redraw();
}
@@ -4118,6 +4136,7 @@ void Node3DEditorViewport::_toggle_cinema_preview(bool p_activate) {
if (!previewing_cinema) {
if (previewing != nullptr) {
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;
@@ -4369,6 +4388,12 @@ void Node3DEditorViewport::set_state(const Dictionary &p_state) {
int idx = view_display_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW);
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))) {
@@ -4379,6 +4404,7 @@ void Node3DEditorViewport::set_state(const Dictionary &p_state) {
if (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(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
surface->queue_redraw();
previewing_camera = true;

View File

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