2 #include "client/camera.h"
3 #include "client/client.h"
4 #include "client/client_player.h"
5 #include "client/hud.h"
6 #include "client/input.h"
7 #include "client/window.h"
18 HUDElement *pause_menu_hud;
20 KeyListener pause_listener;
21 KeyListener fullscreen_listener;
22 KeyListener fly_listener;
23 KeyListener collision_listener;
26 void input_on_cursor_pos(double current_x, double current_y)
31 static double last_x, last_y = 0.0;
33 double delta_x = current_x - last_x;
34 double delta_y = current_y - last_y;
38 client_player.yaw += (f32) delta_x * M_PI / 180.0f / 8.0f;
39 client_player.pitch -= (f32) delta_y * M_PI / 180.0f / 8.0f;
41 client_player.pitch = fmax(fmin(client_player.pitch, M_PI / 2.0f - 0.01f), -M_PI / 2.0f + 0.01f);
43 camera_set_angle(client_player.yaw, client_player.pitch);
46 static bool move(int forward, int backward, vec3 dir)
49 f64 speed = client_player.fly ? 25.0f : 4.317f;
51 if (glfwGetKey(window.handle, forward) == GLFW_PRESS)
53 else if (glfwGetKey(window.handle, backward) == GLFW_PRESS)
58 client_player.velocity.x += dir[0] * speed * sign;
59 client_player.velocity.y += dir[1] * speed * sign;
60 client_player.velocity.z += dir[2] * speed * sign;
65 static void enter_game()
67 glfwSetInputMode(window.handle, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
68 input.pause_menu_hud->visible = false;
71 static void do_key_listener(KeyListener *listener)
73 bool is_pressed = glfwGetKey(window.handle, listener->key) == GLFW_PRESS;
74 listener->fired = listener->was_pressed && ! is_pressed;
75 listener->was_pressed = is_pressed;
78 static KeyListener create_key_listener(int key)
80 return (KeyListener) {
89 do_key_listener(&input.pause_listener);
90 do_key_listener(&input.fullscreen_listener);
91 do_key_listener(&input.fly_listener);
92 do_key_listener(&input.collision_listener);
94 if (input.pause_listener.fired) {
95 input.paused = ! input.paused;
98 glfwSetInputMode(window.handle, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
99 input.pause_menu_hud->visible = true;
105 if (input.fullscreen_listener.fired) {
106 if (window.fullscreen)
107 window_exit_fullscreen();
109 window_enter_fullscreen();
112 if (input.fly_listener.fired) {
113 client_player.fly = ! client_player.fly;
114 client_player_update_info();
117 if (input.collision_listener.fired) {
118 client_player.collision = ! client_player.collision;
119 client_player_update_info();
122 client_player.velocity.x = 0.0f;
123 client_player.velocity.z = 0.0f;
125 if (client_player.fly)
126 client_player.velocity.y = 0.0f;
128 if (! input.paused) {
129 move(GLFW_KEY_W, GLFW_KEY_S, camera_movement_dirs.front);
130 move(GLFW_KEY_D, GLFW_KEY_A, camera_movement_dirs.right);
132 if (client_player.fly)
133 move(GLFW_KEY_SPACE, GLFW_KEY_LEFT_SHIFT, camera_movement_dirs.up);
134 else if (glfwGetKey(window.handle, GLFW_KEY_SPACE) == GLFW_PRESS)
135 client_player_jump();
141 input.paused = false;
143 input.pause_listener = create_key_listener(GLFW_KEY_ESCAPE);
144 input.fullscreen_listener = create_key_listener(GLFW_KEY_F11);
145 input.fly_listener = create_key_listener(GLFW_KEY_F);
146 input.collision_listener = create_key_listener(GLFW_KEY_C);
148 input.pause_menu_hud = hud_add((HUDElementDefinition) {
150 .pos = {-1.0f, -1.0f, 0.5f},
154 .texture = texture_get(RESSOURCEPATH "textures/pause_layer.png"),
155 .scale = {1.0f, 1.0f},
156 .scale_type = HUD_SCALE_SCREEN
161 glfwSetInputMode(window.handle, GLFW_STICKY_KEYS, GL_TRUE);