Skip to content

Commit 8aa37ca

Browse files
committed
Merge pull request #109469 from ryevdokimov/fix-previews
Fix cinematic preview causing the editor redraw continuously and aspect ratio not updating in camera preview
2 parents fa5035f + edee07b commit 8aa37ca

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
@@ -3048,6 +3048,7 @@ void Node3DEditorViewport::_notification(int p_what) {
30483048
switch (p_what) {
30493049
case NOTIFICATION_TRANSLATION_CHANGED: {
30503050
_update_name();
3051+
_update_centered_labels();
30513052
message_time = MIN(message_time, 0.001); // Make it disappear.
30523053

30533054
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) {
31543155
//then switch the viewport's camera to the scene's viewport camera
31553156
if (previewing != nullptr) {
31563157
previewing->disconnect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
3158+
previewing->disconnect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
31573159
}
31583160
previewing = cam;
31593161
previewing->connect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
3162+
previewing->connect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
31603163
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), cam->get_camera());
31613164
surface->queue_redraw();
31623165
}
@@ -3335,13 +3338,6 @@ void Node3DEditorViewport::_notification(int p_what) {
33353338
Math::remap(fps, 110, 10, 0, 1)));
33363339
}
33373340

3338-
bool show_cinema = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW));
3339-
cinema_label->set_visible(show_cinema);
3340-
if (show_cinema) {
3341-
float cinema_half_width = cinema_label->get_size().width / 2.0f;
3342-
cinema_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -cinema_half_width);
3343-
}
3344-
33453341
if (lock_rotation) {
33463342
float locked_half_width = locked_label->get_size().width / 2.0f;
33473343
locked_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -locked_half_width);
@@ -3425,6 +3421,8 @@ void Node3DEditorViewport::_notification(int p_what) {
34253421
} break;
34263422

34273423
case NOTIFICATION_THEME_CHANGED: {
3424+
_update_centered_labels();
3425+
34283426
view_display_menu->set_button_icon(get_editor_theme_icon(SNAME("GuiTabMenuHl")));
34293427
preview_camera->set_button_icon(get_editor_theme_icon(SNAME("Camera3D")));
34303428
Control *gui_base = EditorNode::get_singleton()->get_gui_base();
@@ -3885,6 +3883,10 @@ void Node3DEditorViewport::_menu_option(int p_option) {
38853883
previewing_cinema = true;
38863884
_toggle_cinema_preview(current);
38873885

3886+
cinema_label->set_visible(current);
3887+
_update_centered_labels();
3888+
surface->queue_redraw();
3889+
38883890
if (current) {
38893891
preview_camera->hide();
38903892
} else {
@@ -4065,6 +4067,20 @@ void Node3DEditorViewport::_preview_exited_scene() {
40654067
view_display_menu->show();
40664068
}
40674069

4070+
void Node3DEditorViewport::_preview_camera_property_changed() {
4071+
if (previewing) {
4072+
surface->queue_redraw();
4073+
}
4074+
}
4075+
4076+
void Node3DEditorViewport::_update_centered_labels() {
4077+
if (cinema_label->is_visible()) {
4078+
cinema_label->reset_size();
4079+
float cinema_half_width = cinema_label->get_size().width / 2.0f;
4080+
cinema_label->set_anchor_and_offset(SIDE_LEFT, 0.5f, -cinema_half_width);
4081+
}
4082+
}
4083+
40684084
void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
40694085
uint32_t layer = 1 << (GIZMO_BASE_LAYER + p_idx);
40704086

@@ -4158,6 +4174,7 @@ void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) {
41584174

41594175
if (!p_activate) {
41604176
previewing->disconnect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
4177+
previewing->disconnect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
41614178
previewing = nullptr;
41624179
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), camera->get_camera()); //restore
41634180
if (!preview) {
@@ -4168,6 +4185,7 @@ void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) {
41684185
} else {
41694186
previewing = preview;
41704187
previewing->connect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
4188+
previewing->connect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
41714189
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), preview->get_camera()); //replace
41724190
surface->queue_redraw();
41734191
}
@@ -4180,6 +4198,7 @@ void Node3DEditorViewport::_toggle_cinema_preview(bool p_activate) {
41804198
if (!previewing_cinema) {
41814199
if (previewing != nullptr) {
41824200
previewing->disconnect(SceneStringName(tree_exited), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
4201+
previewing->disconnect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
41834202
}
41844203

41854204
previewing = nullptr;
@@ -4431,6 +4450,12 @@ void Node3DEditorViewport::set_state(const Dictionary &p_state) {
44314450

44324451
int idx = view_display_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW);
44334452
view_display_menu->get_popup()->set_item_checked(idx, previewing_cinema);
4453+
4454+
cinema_label->set_visible(previewing_cinema);
4455+
if (previewing_cinema) {
4456+
_update_centered_labels();
4457+
surface->queue_redraw();
4458+
}
44344459
}
44354460

44364461
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) {
44414466
if (Object::cast_to<Camera3D>(pv)) {
44424467
previewing = Object::cast_to<Camera3D>(pv);
44434468
previewing->connect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
4469+
previewing->connect(CoreStringName(property_list_changed), callable_mp(this, &Node3DEditorViewport::_preview_camera_property_changed));
44444470
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), previewing->get_camera()); //replace
44454471
surface->queue_redraw();
44464472
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)