Merge pull request #93436 from Calinou/3d-editor-half-resolution-use-3d-scaling

Use Viewport's 3D Scaling in the 3D editor's Half Resolution option
This commit is contained in:
Thaddeus Crews
2025-11-20 16:47:04 -06:00

View File

@ -712,9 +712,9 @@ void Node3DEditorViewport::cancel_transform() {
}
void Node3DEditorViewport::_update_shrink() {
bool shrink = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION));
subviewport_container->set_stretch_shrink(shrink ? 2 : 1);
subviewport_container->set_texture_filter(shrink ? TEXTURE_FILTER_NEAREST : TEXTURE_FILTER_PARENT_NODE);
const float scaling_3d_scale = GLOBAL_GET("rendering/scaling_3d/scale");
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;
viewport->set_scaling_3d_scale(MAX(0.25, scaling_3d_scale * shrink_factor));
}
float Node3DEditorViewport::get_znear() const {
@ -738,11 +738,11 @@ Vector3 Node3DEditorViewport::_get_camera_position() const {
}
Point2 Node3DEditorViewport::point_to_screen(const Vector3 &p_point) {
return camera->unproject_position(p_point) * subviewport_container->get_stretch_shrink();
return camera->unproject_position(p_point);
}
Vector3 Node3DEditorViewport::get_ray_pos(const Vector2 &p_pos) const {
return camera->project_ray_origin(p_pos / subviewport_container->get_stretch_shrink());
return camera->project_ray_origin(p_pos);
}
Vector3 Node3DEditorViewport::_get_camera_normal() const {
@ -750,7 +750,7 @@ Vector3 Node3DEditorViewport::_get_camera_normal() const {
}
Vector3 Node3DEditorViewport::get_ray(const Vector2 &p_pos) const {
return camera->project_ray_normal(p_pos / subviewport_container->get_stretch_shrink());
return camera->project_ray_normal(p_pos);
}
void Node3DEditorViewport::_clear_selected() {
@ -835,7 +835,7 @@ void Node3DEditorViewport::_select_clicked(bool p_allow_locked) {
ObjectID Node3DEditorViewport::_select_ray(const Point2 &p_pos) const {
Vector3 ray = get_ray(p_pos);
Vector3 pos = get_ray_pos(p_pos);
Vector2 shrinked_pos = p_pos / subviewport_container->get_stretch_shrink();
Vector2 shrinked_pos = p_pos;
if (viewport->get_debug_draw() == Viewport::DEBUG_DRAW_SDFGI_PROBES) {
RS::get_singleton()->sdfgi_set_debug_probe_select(pos, ray);
@ -3129,8 +3129,6 @@ void Node3DEditorViewport::_project_settings_changed() {
viewport->set_positional_shadow_atlas_quadrant_subdiv(2, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q2));
viewport->set_positional_shadow_atlas_quadrant_subdiv(3, Viewport::PositionalShadowAtlasQuadrantSubdiv(atlas_q3));
_update_shrink();
// Update MSAA, screen-space AA and debanding if changed
const int msaa_mode = GLOBAL_GET("rendering/anti_aliasing/quality/msaa_3d");
@ -3158,8 +3156,7 @@ void Node3DEditorViewport::_project_settings_changed() {
const Viewport::Scaling3DMode scaling_3d_mode = Viewport::Scaling3DMode(int(GLOBAL_GET("rendering/scaling_3d/mode")));
viewport->set_scaling_3d_mode(scaling_3d_mode);
const float scaling_3d_scale = GLOBAL_GET("rendering/scaling_3d/scale");
viewport->set_scaling_3d_scale(scaling_3d_scale);
_update_shrink();
const float fsr_sharpness = GLOBAL_GET("rendering/scaling_3d/fsr_sharpness");
viewport->set_fsr_sharpness(fsr_sharpness);
@ -3413,7 +3410,7 @@ void Node3DEditorViewport::_notification(int p_what) {
}
if (show_info) {
const String viewport_size = vformat(U"%d × %d", viewport->get_size().x, viewport->get_size().y);
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());
String text;
text += vformat(TTR("X: %s\n"), rtos(current_camera->get_position().x).pad_decimals(1));
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) {
text += vformat(
TTR("Size: %s (%.1fMP)\n"),
viewport_size,
viewport->get_size().x * viewport->get_size().y * 0.000001);
viewport->get_size().x * viewport->get_size().y * Math::pow(viewport->get_scaling_3d_scale(), 2) * 0.000001);
text += "\n";
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() {
const int viewport_base_height = 400 * MAX(1, EDSCALE);
gizmo_scale =
(gizmo_size / Math::abs(dd)) * MAX(1, EDSCALE) *
MIN(viewport_base_height, subviewport_container->get_size().height) / viewport_base_height /
subviewport_container->get_stretch_shrink();
MIN(viewport_base_height, subviewport_container->get_size().height) / viewport_base_height;
Vector3 scale = Vector3(1, 1, 1) * gizmo_scale;
// if the determinant is zero, we should disable the gizmo from being rendered
@ -4800,7 +4796,7 @@ Dictionary Node3DEditorViewport::get_state() const {
d["grid"] = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_GRID));
d["information"] = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_INFORMATION));
d["frame_time"] = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_FRAME_TIME));
d["half_res"] = subviewport_container->get_stretch_shrink() > 1;
d["half_res"] = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION));
d["cinematic_preview"] = view_display_menu->get_popup()->is_item_checked(view_display_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW));
if (previewing) {
d["previewing"] = EditorNode::get_singleton()->get_edited_scene()->get_path_to(previewing);