aquire and release

This commit is contained in:
2025-04-20 14:58:39 -05:00
parent c6fa731df0
commit d253ebb197
7 changed files with 78 additions and 45 deletions

View File

@@ -18,10 +18,9 @@ WindowModule::~WindowModule() {
renderer->getCmdList().clear();
delete renderer;
}
for(auto* w : windows) {
if(w)
delete w;
}
if(window)
delete window;
}
}
@@ -39,37 +38,13 @@ void WindowModule::onLoad() {
app->registerEvent(Archimedes::WindowFocusLostEvent());
app->registerEvent(Archimedes::WindowMovedEvent());
windows.push_back(new Archimedes::Window([this](Archimedes::Event* e){
app->emitEvent(e);
}));
renderer = new Archimedes::Renderer();
for(auto* window : windows)
window->setRenderer(renderer);
if(!renderer->init()) {
std::cout << "Renderer init failed!\n";
std::abort();
}
}
void WindowModule::run() {
for(auto* window : windows) {
if(window->shouldClose()) {
app->end();
}
for(auto e : window->getWindowImpl().data.eventList) {
app->emitEvent(e);
}
window->getWindowImpl().data.eventList.clear();
if(window)
window->doFrame();
}
}
bool WindowModule::onEvent(const Archimedes::Event& e) {
@@ -77,10 +52,10 @@ bool WindowModule::onEvent(const Archimedes::Event& e) {
unsigned int type = app->getEventType(e);
if(type == app->getEventType(Archimedes::WindowResizeEvent())) {
window->getSize(renderer->w, renderer->h);
return true;
} else if(type == app->getEventType(Archimedes::WindowCloseEvent())) {
app->stopModule(name);
return true;
} else if(type == app->getEventType(Archimedes::WindowKeyPressedEvent())) {

View File

@@ -25,12 +25,42 @@ class WindowModule : public Archimedes::Module {
//interface for other modules
std::vector<Archimedes::Window*>& getWindow() { return windows; }
Archimedes::Window* aquireWindow() {
if(!window) {
window = new Archimedes::Window([this](Archimedes::Event* e){
app->emitEvent(e);
});
window->setRenderer(renderer);
if(!renderer->init()) {
std::cout << "Renderer init failed!\n";
std::abort();
}
}
windowRefs++;
return window;
}
void releaseWindow(Archimedes::Window* w) {
if(w == window && window != nullptr) {
if(--windowRefs == 0) {
delete window;
window = nullptr;
}
}
}
Archimedes::Renderer* getRenderer() { return renderer; }
private:
std::vector<Archimedes::Window*> windows;
int windowRefs = 0;
Archimedes::Window* window;
Archimedes::Renderer* renderer;
};