Merge pull request #54207 from Calinou/3d-editor-add-quick-fov-adjust-3.x

This commit is contained in:
Rémi Verschelde 2022-01-03 20:44:00 +01:00 committed by GitHub
commit 0aa7768b1e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 10 deletions

View file

@ -253,6 +253,14 @@ void ViewportRotationControl::_bind_methods() {
ClassDB::bind_method(D_METHOD("_on_mouse_exited"), &ViewportRotationControl::_on_mouse_exited); ClassDB::bind_method(D_METHOD("_on_mouse_exited"), &ViewportRotationControl::_on_mouse_exited);
} }
void SpatialEditorViewport::_view_settings_confirmed(real_t p_interp_delta) {
// Set FOV override multiplier back to the default, so that the FOV
// setting specified in the View menu is correctly applied.
cursor.fov_scale = 1.0;
_update_camera(p_interp_delta);
}
void SpatialEditorViewport::_update_camera(float p_interp_delta) { void SpatialEditorViewport::_update_camera(float p_interp_delta) {
bool is_orthogonal = camera->get_projection() == Camera::PROJECTION_ORTHOGONAL; bool is_orthogonal = camera->get_projection() == Camera::PROJECTION_ORTHOGONAL;
@ -317,6 +325,8 @@ void SpatialEditorViewport::_update_camera(float p_interp_delta) {
equal = false; equal = false;
} else if (!Math::is_equal_approx(old_camera_cursor.distance, camera_cursor.distance, tolerance)) { } else if (!Math::is_equal_approx(old_camera_cursor.distance, camera_cursor.distance, tolerance)) {
equal = false; equal = false;
} else if (!Math::is_equal_approx(old_camera_cursor.fov_scale, camera_cursor.fov_scale, tolerance)) {
equal = false;
} }
if (!equal || p_interp_delta == 0 || is_orthogonal != orthogonal) { if (!equal || p_interp_delta == 0 || is_orthogonal != orthogonal) {
@ -380,7 +390,7 @@ float SpatialEditorViewport::get_zfar() const {
return CLAMP(spatial_editor->get_zfar(), MIN_Z, MAX_Z); return CLAMP(spatial_editor->get_zfar(), MIN_Z, MAX_Z);
} }
float SpatialEditorViewport::get_fov() const { float SpatialEditorViewport::get_fov() const {
return CLAMP(spatial_editor->get_fov(), MIN_FOV, MAX_FOV); return CLAMP(spatial_editor->get_fov() * cursor.fov_scale, MIN_FOV, MAX_FOV);
} }
Transform SpatialEditorViewport::_get_camera_transform() const { Transform SpatialEditorViewport::_get_camera_transform() const {
@ -1161,18 +1171,26 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
float zoom_factor = 1 + (ZOOM_FREELOOK_MULTIPLIER - 1) * b->get_factor(); float zoom_factor = 1 + (ZOOM_FREELOOK_MULTIPLIER - 1) * b->get_factor();
switch (b->get_button_index()) { switch (b->get_button_index()) {
case BUTTON_WHEEL_UP: { case BUTTON_WHEEL_UP: {
if (is_freelook_active()) { if (b->get_alt()) {
scale_freelook_speed(zoom_factor); scale_fov(-0.05);
} else { } else {
scale_cursor_distance(1.0 / zoom_factor); if (is_freelook_active()) {
scale_freelook_speed(zoom_factor);
} else {
scale_cursor_distance(1.0 / zoom_factor);
}
} }
} break; } break;
case BUTTON_WHEEL_DOWN: { case BUTTON_WHEEL_DOWN: {
if (is_freelook_active()) { if (b->get_alt()) {
scale_freelook_speed(1.0 / zoom_factor); scale_fov(0.05);
} else { } else {
scale_cursor_distance(zoom_factor); if (is_freelook_active()) {
scale_freelook_speed(1.0 / zoom_factor);
} else {
scale_cursor_distance(zoom_factor);
}
} }
} break; } break;
@ -2122,6 +2140,18 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
emit_signal("toggle_maximize_view", this); emit_signal("toggle_maximize_view", this);
} }
} }
if (ED_IS_SHORTCUT("spatial_editor/decrease_fov", p_event)) {
scale_fov(-0.05);
}
if (ED_IS_SHORTCUT("spatial_editor/increase_fov", p_event)) {
scale_fov(0.05);
}
if (ED_IS_SHORTCUT("spatial_editor/reset_fov", p_event)) {
reset_fov();
}
} }
// freelook uses most of the useful shortcuts, like save, so its ok // freelook uses most of the useful shortcuts, like save, so its ok
@ -2289,6 +2319,16 @@ void SpatialEditorViewport::set_freelook_active(bool active_now) {
freelook_active = active_now; freelook_active = active_now;
} }
void SpatialEditorViewport::scale_fov(real_t p_fov_offset) {
cursor.fov_scale = CLAMP(cursor.fov_scale + p_fov_offset, 0.1, 2.5);
surface->update();
}
void SpatialEditorViewport::reset_fov() {
cursor.fov_scale = 1.0;
surface->update();
}
void SpatialEditorViewport::scale_cursor_distance(real_t scale) { void SpatialEditorViewport::scale_cursor_distance(real_t scale) {
real_t min_distance = MAX(camera->get_znear() * 4, ZOOM_FREELOOK_MIN); real_t min_distance = MAX(camera->get_znear() * 4, ZOOM_FREELOOK_MIN);
real_t max_distance = MIN(camera->get_zfar() / 2, ZOOM_FREELOOK_MAX); real_t max_distance = MIN(camera->get_zfar() / 2, ZOOM_FREELOOK_MAX);
@ -3531,6 +3571,7 @@ void SpatialEditorViewport::_bind_methods() {
ClassDB::bind_method(D_METHOD("_menu_option"), &SpatialEditorViewport::_menu_option); ClassDB::bind_method(D_METHOD("_menu_option"), &SpatialEditorViewport::_menu_option);
ClassDB::bind_method(D_METHOD("_toggle_camera_preview"), &SpatialEditorViewport::_toggle_camera_preview); ClassDB::bind_method(D_METHOD("_toggle_camera_preview"), &SpatialEditorViewport::_toggle_camera_preview);
ClassDB::bind_method(D_METHOD("_preview_exited_scene"), &SpatialEditorViewport::_preview_exited_scene); ClassDB::bind_method(D_METHOD("_preview_exited_scene"), &SpatialEditorViewport::_preview_exited_scene);
ClassDB::bind_method(D_METHOD("_view_settings_confirmed"), &SpatialEditorViewport::_view_settings_confirmed);
ClassDB::bind_method(D_METHOD("_update_camera"), &SpatialEditorViewport::_update_camera); ClassDB::bind_method(D_METHOD("_update_camera"), &SpatialEditorViewport::_update_camera);
ClassDB::bind_method(D_METHOD("update_transform_gizmo_view"), &SpatialEditorViewport::update_transform_gizmo_view); ClassDB::bind_method(D_METHOD("update_transform_gizmo_view"), &SpatialEditorViewport::update_transform_gizmo_view);
ClassDB::bind_method(D_METHOD("_selection_result_pressed"), &SpatialEditorViewport::_selection_result_pressed); ClassDB::bind_method(D_METHOD("_selection_result_pressed"), &SpatialEditorViewport::_selection_result_pressed);
@ -6540,6 +6581,9 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
ED_SHORTCUT("spatial_editor/align_transform_with_view", TTR("Align Transform with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_M); ED_SHORTCUT("spatial_editor/align_transform_with_view", TTR("Align Transform with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_M);
ED_SHORTCUT("spatial_editor/align_rotation_with_view", TTR("Align Rotation with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_F); ED_SHORTCUT("spatial_editor/align_rotation_with_view", TTR("Align Rotation with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_F);
ED_SHORTCUT("spatial_editor/freelook_toggle", TTR("Toggle Freelook"), KEY_MASK_SHIFT + KEY_F); ED_SHORTCUT("spatial_editor/freelook_toggle", TTR("Toggle Freelook"), KEY_MASK_SHIFT + KEY_F);
ED_SHORTCUT("spatial_editor/decrease_fov", TTR("Decrease Field of View"), KEY_MASK_CMD + KEY_EQUAL); // Usually direct access key for `KEY_PLUS`.
ED_SHORTCUT("spatial_editor/increase_fov", TTR("Increase Field of View"), KEY_MASK_CMD + KEY_MINUS);
ED_SHORTCUT("spatial_editor/reset_fov", TTR("Reset Field of View to Default"), KEY_MASK_CMD + KEY_0);
PopupMenu *p; PopupMenu *p;
@ -6688,7 +6732,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
settings_vbc->add_margin_child(TTR("View Z-Far:"), settings_zfar); settings_vbc->add_margin_child(TTR("View Z-Far:"), settings_zfar);
for (uint32_t i = 0; i < VIEWPORTS_COUNT; ++i) { for (uint32_t i = 0; i < VIEWPORTS_COUNT; ++i) {
settings_dialog->connect("confirmed", viewports[i], "_update_camera", varray(0.0)); settings_dialog->connect("confirmed", viewports[i], "_view_settings_confirmed", varray(0.0));
} }
/* XFORM DIALOG */ /* XFORM DIALOG */

View file

@ -378,7 +378,7 @@ private:
struct Cursor { struct Cursor {
Vector3 pos; Vector3 pos;
float x_rot, y_rot, distance; float x_rot, y_rot, distance, fov_scale;
Vector3 eye_pos; // Used in freelook mode Vector3 eye_pos; // Used in freelook mode
bool region_select; bool region_select;
Point2 region_begin, region_end; Point2 region_begin, region_end;
@ -388,6 +388,7 @@ private:
x_rot = 0.5; x_rot = 0.5;
y_rot = -0.5; y_rot = -0.5;
distance = 4; distance = 4;
fov_scale = 1.0;
region_select = false; region_select = false;
} }
}; };
@ -396,6 +397,8 @@ private:
Cursor cursor; // Immediate cursor Cursor cursor; // Immediate cursor
Cursor camera_cursor; // That one may be interpolated (don't modify this one except for smoothing purposes) Cursor camera_cursor; // That one may be interpolated (don't modify this one except for smoothing purposes)
void scale_fov(real_t p_fov_offset);
void reset_fov();
void scale_cursor_distance(real_t scale); void scale_cursor_distance(real_t scale);
void set_freelook_active(bool active_now); void set_freelook_active(bool active_now);
@ -412,7 +415,7 @@ private:
void set_message(String p_message, float p_time = 5); void set_message(String p_message, float p_time = 5);
// void _view_settings_confirmed(float p_interp_delta);
void _update_camera(float p_interp_delta); void _update_camera(float p_interp_delta);
Transform to_camera_transform(const Cursor &p_cursor) const; Transform to_camera_transform(const Cursor &p_cursor) const;
void _draw(); void _draw();