Skip to content

Commit

Permalink
Add changeable freelook speed in Game Window
Browse files Browse the repository at this point in the history
  • Loading branch information
Giganzo committed Feb 10, 2025
1 parent f0f5319 commit cedcc24
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 1 deletion.
1 change: 1 addition & 0 deletions editor/plugins/game_view_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ void GameViewDebugger::_session_started(Ref<EditorDebuggerSession> p_session) {
settings["editors/panning/warped_mouse_panning"] = EDITOR_GET("editors/panning/warped_mouse_panning");
settings["editors/panning/2d_editor_pan_speed"] = EDITOR_GET("editors/panning/2d_editor_pan_speed");
settings["canvas_item_editor/pan_view"] = DebuggerMarshalls::serialize_key_shortcut(ED_GET_SHORTCUT("canvas_item_editor/pan_view"));
settings["editors/3d/freelook/freelook_base_speed"] = EDITOR_GET("editors/3d/freelook/freelook_base_speed");
setup_data.append(settings);
p_session->send_message("scene:runtime_node_select_setup", setup_data);

Expand Down
18 changes: 17 additions & 1 deletion scene/debugger/scene_debugger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1261,6 +1261,8 @@ void RuntimeNodeSelect::_setup(const Dictionary &p_settings) {
#ifndef _3D_DISABLED
cursor = Cursor();

freelook_speed = p_settings.get("editors/3d/freelook/freelook_base_speed", FREELOOK_BASE_SPEED);

/// 3D Selection Box Generation
// Copied from the Node3DEditor implementation.

Expand Down Expand Up @@ -1443,7 +1445,7 @@ void RuntimeNodeSelect::_process_frame() {
direction -= up;
}

real_t speed = FREELOOK_BASE_SPEED;
real_t speed = freelook_speed;
if (input->is_physical_key_pressed(Key::SHIFT)) {
speed *= 3.0;
}
Expand Down Expand Up @@ -1959,13 +1961,17 @@ bool RuntimeNodeSelect::_handle_3d_input(const Ref<InputEvent> &p_event) {
case MouseButton::WHEEL_UP: {
if (!camera_freelook) {
_cursor_scale_distance(1.0 / zoom_factor);
} else {
_scale_freelook_speed(zoom_factor);
}

return true;
} break;
case MouseButton::WHEEL_DOWN: {
if (!camera_freelook) {
_cursor_scale_distance(zoom_factor);
} else {
_scale_freelook_speed(1.0 / zoom_factor);
}

return true;
Expand Down Expand Up @@ -2064,6 +2070,16 @@ void RuntimeNodeSelect::_cursor_scale_distance(real_t p_scale) {
SceneTree::get_singleton()->get_root()->set_camera_3d_override_transform(_get_cursor_transform());
}

void RuntimeNodeSelect::_scale_freelook_speed(real_t p_scale) {
real_t min_speed = MAX(CAMERA_ZNEAR * 4, VIEW_3D_MIN_ZOOM);
real_t max_speed = MIN(CAMERA_ZFAR / 4, VIEW_3D_MAX_ZOOM);
if (unlikely(min_speed > max_speed)) {
freelook_speed = (min_speed + max_speed) / 2;
} else {
freelook_speed = CLAMP(freelook_speed * p_scale, min_speed, max_speed);
}
}

void RuntimeNodeSelect::_cursor_look(Ref<InputEventWithModifiers> p_event) {
Window *root = SceneTree::get_singleton()->get_root();
const Vector2 relative = Input::get_singleton()->warp_mouse_motion(p_event, Rect2(Vector2(), root->get_size()));
Expand Down
2 changes: 2 additions & 0 deletions scene/debugger/scene_debugger.h
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@ class RuntimeNodeSelect : public Object {

bool camera_first_override = true;
bool camera_freelook = false;
real_t freelook_speed = FREELOOK_BASE_SPEED;

Vector2 previous_mouse_position;

Expand Down Expand Up @@ -309,6 +310,7 @@ class RuntimeNodeSelect : public Object {
bool _handle_3d_input(const Ref<InputEvent> &p_event);
void _set_camera_freelook_enabled(bool p_enabled);
void _cursor_scale_distance(real_t p_scale);
void _scale_freelook_speed(real_t p_scale);
void _cursor_look(Ref<InputEventWithModifiers> p_event);
void _cursor_pan(Ref<InputEventWithModifiers> p_event);
void _cursor_orbit(Ref<InputEventWithModifiers> p_event);
Expand Down

0 comments on commit cedcc24

Please sign in to comment.