diff --git a/include/utils/App/App.h b/include/utils/App/App.h index 28b8be8..f31661f 100644 --- a/include/utils/App/App.h +++ b/include/utils/App/App.h @@ -107,7 +107,36 @@ namespace Archimedes { virtual void startModule(std::variant m) { toOpen.push_back(m); } - virtual bool onEvent(const Event&) = 0; + virtual bool onEvent(const Event& event) { + + unsigned int type = getEventType(event); + + if(type == getEventType(Archimedes::DoLoadModuleEvent())) { + + Archimedes::DoLoadModuleEvent& e = (Archimedes::DoLoadModuleEvent&) event; + + startModule(e.module); + + return true; + + } else if(type == getEventType(Archimedes::DoUnloadModuleEvent())) { + + Archimedes::DoUnloadModuleEvent& e = (Archimedes::DoUnloadModuleEvent&) event; + + stopModule(e.module); + + return true; + + } else if(type == getEventType(Archimedes::LoadModuleEvent())) { + + return true; + } else if(type == getEventType(Archimedes::UnloadModuleEvent())) { + + return true; + } + + return false; + } void handleEvents() { static bool handled; @@ -129,6 +158,7 @@ namespace Archimedes { } if(!handled) { + std::cout << "here?\n"; if(this->onEvent(*events.front())) { Event* e = events.front(); events.pop_front(); @@ -173,7 +203,8 @@ namespace Archimedes { virtual Module* load(std::string moduleNameOrPath) { Module* m = dynamicLoad(moduleNameOrPath); - return m != nullptr ? load(m) : reload(moduleNameOrPath); + //return m != nullptr ? load(m) : reload(moduleNameOrPath); + return load(m); } virtual Module* load(Module* m) { @@ -182,6 +213,8 @@ namespace Archimedes { return nullptr; } + std::cout << "Load: " << (std::string) *m << "1\n"; + void* h = m->getHandle(); for(auto it = runOrder.begin(); it != runOrder.end(); it++) { if(*it == static_cast(*m)) { @@ -193,10 +226,14 @@ namespace Archimedes { return modules[*it]; } } + + std::cout << "Load: " << (std::string) *m << "2\n"; if(modules.find(*m) == modules.end()) modules[*m] = m; + std::cout << "Load: " << (std::string) *m << "3\n"; + for(auto it = runOrder.begin(); it != runOrder.end(); it++) { if(m->deps.find(*it) != m->deps.end()) { @@ -208,6 +245,8 @@ namespace Archimedes { } } + std::cout << "Load: " << (std::string) *m << "4\n"; + //insert temporarily to avoid circular dependencies runOrder.insert(roInsert, *m); @@ -229,12 +268,21 @@ namespace Archimedes { m->moduleInstances[it.first] = load(std::get(it.second)); } + std::cout << "Load: " << (std::string) *m << "5\n"; + //reinsert once final order has been reached runOrder.remove(*m); + std::cout << "Load: " << (std::string) *m << "6\n"; + runOrder.insert(roInsert, *m); + std::cout << "Load: " << (std::string) *m << "7\n"; + emitEvent(new LoadModuleEvent(*m)); + + std::cout << "Load: " << (std::string) *m << "8\n"; + return m; } diff --git a/modules/ImguiModule/src/ImguiModule.cpp b/modules/ImguiModule/src/ImguiModule.cpp index 53d918c..acdb95a 100644 --- a/modules/ImguiModule/src/ImguiModule.cpp +++ b/modules/ImguiModule/src/ImguiModule.cpp @@ -39,7 +39,11 @@ void ImguiModule::onLoad() { std::abort(); } + std::cout << "onLoad: " << name << "1\n"; + window = wm->aquireWindow(); + + std::cout << "onLoad: " << name << "2\n"; IMGUI_CHECKVERSION(); context = ImGui::CreateContext(); @@ -57,13 +61,19 @@ void ImguiModule::onLoad() { ImGui::StyleColorsDark(); //ImGui::StyleColorsLight(); + std::cout << "onLoad: " << name << "3\n"; + // Setup Platform/Renderer backends if(!ImGui_ImplGlfw_InitForOpenGL(window->getWindowImpl().getWindow(), true)) std::cout << "GLFWImpl failed\n"; + + std::cout << "onLoad: " << name << "3.5\n"; + if(!ImGui_ImplOpenGL3_Init("#version 330")) { std::cout << "ImGui_ImplOpenGL3_Init failed!\n" << std::endl; } + std::cout << "onLoad: " << name << "4\n"; wm->getRenderer()->getCmdList().push_back([](){ ImGui::Render(); @@ -75,12 +85,16 @@ void ImguiModule::onLoad() { ImGui::NewFrame(); }); + std::cout << "onLoad: " << name << "5\n"; rcmd_it = --wm->getRenderer()->getCmdList().end()++; + std::cout << "onLoad: " << name << "6\n"; //Compute first frame ahead of first WindowModule->run() ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); + + std::cout << "ImguiModule loaded\n"; } bool ImguiModule::onEvent(const Archimedes::Event &event) { diff --git a/modules/WindowModule/src/WindowModule.cpp b/modules/WindowModule/src/WindowModule.cpp index 0ef658d..23b9b89 100644 --- a/modules/WindowModule/src/WindowModule.cpp +++ b/modules/WindowModule/src/WindowModule.cpp @@ -20,7 +20,7 @@ WindowModule::~WindowModule() { } if(window) - delete window; + releaseWindow(window); } } diff --git a/modules/examples/ChatClient/src/ChatClient.cpp b/modules/examples/ChatClient/src/ChatClient.cpp index 4738c6a..8d9b2b0 100644 --- a/modules/examples/ChatClient/src/ChatClient.cpp +++ b/modules/examples/ChatClient/src/ChatClient.cpp @@ -1,3 +1,8 @@ + +#include "modules/ImguiModule/src/ImguiModule.h" + +#include "modules/ClientModule/src/ClientModule.h" + #include "ChatClient.h" @@ -5,6 +10,8 @@ ChatClient::ChatClient(Archimedes::App* a, void* h) : Module(a, h) { name = "ChatClient"; + std::cout << name; + ClientModule* cm = new ClientModule(a, h); deps[*cm] = cm; cm->shouldHandleEvents(ClientModule::CMEventEnum::ConnectionStatusChanged | ClientModule::CMEventEnum::DataSent); @@ -12,6 +19,8 @@ ChatClient::ChatClient(Archimedes::App* a, void* h) : Module(a, h) { ImguiModule* im = new ImguiModule(a, h); deps[*im] = im; + + std::cout << " created!\n"; } ChatClient::~ChatClient() { @@ -30,12 +39,18 @@ void ChatClient::onLoad() { ImguiModule* im; { im = (ImguiModule*) moduleInstances[ImguiModule()]; } if(!im) { - std::cout << "No ClientModule for ChatClient!\n"; + std::cout << "No ImguiModule for ChatClient!\n"; std::abort(); } ImGui::SetCurrentContext(im->aquireContext()); + ClientModule* cm; { cm = (ClientModule*) moduleInstances[ClientModule()]; } + + if(!cm) { + std::cout << "No ClientModule for ChatClient!\n"; + std::abort(); + } } void ChatClient::run() { diff --git a/modules/examples/ChatClient/src/ChatClient.h b/modules/examples/ChatClient/src/ChatClient.h index d15c6ef..c772e88 100644 --- a/modules/examples/ChatClient/src/ChatClient.h +++ b/modules/examples/ChatClient/src/ChatClient.h @@ -1,8 +1,5 @@ #include "Archimedes.h" -#include "modules/ClientModule/src/ClientModule.h" - -#include "modules/ImguiModule/src/ImguiModule.h" class ChatClient : public Archimedes::Module { @@ -14,11 +11,11 @@ class ChatClient : public Archimedes::Module { ~ChatClient(); - void onLoad(); + void onLoad() override; - void run(); + void run() override; - bool onEvent(const Archimedes::Event&); + bool onEvent(const Archimedes::Event&) override; private: std::string messages = ""; diff --git a/src/example_apps/MinimalApp/MinimalApp.cpp b/src/example_apps/MinimalApp/MinimalApp.cpp index 36dde6f..0f81bc3 100644 --- a/src/example_apps/MinimalApp/MinimalApp.cpp +++ b/src/example_apps/MinimalApp/MinimalApp.cpp @@ -3,6 +3,7 @@ void MinimalApp::run() { for(std::string m : runOrder) { + std::cout << "onLoad: " << m << std::endl; modules[m]->onLoad(); }