Merge pull request #53820 from Calinou/3d-editor-add-quick-fov-adjust
This commit is contained in:
commit
69eaa806c8
|
@ -252,6 +252,14 @@ void ViewportRotationControl::set_viewport(Node3DEditorViewport *p_viewport) {
|
||||||
viewport = p_viewport;
|
viewport = p_viewport;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Node3DEditorViewport::_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 Node3DEditorViewport::_update_camera(real_t p_interp_delta) {
|
void Node3DEditorViewport::_update_camera(real_t p_interp_delta) {
|
||||||
bool is_orthogonal = camera->get_projection() == Camera3D::PROJECTION_ORTHOGONAL;
|
bool is_orthogonal = camera->get_projection() == Camera3D::PROJECTION_ORTHOGONAL;
|
||||||
|
|
||||||
|
@ -318,6 +326,8 @@ void Node3DEditorViewport::_update_camera(real_t 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) {
|
||||||
|
@ -383,7 +393,7 @@ float Node3DEditorViewport::get_zfar() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
float Node3DEditorViewport::get_fov() const {
|
float Node3DEditorViewport::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);
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform3D Node3DEditorViewport::_get_camera_transform() const {
|
Transform3D Node3DEditorViewport::_get_camera_transform() const {
|
||||||
|
@ -1327,18 +1337,26 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
|
||||||
const real_t zoom_factor = 1 + (ZOOM_FREELOOK_MULTIPLIER - 1) * b->get_factor();
|
const real_t zoom_factor = 1 + (ZOOM_FREELOOK_MULTIPLIER - 1) * b->get_factor();
|
||||||
switch (b->get_button_index()) {
|
switch (b->get_button_index()) {
|
||||||
case MOUSE_BUTTON_WHEEL_UP: {
|
case MOUSE_BUTTON_WHEEL_UP: {
|
||||||
|
if (b->is_alt_pressed()) {
|
||||||
|
scale_fov(-0.05);
|
||||||
|
} else {
|
||||||
if (is_freelook_active()) {
|
if (is_freelook_active()) {
|
||||||
scale_freelook_speed(zoom_factor);
|
scale_freelook_speed(zoom_factor);
|
||||||
} else {
|
} else {
|
||||||
scale_cursor_distance(1.0 / zoom_factor);
|
scale_cursor_distance(1.0 / zoom_factor);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
case MOUSE_BUTTON_WHEEL_DOWN: {
|
case MOUSE_BUTTON_WHEEL_DOWN: {
|
||||||
|
if (b->is_alt_pressed()) {
|
||||||
|
scale_fov(0.05);
|
||||||
|
} else {
|
||||||
if (is_freelook_active()) {
|
if (is_freelook_active()) {
|
||||||
scale_freelook_speed(1.0 / zoom_factor);
|
scale_freelook_speed(1.0 / zoom_factor);
|
||||||
} else {
|
} else {
|
||||||
scale_cursor_distance(zoom_factor);
|
scale_cursor_distance(zoom_factor);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
case MOUSE_BUTTON_RIGHT: {
|
case MOUSE_BUTTON_RIGHT: {
|
||||||
NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
|
NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int();
|
||||||
|
@ -2305,6 +2323,18 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
|
||||||
emit_signal(SNAME("toggle_maximize_view"), this);
|
emit_signal(SNAME("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
|
||||||
|
@ -2472,6 +2502,16 @@ void Node3DEditorViewport::set_freelook_active(bool active_now) {
|
||||||
freelook_active = active_now;
|
freelook_active = active_now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Node3DEditorViewport::scale_fov(real_t p_fov_offset) {
|
||||||
|
cursor.fov_scale = CLAMP(cursor.fov_scale + p_fov_offset, 0.1, 2.5);
|
||||||
|
surface->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Node3DEditorViewport::reset_fov() {
|
||||||
|
cursor.fov_scale = 1.0;
|
||||||
|
surface->update();
|
||||||
|
}
|
||||||
|
|
||||||
void Node3DEditorViewport::scale_cursor_distance(real_t scale) {
|
void Node3DEditorViewport::scale_cursor_distance(real_t scale) {
|
||||||
real_t min_distance = MAX(camera->get_near() * 4, ZOOM_FREELOOK_MIN);
|
real_t min_distance = MAX(camera->get_near() * 4, ZOOM_FREELOOK_MIN);
|
||||||
real_t max_distance = MIN(camera->get_far() / 4, ZOOM_FREELOOK_MAX);
|
real_t max_distance = MIN(camera->get_far() / 4, ZOOM_FREELOOK_MAX);
|
||||||
|
@ -7343,6 +7383,9 @@ Node3DEditor::Node3DEditor(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;
|
||||||
|
|
||||||
|
@ -7490,7 +7533,7 @@ Node3DEditor::Node3DEditor(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", callable_mp(viewports[i], &Node3DEditorViewport::_update_camera), varray(0.0));
|
settings_dialog->connect("confirmed", callable_mp(viewports[i], &Node3DEditorViewport::_view_settings_confirmed), varray(0.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XFORM DIALOG */
|
/* XFORM DIALOG */
|
||||||
|
|
|
@ -315,7 +315,7 @@ private:
|
||||||
|
|
||||||
struct Cursor {
|
struct Cursor {
|
||||||
Vector3 pos;
|
Vector3 pos;
|
||||||
real_t x_rot, y_rot, distance;
|
real_t 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;
|
||||||
|
@ -325,6 +325,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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -333,6 +334,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);
|
||||||
|
@ -349,6 +352,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(real_t p_interp_delta);
|
||||||
void _update_camera(real_t p_interp_delta);
|
void _update_camera(real_t p_interp_delta);
|
||||||
Transform3D to_camera_transform(const Cursor &p_cursor) const;
|
Transform3D to_camera_transform(const Cursor &p_cursor) const;
|
||||||
void _draw();
|
void _draw();
|
||||||
|
|
Loading…
Reference in New Issue