mirror of
https://github.com/godotengine/godot.git
synced 2025-04-13 01:00:35 +08:00
Add changeable freelook speed in Game Window
This commit is contained in:
parent
f0f5319b0b
commit
cedcc2444e
@ -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);
|
||||
|
||||
|
@ -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.
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -1959,6 +1961,8 @@ 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;
|
||||
@ -1966,6 +1970,8 @@ bool RuntimeNodeSelect::_handle_3d_input(const Ref<InputEvent> &p_event) {
|
||||
case MouseButton::WHEEL_DOWN: {
|
||||
if (!camera_freelook) {
|
||||
_cursor_scale_distance(zoom_factor);
|
||||
} else {
|
||||
_scale_freelook_speed(1.0 / zoom_factor);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -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()));
|
||||
|
@ -255,6 +255,7 @@ private:
|
||||
|
||||
bool camera_first_override = true;
|
||||
bool camera_freelook = false;
|
||||
real_t freelook_speed = FREELOOK_BASE_SPEED;
|
||||
|
||||
Vector2 previous_mouse_position;
|
||||
|
||||
@ -309,6 +310,7 @@ private:
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user