Files
Archimedes/modules/WindowModule/WindowModule.h
2026-02-10 13:50:44 -06:00

86 lines
2.2 KiB
C++

#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<void(Archimedes::Event*)> 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<void(Archimedes::Event*)>& fn) { eventFuncs.push_back(fn); return --eventFuncs.end()++; }
void removeEventFn(std::list<std::function<void(Archimedes::Event*)>>::iterator it) { eventFuncs.erase(it); }
Archimedes::Renderer* getRenderer() { return renderer; }
private:
int windowRefs = 0;
std::list<std::function<void(Archimedes::Event*)>> eventFuncs;
Archimedes::WindowGLFW* window = nullptr;
Archimedes::RendererOpenGL* renderer = nullptr;
};
#ifdef WINDOWMODULE_DYNAMIC
typedef WindowModule mtype;
#include "endModule.h"
#endif
#endif