feat: event emitter

This commit is contained in:
2025-10-22 11:31:42 +02:00
parent 31fbecbb47
commit 71f1b2c6d2
9 changed files with 147 additions and 123 deletions

View File

@ -2,48 +2,67 @@
#include "engine/renderer/core.h"
#include "engine/window/event.h"
#include "engine/window/event.hpp"
#include "engine/renderer/wavefront.h"
std::unique_ptr<IApplication> Engine::s_app = nullptr;
std::shared_ptr<Window> Engine::s_window = nullptr;
std::unique_ptr<Renderer> Engine::s_renderer = nullptr;
std::shared_ptr<Scene> Engine::s_scene = nullptr;
bool Engine::s_running = false;
Engine* Engine::s_instance = nullptr;
void Engine::Run(std::unique_ptr<IApplication> app) {
s_scene = std::make_shared<Scene>();
s_renderer = std::make_unique<Renderer>(s_scene);
s_window = Window::GetInstance();
s_app = std::move(app);
s_running = true;
m_scene = std::make_shared<Scene>();
m_renderer = std::make_unique<Renderer>(m_scene);
m_window = Window::GetInstance();
m_app = std::move(app);
m_running = true;
s_app->OnInit(s_scene);
s_renderer->Init();
m_app->OnInit(m_scene);
m_renderer->Init();
s_window->Subscribe<WindowCloseEvent>([&](const WindowCloseEvent& e) {
s_running = false;
s_app->OnEvent(e);
});
// m_window->Subscribe<WindowCloseEvent>([&](const WindowCloseEvent& e) {
// m_app->OnEvent(e);
// });
s_window->Subscribe<WindowResizeEvent>([&](const WindowResizeEvent& e) {
s_renderer->OnWindowResized(e.GetWidth(), e.GetHeight());
s_app->OnEvent(e);
});
// m_window->Subscribe<WindowResizeEvent>([&](const WindowResizeEvent& e) {
// m_renderer->OnWindowResized(e.GetWidth(), e.GetHeight());
// m_app->OnEvent(e);
// });
while (s_running) {
s_window->ProcessEvents();
m_window->Subscribe2(this);
s_app->OnUpdate();
while (m_running) {
m_window->ProcessEvents();
s_renderer->Render();
m_app->OnUpdate();
s_window->SwapBuffers();
m_renderer->Render();
m_window->SwapBuffers();
}
s_app->OnShutdown();
m_app->OnShutdown();
s_window->Destroy();
s_app.reset();
m_window->Destroy();
m_app.reset();
}
void Engine::OnEvent(const Event& event) {
m_app->OnEvent(event);
if (event.GetCategory() == Event::EventCategory::WINDOW) {
if (event.GetType() == EventType::WINDOW_RESIZE) {
auto e = static_cast<const WindowResizeEvent&>(event);
m_renderer->OnWindowResized(e.GetWidth(), e.GetHeight());
}
if (event.GetType() == EventType::WINDOW_CLOSE) {
m_running = false;
}
}
}
Engine* Engine::GetInstance() {
if (!s_instance) {
s_instance = new Engine();
}
return s_instance;
}

View File

@ -101,10 +101,12 @@ void Window::ProcessEvents() {
case SDL_EVENT_WINDOW_CLOSE_REQUESTED:
case SDL_EVENT_QUIT:
Dispatch(WindowCloseEvent());
EmitEvent(WindowCloseEvent{});
break;
case SDL_EVENT_KEY_DOWN:
if (event.key.scancode == SDL_SCANCODE_ESCAPE) {
Dispatch(WindowCloseEvent());
EmitEvent(WindowCloseEvent{});
}
if (event.key.scancode == SDL_SCANCODE_F11) {
bool isFullscreen = SDL_GetWindowFlags(m_handle) & SDL_WINDOW_FULLSCREEN;
@ -122,7 +124,9 @@ void Window::ProcessEvents() {
0,
width,
height);
Dispatch(WindowResizeEvent(static_cast<unsigned int>(m_width), static_cast<unsigned int>(m_height)));
auto event = WindowResizeEvent(static_cast<unsigned int>(m_width), static_cast<unsigned int>(m_height));
Dispatch(event);
EmitEvent(event);
SDL_SetWindowRelativeMouseMode(m_handle, true);
SDL_Rect boundaries = {0, 0, m_width, m_height};
SDL_SetWindowMouseRect(m_handle, &boundaries);