From f3181cabad7bbdd705dbe0448f1af58de3064f62 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 24 Aug 2021 21:22:32 +0200 Subject: [PATCH] Tweak and extend debug info --- README.md | 1 + src/CMakeLists.txt | 15 ++++ src/client/client_player.c | 31 ++------ src/client/debug_menu.c | 148 +++++++++++++++++++++++++++++++++++++ src/client/debug_menu.h | 23 ++++++ src/client/font.c | 2 +- src/client/font.h | 2 +- src/client/game.c | 59 +++++++-------- src/client/hud.c | 2 +- src/client/hud.h | 2 +- src/client/input.c | 32 +++++--- src/client/window.c | 5 ++ 12 files changed, 251 insertions(+), 71 deletions(-) create mode 100644 src/client/debug_menu.c create mode 100644 src/client/debug_menu.h diff --git a/README.md b/README.md index 77e4abb..11e8b5e 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ or alternatively: | F | Toggle flight | | C | Toggle collision | | F11 | Toggle fullscreen | +| F3 | Toggle debug info | | ESC | Pause / unpause game | ## Dependencies diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b8e67f8..bcf2e34 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -50,6 +50,7 @@ add_executable(Dragonblocks client/client_node.c client/client_player.c client/cube.c + client/debug_menu.c client/facecache.c client/font.c client/game.c @@ -89,6 +90,20 @@ target_link_libraries(DragonblocksServer sqlite3 ) +execute_process(COMMAND git tag --points-at HEAD + OUTPUT_VARIABLE GIT_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +if ("${GIT_VERSION}" STREQUAL "") + execute_process(COMMAND git rev-parse --short HEAD + OUTPUT_VARIABLE GIT_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +endif() + +add_compile_definitions(DRAGONBLOCKS_VERSION="${GIT_VERSION}") + if (CMAKE_BUILD_TYPE STREQUAL "Release") add_compile_definitions(RELEASE) endif() diff --git a/src/client/client_player.c b/src/client/client_player.c index 3171b7f..67e49fe 100644 --- a/src/client/client_player.c +++ b/src/client/client_player.c @@ -5,6 +5,7 @@ #include "client/client_map.h" #include "client/client_player.h" #include "client/cube.h" +#include "client/debug_menu.h" #include "client/texture.h" struct ClientPlayer client_player; @@ -19,7 +20,9 @@ static void update_pos() client_player.obj->pos = (v3f32) {client_player.pos.x, client_player.pos.y, client_player.pos.z}; object_transform(client_player.obj); - client_player_update_info(); + debug_menu_update_pos(); + debug_menu_update_humidity(); + debug_menu_update_temperature(); } // get absolute player bounding box @@ -107,21 +110,12 @@ void client_player_add_to_scene() } } - client_player.info_hud = hud_add((HUDElementDefinition) { - .type = HUD_TEXT, - .pos = {-1.0f, -1.0f, 0.0f}, - .offset = {2, 2 + 16 + 2 + 16 + 2}, - .type_def = { - .text = { - .text = "", - .color = {1.0f, 1.0f, 1.0f}, - }, - }, - }); - pthread_rwlock_rdlock(&client_player.rwlock); update_pos(); pthread_rwlock_unlock(&client_player.rwlock); + + debug_menu_update_yaw(); + debug_menu_update_pitch(); } // jump if possible @@ -208,14 +202,3 @@ void client_player_tick(f64 dtime) pthread_rwlock_unlock(&client_player.rwlock); } - -// update HUD info text -void client_player_update_info() -{ - v3s32 node_pos = {client_player.pos.x, client_player.pos.y, client_player.pos.z}; - - char info_text[BUFSIZ]; - sprintf(info_text, "(%.1f %.1f %.1f) humidity: %.2f temperature: %.2f flight: %s collision: %s", client_player.pos.x, client_player.pos.y, client_player.pos.z, get_humidity(node_pos), get_temperature(node_pos), client_player.fly ? "enabled" : "disabled", client_player.collision ? "enabled" : "disabled"); - - hud_change_text(client_player.info_hud, info_text); -} diff --git a/src/client/debug_menu.c b/src/client/debug_menu.c new file mode 100644 index 0000000..d9ecd14 --- /dev/null +++ b/src/client/debug_menu.c @@ -0,0 +1,148 @@ +#include +#include +#include +#include "environment.h" +#include "client/client_player.h" +#include "client/debug_menu.h" +#include "client/hud.h" +#include "client/window.h" + +typedef enum +{ + DME_VERSION, + DME_FPS, + DME_POS, + DME_YAW, + DME_PITCH, + DME_HUMIDITY, + DME_TEMPERATURE, + DME_FLIGHT, + DME_COLLISION, + DME_FULLSCREEN, + DME_OPENGL, + DME_GPU, + DME_GLSL, + DME_COUNT, +} DebugMenuEntry; + +static HUDElement *huds[DME_COUNT] = {NULL}; + +static bool debug_menu_enabled = true; +static DebugMenuEntry last_always_visible = DME_POS; + +void debug_menu_init() +{ + s32 offset = -16; + + for (DebugMenuEntry i = 0; i < DME_COUNT; i++) { + huds[i] = hud_add((HUDElementDefinition) { + .type = HUD_TEXT, + .pos = {-1.0f, -1.0f, 0.0f}, + .offset = {2, offset += 18}, + .type_def = { + .text = { + .text = "", + .color = {1.0f, 1.0f, 1.0f}, + }, + }, + }); + } +} + +void debug_menu_toggle() +{ + debug_menu_enabled = ! debug_menu_enabled; + + for (DebugMenuEntry i = 0; i < DME_COUNT; i++) + huds[i]->visible = debug_menu_enabled || i <= last_always_visible; +} + +void debug_menu_update_version() +{ + hud_change_text(huds[DME_VERSION], "Dragonblocks Alpha " DRAGONBLOCKS_VERSION); +} + +void debug_menu_update_fps(int fps) +{ + char text[BUFSIZ]; + sprintf(text, "%d FPS", fps); + hud_change_text(huds[DME_FPS], text); +} + +void debug_menu_update_pos() +{ + char text[BUFSIZ]; + sprintf(text, "(%.1f %.1f %.1f)", client_player.pos.x, client_player.pos.y, client_player.pos.z); + hud_change_text(huds[DME_POS], text); +} + +void debug_menu_update_yaw() +{ + char text[BUFSIZ]; + sprintf(text, "yaw = %.1f", client_player.yaw / M_PI * 180.0); + hud_change_text(huds[DME_YAW], text); +} + +void debug_menu_update_pitch() +{ + char text[BUFSIZ]; + sprintf(text, "pitch = %.1f", client_player.pitch / M_PI * 180.0); + hud_change_text(huds[DME_PITCH], text); +} + +void debug_menu_update_humidity() +{ + char text[BUFSIZ]; + sprintf(text, "humidity = %.2f", get_humidity((v3s32) {client_player.pos.x, client_player.pos.y, client_player.pos.z})); + hud_change_text(huds[DME_HUMIDITY], text); +} + +void debug_menu_update_temperature() +{ + char text[BUFSIZ]; + sprintf(text, "temperature = %.2f", get_temperature((v3s32) {client_player.pos.x, client_player.pos.y, client_player.pos.z})); + hud_change_text(huds[DME_TEMPERATURE], text); +} + +void debug_menu_update_flight() +{ + char text[BUFSIZ]; + sprintf(text, "flight: %s", client_player.fly ? "enabled" : "disabled"); + hud_change_text(huds[DME_FLIGHT], text); +} + +void debug_menu_update_collision() +{ + char text[BUFSIZ]; + sprintf(text, "collision: %s", client_player.collision ? "enabled" : "disabled"); + hud_change_text(huds[DME_COLLISION], text); +} + +void debug_menu_update_fullscreen() +{ + char text[BUFSIZ]; + sprintf(text, "fullscreen: %s", window.fullscreen ? "enabled" : "disabled"); + hud_change_text(huds[DME_FULLSCREEN], text); +} + +void debug_menu_update_opengl() +{ + char text[BUFSIZ]; + sprintf(text, "OpenGL %s", glGetString(GL_VERSION)); + hud_change_text(huds[DME_OPENGL], text); +} + +void debug_menu_update_gpu() +{ + char text[BUFSIZ]; + sprintf(text, "%s", glGetString(GL_RENDERER)); + hud_change_text(huds[DME_GPU], text); +} + +void debug_menu_update_glsl() +{ + char text[BUFSIZ]; + sprintf(text, "GLSL %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); + hud_change_text(huds[DME_GLSL], text); +} + diff --git a/src/client/debug_menu.h b/src/client/debug_menu.h new file mode 100644 index 0000000..4a8ab58 --- /dev/null +++ b/src/client/debug_menu.h @@ -0,0 +1,23 @@ +#ifndef _DEBUG_MENU_H_ +#define _DEBUG_MENU_H_ + +#include + +void debug_menu_init(); +void debug_menu_toggle(); + +void debug_menu_update_version(); +void debug_menu_update_fps(int fps); +void debug_menu_update_pos(); +void debug_menu_update_yaw(); +void debug_menu_update_pitch(); +void debug_menu_update_humidity(); +void debug_menu_update_temperature(); +void debug_menu_update_flight(); +void debug_menu_update_collision(); +void debug_menu_update_fullscreen(); +void debug_menu_update_opengl(); +void debug_menu_update_gpu(); +void debug_menu_update_glsl(); + +#endif diff --git a/src/client/font.c b/src/client/font.c index ac3c251..01d9c77 100644 --- a/src/client/font.c +++ b/src/client/font.c @@ -109,7 +109,7 @@ void font_deinit() } } -Font *font_create(char *text) +Font *font_create(const char *text) { Font *fnt = malloc(sizeof(fnt)); diff --git a/src/client/font.h b/src/client/font.h index e8d42e6..6e3bb61 100644 --- a/src/client/font.h +++ b/src/client/font.h @@ -13,7 +13,7 @@ typedef struct bool font_init(); void font_deinit(); -Font *font_create(char *text); +Font *font_create(const char *text); void font_delete(Font *fnt); void font_render(Font *fnt); diff --git a/src/client/game.c b/src/client/game.c index 48f80fd..4368b12 100644 --- a/src/client/game.c +++ b/src/client/game.c @@ -8,26 +8,31 @@ #include "client/client_map.h" #include "client/client_node.h" #include "client/client_player.h" +#include "client/debug_menu.h" #include "client/hud.h" #include "client/input.h" #include "client/font.h" #include "client/window.h" #include "signal_handlers.h" -static void game_loop(Client *client) +static void crosshair_init() { - HUDElement *fps_hud = hud_add((HUDElementDefinition) { - .type = HUD_TEXT, - .pos = {-1.0f, -1.0f, 0.0f}, - .offset = {2, 2 + 16 + 2}, + hud_add((HUDElementDefinition) { + .type = HUD_IMAGE, + .pos = {0.0f, 0.0f, 0.0f}, + .offset = {0, 0}, .type_def = { - .text = { - .text = "", - .color = {1.0f, 1.0f, 1.0f}, + .image = { + .texture = texture_get(RESSOURCEPATH "textures/crosshair.png"), + .scale = {1.0f, 1.0f}, + .scale_type = HUD_SCALE_TEXTURE, }, }, }); +} +static void game_loop(Client *client) +{ f64 fps_update_timer = 1.0f; int frames = 0; @@ -40,9 +45,7 @@ static void game_loop(Client *client) ts_old = ts; if ((fps_update_timer -= dtime) <= 0.0) { - char fps[((int) log10(frames) + 1) + 1 + 3 + 1]; - sprintf(fps, "%d FPS", frames); - hud_change_text(fps_hud, fps); + debug_menu_update_fps(frames); fps_update_timer += 1.0; frames = 0; } @@ -97,30 +100,18 @@ bool game(Client *client) hud_on_resize(width, height); - hud_add((HUDElementDefinition) { - .type = HUD_IMAGE, - .pos = {0.0f, 0.0f, 0.0f}, - .offset = {0, 0}, - .type_def = { - .image = { - .texture = texture_get(RESSOURCEPATH "textures/crosshair.png"), - .scale = {1.0f, 1.0f}, - .scale_type = HUD_SCALE_TEXTURE, - }, - }, - }); + debug_menu_init(); + debug_menu_toggle(); + debug_menu_update_fps(0); + debug_menu_update_version(); + debug_menu_update_flight(); + debug_menu_update_collision(); + debug_menu_update_fullscreen(); + debug_menu_update_opengl(); + debug_menu_update_gpu(); + debug_menu_update_glsl(); - hud_add((HUDElementDefinition) { - .type = HUD_TEXT, - .pos = {-1.0f, -1.0f, 0.0f}, - .offset = {2, 2}, - .type_def = { - .text = { - .text = "Dragonblocks Alpha", // ToDo: add version - .color = {1.0f, 1.0f, 1.0f}, - }, - }, - }); + crosshair_init(); input_init(); diff --git a/src/client/hud.c b/src/client/hud.c index 071a45e..a903164 100644 --- a/src/client/hud.c +++ b/src/client/hud.c @@ -225,7 +225,7 @@ HUDElement *hud_add(HUDElementDefinition def) return element; } -void hud_change_text(HUDElement *element, char *text) +void hud_change_text(HUDElement *element, const char *text) { if (strcmp(element->def.type_def.text.text, text)) { element->def.type_def.text.text = strdup(text); diff --git a/src/client/hud.h b/src/client/hud.h index d58af37..70d4e78 100644 --- a/src/client/hud.h +++ b/src/client/hud.h @@ -56,6 +56,6 @@ void hud_deinit(); void hud_on_resize(int width, int height); void hud_render(); HUDElement *hud_add(HUDElementDefinition def); -void hud_change_text(HUDElement *element, char *text); +void hud_change_text(HUDElement *element, const char *text); #endif diff --git a/src/client/input.c b/src/client/input.c index c2cd869..61efa7a 100644 --- a/src/client/input.c +++ b/src/client/input.c @@ -2,6 +2,7 @@ #include "client/camera.h" #include "client/client.h" #include "client/client_player.h" +#include "client/debug_menu.h" #include "client/hud.h" #include "client/input.h" #include "client/window.h" @@ -21,6 +22,7 @@ static struct KeyListener fullscreen_listener; KeyListener fly_listener; KeyListener collision_listener; + KeyListener debug_menu_listener; } input; void input_on_cursor_pos(double current_x, double current_y) @@ -38,9 +40,13 @@ void input_on_cursor_pos(double current_x, double current_y) client_player.yaw += (f32) delta_x * M_PI / 180.0f / 8.0f; client_player.pitch -= (f32) delta_y * M_PI / 180.0f / 8.0f; + client_player.yaw = fmod(client_player.yaw + M_PI * 2.0f, M_PI * 2.0f); client_player.pitch = fmax(fmin(client_player.pitch, M_PI / 2.0f - 0.01f), -M_PI / 2.0f + 0.01f); camera_set_angle(client_player.yaw, client_player.pitch); + + debug_menu_update_yaw(); + debug_menu_update_pitch(); } static bool move(int forward, int backward, vec3 dir) @@ -88,8 +94,6 @@ void input_tick() { do_key_listener(&input.pause_listener); do_key_listener(&input.fullscreen_listener); - do_key_listener(&input.fly_listener); - do_key_listener(&input.collision_listener); if (input.pause_listener.fired) { input.paused = ! input.paused; @@ -109,14 +113,23 @@ void input_tick() window_enter_fullscreen(); } - if (input.fly_listener.fired) { - client_player.fly = ! client_player.fly; - client_player_update_info(); - } + if (! input.paused) { + do_key_listener(&input.fly_listener); + do_key_listener(&input.collision_listener); + do_key_listener(&input.debug_menu_listener); - if (input.collision_listener.fired) { - client_player.collision = ! client_player.collision; - client_player_update_info(); + if (input.fly_listener.fired) { + client_player.fly = ! client_player.fly; + debug_menu_update_flight(); + } + + if (input.collision_listener.fired) { + client_player.collision = ! client_player.collision; + debug_menu_update_collision(); + } + + if (input.debug_menu_listener.fired) + debug_menu_toggle(); } client_player.velocity.x = 0.0f; @@ -144,6 +157,7 @@ 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.debug_menu_listener = create_key_listener(GLFW_KEY_F3); input.pause_menu_hud = hud_add((HUDElementDefinition) { .type = HUD_IMAGE, diff --git a/src/client/window.c b/src/client/window.c index 9f71403..511ee4e 100644 --- a/src/client/window.c +++ b/src/client/window.c @@ -1,6 +1,7 @@ #include #include #include +#include "client/debug_menu.h" #include "client/hud.h" #include "client/input.h" #include "client/scene.h" @@ -41,12 +42,16 @@ void window_enter_fullscreen() GLFWmonitor *monitor = glfwGetPrimaryMonitor(); const GLFWvidmode *vidmode = glfwGetVideoMode(monitor); glfwSetWindowMonitor(window.handle, monitor, 0, 0, vidmode->width, vidmode->height, 0); + + debug_menu_update_fullscreen(); } void window_exit_fullscreen() { window.fullscreen = false; glfwSetWindowMonitor(window.handle, NULL, window.small_bounds.x, window.small_bounds.y, window.small_bounds.width, window.small_bounds.height, 0); + + debug_menu_update_fullscreen(); } bool window_init(int width, int height)