Events
This commit is contained in:
@@ -95,15 +95,22 @@ namespace Archimedes {
|
|||||||
std::list<std::variant<std::string, Module*>> toOpen;
|
std::list<std::variant<std::string, Module*>> toOpen;
|
||||||
|
|
||||||
void handleEvents() {
|
void handleEvents() {
|
||||||
|
bool handled = false;
|
||||||
while(!events.empty()) {
|
while(!events.empty()) {
|
||||||
for(auto it = runOrder.rbegin(); it != runOrder.rend(); it++) {
|
for(auto it = runOrder.rbegin(); it != runOrder.rend(); it++) {
|
||||||
if(modules[*it]->onEvent(*events.front())) {
|
if(modules[*it]->onEvent(*events.front())) {
|
||||||
Event* e = events.front();
|
Event* e = events.front();
|
||||||
events.pop_front();
|
events.pop_front();
|
||||||
delete e;
|
delete e;
|
||||||
|
handled = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(handled) {
|
||||||
|
std::cout << "Error: Unhandled Event: " << (std::string) *events.front() << std::endl;
|
||||||
|
}
|
||||||
|
handled = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual ~Event() {
|
virtual ~Event() {}
|
||||||
std::cout << (std::string)*this;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual operator std::string() const = 0;
|
virtual operator std::string() const = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
void doFrame() {
|
void doFrame() {
|
||||||
|
|
||||||
//window.pollEvents();
|
window.pollEvents();
|
||||||
|
|
||||||
window.getSize(renderer->w, renderer->h);
|
window.getSize(renderer->w, renderer->h);
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "Archimedes::WindowResizeEvent"; }
|
operator std::string() const override { return "Archimedes::WindowResizeEvent"; }
|
||||||
|
|
||||||
int width, height;
|
int width, height;
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "Archimedes::WindowCloseEvent"; }
|
operator std::string() const override { return "Archimedes::WindowCloseEvent"; }
|
||||||
|
|
||||||
const Window* window;
|
const Window* window;
|
||||||
};
|
};
|
||||||
@@ -62,7 +62,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "Archimedes::WindowKeyPressedEvent"; }
|
operator std::string() const override { return "Archimedes::WindowKeyPressedEvent"; }
|
||||||
|
|
||||||
unsigned int key;
|
unsigned int key;
|
||||||
unsigned int repeat;
|
unsigned int repeat;
|
||||||
@@ -80,7 +80,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "Archimedes::WindowKeyReleasedEvent"; }
|
operator std::string() const override { return "Archimedes::WindowKeyReleasedEvent"; }
|
||||||
|
|
||||||
unsigned int key;
|
unsigned int key;
|
||||||
};
|
};
|
||||||
@@ -97,7 +97,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "Archimedes::WindowMouseButtonPressedEvent"; }
|
operator std::string() const override { return "Archimedes::WindowMouseButtonPressedEvent"; }
|
||||||
|
|
||||||
unsigned int button;
|
unsigned int button;
|
||||||
};
|
};
|
||||||
@@ -114,7 +114,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "Archimedes::WindowMouseButtonReleasedEvent"; }
|
operator std::string() const override { return "Archimedes::WindowMouseButtonReleasedEvent"; }
|
||||||
|
|
||||||
unsigned int button;
|
unsigned int button;
|
||||||
};
|
};
|
||||||
@@ -131,7 +131,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "Archimedes::WindowScrollEvent"; }
|
operator std::string() const override { return "Archimedes::WindowScrollEvent"; }
|
||||||
|
|
||||||
double dx, dy;
|
double dx, dy;
|
||||||
};
|
};
|
||||||
@@ -142,15 +142,15 @@ namespace Archimedes {
|
|||||||
|
|
||||||
WindowMouseMovedEvent() : x(0), y(0) {}
|
WindowMouseMovedEvent() : x(0), y(0) {}
|
||||||
|
|
||||||
WindowMouseMovedEvent(int x, int y) : x(x), y(y) {}
|
WindowMouseMovedEvent(double x, double y) : x(x), y(y) {}
|
||||||
|
|
||||||
~WindowMouseMovedEvent() {
|
~WindowMouseMovedEvent() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "Archimedes::WindowMouseMovedEvent"; }
|
operator std::string() const override { return "Archimedes::WindowMouseMovedEvent"; }
|
||||||
|
|
||||||
int x, y;
|
double x, y;
|
||||||
};
|
};
|
||||||
|
|
||||||
class WindowFocusedEvent : public Event {
|
class WindowFocusedEvent : public Event {
|
||||||
@@ -165,7 +165,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "Archimedes::WindowFocusedEvent"; }
|
operator std::string() const override { return "Archimedes::WindowFocusedEvent"; }
|
||||||
|
|
||||||
const Window* window;
|
const Window* window;
|
||||||
};
|
};
|
||||||
@@ -182,7 +182,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "Archimedes::WindowFocusLostEvent"; }
|
operator std::string() const override { return "Archimedes::WindowFocusLostEvent"; }
|
||||||
|
|
||||||
const Window* window;
|
const Window* window;
|
||||||
};
|
};
|
||||||
@@ -199,7 +199,7 @@ namespace Archimedes {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "Archimedes::WindowMovedEvent"; }
|
operator std::string() const override { return "Archimedes::WindowMovedEvent"; }
|
||||||
|
|
||||||
int x, y;
|
int x, y;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace CMEvent {
|
|||||||
msg->Release();
|
msg->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
operator std::string() const { return "CMEvent::DataRecievedEvent"; }
|
operator std::string() const override { return "CMEvent::DataRecievedEvent"; }
|
||||||
|
|
||||||
ISteamNetworkingMessage* msg;
|
ISteamNetworkingMessage* msg;
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ namespace CMEvent {
|
|||||||
|
|
||||||
DataSentEvent(ISteamNetworkingMessage* m) : msg(m) {}
|
DataSentEvent(ISteamNetworkingMessage* m) : msg(m) {}
|
||||||
|
|
||||||
operator std::string() const { return "CMEvent::DataSentEvent"; }
|
operator std::string() const override { return "CMEvent::DataSentEvent"; }
|
||||||
|
|
||||||
ISteamNetworkingMessage* msg;
|
ISteamNetworkingMessage* msg;
|
||||||
};
|
};
|
||||||
@@ -46,7 +46,7 @@ namespace CMEvent {
|
|||||||
|
|
||||||
ConnectionStatusChangedEvent(SteamNetConnectionStatusChangedCallback_t* i) : info(i) {}
|
ConnectionStatusChangedEvent(SteamNetConnectionStatusChangedCallback_t* i) : info(i) {}
|
||||||
|
|
||||||
operator std::string() const { return "CMEvent::ConnectionStatusChangedEvent"; }
|
operator std::string() const override { return "CMEvent::ConnectionStatusChangedEvent"; }
|
||||||
|
|
||||||
SteamNetConnectionStatusChangedCallback_t* info;
|
SteamNetConnectionStatusChangedCallback_t* info;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -80,3 +80,64 @@ void ImguiModule::onLoad() {
|
|||||||
ImGui_ImplGlfw_NewFrame();
|
ImGui_ImplGlfw_NewFrame();
|
||||||
ImGui::NewFrame();
|
ImGui::NewFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ImguiModule::onEvent(const Archimedes::Event &event) {
|
||||||
|
/*
|
||||||
|
unsigned int type = app->getEventType(event);
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
|
||||||
|
if(type == app->getEventType(Archimedes::WindowResizeEvent())) {
|
||||||
|
Archimedes::WindowResizeEvent& e = (Archimedes::WindowResizeEvent&) event;
|
||||||
|
io.DisplaySize = ImVec2(e.width, e.height);
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowKeyPressedEvent())) {
|
||||||
|
if(io.WantCaptureKeyboard) {
|
||||||
|
Archimedes::WindowKeyPressedEvent& e = (Archimedes::WindowKeyPressedEvent&) event;
|
||||||
|
io.KeysData[e.key].Down = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowKeyReleasedEvent())) {
|
||||||
|
if(io.WantCaptureKeyboard) {
|
||||||
|
Archimedes::WindowKeyPressedEvent& e = (Archimedes::WindowKeyPressedEvent&) event;
|
||||||
|
io.KeysData[e.key].Down = false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowMouseButtonPressedEvent())) {
|
||||||
|
if(io.WantCaptureMouse) {
|
||||||
|
Archimedes::WindowMouseButtonPressedEvent& e = (Archimedes::WindowMouseButtonPressedEvent&) event;
|
||||||
|
io.MouseDown[e.button] = true;
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowMouseButtonReleasedEvent())) {
|
||||||
|
if(io.WantCaptureMouse) {
|
||||||
|
Archimedes::WindowMouseButtonReleasedEvent& e = (Archimedes::WindowMouseButtonReleasedEvent&) event;
|
||||||
|
io.MouseDown[e.button] = false;
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowScrollEvent())) {
|
||||||
|
if(io.WantCaptureMouse) {
|
||||||
|
Archimedes::WindowScrollEvent& e = (Archimedes::WindowScrollEvent&) event;
|
||||||
|
io.MouseWheel += e.dy;
|
||||||
|
io.MouseWheelH += e.dx;
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowMouseMovedEvent())) {
|
||||||
|
if(io.WantSetMousePos) {
|
||||||
|
Archimedes::WindowMouseMovedEvent& e = (Archimedes::WindowMouseMovedEvent&) event;
|
||||||
|
io.MousePos = ImVec2(e.x, e.y);
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ class ImguiModule : public Archimedes::Module {
|
|||||||
|
|
||||||
~ImguiModule();
|
~ImguiModule();
|
||||||
|
|
||||||
void onLoad();
|
void onLoad() override;
|
||||||
|
|
||||||
bool onEvent(const Archimedes::Event& e) { return false; }
|
bool onEvent(const Archimedes::Event&) override;
|
||||||
|
|
||||||
ImGuiContext* getContext() { return context; }
|
ImGuiContext* getContext() { return context; }
|
||||||
|
|
||||||
|
|||||||
@@ -2,28 +2,52 @@
|
|||||||
|
|
||||||
WindowModule::~WindowModule() {
|
WindowModule::~WindowModule() {
|
||||||
if(app) {
|
if(app) {
|
||||||
|
app->unregisterEvent(Archimedes::WindowResizeEvent());
|
||||||
|
app->unregisterEvent(Archimedes::WindowCloseEvent());
|
||||||
|
app->unregisterEvent(Archimedes::WindowKeyPressedEvent());
|
||||||
|
app->unregisterEvent(Archimedes::WindowKeyReleasedEvent());
|
||||||
|
app->unregisterEvent(Archimedes::WindowMouseButtonPressedEvent());
|
||||||
|
app->unregisterEvent(Archimedes::WindowMouseButtonReleasedEvent());
|
||||||
|
app->unregisterEvent(Archimedes::WindowScrollEvent());
|
||||||
|
app->unregisterEvent(Archimedes::WindowMouseMovedEvent());
|
||||||
|
app->unregisterEvent(Archimedes::WindowFocusedEvent());
|
||||||
|
app->unregisterEvent(Archimedes::WindowFocusLostEvent());
|
||||||
|
app->unregisterEvent(Archimedes::WindowMovedEvent());
|
||||||
|
|
||||||
if(renderer) {
|
if(renderer) {
|
||||||
renderer->getCmdList().clear();
|
renderer->getCmdList().clear();
|
||||||
delete renderer;
|
delete renderer;
|
||||||
}
|
}
|
||||||
if(window) {
|
for(auto* w : windows) {
|
||||||
delete window;
|
if(w)
|
||||||
|
delete w;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowModule::onLoad() {
|
void WindowModule::onLoad() {
|
||||||
|
|
||||||
window = new Archimedes::Window([this](Archimedes::Event* e){
|
app->registerEvent(Archimedes::WindowResizeEvent());
|
||||||
|
app->registerEvent(Archimedes::WindowCloseEvent());
|
||||||
|
app->registerEvent(Archimedes::WindowKeyPressedEvent());
|
||||||
|
app->registerEvent(Archimedes::WindowKeyReleasedEvent());
|
||||||
|
app->registerEvent(Archimedes::WindowMouseButtonPressedEvent());
|
||||||
|
app->registerEvent(Archimedes::WindowMouseButtonReleasedEvent());
|
||||||
|
app->registerEvent(Archimedes::WindowScrollEvent());
|
||||||
|
app->registerEvent(Archimedes::WindowMouseMovedEvent());
|
||||||
|
app->registerEvent(Archimedes::WindowFocusedEvent());
|
||||||
|
app->registerEvent(Archimedes::WindowFocusLostEvent());
|
||||||
|
app->registerEvent(Archimedes::WindowMovedEvent());
|
||||||
|
|
||||||
|
windows.push_back(new Archimedes::Window([this](Archimedes::Event* e){
|
||||||
app->emitEvent(e);
|
app->emitEvent(e);
|
||||||
});
|
}));
|
||||||
|
|
||||||
renderer = new Archimedes::Renderer();
|
renderer = new Archimedes::Renderer();
|
||||||
|
|
||||||
window->setRenderer(renderer);
|
for(auto* window : windows)
|
||||||
|
window->setRenderer(renderer);
|
||||||
|
|
||||||
//renderer = window->getRenderer();
|
|
||||||
|
|
||||||
if(!renderer->init()) {
|
if(!renderer->init()) {
|
||||||
std::cout << "Renderer init failed!\n";
|
std::cout << "Renderer init failed!\n";
|
||||||
std::abort();
|
std::abort();
|
||||||
@@ -32,16 +56,60 @@ void WindowModule::onLoad() {
|
|||||||
|
|
||||||
void WindowModule::run() {
|
void WindowModule::run() {
|
||||||
|
|
||||||
if(window->shouldClose()) {
|
for(auto* window : windows) {
|
||||||
app->end();
|
|
||||||
|
if(window->shouldClose()) {
|
||||||
|
app->end();
|
||||||
|
}
|
||||||
|
|
||||||
|
for(auto e : window->getWindowImpl().data.eventList) {
|
||||||
|
app->emitEvent(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
window->getWindowImpl().data.eventList.clear();
|
||||||
|
|
||||||
|
window->doFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
for(auto e : window->getWindowImpl().data.eventList) {
|
|
||||||
app->emitEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
window->getWindowImpl().data.eventList.clear();
|
|
||||||
|
|
||||||
window->doFrame();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool WindowModule::onEvent(const Archimedes::Event& e) {
|
||||||
|
|
||||||
|
unsigned int type = app->getEventType(e);
|
||||||
|
|
||||||
|
if(type == app->getEventType(Archimedes::WindowResizeEvent())) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowCloseEvent())) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowKeyPressedEvent())) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowKeyReleasedEvent())) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowMouseButtonPressedEvent())) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowMouseButtonReleasedEvent())) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowScrollEvent())) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowMouseMovedEvent())) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowFocusedEvent())) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowFocusLostEvent())) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if(type == app->getEventType(Archimedes::WindowMovedEvent())) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,20 +15,22 @@ class WindowModule : public Archimedes::Module {
|
|||||||
|
|
||||||
WindowModule() { name = "WindowModule"; }
|
WindowModule() { name = "WindowModule"; }
|
||||||
|
|
||||||
~WindowModule();
|
~WindowModule() override;
|
||||||
|
|
||||||
void run();
|
void run() override;
|
||||||
|
|
||||||
void onLoad();
|
void onLoad() override;
|
||||||
|
|
||||||
|
bool onEvent(const Archimedes::Event& e) override;
|
||||||
|
|
||||||
//interface for other modules
|
//interface for other modules
|
||||||
|
|
||||||
Archimedes::Window* getWindow() { return window; }
|
std::vector<Archimedes::Window*>& getWindow() { return windows; }
|
||||||
Archimedes::Renderer* getRenderer() { return renderer; }
|
Archimedes::Renderer* getRenderer() { return renderer; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Archimedes::Window* window;
|
std::vector<Archimedes::Window*> windows;
|
||||||
Archimedes::Renderer* renderer;
|
Archimedes::Renderer* renderer;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user