Skip to content

Commit b7f823c

Browse files
committed
Make Game view follow more editor settings
1 parent f2cc3f1 commit b7f823c

File tree

3 files changed

+82
-31
lines changed

3 files changed

+82
-31
lines changed

editor/plugins/game_view_plugin.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,18 @@ void GameViewDebugger::_session_started(Ref<EditorDebuggerSession> p_session) {
6565
settings["editors/panning/warped_mouse_panning"] = EDITOR_GET("editors/panning/warped_mouse_panning");
6666
settings["editors/panning/2d_editor_pan_speed"] = EDITOR_GET("editors/panning/2d_editor_pan_speed");
6767
settings["canvas_item_editor/pan_view"] = DebuggerMarshalls::serialize_key_shortcut(ED_GET_SHORTCUT("canvas_item_editor/pan_view"));
68+
#ifndef _3D_DISABLED
69+
settings["editors/3d/default_fov"] = EDITOR_GET("editors/3d/default_fov");
70+
settings["editors/3d/default_z_near"] = EDITOR_GET("editors/3d/default_z_near");
71+
settings["editors/3d/default_z_far"] = EDITOR_GET("editors/3d/default_z_far");
72+
settings["editors/3d/navigation/invert_x_axis"] = EDITOR_GET("editors/3d/navigation/invert_x_axis");
73+
settings["editors/3d/navigation/invert_y_axis"] = EDITOR_GET("editors/3d/navigation/invert_y_axis");
74+
settings["editors/3d/navigation/warped_mouse_panning"] = EDITOR_GET("editors/3d/navigation/warped_mouse_panning");
6875
settings["editors/3d/freelook/freelook_base_speed"] = EDITOR_GET("editors/3d/freelook/freelook_base_speed");
76+
settings["editors/3d/freelook/freelook_sensitivity"] = EDITOR_GET("editors/3d/freelook/freelook_sensitivity");
77+
settings["editors/3d/navigation_feel/orbit_sensitivity"] = EDITOR_GET("editors/3d/navigation_feel/orbit_sensitivity");
78+
settings["editors/3d/navigation_feel/translation_sensitivity"] = EDITOR_GET("editors/3d/navigation_feel/translation_sensitivity");
79+
#endif // _3D_DISABLED
6980
setup_data.append(settings);
7081
p_session->send_message("scene:runtime_node_select_setup", setup_data);
7182

scene/debugger/scene_debugger.cpp

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,7 +1261,18 @@ void RuntimeNodeSelect::_setup(const Dictionary &p_settings) {
12611261
#ifndef _3D_DISABLED
12621262
cursor = Cursor();
12631263

1264-
freelook_speed = p_settings.get("editors/3d/freelook/freelook_base_speed", FREELOOK_BASE_SPEED);
1264+
camera_fov = p_settings.get("editors/3d/default_fov", 70);
1265+
camera_znear = p_settings.get("editors/3d/default_z_near", 0.05);
1266+
camera_zfar = p_settings.get("editors/3d/default_z_far", 4'000);
1267+
1268+
invert_x_axis = p_settings.get("editors/3d/navigation/invert_x_axis", false);
1269+
invert_y_axis = p_settings.get("editors/3d/navigation/invert_y_axis", false);
1270+
warped_mouse_panning_3d = p_settings.get("editors/3d/navigation/warped_mouse_panning", true);
1271+
1272+
freelook_base_speed = p_settings.get("editors/3d/freelook/freelook_base_speed", 5);
1273+
freelook_sensitivity = Math::deg_to_rad((real_t)p_settings.get("editors/3d/freelook/freelook_sensitivity", 0.25));
1274+
orbit_sensitivity = Math::deg_to_rad((real_t)p_settings.get("editors/3d/navigation_feel/orbit_sensitivity", 0.004));
1275+
translation_sensitivity = p_settings.get("editors/3d/navigation_feel/translation_sensitivity", 1);
12651276

12661277
/// 3D Selection Box Generation
12671278
// Copied from the Node3DEditor implementation.
@@ -1342,7 +1353,7 @@ void RuntimeNodeSelect::_set_camera_override_enabled(bool p_enabled) {
13421353
_update_view_2d();
13431354

13441355
SceneTree::get_singleton()->get_root()->set_camera_3d_override_transform(_get_cursor_transform());
1345-
SceneTree::get_singleton()->get_root()->set_camera_3d_override_perspective(CAMERA_BASE_FOV * cursor.fov_scale, CAMERA_ZNEAR, CAMERA_ZFAR);
1356+
SceneTree::get_singleton()->get_root()->set_camera_3d_override_perspective(camera_fov * cursor.fov_scale, camera_znear, camera_zfar);
13461357
}
13471358
#endif // _3D_DISABLED
13481359
}
@@ -1445,7 +1456,7 @@ void RuntimeNodeSelect::_process_frame() {
14451456
direction -= up;
14461457
}
14471458

1448-
real_t speed = freelook_speed;
1459+
real_t speed = freelook_base_speed;
14491460
if (input->is_physical_key_pressed(Key::SHIFT)) {
14501461
speed *= 3.0;
14511462
}
@@ -2011,19 +2022,19 @@ bool RuntimeNodeSelect::_handle_3d_input(const Ref<InputEvent> &p_event) {
20112022
switch (k->get_physical_keycode()) {
20122023
case Key::EQUAL: {
20132024
cursor.fov_scale = CLAMP(cursor.fov_scale - 0.05, CAMERA_MIN_FOV_SCALE, CAMERA_MAX_FOV_SCALE);
2014-
SceneTree::get_singleton()->get_root()->set_camera_3d_override_perspective(CAMERA_BASE_FOV * cursor.fov_scale, CAMERA_ZNEAR, CAMERA_ZFAR);
2025+
SceneTree::get_singleton()->get_root()->set_camera_3d_override_perspective(camera_fov * cursor.fov_scale, camera_znear, camera_zfar);
20152026

20162027
return true;
20172028
} break;
20182029
case Key::MINUS: {
20192030
cursor.fov_scale = CLAMP(cursor.fov_scale + 0.05, CAMERA_MIN_FOV_SCALE, CAMERA_MAX_FOV_SCALE);
2020-
SceneTree::get_singleton()->get_root()->set_camera_3d_override_perspective(CAMERA_BASE_FOV * cursor.fov_scale, CAMERA_ZNEAR, CAMERA_ZFAR);
2031+
SceneTree::get_singleton()->get_root()->set_camera_3d_override_perspective(camera_fov * cursor.fov_scale, camera_znear, camera_zfar);
20212032

20222033
return true;
20232034
} break;
20242035
case Key::KEY_0: {
20252036
cursor.fov_scale = 1;
2026-
SceneTree::get_singleton()->get_root()->set_camera_3d_override_perspective(CAMERA_BASE_FOV, CAMERA_ZNEAR, CAMERA_ZFAR);
2037+
SceneTree::get_singleton()->get_root()->set_camera_3d_override_perspective(camera_fov, camera_znear, camera_zfar);
20272038

20282039
return true;
20292040
} break;
@@ -2063,33 +2074,37 @@ void RuntimeNodeSelect::_set_camera_freelook_enabled(bool p_enabled) {
20632074
}
20642075

20652076
void RuntimeNodeSelect::_cursor_scale_distance(real_t p_scale) {
2066-
real_t min_distance = MAX(CAMERA_ZNEAR * 4, VIEW_3D_MIN_ZOOM);
2067-
real_t max_distance = MIN(CAMERA_ZFAR / 4, VIEW_3D_MAX_ZOOM);
2077+
real_t min_distance = MAX(camera_znear * 4, VIEW_3D_MIN_ZOOM);
2078+
real_t max_distance = MIN(camera_zfar / 4, VIEW_3D_MAX_ZOOM);
20682079
cursor.distance = CLAMP(cursor.distance * p_scale, min_distance, max_distance);
20692080

20702081
SceneTree::get_singleton()->get_root()->set_camera_3d_override_transform(_get_cursor_transform());
20712082
}
20722083

20732084
void RuntimeNodeSelect::_scale_freelook_speed(real_t p_scale) {
2074-
real_t min_speed = MAX(CAMERA_ZNEAR * 4, VIEW_3D_MIN_ZOOM);
2075-
real_t max_speed = MIN(CAMERA_ZFAR / 4, VIEW_3D_MAX_ZOOM);
2085+
real_t min_speed = MAX(camera_znear * 4, VIEW_3D_MIN_ZOOM);
2086+
real_t max_speed = MIN(camera_zfar / 4, VIEW_3D_MAX_ZOOM);
20762087
if (unlikely(min_speed > max_speed)) {
2077-
freelook_speed = (min_speed + max_speed) / 2;
2088+
freelook_base_speed = (min_speed + max_speed) / 2;
20782089
} else {
2079-
freelook_speed = CLAMP(freelook_speed * p_scale, min_speed, max_speed);
2090+
freelook_base_speed = CLAMP(freelook_base_speed * p_scale, min_speed, max_speed);
20802091
}
20812092
}
20822093

20832094
void RuntimeNodeSelect::_cursor_look(Ref<InputEventWithModifiers> p_event) {
20842095
Window *root = SceneTree::get_singleton()->get_root();
2085-
const Vector2 relative = Input::get_singleton()->warp_mouse_motion(p_event, Rect2(Vector2(), root->get_size()));
2096+
const Vector2 relative = _get_warped_mouse_motion(p_event, Rect2(Vector2(), root->get_size()));
20862097
const Transform3D prev_camera_transform = _get_cursor_transform();
20872098

2088-
cursor.x_rot += relative.y * RADS_PER_PIXEL;
2099+
if (invert_y_axis) {
2100+
cursor.x_rot -= relative.y * freelook_sensitivity;
2101+
} else {
2102+
cursor.x_rot += relative.y * freelook_sensitivity;
2103+
}
20892104
// Clamp the Y rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented.
20902105
cursor.x_rot = CLAMP(cursor.x_rot, -1.57, 1.57);
20912106

2092-
cursor.y_rot += relative.x * RADS_PER_PIXEL;
2107+
cursor.y_rot += relative.x * freelook_sensitivity;
20932108

20942109
// Look is like the opposite of Orbit: the focus point rotates around the camera.
20952110
Transform3D camera_transform = _get_cursor_transform();
@@ -2104,8 +2119,8 @@ void RuntimeNodeSelect::_cursor_look(Ref<InputEventWithModifiers> p_event) {
21042119
void RuntimeNodeSelect::_cursor_pan(Ref<InputEventWithModifiers> p_event) {
21052120
Window *root = SceneTree::get_singleton()->get_root();
21062121
// Reduce all sides of the area by 1, so warping works when windows are maximized/fullscreen.
2107-
const Vector2 relative = Input::get_singleton()->warp_mouse_motion(p_event, Rect2(Vector2(1, 1), root->get_size() - Vector2(2, 2)));
2108-
const real_t pan_speed = 1 / 150.0;
2122+
const Vector2 relative = _get_warped_mouse_motion(p_event, Rect2(Vector2(1, 1), root->get_size() - Vector2(2, 2)));
2123+
const real_t pan_speed = translation_sensitivity / 150.0;
21092124

21102125
Transform3D camera_transform;
21112126
camera_transform.translate_local(cursor.pos);
@@ -2123,17 +2138,35 @@ void RuntimeNodeSelect::_cursor_pan(Ref<InputEventWithModifiers> p_event) {
21232138
void RuntimeNodeSelect::_cursor_orbit(Ref<InputEventWithModifiers> p_event) {
21242139
Window *root = SceneTree::get_singleton()->get_root();
21252140
// Reduce all sides of the area by 1, so warping works when windows are maximized/fullscreen.
2126-
const Vector2 relative = Input::get_singleton()->warp_mouse_motion(p_event, Rect2(Vector2(1, 1), root->get_size() - Vector2(2, 2)));
2141+
const Vector2 relative = _get_warped_mouse_motion(p_event, Rect2(Vector2(1, 1), root->get_size() - Vector2(2, 2)));
21272142

2128-
cursor.x_rot += relative.y * RADS_PER_PIXEL;
2143+
if (invert_y_axis) {
2144+
cursor.x_rot -= relative.y * orbit_sensitivity;
2145+
} else {
2146+
cursor.x_rot += relative.y * orbit_sensitivity;
2147+
}
21292148
// Clamp the Y rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented.
21302149
cursor.x_rot = CLAMP(cursor.x_rot, -1.57, 1.57);
21312150

2132-
cursor.y_rot += relative.x * RADS_PER_PIXEL;
2151+
if (invert_x_axis) {
2152+
cursor.y_rot -= relative.x * orbit_sensitivity;
2153+
} else {
2154+
cursor.y_rot += relative.x * orbit_sensitivity;
2155+
}
21332156

21342157
SceneTree::get_singleton()->get_root()->set_camera_3d_override_transform(_get_cursor_transform());
21352158
}
21362159

2160+
Point2 RuntimeNodeSelect::_get_warped_mouse_motion(const Ref<InputEventMouseMotion> &p_event, Rect2 p_area) const {
2161+
ERR_FAIL_COND_V(p_event.is_null(), Point2());
2162+
2163+
if (warped_mouse_panning_3d) {
2164+
return Input::get_singleton()->warp_mouse_motion(p_event, p_area);
2165+
}
2166+
2167+
return p_event->get_relative();
2168+
}
2169+
21372170
Transform3D RuntimeNodeSelect::_get_cursor_transform() {
21382171
Transform3D camera_transform;
21392172
camera_transform.translate_local(cursor.pos);
@@ -2158,13 +2191,13 @@ void RuntimeNodeSelect::_reset_camera_3d() {
21582191
cursor.x_rot = -camera->get_global_rotation().x;
21592192
cursor.y_rot = -camera->get_global_rotation().y;
21602193

2161-
cursor.fov_scale = CLAMP(camera->get_fov() / CAMERA_BASE_FOV, CAMERA_MIN_FOV_SCALE, CAMERA_MAX_FOV_SCALE);
2194+
cursor.fov_scale = CLAMP(camera->get_fov() / camera_fov, CAMERA_MIN_FOV_SCALE, CAMERA_MAX_FOV_SCALE);
21622195
} else {
21632196
cursor.fov_scale = 1.0;
21642197
}
21652198

21662199
SceneTree::get_singleton()->get_root()->set_camera_3d_override_transform(_get_cursor_transform());
2167-
SceneTree::get_singleton()->get_root()->set_camera_3d_override_perspective(CAMERA_BASE_FOV * cursor.fov_scale, CAMERA_ZNEAR, CAMERA_ZFAR);
2200+
SceneTree::get_singleton()->get_root()->set_camera_3d_override_perspective(camera_fov * cursor.fov_scale, camera_znear, camera_zfar);
21682201
}
21692202
#endif // _3D_DISABLED
21702203
#endif

scene/debugger/scene_debugger.h

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -242,20 +242,26 @@ class RuntimeNodeSelect : public Object {
242242
const double VIEW_3D_MAX_ZOOM = 1'000'000'000'000;
243243
#else
244244
const float VIEW_3D_MAX_ZOOM = 10'000;
245-
#endif
246-
const float CAMERA_ZNEAR = 0.05;
247-
const float CAMERA_ZFAR = 4'000;
245+
#endif // REAL_T_IS_DOUBLE
248246

249-
const float CAMERA_BASE_FOV = 75;
250247
const float CAMERA_MIN_FOV_SCALE = 0.1;
251248
const float CAMERA_MAX_FOV_SCALE = 2.5;
252249

253-
const float FREELOOK_BASE_SPEED = 4;
254-
const float RADS_PER_PIXEL = 0.004;
255-
256250
bool camera_first_override = true;
257251
bool camera_freelook = false;
258-
real_t freelook_speed = FREELOOK_BASE_SPEED;
252+
253+
real_t camera_fov = 0;
254+
real_t camera_znear = 0;
255+
real_t camera_zfar = 0;
256+
257+
bool invert_x_axis = false;
258+
bool invert_y_axis = false;
259+
bool warped_mouse_panning_3d = false;
260+
261+
real_t freelook_base_speed = 0;
262+
real_t freelook_sensitivity = 0;
263+
real_t orbit_sensitivity = 0;
264+
real_t translation_sensitivity = 0;
259265

260266
Vector2 previous_mouse_position;
261267

@@ -267,7 +273,7 @@ class RuntimeNodeSelect : public Object {
267273
RID sbox_3d_instance_xray_ofs;
268274
Transform3D sbox_3d_xform;
269275
AABB sbox_3d_bounds;
270-
#endif
276+
#endif // _3D_DISABLED
271277

272278
Point2 selection_position = Point2(INFINITY, INFINITY);
273279
bool list_shortcut_pressed = false;
@@ -314,6 +320,7 @@ class RuntimeNodeSelect : public Object {
314320
void _cursor_look(Ref<InputEventWithModifiers> p_event);
315321
void _cursor_pan(Ref<InputEventWithModifiers> p_event);
316322
void _cursor_orbit(Ref<InputEventWithModifiers> p_event);
323+
Point2 _get_warped_mouse_motion(const Ref<InputEventMouseMotion> &p_event, Rect2 p_border) const;
317324
Transform3D _get_cursor_transform();
318325
void _reset_camera_3d();
319326
#endif

0 commit comments

Comments
 (0)