Implemented redirecting warning, error and command messages to in-game console and showing coloured console output

dev
Shariq Shah 7 years ago
parent d10bc6ac67
commit c72089e77d
  1. 5
      README.md
  2. 31
      src/common/log.c
  3. 4
      src/common/log.h
  4. 43
      src/libsymmetry/console.c
  5. 30
      src/libsymmetry/console.h
  6. 14
      src/libsymmetry/game.c

@ -155,7 +155,7 @@
- ## TODO - ## TODO
- Console error/warning output - Implement Auto scrolling to the bottom in console
- Console commands - Console commands
- Console fix bug when enabled in editor mode - Console fix bug when enabled in editor mode
- Console command history - Console command history
@ -410,4 +410,5 @@
* Player init, update, visual representation and movement * Player init, update, visual representation and movement
* Switching between editor and game mode/cameras * Switching between editor and game mode/cameras
* In-game basis for scrollable console/log-viewer * In-game basis for scrollable console/log-viewer
* Console log output * Console log output
* Console error/warning output

@ -30,9 +30,13 @@
#endif #endif
static void log_message_callback_stub(const char* message, va_list args); 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 FILE* log_file = NULL;
static Log_Message_CB message_callback = log_message_callback_stub; 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 #define MAX_LOG_FILE_PATH_LEN 512
@ -116,6 +120,7 @@ void log_warning(const char* message, ...)
va_copy(file_list, console_list); va_copy(file_list, console_list);
vfprintf(log_file, message, file_list); vfprintf(log_file, message, file_list);
vprintf(message, console_list); vprintf(message, console_list);
warning_callback(message, console_list);
va_end(console_list); va_end(console_list);
va_end(file_list); va_end(file_list);
printf("\n"); printf("\n");
@ -132,6 +137,7 @@ void log_error(const char* context, const char* error, ...)
va_copy(file_list, console_list); va_copy(file_list, console_list);
vfprintf(log_file, error, file_list); vfprintf(log_file, error, file_list);
vprintf(error, console_list); vprintf(error, console_list);
error_callback(context, error, console_list);
va_end(console_list); va_end(console_list);
va_end(file_list); va_end(file_list);
printf("\n%s", COL_RESET); printf("\n%s", COL_RESET);
@ -144,18 +150,39 @@ FILE* log_file_handle_get(void)
return log_file; return log_file;
} }
void log_file_handle_set(FILE* file) void log_file_handle_set(FILE* file)
{ {
log_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) if(callback)
message_callback = 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) 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 // This is just a stub in-case no callback has been set
} }

@ -4,6 +4,8 @@
#include <stdio.h> #include <stdio.h>
typedef void (*Log_Message_CB)(const char* message, va_list args); 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_init(const char* log_file_name, const char* user_directory);
void log_cleanup(void); void log_cleanup(void);
@ -15,5 +17,7 @@ void log_raw(const char* str, ...);
FILE* log_file_handle_get(void); FILE* log_file_handle_get(void);
void log_file_handle_set(FILE* file); void log_file_handle_set(FILE* file);
void log_message_callback_set(Log_Message_CB callback); 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 #endif

@ -8,7 +8,7 @@
#include <string.h> #include <string.h>
#include <nuklear.h> #include <nuklear.h>
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); 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); 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->visible = false;
console->text_region_height = 22.f; 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); memset(console->console_command_text, '\0', MAX_CONSOLE_MESSAGE_LEN);
for(int i = 0; i < MAX_CONSOLE_MESSAGES; i++) 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) 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++) for(int i = 0; i <= console->current_message_index; i++)
{ {
nk_layout_row_dynamic(context, console->line_height, 1); 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); 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); 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) 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); 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) if(++console->current_message_index >= MAX_CONSOLE_MESSAGES)
console->current_message_index = 0; console->current_message_index = 0;
vsnprintf(console->console_messages[console->current_message_index], MAX_CONSOLE_MESSAGE_LEN, message, args); 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;
}

@ -7,14 +7,30 @@
#define MAX_CONSOLE_MESSAGE_LEN 256 #define MAX_CONSOLE_MESSAGE_LEN 256
#define MAX_CONSOLE_MESSAGES 1024 #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 struct Console
{ {
bool visible; bool visible;
float text_region_height; float text_region_height;
float line_height; float line_height;
int current_message_index; int current_message_index;
char console_command_text[MAX_CONSOLE_MESSAGE_LEN]; char console_command_text[MAX_CONSOLE_MESSAGE_LEN];
char console_messages[MAX_CONSOLE_MESSAGES][MAX_CONSOLE_MESSAGE_LEN]; struct Console_Message console_messages[MAX_CONSOLE_MESSAGES];
}; };
void console_init(struct Console* console); 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_update(struct Console* console, struct Gui_State* gui_state, float dt);
void console_destroy(struct Console* console); void console_destroy(struct Console* console);
void console_on_log_message(struct Console* console, const char* message, va_list args); 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 #endif

@ -49,6 +49,8 @@ static void game_debug(float dt);
static void game_debug_gui(float dt); static void game_debug_gui(float dt);
static void game_scene_setup(void); static void game_scene_setup(void);
static void game_on_log_message(const char* message, va_list args); 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_box_move(Rigidbody body);
static void on_collision_test(struct Entity* this_ent, struct Entity* other_ent, Rigidbody body, Rigidbody body2); 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_file_handle_set(platform->log.file_handle_get());
log_message_callback_set(game_on_log_message); 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()) 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) void game_on_log_message(const char* message, va_list args)
{ {
console_on_log_message(game_state->console, message, 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);
} }
Loading…
Cancel
Save