Skip to content

Commit 54a6e67

Browse files
committed
Use Viewport's 3D Scaling in the 3D editor's Half Resolution option
This removes the reliance on Viewport shrinking, which fixes various bugs with mouse input handling in 3D gizmos or the GridMap editor. This also makes Half Resolution make use of the current 3D scaling mode defined in the project setting (bilinear, FSR1 or FSR2). When Half Resolution is checked, the Scaling 3D Scale value in the project settings is halved in the editor. To ensure the 3D view remaisn somewhat readable, the final value can't go below the minimum value allowed in the project settings, which is 0.25.
1 parent b15a13e commit 54a6e67

File tree

1 file changed

+12
-16
lines changed

1 file changed

+12
-16
lines changed

editor/scene/3d/node_3d_editor_plugin.cpp

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -712,9 +712,9 @@ void Node3DEditorViewport::cancel_transform() {
712712
}
713713

714714
void Node3DEditorViewport::_update_shrink() {
715-
bool shrink = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION));
716-
subviewport_container->set_stretch_shrink(shrink ? 2 : 1);
717-
subviewport_container->set_texture_filter(shrink ? TEXTURE_FILTER_NEAREST : TEXTURE_FILTER_PARENT_NODE);
715+
const float scaling_3d_scale = GLOBAL_GET("rendering/scaling_3d/scale");
716+
const float shrink_factor = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION)) ? 0.5 : 1.0;
717+
viewport->set_scaling_3d_scale(MAX(0.25, scaling_3d_scale * shrink_factor));
718718
}
719719

720720
float Node3DEditorViewport::get_znear() const {
@@ -738,19 +738,19 @@ Vector3 Node3DEditorViewport::_get_camera_position() const {
738738
}
739739

740740
Point2 Node3DEditorViewport::point_to_screen(const Vector3 &p_point) {
741-
return camera->unproject_position(p_point) * subviewport_container->get_stretch_shrink();
741+
return camera->unproject_position(p_point);
742742
}
743743

744744
Vector3 Node3DEditorViewport::get_ray_pos(const Vector2 &p_pos) const {
745-
return camera->project_ray_origin(p_pos / subviewport_container->get_stretch_shrink());
745+
return camera->project_ray_origin(p_pos);
746746
}
747747

748748
Vector3 Node3DEditorViewport::_get_camera_normal() const {
749749
return -_get_camera_transform().basis.get_column(2);
750750
}
751751

752752
Vector3 Node3DEditorViewport::get_ray(const Vector2 &p_pos) const {
753-
return camera->project_ray_normal(p_pos / subviewport_container->get_stretch_shrink());
753+
return camera->project_ray_normal(p_pos);
754754
}
755755

756756
void Node3DEditorViewport::_clear_selected() {
@@ -835,7 +835,7 @@ void Node3DEditorViewport::_select_clicked(bool p_allow_locked) {
835835
ObjectID Node3DEditorViewport::_select_ray(const Point2 &p_pos) const {
836836
Vector3 ray = get_ray(p_pos);
837837
Vector3 pos = get_ray_pos(p_pos);
838-
Vector2 shrinked_pos = p_pos / subviewport_container->get_stretch_shrink();
838+
Vector2 shrinked_pos = p_pos;
839839

840840
if (viewport->get_debug_draw() == Viewport::DEBUG_DRAW_SDFGI_PROBES) {
841841
RS::get_singleton()->sdfgi_set_debug_probe_select(pos, ray);
@@ -3129,8 +3129,6 @@ void Node3DEditorViewport::_project_settings_changed() {
31293129
viewport->set_positional_shadow_atlas_quadrant_subdiv(2, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q2));
31303130
viewport->set_positional_shadow_atlas_quadrant_subdiv(3, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q3));
31313131

3132-
_update_shrink();
3133-
31343132
// Update MSAA, screen-space AA and debanding if changed
31353133

31363134
const int msaa_mode = GLOBAL_GET("rendering/anti_aliasing/quality/msaa_3d");
@@ -3158,8 +3156,7 @@ void Node3DEditorViewport::_project_settings_changed() {
31583156
const Viewport::Scaling3DMode scaling_3d_mode = Viewport::Scaling3DMode(int(GLOBAL_GET("rendering/scaling_3d/mode")));
31593157
viewport->set_scaling_3d_mode(scaling_3d_mode);
31603158

3161-
const float scaling_3d_scale = GLOBAL_GET("rendering/scaling_3d/scale");
3162-
viewport->set_scaling_3d_scale(scaling_3d_scale);
3159+
_update_shrink();
31633160

31643161
const float fsr_sharpness = GLOBAL_GET("rendering/scaling_3d/fsr_sharpness");
31653162
viewport->set_fsr_sharpness(fsr_sharpness);
@@ -3413,7 +3410,7 @@ void Node3DEditorViewport::_notification(int p_what) {
34133410
}
34143411

34153412
if (show_info) {
3416-
const String viewport_size = vformat(U"%d × %d", viewport->get_size().x, viewport->get_size().y);
3413+
const String viewport_size = vformat(U"%d × %d", viewport->get_size().x * viewport->get_scaling_3d_scale(), viewport->get_size().y * viewport->get_scaling_3d_scale());
34173414
String text;
34183415
text += vformat(TTR("X: %s\n"), rtos(current_camera->get_position().x).pad_decimals(1));
34193416
text += vformat(TTR("Y: %s\n"), rtos(current_camera->get_position().y).pad_decimals(1));
@@ -3422,7 +3419,7 @@ void Node3DEditorViewport::_notification(int p_what) {
34223419
text += vformat(
34233420
TTR("Size: %s (%.1fMP)\n"),
34243421
viewport_size,
3425-
viewport->get_size().x * viewport->get_size().y * 0.000001);
3422+
viewport->get_size().x * viewport->get_size().y * Math::pow(viewport->get_scaling_3d_scale(), 2) * 0.000001);
34263423

34273424
text += "\n";
34283425
text += vformat(TTR("Objects: %d\n"), viewport->get_render_info(Viewport::RENDER_INFO_TYPE_VISIBLE, Viewport::RENDER_INFO_OBJECTS_IN_FRAME));
@@ -4561,8 +4558,7 @@ void Node3DEditorViewport::update_transform_gizmo_view() {
45614558
const int viewport_base_height = 400 * MAX(1, EDSCALE);
45624559
gizmo_scale =
45634560
(gizmo_size / Math::abs(dd)) * MAX(1, EDSCALE) *
4564-
MIN(viewport_base_height, subviewport_container->get_size().height) / viewport_base_height /
4565-
subviewport_container->get_stretch_shrink();
4561+
MIN(viewport_base_height, subviewport_container->get_size().height) / viewport_base_height;
45664562
Vector3 scale = Vector3(1, 1, 1) * gizmo_scale;
45674563

45684564
// if the determinant is zero, we should disable the gizmo from being rendered
@@ -4800,7 +4796,7 @@ Dictionary Node3DEditorViewport::get_state() const {
48004796
d["grid"] = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_GRID));
48014797
d["information"] = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_INFORMATION));
48024798
d["frame_time"] = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_FRAME_TIME));
4803-
d["half_res"] = subviewport_container->get_stretch_shrink() > 1;
4799+
d["half_res"] = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION));
48044800
d["cinematic_preview"] = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW));
48054801
if (previewing) {
48064802
d["previewing"] = EditorNode::get_singleton()->get_edited_scene()->get_path_to(previewing);

0 commit comments

Comments
 (0)