#pragma once #ifndef _NB_WINDOW #define _NB_WINDOW #include "GLLoad.hpp" #include #include #include #include #include #include namespace nb { class GLError : public std::runtime_error { public: GLError(const std::string&); }; class OpenGLError : public Error { using Base = Error; public: using Base::Base; enum Codes : unsigned int { UNDEFINED, INIT_FAILED, GLFW_INTIALIZED, GLAD_FAILED }; static const std::string type; static const ErrorCodeMap ErrorMessages; }; class WindowError : public Error { using Base = Error; public: using Base::Base; enum Codes : unsigned int { UNDEFINED, INITIALIZED_WINDOW, NO_GLFW, INIT_FAILED }; static const std::string type; static const ErrorCodeMap ErrorMessages; }; class Window { public: static bool StrictInitialization; static int getGLFWHint(int); static int setGLFWHint(int, int); static Window* getCurrent(); Window(const std::array, const char*, GLFWmonitor* initMonitor=NULL, GLFWwindow* initWindow=NULL); Window(const uint16_t, const uint16_t, const char*, GLFWmonitor* initMonitor=NULL, GLFWwindow* initWindow=NULL); ~Window(); int getWindowHint(int) const; GLFWwindow* getWindow() const; std::array getSize() const; float getAspectRatio() const; std::string getName() const; int init(); int setWindowHint(int, int); void setCurrent(); void resize(const std::array); void resize(const uint16_t x, const uint16_t y); protected: static std::map WindowContexts; static std::map GLFWHints; static Window* _current; static bool _glfw_init; static bool checkKillGLFW(); std::map windowHints; std::array windowSize; float _aspect_ratio; std::string windowName; GLFWwindow* window; GLFWmonitor* monitor; GLFWwindow* shareWindow; bool _init = false; int gladResponse = -1; }; }; #endif