diff --git a/OpenGL/playground/.gitignore b/OpenGL/playground/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/OpenGL/playground/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/OpenGL/playground/CMakeLists.txt b/OpenGL/playground/CMakeLists.txt index 6ce2dd7..d880678 100644 --- a/OpenGL/playground/CMakeLists.txt +++ b/OpenGL/playground/CMakeLists.txt @@ -24,7 +24,7 @@ if (WIN32) include_directories(${executable} "C:/dev/glm" "C:/dev/SDL2/include/" - "C:/dev/SDL2_image/include/" + #"C:/dev/SDL2_image/include/" ) endif (WIN32) diff --git a/OpenGL/playground/CMakeSettings.json b/OpenGL/playground/CMakeSettings.json new file mode 100644 index 0000000..665d94b --- /dev/null +++ b/OpenGL/playground/CMakeSettings.json @@ -0,0 +1,25 @@ +{ + "environments": [ + { + "DevDir": "E:\\Languages\\Examples\\OpenGL\\playground\\build", + "BuildDir": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}" + } + ], + "configurations": [ + { + "name": "x64-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ + "msvc_x64_x64" + ], + "buildRoot": "E:\\Languages\\Examples\\OpenGL\\playground\\build", + // "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}", + "installRoot": "E:\\Languages\\Examples\\OpenGL\\playground\\build", + // "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "" + } + ] +} \ No newline at end of file diff --git a/OpenGL/playground/include/logger.h b/OpenGL/playground/include/logger.h new file mode 100644 index 0000000..0143d13 --- /dev/null +++ b/OpenGL/playground/include/logger.h @@ -0,0 +1,162 @@ +#ifndef INCLUDE_LOGGER_H_ +#define INCLUDE_LOGGER_H_ + +#include +#include +#include +#include + +#ifdef _WIN32 +#include +typedef enum { + CONSOLE_COLOUR_FG_BLACK = 0, + CONSOLE_COLOUR_FG_BLUE = FOREGROUND_BLUE, + CONSOLE_COLOUR_FG_GREEN = FOREGROUND_GREEN, + CONSOLE_COLOUR_FG_CYAN = FOREGROUND_GREEN | FOREGROUND_BLUE, + CONSOLE_COLOUR_FG_RED = FOREGROUND_RED, + CONSOLE_COLOUR_FG_MAGENTA = FOREGROUND_RED | FOREGROUND_BLUE, + CONSOLE_COLOUR_FG_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN, + CONSOLE_COLOUR_FG_GRAY = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, + CONSOLE_COLOUR_FG_LIGHT_GRAY = FOREGROUND_INTENSITY, + CONSOLE_COLOUR_FG_LIGHT_BLUE = FOREGROUND_INTENSITY | FOREGROUND_BLUE, + CONSOLE_COLOUR_FG_LIGHT_GREEN = FOREGROUND_INTENSITY | FOREGROUND_GREEN, + CONSOLE_COLOUR_FG_LIGHT_CYAN = FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE, + CONSOLE_COLOUR_FG_LIGHT_RED = FOREGROUND_INTENSITY | FOREGROUND_RED, + CONSOLE_COLOUR_FG_LIGHT_MAGENTA = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE, + CONSOLE_COLOUR_FG_LIGHT_YELLOW = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN, + CONSOLE_COLOUR_FG_WHITE = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, + CONSOLE_COLOUR_FG_DEFAULT = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, + CONSOLE_COLOUR_BG_DEFAULT = 0 +} ConsoleColour; + +#ifdef _WIN32 + HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); + WORD wOldColorAttrs; + CONSOLE_SCREEN_BUFFER_INFO csbiInfo; +#endif + +#else +typedef enum { + CONSOLE_COLOUR_FG_DEFAULT = 39, + CONSOLE_COLOUR_FG_BLACK = 30, + CONSOLE_COLOUR_FG_RED = 31, + CONSOLE_COLOUR_FG_GREEN = 32, + CONSOLE_COLOUR_FG_YELLOW = 33, + CONSOLE_COLOUR_FG_BLUE = 34, + CONSOLE_COLOUR_FG_MAGENTA = 35, + CONSOLE_COLOUR_FG_CYAN = 36, + CONSOLE_COLOUR_FG_LIGHT_GRAY = 37, + CONSOLE_COLOUR_FG_DARK_GRAY = 90, + CONSOLE_COLOUR_FG_LIGHT_RED = 91, + CONSOLE_COLOUR_FG_LIGHT_GREEN = 92, + CONSOLE_COLOUR_FG_LIGHT_YELLOW = 93, + CONSOLE_COLOUR_FG_LIGHT_BLUE = 94, + CONSOLE_COLOUR_FG_LIGHT_MAGENTA = 95, + CONSOLE_COLOUR_FG_LIGHT_CYAN = 96, + CONSOLE_COLOUR_FG_WHITE = 97, + CONSOLE_COLOUR_BG_RED = 41, + CONSOLE_COLOUR_BG_GREEN = 42, + CONSOLE_COLOUR_BG_BLUE = 44, + CONSOLE_COLOUR_BG_DEFAULT = 49 +} ConsoleColour; +#endif + + +class Colour { +public: + //template + //static std::string getColouredText(T colour, D text) { + // std::stringstream output; + +//#ifdef _WIN32 + // SetConsoleTextAttribute(h, T); +//#else + // output << "\033[" << colour << "m" << text; + // output << "\033[" << CONSOLE_COLOUR_BG_DEFAULT << "m"; + // output << "\033[" << CONSOLE_COLOUR_FG_DEFAULT << "m"; +//#endif + + // return output.str(); + //} + + static void resetColour() { +#ifdef _WIN32 + SetConsoleTextAttribute(h, CONSOLE_COLOUR_BG_DEFAULT); + SetConsoleTextAttribute(h, CONSOLE_COLOUR_FG_DEFAULT); +#else + std::cout + << "\033[" << CONSOLE_COLOUR_BG_DEFAULT << "m" + << "\033[" << CONSOLE_COLOUR_FG_DEFAULT << "m"; +#endif + } + + template + static void consoleColour(T colour) { +#ifdef _WIN32 + SetConsoleTextAttribute(h, colour); +#else + std::cout << "\033[" << colour << "m"; +#endif + } +}; + +typedef enum { + LOGGER_INFO = CONSOLE_COLOUR_FG_GREEN, + LOGGER_WARN = CONSOLE_COLOUR_FG_YELLOW, + LOGGER_ERROR = CONSOLE_COLOUR_FG_RED, + LOGGER_PANIC = CONSOLE_COLOUR_FG_RED, + LOGGER_DEBUG = CONSOLE_COLOUR_FG_BLUE +} LogType; + +typedef enum { + LOGGER_EXIT, + LOGGER_ENDL +} LogAction; + +class Logger { +public: + + std::stringstream outStream; + std::map lookupTable; + Logger() { + +#ifdef _WIN32 + GetConsoleScreenBufferInfo(h, &csbiInfo); + wOldColorAttrs = csbiInfo.wAttributes; +#endif + + lookupTable[LOGGER_INFO] = "INFO"; + lookupTable[LOGGER_WARN] = "WARN"; + lookupTable[LOGGER_ERROR] = "ERROR"; + lookupTable[LOGGER_PANIC] = "PANIC"; + lookupTable[LOGGER_DEBUG] = "DEBUG"; + } + + Logger& operator<< (const LogType type) { + std::cout << "["; + Colour::consoleColour(type); + std::cout << lookupTable[type]; + Colour::consoleColour(CONSOLE_COLOUR_FG_DEFAULT); + std::cout << "] "; + return *this; + } + + Logger& operator<< (const LogAction action) { + if (action == LOGGER_ENDL) { + std::cout << outStream.str() << std::endl; + outStream.str(std::string());; + outStream.flush(); + } + if (action == LOGGER_EXIT) + exit(0); + return *this; + } + + template + Logger& operator<< (const T& data) { + outStream << data; + return *this; + } +}; + +#endif diff --git a/OpenGL/playground/src/main.cpp b/OpenGL/playground/src/main.cpp index 9ca8c01..1b12762 100644 --- a/OpenGL/playground/src/main.cpp +++ b/OpenGL/playground/src/main.cpp @@ -1,5 +1,7 @@ -#include +// General includes +#include +// GL includes #include // SDL includes different on windows @@ -15,15 +17,27 @@ #include #include +// Custom includes +#include + int main(int argc, char** argv) { std::cout << "----- OpenGL Playground -----" << std::endl; std::cout << "-------- Version 1.0 --------" << std::endl; - std::cout << "----- ©Benjamin Kyd 2019 ----" << std::endl; + std::cout << "----- ©Benjamin Kyd 2019 ----" << std::endl << std::endl; + // Get global variables ready + Logger logger; SDL_Window* window = nullptr; SDL_GLContext glContext; bool isWindowClosed = true; + logger << LOGGER_DEBUG << "debug" << LOGGER_ENDL; + logger << LOGGER_INFO << "info" << LOGGER_ENDL; + logger << LOGGER_WARN << "warn" << LOGGER_ENDL; + logger << LOGGER_ERROR << "error" << LOGGER_ENDL; + logger << LOGGER_PANIC << "panic" << LOGGER_ENDL << LOGGER_ENDL; + + // Initialize SDL and OpenGL SDL_Init(SDL_INIT_EVERYTHING); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); @@ -36,14 +50,51 @@ int main(int argc, char** argv) { SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); - window = SDL_CreateWindow("GL CUBE", + window = SDL_CreateWindow("OpenGL Playground V1.0", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - 500, 500, + 1000, 1000, SDL_WINDOW_OPENGL); glContext = SDL_GL_CreateContext(window); SDL_GL_SetSwapInterval(0); gladLoadGLLoader(SDL_GL_GetProcAddress); + isWindowClosed = false; + logger << LOGGER_INFO << "OpenGL and SDL initialized" << LOGGER_ENDL; + + + + // Various timers needed for FPS counting + std::chrono::high_resolution_clock timer; + auto FPSCalculateLast = timer.now(); + auto FPSClock = SDL_GetTicks(); + + auto UpdateClock = SDL_GetTicks(); + + SDL_Event event; + while (!isWindowClosed) { + // Calculate and display framerate + if (SDL_GetTicks() - FPSClock >= 1000) { + auto deltaTime = std::chrono::duration_cast(timer.now() - FPSCalculateLast).count(); + logger << LOGGER_INFO << "FPS: " << (int)(1 / ((float)deltaTime * 1e-9)) << LOGGER_ENDL; + FPSClock = SDL_GetTicks(); + } + FPSCalculateLast = timer.now(); + + // Update tick + if (SDL_GetTicks() - UpdateClock >= 10) { + + } + + // Handle events + while (SDL_PollEvent(&event) != 0) + if (event.type == SDL_QUIT) + isWindowClosed = true; + + // Swap GL frame buffers + SDL_GL_SwapWindow(window); + } + + return 0; }