2 #include "client/camera.h"
3 #include "client/client.h"
4 #include "client/client_player.h"
5 #include "client/debug_menu.h"
6 #include "client/gui.h"
7 #include "client/input.h"
8 #include "client/window.h"
19 GUIElement *pause_menu;
21 KeyListener pause_listener;
22 KeyListener fullscreen_listener;
23 KeyListener fly_listener;
24 KeyListener collision_listener;
25 KeyListener debug_menu_listener;
28 void input_on_cursor_pos(double current_x, double current_y)
33 static double last_x, last_y = 0.0;
35 double delta_x = current_x - last_x;
36 double delta_y = current_y - last_y;
40 client_player.yaw += (f32) delta_x * M_PI / 180.0f / 8.0f;
41 client_player.pitch -= (f32) delta_y * M_PI / 180.0f / 8.0f;
43 client_player.yaw = fmod(client_player.yaw + M_PI * 2.0f, M_PI * 2.0f);
44 client_player.pitch = fmax(fmin(client_player.pitch, M_PI / 2.0f - 0.01f), -M_PI / 2.0f + 0.01f);
46 camera_set_angle(client_player.yaw, client_player.pitch);
48 debug_menu_update_yaw();
49 debug_menu_update_pitch();
52 static bool move(int forward, int backward, vec3 dir)
55 f64 speed = client_player.fly ? 25.0f : 4.317f;
57 if (glfwGetKey(window.handle, forward) == GLFW_PRESS)
59 else if (glfwGetKey(window.handle, backward) == GLFW_PRESS)
64 client_player.velocity.x += dir[0] * speed * sign;
65 client_player.velocity.y += dir[1] * speed * sign;
66 client_player.velocity.z += dir[2] * speed * sign;
71 static void enter_game()
73 glfwSetInputMode(window.handle, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
74 input.pause_menu->visible = false;
77 static void do_key_listener(KeyListener *listener)
79 bool is_pressed = glfwGetKey(window.handle, listener->key) == GLFW_PRESS;
80 listener->fired = listener->was_pressed && ! is_pressed;
81 listener->was_pressed = is_pressed;
84 static KeyListener create_key_listener(int key)
86 return (KeyListener) {
95 do_key_listener(&input.pause_listener);
96 do_key_listener(&input.fullscreen_listener);
98 if (input.pause_listener.fired) {
99 input.paused = ! input.paused;
102 glfwSetInputMode(window.handle, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
103 input.pause_menu->visible = true;
109 if (input.fullscreen_listener.fired) {
110 if (window.fullscreen)
111 window_exit_fullscreen();
113 window_enter_fullscreen();
116 if (! input.paused) {
117 do_key_listener(&input.fly_listener);
118 do_key_listener(&input.collision_listener);
119 do_key_listener(&input.debug_menu_listener);
121 if (input.fly_listener.fired) {
122 client_player.fly = ! client_player.fly;
123 debug_menu_update_flight();
126 if (input.collision_listener.fired) {
127 client_player.collision = ! client_player.collision;
128 debug_menu_update_collision();
131 if (input.debug_menu_listener.fired)
135 client_player.velocity.x = 0.0f;
136 client_player.velocity.z = 0.0f;
138 if (client_player.fly)
139 client_player.velocity.y = 0.0f;
141 if (! input.paused) {
142 move(GLFW_KEY_W, GLFW_KEY_S, camera.movement_dirs.front);
143 move(GLFW_KEY_D, GLFW_KEY_A, camera.movement_dirs.right);
145 if (client_player.fly)
146 move(GLFW_KEY_SPACE, GLFW_KEY_LEFT_SHIFT, camera.movement_dirs.up);
147 else if (glfwGetKey(window.handle, GLFW_KEY_SPACE) == GLFW_PRESS)
148 client_player_jump();
154 input.paused = false;
156 input.pause_listener = create_key_listener(GLFW_KEY_ESCAPE);
157 input.fullscreen_listener = create_key_listener(GLFW_KEY_F11);
158 input.fly_listener = create_key_listener(GLFW_KEY_F);
159 input.collision_listener = create_key_listener(GLFW_KEY_C);
160 input.debug_menu_listener = create_key_listener(GLFW_KEY_F3);
162 input.pause_menu = gui_add(&gui_root, (GUIElementDefinition) {
167 .align = {0.0f, 0.0f},
168 .scale = {1.0f, 1.0f},
169 .scale_type = GST_PARENT,
170 .affect_parent_scale = false,
173 .text_color = {0.0f, 0.0f, 0.0f, 0.0f},
174 .bg_color = {0.0f, 0.0f, 0.0f, 0.4f},
177 glfwSetInputMode(window.handle, GLFW_STICKY_KEYS, GL_TRUE);