diff options
author | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-12-13 09:15:56 +0100 |
---|---|---|
committer | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-12-13 09:15:56 +0100 |
commit | 2b3659c8c5dace0ff9ff9cb8b9421f7f3f890218 (patch) | |
tree | 5a051d3d11c2bb358b170735b0bcdee0e997aa25 /src/crepe/system/InputSystem.cpp | |
parent | 2793e8be0e6c44bb34a25522e1e75ed8a2868b32 (diff) |
added window events back to code and function cleanup
Diffstat (limited to 'src/crepe/system/InputSystem.cpp')
-rw-r--r-- | src/crepe/system/InputSystem.cpp | 239 |
1 files changed, 122 insertions, 117 deletions
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; |