From a80477f2e7f4c18adcc6441828d17582aad2598f Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Mon, 9 Dec 2024 15:29:18 +0100 Subject: get_keyboard_state working --- src/crepe/api/Config.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/crepe/api/Config.h') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index a9745c3..7b1a5ca 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -86,6 +86,12 @@ public: */ std::string root_pattern = ".crepe-root"; } asset; + //! Configuration for click tolerance. + struct { + //! The maximum number of pixels the mouse can move between MouseDown and MouseUp events to be considered a click. + int tolerance = 5; + } click_tolerance; + }; } // namespace crepe -- cgit v1.2.3 From f6633670594e04baf77c14399c9f3bdaa49aecea Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Mon, 9 Dec 2024 15:29:51 +0100 Subject: make format --- src/crepe/api/Config.h | 1 - src/crepe/facade/SDLContext.cpp | 29 ++++++++++++++-------------- src/crepe/facade/SDLContext.h | 2 +- src/crepe/system/InputSystem.h | 2 +- src/test/InputTest.cpp | 42 ++++++++++++++++++++--------------------- 5 files changed, 37 insertions(+), 39 deletions(-) (limited to 'src/crepe/api/Config.h') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 7b1a5ca..d2be3f3 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -91,7 +91,6 @@ public: //! The maximum number of pixels the mouse can move between MouseDown and MouseUp events to be considered a click. int tolerance = 5; } click_tolerance; - }; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 1e8af41..4504b95 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -191,22 +191,21 @@ Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { return LOOKUP_TABLE[sdl_key]; } std::array SDLContext::get_keyboard_state() { - // Array to hold the key states (true if pressed, false if not) - std::array keyState{}; - SDL_PumpEvents(); - const Uint8 *current_state = SDL_GetKeyboardState(nullptr); - - for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { - Keycode key = sdl_to_keycode(static_cast(i)); - - if (key != Keycode::NONE) { - keyState[key] = current_state[i] != 0; - } - } - - return keyState; -} + // Array to hold the key states (true if pressed, false if not) + std::array keyState{}; + SDL_PumpEvents(); + const Uint8 * current_state = SDL_GetKeyboardState(nullptr); + + for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { + Keycode key = sdl_to_keycode(static_cast(i)); + + if (key != Keycode::NONE) { + keyState[key] = current_state[i] != 0; + } + } + return keyState; +} MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { static const std::array MOUSE_BUTTON_LOOKUP_TABLE = [] { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 5182dca..053aa59 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -165,7 +165,7 @@ private: * \return The corresponding `Keycode` value or `Keycode::NONE` if the key is unrecognized. */ Keycode sdl_to_keycode(SDL_Scancode sdl_key); - + /** * \brief Converts an SDL mouse button code to the custom MouseButton type. * diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h index 1d6e79c..5da8f32 100644 --- a/src/crepe/system/InputSystem.h +++ b/src/crepe/system/InputSystem.h @@ -1,9 +1,9 @@ #pragma once +#include "../api/Config.h" #include "../facade/SDLContext.h" #include "../types.h" #include "../util/OptionalRef.h" -#include "../api/Config.h" #include "System.h" diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index e9dc645..5150960 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -332,30 +332,30 @@ TEST_F(InputTest, WindowMoveTest) { EXPECT_TRUE(callback_triggered); } TEST_F(InputTest, KeyboardStateTest) { - SDLContext& sdl_context = this->mediator.sdl_context; - // Simulate pressing a key - SDL_Event key_down_event; - SDL_zero(key_down_event); - key_down_event.type = SDL_KEYDOWN; - key_down_event.key.keysym.scancode = SDL_SCANCODE_A; + SDLContext & sdl_context = this->mediator.sdl_context; + // Simulate pressing a key + SDL_Event key_down_event; + SDL_zero(key_down_event); + key_down_event.type = SDL_KEYDOWN; + key_down_event.key.keysym.scancode = SDL_SCANCODE_A; key_down_event.key.keysym.sym = SDL_SCANCODE_A; - SDL_PushEvent(&key_down_event); + SDL_PushEvent(&key_down_event); - // Check the keyboard state - auto keyboard_state = sdl_context.get_keyboard_state(); + // Check the keyboard state + auto keyboard_state = sdl_context.get_keyboard_state(); - // Verify the state of the 'A' key - EXPECT_TRUE(keyboard_state[Keycode::A]); + // Verify the state of the 'A' key + EXPECT_TRUE(keyboard_state[Keycode::A]); - // Simulate releasing a key - SDL_Event key_up_event; - SDL_zero(key_up_event); - key_up_event.type = SDL_KEYUP; - key_up_event.key.keysym.scancode = SDL_SCANCODE_A; // Simulate releasing 'A' key - SDL_PushEvent(&key_up_event); - // Check the keyboard state again - keyboard_state = sdl_context.get_keyboard_state(); + // Simulate releasing a key + SDL_Event key_up_event; + SDL_zero(key_up_event); + key_up_event.type = SDL_KEYUP; + key_up_event.key.keysym.scancode = SDL_SCANCODE_A; // Simulate releasing 'A' key + SDL_PushEvent(&key_up_event); + // Check the keyboard state again + keyboard_state = sdl_context.get_keyboard_state(); - // Verify the state of the 'A' key - EXPECT_FALSE(keyboard_state[Keycode::A]); + // Verify the state of the 'A' key + EXPECT_FALSE(keyboard_state[Keycode::A]); } -- cgit v1.2.3 From b2c72ee8ce282bb13b0fbeb2ddb01fdfd6ad1280 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Tue, 10 Dec 2024 12:27:59 +0100 Subject: font progress --- src/crepe/api/Config.h | 11 +++++++++ src/crepe/facade/SDLFontContext.cpp | 19 ++++++++------- src/crepe/facade/SDLFontContext.h | 5 +++- src/crepe/facade/font.cpp | 21 +++++++++++++++++ src/crepe/facade/font.h | 47 +++++++++++++++++++++++++++++++++++++ src/example/CMakeLists.txt | 1 + src/example/loadfont.cpp | 13 ++++++++++ 7 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 src/crepe/facade/font.cpp create mode 100644 src/crepe/facade/font.h create mode 100644 src/example/loadfont.cpp (limited to 'src/crepe/api/Config.h') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index a9745c3..e4808fe 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -86,6 +86,17 @@ public: */ std::string root_pattern = ".crepe-root"; } asset; + //! Default font options + struct { + /** + * \brief Default font size + * + * using the SDL_ttf library the font size needs to be set when loading the font. + * This config option is the font size at which all fonts will be loaded initially. + * + */ + int font_size = 16; + } font; }; } // namespace crepe diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp index 6ce5efd..a4be143 100644 --- a/src/crepe/facade/SDLFontContext.cpp +++ b/src/crepe/facade/SDLFontContext.cpp @@ -1,19 +1,22 @@ -#include "SDLFontContext.h" #include +#include "SDLFontContext.h" + + using namespace crepe; using namespace std; SDLFontContext::SDLFontContext(){ - if (!FcInit()) { - throw std::runtime_error("Failed to initialize Fontconfig."); - } + } SDLFontContext::~SDLFontContext(){ - FcFini(); + } -Asset SDLFontContext::get_font_asset(const std::string & font_family) { +unique_ptr SDLFontContext::get_font_asset(const std::string & font_family) { + if (!FcInit()) { + throw std::runtime_error("Failed to initialize Fontconfig."); + } // Create a pattern to search for the font family FcPattern* pattern = FcNameParse(reinterpret_cast(font_family.c_str())); if (!pattern) { @@ -46,6 +49,6 @@ Asset SDLFontContext::get_font_asset(const std::string & font_family) { // Convert the file path to a std::string std::string font_file_path(reinterpret_cast(file_path)); FcPatternDestroy(matched_pattern); - - return Asset(font_file_path); + FcFini(); + return std::move(make_unique(font_file_path)); } diff --git a/src/crepe/facade/SDLFontContext.h b/src/crepe/facade/SDLFontContext.h index 3b2e162..cd91383 100644 --- a/src/crepe/facade/SDLFontContext.h +++ b/src/crepe/facade/SDLFontContext.h @@ -1,14 +1,17 @@ #pragma once +#include #include #include + #include "../api/Asset.h" + namespace crepe { class SDLFontContext{ public: SDLFontContext(); ~SDLFontContext(); - Asset get_font_asset(const std::string & font_family); + std::unique_ptr get_font_asset(const std::string & font_family); private: }; diff --git a/src/crepe/facade/font.cpp b/src/crepe/facade/font.cpp new file mode 100644 index 0000000..259a6cd --- /dev/null +++ b/src/crepe/facade/font.cpp @@ -0,0 +1,21 @@ +#include "font.h" +#include "../api/Config.h" +using namespace std; +using namespace crepe; + +void Font::load(unique_ptr res){ + const char* font_path = res->get_path(); + int font_size = Config::get_instance().font.font_size; + this->font = std::unique_ptr( + TTF_OpenFont(font_path, font_size), &TTF_CloseFont); + + if (!font) { + throw std::runtime_error("Failed to load font: " + std::string(TTF_GetError())); + } +} +Font::Font(const char* src){ + this->load(make_unique(src)); +} +Font::Font(std::unique_ptr res){ + this->load(std::move(res)); +} diff --git a/src/crepe/facade/font.h b/src/crepe/facade/font.h new file mode 100644 index 0000000..f5c7785 --- /dev/null +++ b/src/crepe/facade/font.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include + +#include "../api/Asset.h" + +namespace crepe { + +/** + * \brief Font resource facade + * + * This class is a wrapper around an SDL_ttf font instance, encapsulating font loading and usage. + */ +class Font { +public: + /** + * \param src The file path to the font file. + */ + Font(const char* src); + + /** + * \param res A unique pointer to an Asset holding the font resource. + */ + Font(std::unique_ptr res); + + /** + * \brief Destructor to clean up font resources. + */ + ~Font() = default; + + void draw(const vec2& pos, const vec2&) +private: + /** + * \brief Load the font from the given resource. + * + * This method is used by both constructors to load the font resource. + * + * \param res A unique pointer to an Asset holding the font resource. + */ + void load(std::unique_ptr res); + +private: + std::unique_ptr font; ///< The SDL_ttf font object with custom deleter. +}; + +} // namespace crepe diff --git a/src/example/CMakeLists.txt b/src/example/CMakeLists.txt index 8ef71bb..7fc81d7 100644 --- a/src/example/CMakeLists.txt +++ b/src/example/CMakeLists.txt @@ -21,3 +21,4 @@ add_example(savemgr) add_example(rendering_particle) add_example(game) add_example(button) +add_example(loadfont) diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp new file mode 100644 index 0000000..8931ce3 --- /dev/null +++ b/src/example/loadfont.cpp @@ -0,0 +1,13 @@ +#include +#include + +#include + +using namespace crepe; + +int main(){ + SDLFontContext font_facade; + std::unique_ptr asset = font_facade.get_font_asset("OpenSymbol"); + std::cout << "path: " << asset->get_path() << std::endl; + return 0; +} -- cgit v1.2.3 From e75e355c3a59d53a1d64fd8fae3331b2234083e2 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Wed, 11 Dec 2024 22:17:43 +0100 Subject: text component pretty much finished --- src/crepe/api/CMakeLists.txt | 2 ++ src/crepe/api/Config.h | 4 ++-- src/crepe/api/Text.cpp | 6 ++++++ src/crepe/api/Text.h | 8 ++++---- src/crepe/facade/Font.cpp | 10 +++++++--- src/crepe/facade/Font.h | 12 ++++++------ src/crepe/facade/SDLFontContext.cpp | 11 +++++------ src/crepe/facade/SDLFontContext.h | 8 ++++++++ src/example/loadfont.cpp | 23 +++++++++++++++++------ 9 files changed, 57 insertions(+), 27 deletions(-) (limited to 'src/crepe/api/Config.h') diff --git a/src/crepe/api/CMakeLists.txt b/src/crepe/api/CMakeLists.txt index fb11c8d..90e4d1f 100644 --- a/src/crepe/api/CMakeLists.txt +++ b/src/crepe/api/CMakeLists.txt @@ -20,6 +20,7 @@ target_sources(crepe PUBLIC Button.cpp UIObject.cpp AI.cpp + Text.cpp ) target_sources(crepe PUBLIC FILE_SET HEADERS FILES @@ -49,4 +50,5 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES Button.h UIObject.h AI.h + Text.h ) diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index def4c49..159be99 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -81,11 +81,11 @@ struct Config final { /** * \brief Default font size * - * using the SDL_ttf library the font size needs to be set when loading the font. + * Using the SDL_ttf library the font size needs to be set when loading the font. * This config option is the font size at which all fonts will be loaded initially. * */ - int font_size = 16; + unsigned int size = 16; } font; //! Audio system settings diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index e69de29..dd44dd9 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -0,0 +1,6 @@ +#include "Text.h" + +using namespace crepe; + +Text::Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font) : UIObject(id,dimensions,offset),source(font){} + diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index 9dd275b..d5f47fa 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -11,11 +11,11 @@ namespace crepe{ class Text : public UIObject{ public: - Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font, int font_size); + Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font); //! Label text. std::string text; - //! Label text color + //! Label text color. Color text_color = Color::BLACK; /** * \brief fontsize for text rendering @@ -26,8 +26,8 @@ public: * The default font size that is loaded is set in the Config. * Instead this value is used to upscale the font texture which can cause blurring or distorted text when upscaling or downscaling too much. */ - int font_size = 16; - + unsigned int font_size = 16; + //! Font asset const Asset source; private: }; diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index 2ad176a..b600b01 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -1,24 +1,28 @@ -#include "font.h" #include "../api/Config.h" + +#include "font.h" + using namespace std; using namespace crepe; void Font::load(unique_ptr res){ const char* font_path = res->get_path(); - int font_size = Config::get_instance().font.font_size; this->font = std::unique_ptr( - TTF_OpenFont(font_path, font_size), &TTF_CloseFont); + TTF_OpenFont(font_path, this->default_font_size), &TTF_CloseFont); if (!font) { throw std::runtime_error("Failed to load font: " + std::string(TTF_GetError())); } } + Font::Font(const char* src){ this->load(make_unique(src)); } + Font::Font(std::unique_ptr res){ this->load(std::move(res)); } + const TTF_Font& Font::get_font() const{ return this->font; } diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h index e34ac63..8bf9fc9 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -9,17 +9,17 @@ namespace crepe { /** - * \brief Font resource facade + * \brief Resource for managing font creation and destruction * * This class is a wrapper around an SDL_ttf font instance, encapsulating font loading and usage. */ class Font : public Resource{ public: - /**. - * \param src Asset with texture data to load. - * \param mediator use the SDLContext reference to load the image + /** + * \param src Asset with font data to load. + * \param mediator use the SDLContext reference to load text */ - Font(const Asset & src, Mediator & mediator); + Font( src, Mediator & mediator); ~Font() = default @@ -27,7 +27,7 @@ public: private: //! The SDL_ttf font object with custom deleter. std::unique_ptr font; - int default_font_size = Config::get_instance().font.font_size; + unsigned int default_font_size = Config::get_instance().font.size; }; } // namespace crepe diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp index a4be143..d7a0bff 100644 --- a/src/crepe/facade/SDLFontContext.cpp +++ b/src/crepe/facade/SDLFontContext.cpp @@ -7,16 +7,16 @@ using namespace crepe; using namespace std; SDLFontContext::SDLFontContext(){ - + if (!FcInit()) { + throw std::runtime_error("Failed to initialize Fontconfig."); + } } SDLFontContext::~SDLFontContext(){ - + FcFini(); } unique_ptr SDLFontContext::get_font_asset(const std::string & font_family) { - if (!FcInit()) { - throw std::runtime_error("Failed to initialize Fontconfig."); - } + // Create a pattern to search for the font family FcPattern* pattern = FcNameParse(reinterpret_cast(font_family.c_str())); if (!pattern) { @@ -49,6 +49,5 @@ unique_ptr SDLFontContext::get_font_asset(const std::string & font_family // Convert the file path to a std::string std::string font_file_path(reinterpret_cast(file_path)); FcPatternDestroy(matched_pattern); - FcFini(); return std::move(make_unique(font_file_path)); } diff --git a/src/crepe/facade/SDLFontContext.h b/src/crepe/facade/SDLFontContext.h index cd91383..c890b2d 100644 --- a/src/crepe/facade/SDLFontContext.h +++ b/src/crepe/facade/SDLFontContext.h @@ -11,6 +11,14 @@ namespace crepe { public: SDLFontContext(); ~SDLFontContext(); + /** + * + * \brief Facade function to convert a font_family into an asset. + * + * This function uses the FontConfig library to convert a font family name (Arial, Inter, Helvetica) and converts it to the font source path. + * + * \param font_family Name of the font family name. + */ std::unique_ptr get_font_asset(const std::string & font_family); private: }; diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 8931ce3..0002026 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -1,13 +1,24 @@ #include +#include #include - #include +#include using namespace crepe; -int main(){ - SDLFontContext font_facade; - std::unique_ptr asset = font_facade.get_font_asset("OpenSymbol"); - std::cout << "path: " << asset->get_path() << std::endl; - return 0; +int main() { + SDLFontContext font_facade; + + // Create a unique pointer to the font asset + std::unique_ptr asset = font_facade.get_font_asset("OpenSymbol"); + std::cout << "path: " << asset->get_path() << std::endl; + try{ + // Correct way to create a unique pointer for Text + std::unique_ptr label = std::make_unique(1, vec2(100, 100), vec2(0, 0), *asset); + }catch (const std::exception& e) { + std::cout << "Standard exception thrown: " << e.what() << std::endl; + } + + + return 0; } -- cgit v1.2.3 From 73f8d5c558ebc0820ede241e64a876ff1c5ccefb Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 07:57:24 +0100 Subject: seperat ints converted to float --- src/crepe/api/Button.cpp | 3 +- src/crepe/api/Button.h | 12 +------ src/crepe/api/Config.h | 4 +-- src/crepe/system/InputSystem.cpp | 77 ++++++++++++++++++---------------------- src/crepe/system/InputSystem.h | 10 +++--- src/test/InputTest.cpp | 4 +-- 6 files changed, 44 insertions(+), 66 deletions(-) (limited to 'src/crepe/api/Config.h') diff --git a/src/crepe/api/Button.cpp b/src/crepe/api/Button.cpp index 76f74f0..305922c 100644 --- a/src/crepe/api/Button.cpp +++ b/src/crepe/api/Button.cpp @@ -3,9 +3,8 @@ namespace crepe { Button::Button(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, - const std::function & on_click, bool is_toggle) + const std::function & on_click) : UIObject(id, dimensions, offset), - is_toggle(is_toggle), on_click(on_click) {} } // namespace crepe diff --git a/src/crepe/api/Button.h b/src/crepe/api/Button.h index 61b18d7..08f5dec 100644 --- a/src/crepe/api/Button.h +++ b/src/crepe/api/Button.h @@ -15,19 +15,11 @@ public: * \param id The unique ID of the game object associated with this button. * \param dimensions The width and height of the UIObject * \param offset The offset relative this GameObjects Transform - * \param is_toggle Optional flag to indicate if the button is a toggle button. Defaults to false. * \param on_click callback function that will be invoked when the button is clicked. */ Button(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, - const std::function & on_click, bool is_toggle = false); + const std::function & on_click); - /** - * \brief Indicates if the button is a toggle button (can be pressed and released). - * - * A toggle button allows for a pressed/released state, whereas a regular button - * typically only has an on-click state. - */ - bool is_toggle = false; // TODO: create separate toggle button class /** * \brief The callback function to be executed when the button is clicked. @@ -56,8 +48,6 @@ public: private: //! friend relation for is_pressed and hover variables friend class InputSystem; - //! Indicates whether the toggle button is pressed - bool is_pressed = false; //! Indicates whether the mouse is currently hovering over the button bool hover = false; diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index d2be3f3..324e639 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -89,8 +89,8 @@ public: //! Configuration for click tolerance. struct { //! The maximum number of pixels the mouse can move between MouseDown and MouseUp events to be considered a click. - int tolerance = 5; - } click_tolerance; + int click_tolerance = 5; + } input; }; } // namespace crepe diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index f5d8536..e76b1ec 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -2,7 +2,6 @@ #include "../api/Button.h" #include "../manager/ComponentManager.h" #include "../manager/EventManager.h" - #include "InputSystem.h" using namespace crepe; @@ -41,15 +40,15 @@ void InputSystem::update() { || event.event_type == SDLContext::EventType::MOUSEMOVE || event.event_type == SDLContext::EventType::MOUSEWHEEL) { - int adjusted_mouse_x = event.mouse_data.mouse_position.x + camera_origin.x; - int adjusted_mouse_y = event.mouse_data.mouse_position.y + camera_origin.y; - + ivec2 adjusted_mouse; + adjusted_mouse.x = event.mouse_data.mouse_position.x + camera_origin.x; + adjusted_mouse.y = event.mouse_data.mouse_position.y + camera_origin.y; // Check if the mouse is within the viewport bool mouse_in_viewport - = !(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); + = !(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); if (!mouse_in_viewport) continue; @@ -57,45 +56,44 @@ void InputSystem::update() { switch (event.event_type) { case SDLContext::EventType::MOUSEDOWN: event_mgr.queue_event({ - .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, .button = event.mouse_data.mouse_button, }); - this->last_mouse_down_position = {adjusted_mouse_x, adjusted_mouse_y}; + this->last_mouse_down_position = {adjusted_mouse.x, adjusted_mouse.y}; this->last_mouse_button = event.mouse_data.mouse_button; break; case SDLContext::EventType::MOUSEUP: { event_mgr.queue_event({ - .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, .button = event.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; + 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.mouse_data.mouse_button && std::abs(delta_x) <= click_tolerance && std::abs(delta_y) <= click_tolerance) { event_mgr.queue_event({ - .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, .button = event.mouse_data.mouse_button, }); - this->handle_click(event.mouse_data.mouse_button, adjusted_mouse_x, - adjusted_mouse_y); + this->handle_click(event.mouse_data.mouse_button, adjusted_mouse); } break; } case SDLContext::EventType::MOUSEMOVE: event_mgr.queue_event({ - .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, .mouse_delta = event.mouse_data.rel_mouse_move, }); - this->handle_move(event, adjusted_mouse_x, adjusted_mouse_y); + this->handle_move(event, adjusted_mouse); break; case SDLContext::EventType::MOUSEWHEEL: event_mgr.queue_event({ - .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, .scroll_direction = event.mouse_data.scroll_direction, .scroll_delta = event.mouse_data.scroll_delta, }); @@ -148,54 +146,57 @@ void InputSystem::update() { } void InputSystem::handle_move(const SDLContext::EventData & event_data, - const int adjusted_mouse_x, const int adjusted_mouse_y) { + const ivec2& mouse_pos) { ComponentManager & mgr = this->mediator.component_manager; RefVector