diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/crepe/api/Event.h | 10 | ||||
-rw-r--r-- | src/crepe/api/KeyCodes.h | 2 | ||||
-rw-r--r-- | src/crepe/facade/SDLContext.cpp | 72 | ||||
-rw-r--r-- | src/crepe/facade/SDLContext.h | 5 | ||||
-rw-r--r-- | src/crepe/system/InputSystem.cpp | 239 | ||||
-rw-r--r-- | src/crepe/system/InputSystem.h | 37 | ||||
-rw-r--r-- | src/test/InputTest.cpp | 52 |
7 files changed, 196 insertions, 221 deletions
diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index 66dd0cc..17ae809 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -40,7 +40,7 @@ public: class MousePressEvent : public Event { public: //! mouse position - ivec2 mouse_pos = {0, 0}; + vec2 mouse_pos = {0, 0}; //! The mouse button that was pressed. MouseButton button = MouseButton::NONE; @@ -52,7 +52,7 @@ public: class MouseClickEvent : public Event { public: //! mouse position - ivec2 mouse_pos = {0, 0}; + vec2 mouse_pos = {0, 0}; //! The mouse button that was clicked. MouseButton button = MouseButton::NONE; @@ -64,7 +64,7 @@ public: class MouseReleaseEvent : public Event { public: //! mouse position - ivec2 mouse_pos = {0, 0}; + vec2 mouse_pos = {0, 0}; //! The mouse button that was released. MouseButton button = MouseButton::NONE; @@ -76,7 +76,7 @@ public: class MouseMoveEvent : public Event { public: //! new mouse position - ivec2 mouse_pos = {0, 0}; + vec2 mouse_pos = {0, 0}; //! The change in mouse position relative to the last position (in pixels). ivec2 mouse_delta = {0, 0}; }; @@ -87,7 +87,7 @@ public: class MouseScrollEvent : public Event { public: //! mouse position when the scroll happened. - ivec2 mouse_pos = {0, 0}; + vec2 mouse_pos = {0, 0}; //! scroll direction (-1 = down, 1 = up) int scroll_direction = 0; //! scroll amount in y axis (from and away from the person). diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h index fa0d17c..a9141e2 100644 --- a/src/crepe/api/KeyCodes.h +++ b/src/crepe/api/KeyCodes.h @@ -153,8 +153,6 @@ typedef enum { RIGHT_SUPER = 347, /// \} MENU = 348, //!< Menu key. - //! Not actually a key instead its the amount of keycodes there are for array indexing - NUM_KEYCODES = 512, } Keycode; diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 6e47561..7c7d58e 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -1,4 +1,3 @@ -#include <iostream> #include <SDL2/SDL.h> #include <SDL2/SDL_blendmode.h> #include <SDL2/SDL_image.h> @@ -86,7 +85,6 @@ Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { } void SDLContext::update_keyboard_state() { // Array to hold the key states (true if pressed, false if not) - std::array<bool, Keycode::NUM_KEYCODES> keyState{}; SDL_PumpEvents(); const Uint8 * current_state = SDL_GetKeyboardState(nullptr); @@ -284,8 +282,6 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { ivec2 mouse_pos; mouse_pos.x = (event.button.x - cam.bar_size.x) / cam.render_scale.x; mouse_pos.y = (event.button.y - cam.bar_size.y) / cam.render_scale.y; - std::cout << "SDL mousePos X: " << mouse_pos.x << std::endl; - std::cout << "SDL mousePos Y: " << mouse_pos.y << std::endl; switch (event.type) { case SDL_QUIT: event_list.push_back({.event_type = SDLContext::EventType::SHUTDOWN}); @@ -357,44 +353,52 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { }; event_list.push_back(transfer_event); } break; + case SDL_WINDOWEVENT: + handle_window_event(event.window, event_list); + break; } } return event_list; } -// Separate function for SDL_WINDOWEVENT subtypes void SDLContext::handle_window_event(const SDL_WindowEvent & window_event, std::vector<SDLContext::EventData> & event_list) { - // switch (window_event.event) { - // case SDL_WINDOWEVENT_EXPOSED: - // event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); - // break; - // case SDL_WINDOWEVENT_RESIZED: - // event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, - // {}, - // {}, - // {{}, {window_event.data1, window_event.data2}}}); - // break; - // case SDL_WINDOWEVENT_MOVED: - // event_list.push_back({SDLContext::EventType::WINDOW_MOVE, - // {}, - // {}, - // {{window_event.data1, window_event.data2}, {}}}); - // break; - // case SDL_WINDOWEVENT_MINIMIZED: - // event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); - // break; - // case SDL_WINDOWEVENT_MAXIMIZED: - // event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); - // break; - // case SDL_WINDOWEVENT_FOCUS_GAINED: - // event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); - // break; - // case SDL_WINDOWEVENT_FOCUS_LOST: - // event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); - // break; - // } + switch (window_event.event) { + case SDL_WINDOWEVENT_EXPOSED: + event_list.push_back(EventData{SDLContext::EventType::WINDOW_EXPOSE}); + break; + case SDL_WINDOWEVENT_RESIZED: { + EventData transfer_event; + transfer_event.event_type = SDLContext::EventType::WINDOW_RESIZE; + transfer_event.data.window_data = WindowData{ + .resize_dimension = {window_event.data1, window_event.data2} + }; + event_list.push_back(transfer_event); + break; + } + case SDL_WINDOWEVENT_MOVED: { + EventData transfer_event; + transfer_event.event_type = SDLContext::EventType::WINDOW_MOVE; + transfer_event.data.window_data = WindowData{ + .move_delta = {window_event.data1, window_event.data2} + }; + event_list.push_back(transfer_event); + break; + } + case SDL_WINDOWEVENT_MINIMIZED: + event_list.push_back(EventData{SDLContext::EventType::WINDOW_MINIMIZE}); + break; + case SDL_WINDOWEVENT_MAXIMIZED: + event_list.push_back(EventData{SDLContext::EventType::WINDOW_MAXIMIZE}); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + event_list.push_back(EventData{SDLContext::EventType::WINDOW_FOCUS_GAIN}); + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + event_list.push_back(EventData{SDLContext::EventType::WINDOW_FOCUS_LOST}); + break; + } } void SDLContext::set_color_texture(const Texture & texture, const Color & color) { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index b10bcfe..e56d531 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -116,11 +116,6 @@ public: EventDataUnion() {} ~EventDataUnion() {} } data; - - // Helper functions - // bool isKeyEvent() const { return event_type == SDLContext::EventType::KEYDOWN || event_type == SDLContext::EventType::KEYUP; } - // bool isMouseEvent() const { return event_type == SDLContext::EventType::MOUSEDOWN || event_type == SDLContext::EventType::MOUSEUP || event_type == SDLContext::EventType::MOUSEMOVE; } - // bool isWindowEvent() const { return event_type == SDLContext::EventType::WINDOW_MINIMIZE || event_type == SDLContext::EventType::WINDOW_RESIZE; } }; /** * \brief Retrieves the current state of the keyboard. diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index 32538e8..bb454af 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -1,4 +1,3 @@ -#include <iostream> #include "../api/Button.h" #include "../manager/ComponentManager.h" #include "../manager/EventManager.h" @@ -11,7 +10,7 @@ using namespace crepe; void InputSystem::update() { ComponentManager & mgr = this->mediator.component_manager; - EventManager & event_mgr = this->mediator.event_manager; + SDLContext & context = this->mediator.sdl_context; std::vector<SDLContext::EventData> event_list = context.get_events(); RefVector<Button> buttons = mgr.get_components_by_type<Button>(); @@ -31,129 +30,135 @@ void InputSystem::update() { = mgr.get_components_by_id<Transform>(current_cam.game_object_id); Transform & cam_transform = transform_vec.front().get(); - ivec2 camera_origin; - int camera_origin_x = cam_transform.position.x + current_cam.data.postion_offset.x - - (current_cam.viewport_size.x / 2); - int camera_origin_y = cam_transform.position.y + current_cam.data.postion_offset.y - - (current_cam.viewport_size.y / 2); + vec2 camera_origin = cam_transform.position + current_cam.data.postion_offset + - (current_cam.viewport_size / 2); for (const SDLContext::EventData & event : event_list) { // Only calculate mouse coordinates for relevant events - if (event.event_type == SDLContext::EventType::MOUSEDOWN - || event.event_type == SDLContext::EventType::MOUSEUP - || event.event_type == SDLContext::EventType::MOUSEMOVE - || event.event_type == SDLContext::EventType::MOUSEWHEEL) { - - ivec2 adjusted_mouse; - std::cout << "mousePos X: " << event.data.mouse_data.mouse_position.x << std::endl; - std::cout << "mousePos Y: " << event.data.mouse_data.mouse_position.y << std::endl; - int world_mouse_x = event.data.mouse_data.mouse_position.x + camera_origin_x; - int world_mouse_y = event.data.mouse_data.mouse_position.y + camera_origin_y; - // Check if the mouse is within the viewport - bool mouse_in_viewport - = !(world_mouse_x < camera_origin_x - || world_mouse_x > camera_origin_x + current_cam.viewport_size.x - || world_mouse_y < camera_origin_y - || world_mouse_y > camera_origin_y + current_cam.viewport_size.y); - std::cout << "in view " << mouse_in_viewport << std::endl; - if (!mouse_in_viewport) continue; - - // Handle mouse-specific events - switch (event.event_type) { - case SDLContext::EventType::MOUSEDOWN: - event_mgr.queue_event<MousePressEvent>({ - .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .button = event.data.mouse_data.mouse_button, - }); - this->last_mouse_down_position = {adjusted_mouse.x, adjusted_mouse.y}; - this->last_mouse_button = event.data.mouse_data.mouse_button; - break; - - case SDLContext::EventType::MOUSEUP: { - event_mgr.queue_event<MouseReleaseEvent>({ - .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .button = event.data.mouse_data.mouse_button, - }); - int delta_x = adjusted_mouse.x - this->last_mouse_down_position.x; - int delta_y = adjusted_mouse.y - this->last_mouse_down_position.y; - - if (this->last_mouse_button == event.data.mouse_data.mouse_button - && std::abs(delta_x) <= click_tolerance - && std::abs(delta_y) <= click_tolerance) { - event_mgr.queue_event<MouseClickEvent>({ - .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .button = event.data.mouse_data.mouse_button, - }); - this->handle_click(event.data.mouse_data.mouse_button, adjusted_mouse); - } - break; - } - - case SDLContext::EventType::MOUSEMOVE: - event_mgr.queue_event<MouseMoveEvent>({ - .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .mouse_delta = event.data.mouse_data.rel_mouse_move, - }); - this->handle_move(event, adjusted_mouse); - break; - - case SDLContext::EventType::MOUSEWHEEL: - event_mgr.queue_event<MouseScrollEvent>({ - .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .scroll_direction = event.data.mouse_data.scroll_direction, - .scroll_delta = event.data.mouse_data.scroll_delta, - }); - break; - - default: - break; - } + if(this->is_mouse_event(event.event_type)) { + this->handle_mouse_event(event,camera_origin,current_cam); + } else { - // Handle non-mouse events - switch (event.event_type) { - case SDLContext::EventType::KEYDOWN: - - event_mgr.queue_event<KeyPressEvent>( - {.repeat = event.data.key_data.key_repeat, .key = event.data.key_data.key}); - break; - case SDLContext::EventType::KEYUP: - event_mgr.queue_event<KeyReleaseEvent>({.key = event.data.key_data.key}); - break; - case SDLContext::EventType::SHUTDOWN: - event_mgr.queue_event<ShutDownEvent>({}); - break; - case SDLContext::EventType::WINDOW_EXPOSE: - event_mgr.queue_event<WindowExposeEvent>({}); - break; - case SDLContext::EventType::WINDOW_RESIZE: - event_mgr.queue_event<WindowResizeEvent>( - WindowResizeEvent{.dimensions = event.data.window_data.resize_dimension}); - break; - case SDLContext::EventType::WINDOW_MOVE: - event_mgr.queue_event<WindowMoveEvent>( - {.delta_move = event.data.window_data.move_delta}); - break; - case SDLContext::EventType::WINDOW_MINIMIZE: - event_mgr.queue_event<WindowMinimizeEvent>({}); - break; - case SDLContext::EventType::WINDOW_MAXIMIZE: - event_mgr.queue_event<WindowMaximizeEvent>({}); - break; - case SDLContext::EventType::WINDOW_FOCUS_GAIN: - event_mgr.queue_event<WindowFocusGainEvent>({}); - break; - case SDLContext::EventType::WINDOW_FOCUS_LOST: - event_mgr.queue_event<WindowFocusLostEvent>({}); - break; - default: - break; + this->handle_non_mouse_event(event); + + } + } +} + +void InputSystem::handle_mouse_event(const SDLContext::EventData &event, const vec2 &camera_origin, + const Camera ¤t_cam){ + EventManager & event_mgr = this->mediator.event_manager; + vec2 adjusted_mouse; + adjusted_mouse.x = event.data.mouse_data.mouse_position.x + camera_origin.x; + adjusted_mouse.x = event.data.mouse_data.mouse_position.y + camera_origin.y; + // Check if the mouse is within the viewport + if ((adjusted_mouse.x < camera_origin.x + || adjusted_mouse.x > camera_origin.x + current_cam.viewport_size.x + || adjusted_mouse.y < camera_origin.y + || adjusted_mouse.y > camera_origin.y + current_cam.viewport_size.y)) return; + + // Handle mouse-specific events + switch (event.event_type) { + case SDLContext::EventType::MOUSEDOWN: + event_mgr.queue_event<MousePressEvent>({ + .mouse_pos = adjusted_mouse, + .button = event.data.mouse_data.mouse_button, + }); + this->last_mouse_down_position = adjusted_mouse; + this->last_mouse_button = event.data.mouse_data.mouse_button; + break; + + case SDLContext::EventType::MOUSEUP: { + event_mgr.queue_event<MouseReleaseEvent>({ + .mouse_pos = adjusted_mouse, + .button = event.data.mouse_data.mouse_button, + }); + vec2 delta_move = adjusted_mouse - this->last_mouse_down_position; + int click_tolerance = Config::get_instance().input.click_tolerance; + if (this->last_mouse_button == event.data.mouse_data.mouse_button + && std::abs(delta_move.x) <= click_tolerance + && std::abs(delta_move.y) <= click_tolerance) { + event_mgr.queue_event<MouseClickEvent>({ + .mouse_pos = adjusted_mouse, + .button = event.data.mouse_data.mouse_button, + }); + this->handle_click(event.data.mouse_data.mouse_button, adjusted_mouse); } + break; } + + case SDLContext::EventType::MOUSEMOVE: + event_mgr.queue_event<MouseMoveEvent>({ + .mouse_pos = adjusted_mouse, + .mouse_delta = event.data.mouse_data.rel_mouse_move, + }); + this->handle_move(event, adjusted_mouse); + break; + + case SDLContext::EventType::MOUSEWHEEL: + event_mgr.queue_event<MouseScrollEvent>({ + .mouse_pos = adjusted_mouse, + .scroll_direction = event.data.mouse_data.scroll_direction, + .scroll_delta = event.data.mouse_data.scroll_delta, + }); + break; + + default: + break; + } +} + +void InputSystem::handle_non_mouse_event(const SDLContext::EventData &event){ + EventManager & event_mgr = this->mediator.event_manager; + switch (event.event_type) { + case SDLContext::EventType::KEYDOWN: + + event_mgr.queue_event<KeyPressEvent>( + {.repeat = event.data.key_data.key_repeat, .key = event.data.key_data.key}); + break; + case SDLContext::EventType::KEYUP: + event_mgr.queue_event<KeyReleaseEvent>({.key = event.data.key_data.key}); + break; + case SDLContext::EventType::SHUTDOWN: + event_mgr.queue_event<ShutDownEvent>({}); + break; + case SDLContext::EventType::WINDOW_EXPOSE: + event_mgr.queue_event<WindowExposeEvent>({}); + break; + case SDLContext::EventType::WINDOW_RESIZE: + event_mgr.queue_event<WindowResizeEvent>( + WindowResizeEvent{.dimensions = event.data.window_data.resize_dimension}); + break; + case SDLContext::EventType::WINDOW_MOVE: + event_mgr.queue_event<WindowMoveEvent>( + {.delta_move = event.data.window_data.move_delta}); + break; + case SDLContext::EventType::WINDOW_MINIMIZE: + event_mgr.queue_event<WindowMinimizeEvent>({}); + break; + case SDLContext::EventType::WINDOW_MAXIMIZE: + event_mgr.queue_event<WindowMaximizeEvent>({}); + break; + case SDLContext::EventType::WINDOW_FOCUS_GAIN: + event_mgr.queue_event<WindowFocusGainEvent>({}); + break; + case SDLContext::EventType::WINDOW_FOCUS_LOST: + event_mgr.queue_event<WindowFocusLostEvent>({}); + break; + default: + break; } } +bool InputSystem::is_mouse_event(SDLContext::EventType event_type){ + return (event_type == SDLContext::EventType::MOUSEDOWN + || event_type == SDLContext::EventType::MOUSEUP + || event_type == SDLContext::EventType::MOUSEMOVE + || event_type == SDLContext::EventType::MOUSEWHEEL); +} + void InputSystem::handle_move(const SDLContext::EventData & event_data, - const ivec2& mouse_pos) { + const vec2& mouse_pos) { ComponentManager & mgr = this->mediator.component_manager; RefVector<Button> buttons = mgr.get_components_by_type<Button>(); @@ -183,7 +188,7 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data, } } -void InputSystem::handle_click(const MouseButton & mouse_button, const ivec2& mouse_pos) { +void InputSystem::handle_click(const MouseButton & mouse_button, const vec2& mouse_pos) { ComponentManager & mgr = this->mediator.component_manager; RefVector<Button> buttons = mgr.get_components_by_type<Button>(); @@ -203,7 +208,7 @@ void InputSystem::handle_click(const MouseButton & mouse_button, const ivec2& mo } } -bool InputSystem::is_mouse_inside_button(const ivec2& mouse_pos, +bool InputSystem::is_mouse_inside_button(const vec2& mouse_pos, const Button & button, const Transform & transform) { int actual_x = transform.position.x + button.offset.x; int actual_y = transform.position.y + button.offset.y; diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h index 3703635..7b8f510 100644 --- a/src/crepe/system/InputSystem.h +++ b/src/crepe/system/InputSystem.h @@ -32,15 +32,36 @@ public: private: //! Stores the last position of the mouse when the button was pressed. - ivec2 last_mouse_down_position; + vec2 last_mouse_down_position; // TODO: specify world/hud space and make regular `vec2` //! Stores the last mouse button pressed. MouseButton last_mouse_button = MouseButton::NONE; - - //! The maximum allowable distance between mouse down and mouse up to register as a click. This can be changed using the Config. - int click_tolerance = Config::get_instance().input.click_tolerance; - + /** + * \brief Determines whether the given event type is a mouse event. + * \param event_type The event type to check. + * \return True if the event type corresponds to a mouse event, false otherwise. + */ + bool is_mouse_event(SDLContext::EventType event_type); + /** + * \brief Handles mouse-related events. + * \param event The event data for the mouse event. + * \param camera_origin The origin position of the camera in world space. + * \param current_cam The currently active camera. + * + * This method processes mouse events, adjusts the mouse position to world coordinates, + * and triggers the appropriate mouse-specific event handling logic. + */ + void handle_mouse_event(const SDLContext::EventData &event, const vec2 &camera_origin, + const Camera ¤t_cam); + /** + * \brief Handles non-mouse-related events. + * \param event The event data for the non-mouse event. + * + * This method processes events that do not involve the mouse, such as keyboard events, + * window events, and shutdown events, and triggers the corresponding event actions. + */ + void handle_non_mouse_event(const SDLContext::EventData &event); /** * \brief Handles the mouse click event. * \param mouse_button The mouse button involved in the click. @@ -49,7 +70,7 @@ private: * * This method processes the mouse click event and triggers the corresponding button action. */ - void handle_click(const MouseButton & mouse_button,const ivec2& mouse_pos); + void handle_click(const MouseButton & mouse_button,const vec2& mouse_pos); /** * \brief Handles the mouse movement event. @@ -59,7 +80,7 @@ private: * * This method processes the mouse movement event and updates the button hover state. */ - void handle_move(const SDLContext::EventData & event_data, const ivec2& mouse_pos); + void handle_move(const SDLContext::EventData & event_data, const vec2& mouse_pos); /** * \brief Checks if the mouse position is inside the bounds of the button. @@ -69,7 +90,7 @@ private: * \param transform The transform component of the button. * \return True if the mouse is inside the button, false otherwise. */ - bool is_mouse_inside_button(const ivec2& mouse_pos, + bool is_mouse_inside_button(const vec2& mouse_pos, const Button & button, const Transform & transform); /** diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index 7a28882..7063561 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -43,7 +43,8 @@ protected: //mediator.component_manager = mgr; //event_manager.clear(); } - + void TearDown() override { + } void simulate_mouse_click(int mouse_x, int mouse_y, Uint8 mouse_button) { SDL_Event event; @@ -261,52 +262,3 @@ TEST_F(InputTest, testButtonHover) { event_manager.dispatch_events(); EXPECT_TRUE(button.hover); } - -TEST_F(InputTest, WindowResizeTest) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - bool callback_triggered = false; - EventHandler<WindowResizeEvent> on_window_resize = [&](const WindowResizeEvent & event) { - callback_triggered = true; - EXPECT_EQ(event.dimensions.x, 800); - EXPECT_EQ(event.dimensions.y, 600); - return false; - }; - event_manager.subscribe<WindowResizeEvent>(on_window_resize); - SDL_Event resize_event; - SDL_zero(resize_event); - resize_event.type = SDL_WINDOWEVENT; - resize_event.window.event = SDL_WINDOWEVENT_RESIZED; - resize_event.window.data1 = 800; // new width - resize_event.window.data2 = 600; // new height - SDL_PushEvent(&resize_event); - input_system.update(); - event_manager.dispatch_events(); - EXPECT_TRUE(callback_triggered); -} -TEST_F(InputTest, WindowMoveTest) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - bool callback_triggered = false; - EventHandler<WindowMoveEvent> on_window_move = [&](const WindowMoveEvent & event) { - callback_triggered = true; - EXPECT_EQ(event.delta_move.x, 800); - EXPECT_EQ(event.delta_move.y, 600); - return false; - }; - event_manager.subscribe<WindowMoveEvent>(on_window_move); - SDL_Event resize_event; - SDL_zero(resize_event); - resize_event.type = SDL_WINDOWEVENT; - resize_event.window.event = SDL_WINDOWEVENT_MOVED; - resize_event.window.data1 = 800; // new width - resize_event.window.data2 = 600; // new height - SDL_PushEvent(&resize_event); - input_system.update(); - event_manager.dispatch_events(); - EXPECT_TRUE(callback_triggered); -} |