]> git.lizzy.rs Git - dragonblocks_alpha.git/blobdiff - src/client/input.c
Implement frustum culling properly
[dragonblocks_alpha.git] / src / client / input.c
index c2964c27e22937941c5e891aea73d11404de054e..763629d3bb3cd28b115bfabdbae8e1be39584fdf 100644 (file)
@@ -1,11 +1,16 @@
 #include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include "client/camera.h"
 #include "client/client.h"
 #include "client/client_player.h"
 #include "client/debug_menu.h"
+#include "client/game.h"
 #include "client/gui.h"
 #include "client/input.h"
 #include "client/window.h"
+#include "day.h"
+#include "util.h"
 
 typedef struct
 {
@@ -17,12 +22,15 @@ typedef struct
 static struct
 {
        GUIElement *pause_menu;
+       GUIElement *status_message;
        bool paused;
        KeyListener pause_listener;
        KeyListener fullscreen_listener;
        KeyListener fly_listener;
        KeyListener collision_listener;
+       KeyListener timelapse_listener;
        KeyListener debug_menu_listener;
+       KeyListener screenshot_listener;
 } input;
 
 void input_on_cursor_pos(double current_x, double current_y)
@@ -90,8 +98,19 @@ static KeyListener create_key_listener(int key)
        };
 }
 
-void input_tick()
+static void set_status_message(char *message)
 {
+       gui_set_text(input.status_message, message);
+       input.status_message->def.text_color.w = 1.01f;
+}
+
+void input_tick(f64 dtime)
+{
+       if (input.status_message->def.text_color.w > 1.0f)
+               input.status_message->def.text_color.w = 1.0f;
+       else if (input.status_message->def.text_color.w > 0.0f)
+               input.status_message->def.text_color.w -= dtime * 1.0f;
+
        do_key_listener(&input.pause_listener);
        do_key_listener(&input.fullscreen_listener);
 
@@ -116,20 +135,38 @@ void input_tick()
        if (! input.paused) {
                do_key_listener(&input.fly_listener);
                do_key_listener(&input.collision_listener);
+               do_key_listener(&input.timelapse_listener);
                do_key_listener(&input.debug_menu_listener);
+               do_key_listener(&input.screenshot_listener);
 
                if (input.fly_listener.fired) {
                        client_player.fly = ! client_player.fly;
                        debug_menu_update_flight();
+                       set_status_message(format_string("Flight %s", client_player.fly ? "Enabled" : "Disabled"));
                }
 
                if (input.collision_listener.fired) {
                        client_player.collision = ! client_player.collision;
                        debug_menu_update_collision();
+                       set_status_message(format_string("Collision %s", client_player.collision ? "Enabled" : "Disabled"));
+               }
+
+               if (input.timelapse_listener.fired) {
+                       f64 current_time = get_time_of_day();
+                       timelapse = ! timelapse;
+                       set_time_of_day(current_time);
+                       debug_menu_update_timelapse();
+                       set_status_message(format_string("Timelapse %s", timelapse ? "Enabled" : "Disabled"));
                }
 
                if (input.debug_menu_listener.fired)
                        debug_menu_toggle();
+
+               if (input.screenshot_listener.fired) {
+                       char *screenshot_filename = take_screenshot();
+                       set_status_message(format_string("Screenshot saved to %s", screenshot_filename));
+                       free(screenshot_filename);
+               }
        }
 
        client_player.velocity.x = 0.0f;
@@ -157,7 +194,9 @@ void input_init()
        input.fullscreen_listener = create_key_listener(GLFW_KEY_F11);
        input.fly_listener = create_key_listener(GLFW_KEY_F);
        input.collision_listener = create_key_listener(GLFW_KEY_C);
+       input.timelapse_listener = create_key_listener(GLFW_KEY_T);
        input.debug_menu_listener = create_key_listener(GLFW_KEY_F3);
+       input.screenshot_listener = create_key_listener(GLFW_KEY_F2);
 
        input.pause_menu = gui_add(&gui_root, (GUIElementDefinition) {
                .pos = {0.0f, 0.0f},
@@ -174,6 +213,21 @@ void input_init()
                .bg_color = {0.0f, 0.0f, 0.0f, 0.4f},
        });
 
+       input.status_message = gui_add(&gui_root, (GUIElementDefinition) {
+               .pos = {0.5f, 0.25f},
+               .z_index = 0.1f,
+               .offset = {0, 0},
+               .margin = {0, 0},
+               .align = {0.5f, 0.5f},
+               .scale = {1.0f, 1.0f},
+               .scale_type = GST_TEXT,
+               .affect_parent_scale = false,
+               .text = strdup(""),
+               .image = NULL,
+               .text_color = {1.0f, 0.91f, 0.13f, 0.0f},
+               .bg_color = {0.0f, 0.0f, 0.0f, 0.0f},
+       });
+
        glfwSetInputMode(window.handle, GLFW_STICKY_KEYS, GL_TRUE);
 
        enter_game();