Skip to content

Commit edee07b

Browse files
committed
Fix cinematic preview causing the editor redraw continuously and aspect ratio not updating in camera preview
1 parent a3b42d8 commit edee07b

File tree

2 files changed

+35
-7
lines changed

2 files changed

+35
-7
lines changed

editor/scene/3d/node_3d_editor_plugin.cpp

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2986,6 +2986,7 @@ void Node3DEditorViewport::_notification(int p_what) {
29862986
switch (p_what) {
29872987
case NOTIFICATION_TRANSLATION_CHANGED: {
29882988
_update_name();
2989+
_update_centered_labels();
29892990
message_time = MIN(message_time, 0.001); // Make it disappear.
29902991

29912992
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) {
30923093
//then switch the viewport's camera to the scene's viewport camera
30933094
if (previewing != nullptr) {
30943095
previewing->disconnect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
3096+
previewing->disconnect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
30953097
}
30963098
previewing = cam;
30973099
previewing->connect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
3100+
previewing->connect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
30983101
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), cam->get_camera());
30993102
surface->queue_redraw();
31003103
}
@@ -3273,13 +3276,6 @@ void Node3DEditorViewport::_notification(int p_what) {
32733276
Math::remap(fps, 110, 10, 0, 1)));
32743277
}
32753278

3276-
bool show_cinema = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW));
3277-
cinema_label->set_visible(show_cinema);
3278-
if (show_cinema) {
3279-
float cinema_half_width = cinema_label->get_size().width / 2.0f;
3280-
cinema_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -cinema_half_width);
3281-
}
3282-
32833279
if (lock_rotation) {
32843280
float locked_half_width = locked_label->get_size().width / 2.0f;
32853281
locked_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -locked_half_width);
@@ -3363,6 +3359,8 @@ void Node3DEditorViewport::_notification(int p_what) {
33633359
} break;
33643360

33653361
case NOTIFICATION_THEME_CHANGED: {
3362+
_update_centered_labels();
3363+
33663364
view_display_menu->set_button_icon(get_editor_theme_icon(SNAME("GuiTabMenuHl")));
33673365
preview_camera->set_button_icon(get_editor_theme_icon(SNAME("Camera3D")));
33683366
Control *gui_base = EditorNode::get_singleton()->get_gui_base();
@@ -3823,6 +3821,10 @@ void Node3DEditorViewport::_menu_option(int p_option) {
38233821
previewing_cinema = true;
38243822
_toggle_cinema_preview(current);
38253823

3824+
cinema_label->set_visible(current);
3825+
_update_centered_labels();
3826+
surface->queue_redraw();
3827+
38263828
if (current) {
38273829
preview_camera->hide();
38283830
} else {
@@ -4003,6 +4005,20 @@ void Node3DEditorViewport::_preview_exited_scene() {
40034005
view_display_menu->show();
40044006
}
40054007

4008+
void Node3DEditorViewport::_preview_camera_property_changed() {
4009+
if (previewing) {
4010+
surface->queue_redraw();
4011+
}
4012+
}
4013+
4014+
void Node3DEditorViewport::_update_centered_labels() {
4015+
if (cinema_label->is_visible()) {
4016+
cinema_label->reset_size();
4017+
float cinema_half_width = cinema_label->get_size().width / 2.0f;
4018+
cinema_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -cinema_half_width);
4019+
}
4020+
}
4021+
40064022
void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
40074023
uint32_t layer = 1 << (GIZMO_BASE_LAYER + p_idx);
40084024

@@ -4096,6 +4112,7 @@ void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) {
40964112

40974113
if (!p_activate) {
40984114
previewing->disconnect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
4115+
previewing->disconnect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
40994116
previewing = nullptr;
41004117
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), camera->get_camera()); //restore
41014118
if (!preview) {
@@ -4106,6 +4123,7 @@ void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) {
41064123
} else {
41074124
previewing = preview;
41084125
previewing->connect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
4126+
previewing->connect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
41094127
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), preview->get_camera()); //replace
41104128
surface->queue_redraw();
41114129
}
@@ -4118,6 +4136,7 @@ void Node3DEditorViewport::_toggle_cinema_preview(bool p_activate) {
41184136
if (!previewing_cinema) {
41194137
if (previewing != nullptr) {
41204138
previewing->disconnect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
4139+
previewing->disconnect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
41214140
}
41224141

41234142
previewing = nullptr;
@@ -4369,6 +4388,12 @@ void Node3DEditorViewport::set_state(const Dictionary &p_state) {
43694388

43704389
int idx = view_display_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW);
43714390
view_display_menu->get_popup()->set_item_checked(idx, previewing_cinema);
4391+
4392+
cinema_label->set_visible(previewing_cinema);
4393+
if (previewing_cinema) {
4394+
_update_centered_labels();
4395+
surface->queue_redraw();
4396+
}
43724397
}
43734398

43744399
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) {
43794404
if (Object::cast_to<Camera3D>(pv)) {
43804405
previewing = Object::cast_to<Camera3D>(pv);
43814406
previewing->connect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
4407+
previewing->connect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
43824408
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), previewing->get_camera()); //replace
43834409
surface->queue_redraw();
43844410
previewing_camera = true;

editor/scene/3d/node_3d_editor_plugin.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,8 @@ class Node3DEditorViewport : public Control {
482482
bool previewing_cinema = false;
483483
bool _is_node_locked(const Node *p_node) const;
484484
void _preview_exited_scene();
485+
void _preview_camera_property_changed();
486+
void _update_centered_labels();
485487
void _toggle_camera_preview(bool);
486488
void _toggle_cinema_preview(bool);
487489
void _init_gizmo_instance(int p_idx);

0 commit comments

Comments
 (0)