88 lines
2.3 KiB
C++
88 lines
2.3 KiB
C++
#ifndef WINDOWMODULE_H
|
|
#define WINDOWMODULE_H
|
|
|
|
#include "Archimedes.h"
|
|
|
|
#include "utils/Renderer/Renderer.h"
|
|
#include "utils/Window/Window.h"
|
|
|
|
static_assert(!(WINDOW == 1 && RENDERER == 2), "Window and Renderer are incompatible!\n");
|
|
|
|
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::Window([this](Archimedes::Event* e) {
|
|
for(std::function<void(Archimedes::Event*)> f : eventFuncs)
|
|
f(e);
|
|
app->emitEvent(e);
|
|
});
|
|
|
|
window->setRenderer(renderer);
|
|
|
|
|
|
if(!renderer->init(window->getWindowImpl().getWindow())) {
|
|
std::cout << "Renderer init failed!\n";
|
|
std::abort();
|
|
}
|
|
}
|
|
|
|
windowRefs++;
|
|
#if RENDERER == 1
|
|
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::Window* window = nullptr;
|
|
Archimedes::Renderer* renderer = nullptr;
|
|
|
|
};
|
|
|
|
|
|
#ifdef WINDOWMODULE_DYNAMIC
|
|
typedef WindowModule mtype;
|
|
#include "endModule.h"
|
|
#endif
|
|
|
|
#endif
|