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.
This commit is contained in:
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user