From c72089e77d8d1e48cedd186b79164a58810366b7 Mon Sep 17 00:00:00 2001 From: Shariq Shah Date: Wed, 23 May 2018 00:42:29 +1000 Subject: [PATCH] Implemented redirecting warning, error and command messages to in-game console and showing coloured console output --- README.md | 5 +++-- src/common/log.c | 31 ++++++++++++++++++++++++++-- src/common/log.h | 4 ++++ src/libsymmetry/console.c | 43 ++++++++++++++++++++++++++++++++------- src/libsymmetry/console.h | 30 +++++++++++++++++++++------ src/libsymmetry/game.c | 14 +++++++++++++ 6 files changed, 110 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 909ae50..bf745cc 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ - ## TODO - - Console error/warning output + - Implement Auto scrolling to the bottom in console - Console commands - Console fix bug when enabled in editor mode - Console command history @@ -410,4 +410,5 @@ * Player init, update, visual representation and movement * Switching between editor and game mode/cameras * In-game basis for scrollable console/log-viewer - * Console log output \ No newline at end of file + * Console log output + * Console error/warning output \ No newline at end of file diff --git a/src/common/log.c b/src/common/log.c index 7fd7fa2..307f5fb 100644 --- a/src/common/log.c +++ b/src/common/log.c @@ -30,9 +30,13 @@ #endif static void log_message_callback_stub(const char* message, va_list args); +static void log_warning_callback_stub(const char* warning_message, va_list args); +static void log_error_callback_stub(const char* context, const char* message, va_list args); static FILE* log_file = NULL; static Log_Message_CB message_callback = log_message_callback_stub; +static Log_Warning_CB warning_callback = log_warning_callback_stub; +static Log_Error_CB error_callback = log_error_callback_stub; #define MAX_LOG_FILE_PATH_LEN 512 @@ -116,6 +120,7 @@ void log_warning(const char* message, ...) va_copy(file_list, console_list); vfprintf(log_file, message, file_list); vprintf(message, console_list); + warning_callback(message, console_list); va_end(console_list); va_end(file_list); printf("\n"); @@ -132,6 +137,7 @@ void log_error(const char* context, const char* error, ...) va_copy(file_list, console_list); vfprintf(log_file, error, file_list); vprintf(error, console_list); + error_callback(context, error, console_list); va_end(console_list); va_end(file_list); printf("\n%s", COL_RESET); @@ -144,18 +150,39 @@ FILE* log_file_handle_get(void) return log_file; } -void log_file_handle_set(FILE* file) +void log_file_handle_set(FILE* file) { log_file = file; } -void log_message_callback_set(Log_Message_CB callback) +void log_message_callback_set(Log_Message_CB callback) { if(callback) message_callback = callback; } +void log_warning_callback_set(Log_Warning_CB callback) +{ + if(callback) + warning_callback = callback; +} +void log_error_callback_set(Log_Error_CB callback) +{ + if(callback) + error_callback = callback; +} + void log_message_callback_stub(const char* message, va_list args) +{ + // This is just a stub in-case no callback has been set +} + +void log_warning_callback_stub(const char* warning_message, va_list args) +{ + // This is just a stub in-case no callback has been set +} + +void log_error_callback_stub(const char* context, const char* message, va_list args) { // This is just a stub in-case no callback has been set } \ No newline at end of file diff --git a/src/common/log.h b/src/common/log.h index 2ca5614..3637eeb 100644 --- a/src/common/log.h +++ b/src/common/log.h @@ -4,6 +4,8 @@ #include typedef void (*Log_Message_CB)(const char* message, va_list args); +typedef void (*Log_Warning_CB)(const char* warning_message, va_list args); +typedef void (*Log_Error_CB)(const char* context, const char* error_message, va_list args); void log_init(const char* log_file_name, const char* user_directory); void log_cleanup(void); @@ -15,5 +17,7 @@ void log_raw(const char* str, ...); FILE* log_file_handle_get(void); void log_file_handle_set(FILE* file); void log_message_callback_set(Log_Message_CB callback); +void log_warning_callback_set(Log_Warning_CB callback); +void log_error_callback_set(Log_Error_CB callback); #endif diff --git a/src/libsymmetry/console.c b/src/libsymmetry/console.c index 67d6f60..39d2eb9 100644 --- a/src/libsymmetry/console.c +++ b/src/libsymmetry/console.c @@ -8,7 +8,7 @@ #include #include -static struct nk_color color_normal; +static struct nk_color console_message_color[CMT_MAX]; static int console_filter(const struct nk_text_edit *box, nk_rune unicode); @@ -16,7 +16,11 @@ void console_init(struct Console* console) { assert(console); - color_normal = nk_rgb(255, 255, 255); + console_message_color[CMT_MESSAGE] = nk_rgb(255, 255, 255); + console_message_color[CMT_WARNING] = nk_rgb(255, 255, 0); + console_message_color[CMT_ERROR] = nk_rgb(255, 0, 0); + console_message_color[CMT_COMMAND] = nk_rgb(114, 173, 224); + console_message_color[CMT_NONE] = nk_rgb(255, 0, 255); console->visible = false; console->text_region_height = 22.f; @@ -25,7 +29,10 @@ void console_init(struct Console* console) memset(console->console_command_text, '\0', MAX_CONSOLE_MESSAGE_LEN); for(int i = 0; i < MAX_CONSOLE_MESSAGES; i++) - memset(console->console_messages[i], '\0', MAX_CONSOLE_MESSAGE_LEN); + { + memset(console->console_messages[i].message, '\0', MAX_CONSOLE_MESSAGE_LEN); + console->console_messages[i].type = CMT_NONE; + } } void console_toggle(struct Console* console) @@ -52,7 +59,7 @@ void console_update(struct Console* console, struct Gui_State* gui_state, float for(int i = 0; i <= console->current_message_index; i++) { nk_layout_row_dynamic(context, console->line_height, 1); - nk_labelf_colored(context, NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE, color_normal, console->console_messages[i]); + nk_labelf_colored(context, NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE, console_message_color[console->console_messages[i].type], console->console_messages[i].message); } nk_group_end(context); } @@ -63,7 +70,11 @@ void console_update(struct Console* console, struct Gui_State* gui_state, float int edit_state = nk_edit_string_zero_terminated(context, edit_flags, console->console_command_text, MAX_CONSOLE_MESSAGE_LEN, console_filter); if(edit_state & NK_EDIT_COMMITED) { - log_message("New message entered : %s", console->console_command_text); + if(++console->current_message_index >= MAX_CONSOLE_MESSAGES) + console->current_message_index = 0; + + snprintf(console->console_messages[console->current_message_index].message, MAX_CONSOLE_MESSAGE_LEN, "> %s", console->console_command_text); + console->console_messages[console->current_message_index].type = CMT_COMMAND; memset(console->console_command_text, '\0', MAX_CONSOLE_MESSAGE_LEN); } } @@ -88,5 +99,23 @@ void console_on_log_message(struct Console* console, const char* message, va_lis { if(++console->current_message_index >= MAX_CONSOLE_MESSAGES) console->current_message_index = 0; - vsnprintf(console->console_messages[console->current_message_index], MAX_CONSOLE_MESSAGE_LEN, message, args); -} \ No newline at end of file + vsnprintf(console->console_messages[console->current_message_index].message, MAX_CONSOLE_MESSAGE_LEN, message, args); + console->console_messages[console->current_message_index].type = CMT_MESSAGE; +} + +void console_on_log_warning(struct Console* console, const char* warning_message, va_list args) +{ + if(++console->current_message_index >= MAX_CONSOLE_MESSAGES) + console->current_message_index = 0; + vsnprintf(console->console_messages[console->current_message_index].message, MAX_CONSOLE_MESSAGE_LEN, warning_message, args); + console->console_messages[console->current_message_index].type = CMT_WARNING; +} + +void console_on_log_error(struct Console* console, const char* context, const char* error, va_list args) +{ + if(++console->current_message_index >= MAX_CONSOLE_MESSAGES) + console->current_message_index = 0; + int loc = snprintf(console->console_messages[console->current_message_index].message, MAX_CONSOLE_MESSAGE_LEN, "(%s)", context); + vsnprintf(console->console_messages[console->current_message_index].message + loc, MAX_CONSOLE_MESSAGE_LEN, error, args); + console->console_messages[console->current_message_index].type = CMT_ERROR; +} diff --git a/src/libsymmetry/console.h b/src/libsymmetry/console.h index 5658fd5..44ea619 100644 --- a/src/libsymmetry/console.h +++ b/src/libsymmetry/console.h @@ -7,14 +7,30 @@ #define MAX_CONSOLE_MESSAGE_LEN 256 #define MAX_CONSOLE_MESSAGES 1024 +enum Console_Message_Type +{ + CMT_NONE = 0, + CMT_MESSAGE, + CMT_WARNING, + CMT_ERROR, + CMT_COMMAND, + CMT_MAX +}; + +struct Console_Message +{ + int type; + char message[MAX_CONSOLE_MESSAGE_LEN]; +}; + struct Console { - bool visible; - float text_region_height; - float line_height; - int current_message_index; - char console_command_text[MAX_CONSOLE_MESSAGE_LEN]; - char console_messages[MAX_CONSOLE_MESSAGES][MAX_CONSOLE_MESSAGE_LEN]; + bool visible; + float text_region_height; + float line_height; + int current_message_index; + char console_command_text[MAX_CONSOLE_MESSAGE_LEN]; + struct Console_Message console_messages[MAX_CONSOLE_MESSAGES]; }; void console_init(struct Console* console); @@ -22,6 +38,8 @@ void console_toggle(struct Console* console); void console_update(struct Console* console, struct Gui_State* gui_state, float dt); void console_destroy(struct Console* console); void console_on_log_message(struct Console* console, const char* message, va_list args); +void console_on_log_warning(struct Console* console, const char* warning_message, va_list args); +void console_on_log_error(struct Console* console, const char* context, const char* error, va_list args); #endif \ No newline at end of file diff --git a/src/libsymmetry/game.c b/src/libsymmetry/game.c index 57dd873..3c6be22 100644 --- a/src/libsymmetry/game.c +++ b/src/libsymmetry/game.c @@ -49,6 +49,8 @@ static void game_debug(float dt); static void game_debug_gui(float dt); static void game_scene_setup(void); static void game_on_log_message(const char* message, va_list args); +static void game_on_log_warning(const char* warning_message, va_list args); +static void game_on_log_error(const char* context, const char* error_message, va_list args); static void on_box_move(Rigidbody body); static void on_collision_test(struct Entity* this_ent, struct Entity* other_ent, Rigidbody body, Rigidbody body2); @@ -82,6 +84,8 @@ bool game_init(struct Window* window, struct Platform_Api* platform_api) log_file_handle_set(platform->log.file_handle_get()); log_message_callback_set(game_on_log_message); + log_warning_callback_set(game_on_log_warning); + log_error_callback_set(game_on_log_error); if(!gl_load_extentions()) { @@ -1797,4 +1801,14 @@ void on_collision_test(struct Entity* this_ent, struct Entity* other_ent, Rigidb void game_on_log_message(const char* message, va_list args) { console_on_log_message(game_state->console, message, args); +} + +void game_on_log_warning(const char* warning_message, va_list args) +{ + console_on_log_warning(game_state->console, warning_message, args); +} + +void game_on_log_error(const char* context, const char* error_message, va_list args) +{ + console_on_log_error(game_state->console, context, error_message, args); } \ No newline at end of file