#ifndef WINDOWMODULE_H #define WINDOWMODULE_H #include "Archimedes.h" #include "utils/Renderer/RendererImpl/RendererOpenGL/RendererOpenGL.h" #include "utils/Window/WindowImpl/WindowGLFW/WindowGLFW.h" class WindowModule : public Archimedes::Module { public: WindowModule(Archimedes::App* a, void* h) : Archimedes::Module(a, h) { name = "WindowModule"; } WindowModule() { name = "WindowModule"; } ~WindowModule() override; void run() override; void onLoad() override; bool onEvent(const Archimedes::Event& e) override; //interface for other modules Archimedes::Window* aquireWindow() { if(!window) { window = new Archimedes::WindowGLFW([this](Archimedes::Event* e) { for(std::function f : eventFuncs) f(e); app->emitEvent(e); }); window->setRenderer(renderer); if(!renderer->init()) { std::cout << "Renderer init failed!\n"; std::abort(); } } windowRefs++; #ifdef RENDERER_OPENGL window->getWindowImpl()->restoreContext(); #endif return window; } void releaseWindow(Archimedes::Window* w) { if(w == window && window != nullptr) { if(--windowRefs == 0) { delete window; window = nullptr; } } } auto addEventFn(const std::function& fn) { eventFuncs.push_back(fn); return --eventFuncs.end()++; } void removeEventFn(std::list>::iterator it) { eventFuncs.erase(it); } Archimedes::Renderer* getRenderer() { return renderer; } private: int windowRefs = 0; std::list> eventFuncs; Archimedes::WindowGLFW* window = nullptr; Archimedes::RendererOpenGL* renderer = nullptr; }; #ifdef WINDOWMODULE_DYNAMIC typedef WindowModule mtype; #include "endModule.h" #endif #endif