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. 3
      README.md
  2. 31
      src/common/log.c
  3. 4
      src/common/log.h
  4. 41
      src/libsymmetry/console.c
  5. 30
      src/libsymmetry/console.h
  6. 14
      src/libsymmetry/game.c

@ -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
@ -411,3 +411,4 @@
* Switching between editor and game mode/cameras
* In-game basis for scrollable console/log-viewer
* Console log output
* Console error/warning output

@ -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
}

@ -4,6 +4,8 @@
#include <stdio.h>
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

@ -8,7 +8,7 @@
#include <string.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);
@ -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);
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_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

@ -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())
{
@ -1798,3 +1802,13 @@ 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);
}
Loading…
Cancel
Save