From 823935627c7743c36e1b832670f931d6a67abe2a Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 5 Dec 2024 16:24:45 +0100 Subject: save --- src/crepe/system/InputSystem.h | 84 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/crepe/system/InputSystem.h (limited to 'src/crepe/system') diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h new file mode 100644 index 0000000..0c42bd6 --- /dev/null +++ b/src/crepe/system/InputSystem.h @@ -0,0 +1,84 @@ +#pragma once + +#include "../facade/SDLContext.h" +#include "../types.h" +#include "../util/OptionalRef.h" + +#include "System.h" + +namespace crepe { + +class Camera; +class Button; +class Transform; + +/** + * \brief Handles the processing of input events created by SDLContext + * + * This system processes events such as mouse clicks, mouse movement, and keyboard + * actions. It is responsible for detecting interactions with UI buttons and + * passing the corresponding events to the registered listeners. + */ +class InputSystem : public System { +public: + using System::System; + + /** + * \brief Updates the system, processing all input events. + * This method processes all events and triggers corresponding actions. + */ + void update() override; + +private: + //! Stores the last position of the mouse when the button was pressed. + ivec2 last_mouse_down_position; + + //! 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. + const int click_tolerance = 5; + + /** + * \brief Handles the mouse click event. + * \param mouse_button The mouse button involved in the click. + * \param world_mouse_x The X coordinate of the mouse in world space. + * \param world_mouse_y The Y coordinate of the mouse in world space. + * + * This method processes the mouse click event and triggers the corresponding button action. + */ + void handle_click(const MouseButton & mouse_button, const int world_mouse_x, + const int world_mouse_y); + + /** + * \brief Handles the mouse movement event. + * \param event_data The event data containing information about the mouse movement. + * \param world_mouse_x The X coordinate of the mouse in world space. + * \param world_mouse_y The Y coordinate of the mouse in world space. + * + * This method processes the mouse movement event and updates the button hover state. + */ + void handle_move(const SDLContext::EventData & event_data, const int world_mouse_x, + const int world_mouse_y); + + /** + * \brief Checks if the mouse position is inside the bounds of the button. + * \param world_mouse_x The X coordinate of the mouse in world space. + * \param world_mouse_y The Y coordinate of the mouse in world space. + * \param button The button to check. + * \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 int world_mouse_x, const int world_mouse_y, + const Button & button, const Transform & transform); + + /** + * \brief Handles the button press event, calling the on_click callback if necessary. + * \param button The button being pressed. + * + * This method triggers the on_click action for the button when it is pressed. + */ + void handle_button_press(Button & button); +}; + +} // namespace crepe -- cgit v1.2.3 From fe8f985d2c7ea672a5f886d7d0df064f26bd2cb4 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sat, 7 Dec 2024 15:43:00 +0100 Subject: improved physics for AI --- src/crepe/api/Config.h | 2 +- src/crepe/system/AISystem.cpp | 2 +- src/crepe/system/CollisionSystem.cpp | 14 --------- src/crepe/system/PhysicsSystem.cpp | 57 +++++++++++++++++------------------- src/test/PhysicsTest.cpp | 2 +- 5 files changed, 30 insertions(+), 47 deletions(-) (limited to 'src/crepe/system') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index a9745c3..c31cf4a 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -63,7 +63,7 @@ public: * * Gravity value of game. */ - double gravity = 1; + float gravity = 1; } physics; //! default window settings diff --git a/src/crepe/system/AISystem.cpp b/src/crepe/system/AISystem.cpp index 55dc14c..324ee5f 100644 --- a/src/crepe/system/AISystem.cpp +++ b/src/crepe/system/AISystem.cpp @@ -130,7 +130,7 @@ vec2 AISystem::arrive(const AI & ai) { float distance = to_target.length(); if (distance > 0.0f) { float speed = distance / ai.arrive_deceleration; - speed = std::min(speed, rigidbody.data.max_linear_velocity.length()); + speed = std::min(speed, rigidbody.data.max_linear_velocity); vec2 desired_velocity = to_target * (speed / distance); return desired_velocity - rigidbody.data.linear_velocity; diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 6b1954e..0483693 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -182,11 +182,7 @@ CollisionSystem::collision_handler(CollisionInternal & data1, CollisionInternal vec2 collider_pos2 = this->get_current_position(collider2.offset, data2.transform, data2.rigidbody); resolution = this->get_circle_box_resolution(collider1, collider2, collider_pos1, -<<<<<<< HEAD collider_pos2); -======= - collider_pos2, false); ->>>>>>> 33a072db28d71ba65e59f9491abd42dbf9695fc4 break; } } @@ -272,12 +268,7 @@ vec2 CollisionSystem::get_circle_circle_resolution(const CircleCollider & circle vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_collider, const BoxCollider & box_collider, const vec2 & circle_position, -<<<<<<< HEAD const vec2 & box_position) const { -======= - const vec2 & box_position, - bool inverse) const { ->>>>>>> 33a072db28d71ba65e59f9491abd42dbf9695fc4 vec2 delta = circle_position - box_position; // Compute half-dimensions of the box @@ -299,11 +290,6 @@ vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_co // Compute penetration depth float penetration_depth = circle_collider.radius - distance; -<<<<<<< HEAD - -======= - if (inverse) collision_normal = -collision_normal; ->>>>>>> 33a072db28d71ba65e59f9491abd42dbf9695fc4 // Compute the resolution vector vec2 resolution = collision_normal * penetration_depth; diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp index ebf4439..ab77b35 100644 --- a/src/crepe/system/PhysicsSystem.cpp +++ b/src/crepe/system/PhysicsSystem.cpp @@ -11,11 +11,12 @@ using namespace crepe; void PhysicsSystem::update() { + double dt = LoopTimer::get_instance().get_delta_time(); ComponentManager & mgr = this->mediator.component_manager; RefVector rigidbodies = mgr.get_components_by_type(); RefVector transforms = mgr.get_components_by_type(); - double gravity = Config::get_instance().physics.gravity; + float gravity = Config::get_instance().physics.gravity; for (Rigidbody & rigidbody : rigidbodies) { if (!rigidbody.active) continue; @@ -28,17 +29,27 @@ void PhysicsSystem::update() { if (rigidbody.data.gravity_scale > 0) { rigidbody.data.linear_velocity.y += (rigidbody.data.mass * rigidbody.data.gravity_scale - * gravity); + * gravity * dt); } - // Add damping + // Add coefficient rotation if (rigidbody.data.angular_velocity_coefficient > 0) { rigidbody.data.angular_velocity - *= rigidbody.data.angular_velocity_coefficient; + *= std::pow(rigidbody.data.angular_velocity_coefficient, dt); + } - if (rigidbody.data.linear_velocity_coefficient.x > 0 - && rigidbody.data.linear_velocity_coefficient.y > 0) { - rigidbody.data.linear_velocity - *= rigidbody.data.linear_velocity_coefficient; + + // Add coefficient movement horizontal + if (rigidbody.data.linear_velocity_coefficient.x > 0) + { + rigidbody.data.linear_velocity.x + *= std::pow(rigidbody.data.linear_velocity_coefficient.x, dt); + } + + // Add coefficient movement horizontal + if (rigidbody.data.linear_velocity_coefficient.y > 0) + { + rigidbody.data.linear_velocity.y + *= std::pow(rigidbody.data.linear_velocity_coefficient.y, dt); } // Max velocity check @@ -51,40 +62,26 @@ void PhysicsSystem::update() { rigidbody.data.angular_velocity = -rigidbody.data.max_angular_velocity; } - - if (rigidbody.data.linear_velocity.x - > rigidbody.data.max_linear_velocity.x) { - rigidbody.data.linear_velocity.x - = rigidbody.data.max_linear_velocity.x; - } else if (rigidbody.data.linear_velocity.x - < -rigidbody.data.max_linear_velocity.x) { - rigidbody.data.linear_velocity.x - = -rigidbody.data.max_linear_velocity.x; - } - - if (rigidbody.data.linear_velocity.y - > rigidbody.data.max_linear_velocity.y) { - rigidbody.data.linear_velocity.y - = rigidbody.data.max_linear_velocity.y; - } else if (rigidbody.data.linear_velocity.y - < -rigidbody.data.max_linear_velocity.y) { - rigidbody.data.linear_velocity.y - = -rigidbody.data.max_linear_velocity.y; + + // Set max velocity to maximum length + if(rigidbody.data.linear_velocity.length() > rigidbody.data.max_linear_velocity) { + rigidbody.data.linear_velocity.normalize(); + rigidbody.data.linear_velocity *= rigidbody.data.max_linear_velocity; } // Move object if (!rigidbody.data.constraints.rotation) { - transform.rotation += rigidbody.data.angular_velocity; + transform.rotation += rigidbody.data.angular_velocity * dt; transform.rotation = std::fmod(transform.rotation, 360.0); if (transform.rotation < 0) { transform.rotation += 360.0; } } if (!rigidbody.data.constraints.x) { - transform.position.x += rigidbody.data.linear_velocity.x; + transform.position.x += rigidbody.data.linear_velocity.x * dt; } if (!rigidbody.data.constraints.y) { - transform.position.y += rigidbody.data.linear_velocity.y; + transform.position.y += rigidbody.data.linear_velocity.y * dt; } } } diff --git a/src/test/PhysicsTest.cpp b/src/test/PhysicsTest.cpp index 43d2931..4af34f5 100644 --- a/src/test/PhysicsTest.cpp +++ b/src/test/PhysicsTest.cpp @@ -27,7 +27,7 @@ public: .mass = 1, .gravity_scale = 1, .body_type = Rigidbody::BodyType::DYNAMIC, - .max_linear_velocity = vec2{10, 10}, + .max_linear_velocity = 10, .max_angular_velocity = 10, .constraints = {0, 0}, }); -- cgit v1.2.3 From 2b3f4ae6abcd88d89b0f6d0db8023b26ac3e9150 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sat, 7 Dec 2024 15:45:31 +0100 Subject: restore file --- src/crepe/system/CollisionSystem.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/crepe/system') diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 0483693..952ed0a 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -290,6 +290,7 @@ vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_co // Compute penetration depth float penetration_depth = circle_collider.radius - distance; + // Compute the resolution vector vec2 resolution = collision_normal * penetration_depth; -- cgit v1.2.3 From 3f4be8dd73792b8937cdba4934b8938be163ac7a Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sat, 7 Dec 2024 15:46:29 +0100 Subject: restored file --- src/crepe/system/CollisionSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/crepe/system') diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 952ed0a..44a0431 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -290,7 +290,7 @@ vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_co // Compute penetration depth float penetration_depth = circle_collider.radius - distance; - + // Compute the resolution vector vec2 resolution = collision_normal * penetration_depth; -- cgit v1.2.3 From 529e55a28a7e51bf3dd0f08fa9d6f0192445a7b4 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sat, 7 Dec 2024 19:26:12 +0100 Subject: fixed transform --- src/crepe/api/LoopManager.cpp | 8 +-- src/crepe/system/PhysicsSystem.cpp | 112 ++++++++++++++++++------------------- 2 files changed, 59 insertions(+), 61 deletions(-) (limited to 'src/crepe/system') diff --git a/src/crepe/api/LoopManager.cpp b/src/crepe/api/LoopManager.cpp index fec9f51..0c1caaa 100644 --- a/src/crepe/api/LoopManager.cpp +++ b/src/crepe/api/LoopManager.cpp @@ -37,10 +37,10 @@ void LoopManager::fixed_update() { // TODO: retrieve EventManager from direct member after singleton refactor EventManager & ev = this->mediator.event_manager; ev.dispatch_events(); - this->get_system().update(); - this->get_system().update(); - this->get_system().update(); - this->get_system().update(); + this->get_system().update(); // past velocity en locatie aan. + this->get_system().update(); // past velocity aan (2x) maxforce + this->get_system().update(); // past velocity aan en locatie + this->get_system().update(); // past velocity aan en locate } void LoopManager::loop() { diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp index ab77b35..7e66567 100644 --- a/src/crepe/system/PhysicsSystem.cpp +++ b/src/crepe/system/PhysicsSystem.cpp @@ -14,76 +14,74 @@ void PhysicsSystem::update() { double dt = LoopTimer::get_instance().get_delta_time(); ComponentManager & mgr = this->mediator.component_manager; RefVector rigidbodies = mgr.get_components_by_type(); - RefVector transforms = mgr.get_components_by_type(); + float gravity = Config::get_instance().physics.gravity; for (Rigidbody & rigidbody : rigidbodies) { if (!rigidbody.active) continue; + Transform & transform = mgr.get_components_by_id(rigidbody.game_object_id).front().get(); switch (rigidbody.data.body_type) { case Rigidbody::BodyType::DYNAMIC: - for (Transform & transform : transforms) { - if (transform.game_object_id == rigidbody.game_object_id) { - - // Add gravity - if (rigidbody.data.gravity_scale > 0) { - rigidbody.data.linear_velocity.y - += (rigidbody.data.mass * rigidbody.data.gravity_scale - * gravity * dt); - } - // Add coefficient rotation - if (rigidbody.data.angular_velocity_coefficient > 0) { - rigidbody.data.angular_velocity - *= std::pow(rigidbody.data.angular_velocity_coefficient, dt); - - } + if (transform.game_object_id == rigidbody.game_object_id) { + // Add gravity + if (rigidbody.data.gravity_scale > 0) { + rigidbody.data.linear_velocity.y + += (rigidbody.data.mass * rigidbody.data.gravity_scale + * gravity * dt); + } + // Add coefficient rotation + if (rigidbody.data.angular_velocity_coefficient > 0) { + rigidbody.data.angular_velocity + *= std::pow(rigidbody.data.angular_velocity_coefficient, dt); + + } - // Add coefficient movement horizontal - if (rigidbody.data.linear_velocity_coefficient.x > 0) - { - rigidbody.data.linear_velocity.x - *= std::pow(rigidbody.data.linear_velocity_coefficient.x, dt); - } + // Add coefficient movement horizontal + if (rigidbody.data.linear_velocity_coefficient.x > 0) + { + rigidbody.data.linear_velocity.x + *= std::pow(rigidbody.data.linear_velocity_coefficient.x, dt); + } - // Add coefficient movement horizontal - if (rigidbody.data.linear_velocity_coefficient.y > 0) - { - rigidbody.data.linear_velocity.y - *= std::pow(rigidbody.data.linear_velocity_coefficient.y, dt); - } + // Add coefficient movement horizontal + if (rigidbody.data.linear_velocity_coefficient.y > 0) + { + rigidbody.data.linear_velocity.y + *= std::pow(rigidbody.data.linear_velocity_coefficient.y, dt); + } - // Max velocity check - if (rigidbody.data.angular_velocity - > rigidbody.data.max_angular_velocity) { - rigidbody.data.angular_velocity - = rigidbody.data.max_angular_velocity; - } else if (rigidbody.data.angular_velocity - < -rigidbody.data.max_angular_velocity) { - rigidbody.data.angular_velocity - = -rigidbody.data.max_angular_velocity; - } - - // Set max velocity to maximum length - if(rigidbody.data.linear_velocity.length() > rigidbody.data.max_linear_velocity) { - rigidbody.data.linear_velocity.normalize(); - rigidbody.data.linear_velocity *= rigidbody.data.max_linear_velocity; - } + // Max velocity check + if (rigidbody.data.angular_velocity + > rigidbody.data.max_angular_velocity) { + rigidbody.data.angular_velocity + = rigidbody.data.max_angular_velocity; + } else if (rigidbody.data.angular_velocity + < -rigidbody.data.max_angular_velocity) { + rigidbody.data.angular_velocity + = -rigidbody.data.max_angular_velocity; + } + + // Set max velocity to maximum length + if(rigidbody.data.linear_velocity.length() > rigidbody.data.max_linear_velocity) { + rigidbody.data.linear_velocity.normalize(); + rigidbody.data.linear_velocity *= rigidbody.data.max_linear_velocity; + } - // Move object - if (!rigidbody.data.constraints.rotation) { - transform.rotation += rigidbody.data.angular_velocity * dt; - transform.rotation = std::fmod(transform.rotation, 360.0); - if (transform.rotation < 0) { - transform.rotation += 360.0; - } - } - if (!rigidbody.data.constraints.x) { - transform.position.x += rigidbody.data.linear_velocity.x * dt; - } - if (!rigidbody.data.constraints.y) { - transform.position.y += rigidbody.data.linear_velocity.y * dt; + // Move object + if (!rigidbody.data.constraints.rotation) { + transform.rotation += rigidbody.data.angular_velocity * dt; + transform.rotation = std::fmod(transform.rotation, 360.0); + if (transform.rotation < 0) { + transform.rotation += 360.0; } } + if (!rigidbody.data.constraints.x) { + transform.position.x += rigidbody.data.linear_velocity.x * dt; + } + if (!rigidbody.data.constraints.y) { + transform.position.y += rigidbody.data.linear_velocity.y * dt; + } } break; case Rigidbody::BodyType::KINEMATIC: -- cgit v1.2.3 From 9b4f6f24f29e8873a14989ba8c9fccfbc460af7f Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sat, 7 Dec 2024 20:42:38 +0100 Subject: use fixed delta time --- src/crepe/api/LoopTimer.h | 19 ++++++++++--------- src/crepe/system/AISystem.cpp | 2 +- src/crepe/system/PhysicsSystem.cpp | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) (limited to 'src/crepe/system') diff --git a/src/crepe/api/LoopTimer.h b/src/crepe/api/LoopTimer.h index 9393439..8d0b2f9 100644 --- a/src/crepe/api/LoopTimer.h +++ b/src/crepe/api/LoopTimer.h @@ -58,6 +58,16 @@ public: * \param game_scale The desired game scale (0 = pause, 1 = normal speed, > 1 = speed up). */ void set_game_scale(double game_scale); + + /** + * \brief Get the fixed delta time for consistent updates. + * + * Fixed delta time is used for operations that require uniform time steps, such as physics + * calculations. + * + * \return Fixed delta time in seconds. + */ + double get_fixed_delta_time() const; private: friend class LoopManager; @@ -77,15 +87,6 @@ private: */ void enforce_frame_rate(); - /** - * \brief Get the fixed delta time for consistent updates. - * - * Fixed delta time is used for operations that require uniform time steps, such as physics - * calculations. - * - * \return Fixed delta time in seconds. - */ - double get_fixed_delta_time() const; /** * \brief Get the accumulated lag in the game loop. diff --git a/src/crepe/system/AISystem.cpp b/src/crepe/system/AISystem.cpp index 324ee5f..64e93fc 100644 --- a/src/crepe/system/AISystem.cpp +++ b/src/crepe/system/AISystem.cpp @@ -17,7 +17,7 @@ void AISystem::update() { ComponentManager & mgr = mediator.component_manager; RefVector ai_components = mgr.get_components_by_type(); - double dt = LoopTimer::get_instance().get_delta_time(); + double dt = LoopTimer::get_instance().get_fixed_delta_time(); for (AI & ai : ai_components) { RefVector rigidbodies diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp index 7e66567..be768f9 100644 --- a/src/crepe/system/PhysicsSystem.cpp +++ b/src/crepe/system/PhysicsSystem.cpp @@ -11,7 +11,7 @@ using namespace crepe; void PhysicsSystem::update() { - double dt = LoopTimer::get_instance().get_delta_time(); + double dt = LoopTimer::get_instance().get_fixed_delta_time(); ComponentManager & mgr = this->mediator.component_manager; RefVector rigidbodies = mgr.get_components_by_type(); -- cgit v1.2.3 From a597b0059f30e9d56331c6ece34fdcabb4028616 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 9 Dec 2024 20:15:41 +0100 Subject: making rendering fonts and UI --- src/crepe/facade/SDLContext.cpp | 43 +++++++++++++++++++++++++++++--------- src/crepe/facade/SDLContext.h | 10 ++++++++- src/crepe/system/RenderSystem.cpp | 4 ++-- src/crepe/system/RenderSystem.h | 2 +- src/example/rendering_particle.cpp | 18 ++++++++++++++-- 5 files changed, 61 insertions(+), 16 deletions(-) (limited to 'src/crepe/system') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 6becf60..297763d 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include #include #include @@ -62,6 +64,10 @@ SDLContext::SDLContext() { if (!(IMG_Init(img_flags) & img_flags)) { throw runtime_error("SDLContext: SDL_image could not initialize!"); } + + if (TTF_Init() != 0) { + throw runtime_error("SDLContext: TTF could not initialize!"); + } } SDLContext::~SDLContext() { @@ -73,6 +79,7 @@ SDLContext::~SDLContext() { // TODO: how are we going to ensure that these are called from the same // thread that SDL_Init() was called on? This has caused problems for me // before. + TTF_Quit(); IMG_Quit(); SDL_Quit(); } @@ -281,10 +288,9 @@ void SDLContext::draw(const RenderContext & ctx) { &dstrect, angle, NULL, render_flip); } -SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { +SDLContext::CameraValues & SDLContext::set_camera(const Camera & cam) { const Camera::Data & cam_data = cam.data; - CameraValues ret_cam; // resize window int w, h; SDL_GetWindowSize(this->game_window.get(), &w, &h); @@ -292,9 +298,9 @@ SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { SDL_SetWindowSize(this->game_window.get(), cam.screen.x, cam.screen.y); } - vec2 & zoomed_viewport = ret_cam.zoomed_viewport; - vec2 & bar_size = ret_cam.bar_size; - vec2 & render_scale = ret_cam.render_scale; + vec2 & zoomed_viewport = this->camera_val.zoomed_viewport; + vec2 & bar_size = this->camera_val.bar_size; + vec2 & render_scale = this->camera_val.render_scale; zoomed_viewport = cam.viewport_size * cam_data.zoom; float screen_aspect = static_cast(cam.screen.x) / cam.screen.y; @@ -337,7 +343,7 @@ SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { // fill bg color SDL_RenderFillRect(this->game_renderer.get(), &bg); - return ret_cam; + return this->camera_val; } uint64_t SDLContext::get_ticks() const { return SDL_GetTicks64(); } @@ -366,6 +372,19 @@ SDLContext::texture_from_path(const std::string & path) { return img_texture; } +std::unique_ptr> +SDLContext::font_from_path(const std::string & path) { + + TTF_Font * lib_font = TTF_OpenFont(path.c_str(), 72); + if (!lib_font) { + throw runtime_error(format("SDLContext: font cannot be load from {}", path)); + } + std::unique_ptr> font; + font = {lib_font, [](TTF_Font * f){}}; + + return font; +} + ivec2 SDLContext::get_size(const Texture & ctx) { ivec2 size; SDL_QueryTexture(ctx.texture.get(), NULL, NULL, &size.x, &size.y); @@ -377,7 +396,11 @@ void SDLContext::delay(int ms) const { SDL_Delay(ms); } std::vector SDLContext::get_events() { std::vector event_list; SDL_Event event; + const CameraValues & cam = this->camera_val; while (SDL_PollEvent(&event)) { + 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; switch (event.type) { case SDL_QUIT: event_list.push_back(EventData{ @@ -401,7 +424,7 @@ std::vector SDLContext::get_events() { event_list.push_back(EventData{ .event_type = SDLContext::EventType::MOUSEDOWN, .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, + .mouse_position = mouse_pos, }); break; case SDL_MOUSEBUTTONUP: { @@ -410,21 +433,21 @@ std::vector SDLContext::get_events() { event_list.push_back(EventData{ .event_type = SDLContext::EventType::MOUSEUP, .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, + .mouse_position = mouse_pos, }); } break; case SDL_MOUSEMOTION: { event_list.push_back( EventData{.event_type = SDLContext::EventType::MOUSEMOVE, - .mouse_position = {event.motion.x, event.motion.y}, + .mouse_position = mouse_pos, .rel_mouse_move = {event.motion.xrel, event.motion.yrel}}); } break; case SDL_MOUSEWHEEL: { event_list.push_back(EventData{ .event_type = SDLContext::EventType::MOUSEWHEEL, - .mouse_position = {event.motion.x, event.motion.y}, + .mouse_position = mouse_pos, // TODO: why is this needed? .scroll_direction = event.wheel.y < 0 ? -1 : 1, .scroll_delta = event.wheel.preciseY, diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index e232511..b847c72 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -188,6 +189,9 @@ private: */ ivec2 get_size(const Texture & ctx); + std::unique_ptr> + font_from_path(const std::string & path); + private: //! Will use draw,clear_screen, present_screen, camera. friend class RenderSystem; @@ -198,6 +202,8 @@ private: */ void draw(const RenderContext & ctx); + void draw_text(const + //! Clears the screen, preparing for a new frame. void clear_screen(); @@ -208,7 +214,7 @@ private: * \brief sets the background of the camera (will be adjusted in future PR) * \param camera Reference to the Camera object. */ - CameraValues set_camera(const Camera & camera); + CameraValues & set_camera(const Camera & camera); private: //! the data needed to construct a sdl dst rectangle @@ -254,6 +260,8 @@ private: //! black bars rectangle to draw SDL_FRect black_bars[2] = {}; + + CameraValues camera_val; }; } // namespace crepe diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 26f2c85..74fed26 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -27,7 +27,7 @@ void RenderSystem::present_screen() { ctx.present_screen(); } -SDLContext::CameraValues RenderSystem::update_camera() { +SDLContext::CameraValues & RenderSystem::update_camera() { ComponentManager & mgr = this->mediator.component_manager; SDLContext & ctx = this->mediator.sdl_context; RefVector cameras = mgr.get_components_by_type(); @@ -38,7 +38,7 @@ SDLContext::CameraValues RenderSystem::update_camera() { if (!cam.active) continue; const Transform & transform = mgr.get_components_by_id(cam.game_object_id).front().get(); - SDLContext::CameraValues cam_val = ctx.set_camera(cam); + SDLContext::CameraValues & cam_val = ctx.set_camera(cam); cam_val.cam_pos = transform.position + cam.data.postion_offset; return cam_val; } diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index e270a6b..de26aa8 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -37,7 +37,7 @@ private: void present_screen(); //! Updates the active camera used for rendering. - SDLContext::CameraValues update_camera(); + SDLContext::CameraValues & update_camera(); //! Renders the whole screen void render(); diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 29d475d..b57ba04 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -1,3 +1,4 @@ +#include "api/Button.h" #include #include #include @@ -12,6 +13,8 @@ #include #include #include +#include +#include using namespace crepe; using namespace std; @@ -57,7 +60,7 @@ public: .order_in_layer = 2, .size = {0, 100}, .angle_offset = 0, - .position_offset = {100, 0}, + .position_offset = {0, 0}, }); auto & anim = game_object.add_component(test_sprite, 4, 4, @@ -66,12 +69,23 @@ public: .looping = false, }); anim.set_anim(2); - anim.active = false; + anim.pause(); auto & cam = game_object.add_component(ivec2{1280, 720}, vec2{400, 400}, Camera::Data{ .bg_color = Color::WHITE, }); + + function on_click = [&](){ cout << "button clicked" << std::endl; }; + function on_enter = [&](){ cout << "enter" << std::endl; }; + function on_exit = [&](){ cout << "exit" << std::endl; }; + + auto & button = game_object.add_component