From: outfrost Date: Sun, 27 Jan 2019 00:09:55 +0000 (+0100) Subject: Add a logger! X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=28822c9926bad090069c327914e6e1161b46fc31;p=shadowclad.git Add a logger! Variadic functions, smh --- diff --git a/Makefile b/Makefile index e2eb7c9..2a3dfc1 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,8 @@ LDLIBS ::= -L/usr/local/lib -lGL -lGLEW -lglut -lassimp $(LDLIBS) # Prefix all object file names with the compilation directory objects ::= $(addprefix out/, \ - main.o debugutil.o level.o performance.o \ - render.o tga.o ui.o) + main.o debugutil.o level.o logger.o \ + performance.o render.o tga.o ui.o) # Set executable extension for the platform ifeq ($(OS),Windows_NT) diff --git a/debugutil.c b/debugutil.c index 80f5caa..3c105db 100644 --- a/debugutil.c +++ b/debugutil.c @@ -3,7 +3,7 @@ #include #include -#include "assimp_types.h" +//#include "assimp_types.h" char* getGlInfoString() { const char* glVersion = (const char*) glGetString(GL_VERSION); @@ -24,7 +24,7 @@ char* getGlInfoString() { return glInfoString; } - +/* void dumpScene(FILE* stream, const AiScene* scene) { if (scene == NULL) { fprintf(stream, "NULL"); @@ -55,3 +55,4 @@ void dumpNode(FILE* stream, const AiNode* node) { (*node).mNumMeshes, (void*) (*node).mMeshes); } +*/ diff --git a/level.c b/level.c index 1388a92..3469736 100644 --- a/level.c +++ b/level.c @@ -1,8 +1,8 @@ #include #include -#include // TODO remove #include "level.h" +#include "logger.h" const AiScene* levelScene = NULL; @@ -25,7 +25,7 @@ void setImage(TgaImage* image) { const AiScene* importScene(const char* path) { const AiScene* scene = aiImportFile(path, 0u); if (scene == NULL) { - fprintf(stderr, "Asset import failed at file %s\n", path); // TODO factor logging the heck outta here + logError("Asset import failed (file: %s)", path); } return scene; // TODO aiReleaseImport(scene); diff --git a/logger.c b/logger.c new file mode 100644 index 0000000..23b0dd8 --- /dev/null +++ b/logger.c @@ -0,0 +1,40 @@ +#include +#include + +#include "logger.h" + +LogLevel logLevel = LOGLEVEL_DEBUG; + +void logMessage(LogLevel msgLevel, const char* file, int line, const char* message, ...) { + if (msgLevel > logLevel) { + return; + } + + const char* msgLevelString; + switch (msgLevel) { + case LOGLEVEL_ERROR: + msgLevelString = "error: "; + break; + case LOGLEVEL_WARNING: + msgLevelString = "warning: "; + break; + case LOGLEVEL_INFO: + msgLevelString = ""; + break; + case LOGLEVEL_DEBUG: + msgLevelString = "debug: "; + break; + default: + msgLevelString = "(invalid message level!) "; + break; + } + + va_list args; + va_start(args, message); + + fprintf(stderr, "%s:%i: %s", file, line, msgLevelString); + vfprintf(stderr, message, args); + fputc('\n', stderr); + + va_end(args); +} diff --git a/logger.h b/logger.h new file mode 100644 index 0000000..36aa647 --- /dev/null +++ b/logger.h @@ -0,0 +1,20 @@ +#ifndef LOGGER_H_ +#define LOGGER_H_ + +typedef enum { + LOGLEVEL_ERROR, + LOGLEVEL_WARNING, + LOGLEVEL_INFO, + LOGLEVEL_DEBUG +} LogLevel; + +LogLevel logLevel; + +#define logError(...) logMessage(LOGLEVEL_ERROR, __FILE__, __LINE__, __VA_ARGS__) +#define logWarning(...) logMessage(LOGLEVEL_WARNING, __FILE__, __LINE__, __VA_ARGS__) +#define logInfo(...) logMessage(LOGLEVEL_INFO, __FILE__, __LINE__, __VA_ARGS__) +#define log(...) logMessage(LOGLEVEL_DEBUG, __FILE__, __LINE__, __VA_ARGS__) + +void logMessage(LogLevel msgLevel, const char* file, int line, const char* message, ...); + +#endif diff --git a/main.c b/main.c index cf8dcdf..9cd2a99 100644 --- a/main.c +++ b/main.c @@ -1,9 +1,9 @@ #include #include -#include #include "debugutil.h" #include "level.h" +#include "logger.h" #include "performance.h" #include "render.h" #include "ui.h" @@ -17,14 +17,19 @@ int main(int argc, char** argv) { glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutCreateWindow(NULL); - glutSetWindowTitle(getGlInfoString()); + // glutSetWindowTitle(getGlInfoString()); + glutSetWindowTitle("shadowclad"); + + logInfo("OpenGL %s", (const char*) glGetString(GL_VERSION)); + logInfo("GLSL %s", (const char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); + logInfo("%s", (const char*) glGetString(GL_RENDERER)); GLenum glewInitStatus = glewInit(); if (glewInitStatus != GLEW_OK) { - fprintf(stderr, "GLEW init failed: %s\n", glewGetErrorString(glewInitStatus)); + logError("GLEW init failed: %s", (const char*) glewGetErrorString(glewInitStatus)); return 1; } - printf("GLEW %s\n", glewGetString(GLEW_VERSION)); + logInfo("GLEW %s", (const char*) glewGetString(GLEW_VERSION)); if (GLXEW_EXT_swap_control) { Display* display = glXGetCurrentDisplay(); @@ -33,15 +38,16 @@ int main(int argc, char** argv) { glXSwapIntervalEXT(display, drawable, 1); } else { - fprintf(stderr, "Drawable is not here\n"); + logWarning("Drawable is not here ¯\\_(ツ)_/¯"); + logWarning("Could not enable vsync (GLX_EXT_swap_control)"); } } else if (GLXEW_MESA_swap_control) { glXSwapIntervalMESA(1); - printf("Swap interval %d\n", glXGetSwapIntervalMESA()); + log("Vsync enabled with GLX_MESA_swap_control, swap interval %d", glXGetSwapIntervalMESA()); } else { - fprintf(stderr, "Could not enable vsync\n"); + logWarning("Could not enable vsync (extensions not supported)"); } glutDisplayFunc(renderScene); @@ -54,13 +60,6 @@ int main(int argc, char** argv) { initPerformanceMetering(); initLevel(); - /* - fprintf(stderr, "*model = "); - print_struct_aiScene(stderr, model); - fprintf(stderr, "\n*(*model).mRootNode = "); - print_struct_aiNode(stderr, (*model).mRootNode); - fprintf(stderr, "\n"); - */ glutMainLoop(); return 0; } diff --git a/performance.c b/performance.c index 2a1d13a..267cf36 100644 --- a/performance.c +++ b/performance.c @@ -2,6 +2,8 @@ #include // TODO remove #include +#include "logger.h" + typedef struct timespec Timepoint; static Timepoint lastDisplayTime; @@ -10,7 +12,7 @@ static bool meteringEnabled = false; void initPerformanceMetering() { if (clock_gettime(CLOCK_MONOTONIC, &lastDisplayTime) != 0) { - fprintf(stderr, "Clock read failed, performance metering unavailable\n"); + logWarning("Clock read failed, performance metering unavailable"); } else { meteringEnabled = true; @@ -23,7 +25,7 @@ void frameRendered() { Timepoint now; if (clock_gettime(CLOCK_MONOTONIC, &now) != 0) { - fprintf(stderr, "Clock read failed, stopping performance metering\n"); + logWarning("Clock read failed, stopping performance metering"); meteringEnabled = false; return; } @@ -34,6 +36,7 @@ void frameRendered() { if (fullSeconds > 0) { float seconds = (now.tv_nsec - lastDisplayTime.tv_nsec) / 1000000000.0f; seconds += (float) (now.tv_sec - lastDisplayTime.tv_sec); + // This goes to STDOUT because it's, uh, temporary printf("frametime avg %.1f ms; fps avg %.f\n", (seconds / frames) * 1000.0f, (frames / seconds)); lastDisplayTime = now; frames = 0;