From 289ecc3a3829e9b3acff0b1778f75bc526173977 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Sat, 7 Dec 2024 19:14:34 +0100
Subject: changed double to float

---
 src/crepe/Particle.cpp              |  4 ++--
 src/crepe/Particle.h                |  8 ++++----
 src/crepe/api/ParticleEmitter.cpp   |  5 +++--
 src/crepe/api/ParticleEmitter.h     | 29 +++++++++++++++-------------
 src/crepe/system/ParticleSystem.cpp | 38 ++++++++++++++++++-------------------
 src/crepe/system/ParticleSystem.h   |  6 +++---
 6 files changed, 47 insertions(+), 43 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/Particle.cpp b/src/crepe/Particle.cpp
index 485a0d4..ce000a1 100644
--- a/src/crepe/Particle.cpp
+++ b/src/crepe/Particle.cpp
@@ -2,8 +2,8 @@
 
 using namespace crepe;
 
-void Particle::reset(uint32_t lifespan, const vec2 & position, const vec2 & velocity,
-					 double angle) {
+void Particle::reset(unsigned int lifespan, const vec2 & position, const vec2 & velocity,
+					 float angle) {
 	// Initialize the particle state
 	this->time_in_life = 0;
 	this->lifespan = lifespan;
diff --git a/src/crepe/Particle.h b/src/crepe/Particle.h
index d0397c9..4fa93a1 100644
--- a/src/crepe/Particle.h
+++ b/src/crepe/Particle.h
@@ -24,13 +24,13 @@ public:
 	//! Accumulated force affecting the particle over time.
 	vec2 force_over_time;
 	//! Total lifespan of the particle in milliseconds.
-	uint32_t lifespan;
+	unsigned int lifespan;
 	//! Active state of the particle; true if it is in use, false otherwise.
 	bool active = false;
 	//! The time the particle has been alive, in milliseconds.
-	uint32_t time_in_life = 0;
+	unsigned int time_in_life = 0;
 	//! The angle at which the particle is oriented or moving.
-	double angle = 0;
+	float angle = 0;
 
 	/**
 	 * \brief Resets the particle with new properties.
@@ -43,7 +43,7 @@ public:
 	 * \param velocity  The initial velocity of the particle.
 	 * \param angle     The angle of the particle's trajectory or orientation.
 	 */
-	void reset(uint32_t lifespan, const vec2 & position, const vec2 & velocity, double angle);
+	void reset(unsigned int lifespan, const vec2 & position, const vec2 & velocity, float angle);
 	/**
 	 * \brief Updates the particle's state.
 	 *
diff --git a/src/crepe/api/ParticleEmitter.cpp b/src/crepe/api/ParticleEmitter.cpp
index 90b77a0..1cfdceb 100644
--- a/src/crepe/api/ParticleEmitter.cpp
+++ b/src/crepe/api/ParticleEmitter.cpp
@@ -1,10 +1,11 @@
 #include "ParticleEmitter.h"
+#include "api/Sprite.h"
 
 using namespace crepe;
 
-ParticleEmitter::ParticleEmitter(game_object_id_t game_object_id, const Data & data)
+ParticleEmitter::ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite, const Data & data)
 	: Component(game_object_id),
-	  data(data) {
+	  sprite(sprite), data(data) {
 	for (size_t i = 0; i < this->data.max_particles; i++) {
 		this->data.particles.emplace_back();
 	}
diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h
index b83fd61..e8fa15e 100644
--- a/src/crepe/api/ParticleEmitter.h
+++ b/src/crepe/api/ParticleEmitter.h
@@ -1,5 +1,6 @@
 #pragma once
 
+#include <cmath>
 #include <vector>
 
 #include "Component.h"
@@ -26,15 +27,18 @@ public:
 	 */
 	struct Boundary {
 		//! boundary width (midpoint is emitter location)
-		double width = 0.0;
+		float width = INFINITY;
 		//! boundary height (midpoint is emitter location)
-		double height = 0.0;
+		float height = INFINITY;
 		//! boundary offset from particle emitter location
 		vec2 offset;
 		//! reset on exit or stop velocity and set max postion
 		bool reset_on_exit = false;
 	};
 
+	//! sprite reference of displayed sprite
+	const Sprite & sprite;
+
 	/**
 	 * \brief Holds parameters that control particle emission.
 	 *
@@ -45,29 +49,28 @@ public:
 		//! position of the emitter
 		vec2 position;
 		//! maximum number of particles
-		const unsigned int max_particles = 0;
+		const unsigned int max_particles = 256;
 		//! rate of particle emission per update (Lowest value = 0.001 any lower is ignored)
-		double emission_rate = 0;
+		float emission_rate = 1;
 		//! min speed of the particles
-		double min_speed = 0;
+		float min_speed = 1;
 		//! min speed of the particles
-		double max_speed = 0;
+		float max_speed = 2;
 		//! min angle of particle emission
-		double min_angle = 0;
+		float min_angle = 0;
 		//! max angle of particle emission
-		double max_angle = 0;
+		float max_angle = 0;
 		//! begin Lifespan of particle (only visual)
-		double begin_lifespan = 0.0;
+		float begin_lifespan = 0.0;
 		//! end Lifespan of particle
-		double end_lifespan = 0.0;
+		float end_lifespan = 10.0;
 		//! force over time (physics)
 		vec2 force_over_time;
 		//! particle boundary
 		Boundary boundary;
 		//! collection of particles
 		std::vector<Particle> particles;
-		//! sprite reference
-		const Sprite & sprite;
+		
 	};
 
 public:
@@ -75,7 +78,7 @@ public:
 	 * \param game_object_id  Identifier for the game object using this emitter.
 	 * \param data            Configuration data defining particle properties.
 	 */
-	ParticleEmitter(game_object_id_t game_object_id, const Data & data);
+	ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite,const Data & data);
 
 public:
 	//! Configuration data for particle emission settings.
diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index b14c52f..596b4b0 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -21,9 +21,9 @@ void ParticleSystem::update() {
 			= mgr.get_components_by_id<Transform>(emitter.game_object_id).front().get();
 
 		// Emit particles based on emission_rate
-		int updates = calculate_update(this->update_count, emitter.data.emission_rate);
+		int updates = this->calculate_update(this->update_count, emitter.data.emission_rate);
 		for (size_t i = 0; i < updates; i++) {
-			emit_particle(emitter, transform);
+			this->emit_particle(emitter, transform);
 		}
 
 		// Update all particles
@@ -34,7 +34,7 @@ void ParticleSystem::update() {
 		}
 
 		// Check if within boundary
-		check_bounds(emitter, transform);
+		this->check_bounds(emitter, transform);
 	}
 
 	this->update_count = (this->update_count + 1) % this->MAX_UPDATE_COUNT;
@@ -61,9 +61,9 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform &
 	}
 }
 
-int ParticleSystem::calculate_update(int count, double emission) const {
-	double integer_part = std::floor(emission);
-	double fractional_part = emission - integer_part;
+int ParticleSystem::calculate_update(int count, float emission) const {
+	float integer_part = std::floor(emission);
+	float fractional_part = emission - integer_part;
 
 	if (fractional_part > 0) {
 		int denominator = static_cast<int>(1.0 / fractional_part);
@@ -75,13 +75,13 @@ int ParticleSystem::calculate_update(int count, double emission) const {
 
 void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & transform) {
 	vec2 offset = emitter.data.boundary.offset + transform.position + emitter.data.position;
-	double half_width = emitter.data.boundary.width / 2.0;
-	double half_height = emitter.data.boundary.height / 2.0;
+	float half_width = emitter.data.boundary.width / 2.0;
+	float half_height = emitter.data.boundary.height / 2.0;
 
-	const double LEFT = offset.x - half_width;
-	const double RIGHT = offset.x + half_width;
-	const double TOP = offset.y - half_height;
-	const double BOTTOM = offset.y + half_height;
+	const float LEFT = offset.x - half_width;
+	const float RIGHT = offset.x + half_width;
+	const float TOP = offset.y - half_height;
+	const float BOTTOM = offset.y + half_height;
 
 	for (Particle & particle : emitter.data.particles) {
 		const vec2 & position = particle.position;
@@ -102,25 +102,25 @@ void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & t
 	}
 }
 
-double ParticleSystem::generate_random_angle(double min_angle, double max_angle) const {
+float ParticleSystem::generate_random_angle(float min_angle, float max_angle) const {
 	if (min_angle == max_angle) {
 		return min_angle;
 	} else if (min_angle < max_angle) {
 		return min_angle
-			   + static_cast<double>(std::rand() % static_cast<int>(max_angle - min_angle));
+			   + static_cast<float>(std::rand() % static_cast<int>(max_angle - min_angle));
 	} else {
-		double angle_offset = (360 - min_angle) + max_angle;
-		double random_angle
-			= min_angle + static_cast<double>(std::rand() % static_cast<int>(angle_offset));
+		float angle_offset = (360 - min_angle) + max_angle;
+		float random_angle
+			= min_angle + static_cast<float>(std::rand() % static_cast<int>(angle_offset));
 		return (random_angle >= 360) ? random_angle - 360 : random_angle;
 	}
 }
 
-double ParticleSystem::generate_random_speed(double min_speed, double max_speed) const {
+float ParticleSystem::generate_random_speed(float min_speed, float max_speed) const {
 	if (min_speed == max_speed) {
 		return min_speed;
 	} else {
 		return min_speed
-			   + static_cast<double>(std::rand() % static_cast<int>(max_speed - min_speed));
+			   + static_cast<float>(std::rand() % static_cast<int>(max_speed - min_speed));
 	}
 }
diff --git a/src/crepe/system/ParticleSystem.h b/src/crepe/system/ParticleSystem.h
index 068f01c..2adb0f0 100644
--- a/src/crepe/system/ParticleSystem.h
+++ b/src/crepe/system/ParticleSystem.h
@@ -39,7 +39,7 @@ private:
 	 * \param emission Emission rate.
 	 * \return The number of particles to emit.
 	 */
-	int calculate_update(int count, double emission) const;
+	int calculate_update(int count, float emission) const;
 
 	/**
 	 * \brief Checks whether particles are within the emitter’s boundary, resets or stops
@@ -57,7 +57,7 @@ private:
 	 * \param max_angle Maximum emission angle in degrees.
 	 * \return Random angle in degrees.
 	 */
-	double generate_random_angle(double min_angle, double max_angle) const;
+	float generate_random_angle(float min_angle, float max_angle) const;
 
 	/**
 	 * \brief Generates a random speed for particle emission within the specified range.
@@ -66,7 +66,7 @@ private:
 	 * \param max_speed Maximum emission speed.
 	 * \return Random speed.
 	 */
-	double generate_random_speed(double min_speed, double max_speed) const;
+	float generate_random_speed(float min_speed, float max_speed) const;
 
 private:
 	//! Counter to count updates to determine how many times emit_particle is
-- 
cgit v1.2.3


From 666292e33d6997a61d9eaff31e8180a602656474 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Sat, 7 Dec 2024 20:39:19 +0100
Subject: save

---
 src/crepe/api/Event.h            |  97 ++++---
 src/crepe/api/Transform.h        |   8 +
 src/crepe/facade/SDLContext.cpp  | 134 +++++----
 src/crepe/facade/SDLContext.h    |  35 ++-
 src/crepe/system/InputSystem.cpp | 102 ++++---
 src/test/EventTest.cpp           |  39 ++-
 src/test/InputTest.cpp           | 586 +++++++++++++++++++--------------------
 7 files changed, 550 insertions(+), 451 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h
index f2f3daf..265e925 100644
--- a/src/crepe/api/Event.h
+++ b/src/crepe/api/Event.h
@@ -4,7 +4,7 @@
 #include <string>
 
 #include "KeyCodes.h"
-
+#include "types.h"
 namespace crepe {
 
 /**
@@ -38,11 +38,8 @@ public:
  */
 class MousePressEvent : public Event {
 public:
-	//! X-coordinate of the mouse position at the time of the event.
-	int mouse_x = 0;
-
-	//! Y-coordinate of the mouse position at the time of the event.
-	int mouse_y = 0;
+	//! mouse position
+	ivec2 mouse_pos = {0,0};
 
 	//! The mouse button that was pressed.
 	MouseButton button = MouseButton::NONE;
@@ -53,11 +50,8 @@ public:
  */
 class MouseClickEvent : public Event {
 public:
-	//! X-coordinate of the mouse position at the time of the event.
-	int mouse_x = 0;
-
-	//! Y-coordinate of the mouse position at the time of the event.
-	int mouse_y = 0;
+	//! mouse position
+	ivec2 mouse_pos = {0,0};
 
 	//! The mouse button that was clicked.
 	MouseButton button = MouseButton::NONE;
@@ -68,11 +62,8 @@ public:
  */
 class MouseReleaseEvent : public Event {
 public:
-	//! X-coordinate of the mouse position at the time of the event.
-	int mouse_x = 0;
-
-	//! Y-coordinate of the mouse position at the time of the event.
-	int mouse_y = 0;
+	//! mouse position
+	ivec2 mouse_pos = {0,0};
 
 	//! The mouse button that was released.
 	MouseButton button = MouseButton::NONE;
@@ -83,17 +74,10 @@ public:
  */
 class MouseMoveEvent : public Event {
 public:
-	//! X-coordinate of the mouse position at the time of the event.
-	int mouse_x = 0;
-
-	//! Y-coordinate of the mouse position at the time of the event.
-	int mouse_y = 0;
-
-	// Movement since last event in x
-	int delta_x = 0;
-
-	// Movement since last event in y
-	int delta_y = 0;
+	//! new mouse position
+	ivec2 mouse_pos = {0,0};
+	//! The change in mouse position relative to the last position (in pixels).
+	ivec2 mouse_delta = {0,0};
 };
 
 /**
@@ -101,12 +85,8 @@ public:
  */
 class MouseScrollEvent : public Event {
 public:
-	//! X-coordinate of the mouse position at the time of the event.
-	int mouse_x = 0;
-
-	//! Y-coordinate of the mouse position at the time of the event.
-	int mouse_y = 0;
-
+	//! mouse position when the scroll happened.
+	ivec2 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).
@@ -127,4 +107,55 @@ public:
  */
 class ShutDownEvent : public Event {};
 
+/**
+ * \brief Event triggered to indicate the window is overlapped by another window.
+ * 
+ * When two windows overlap the bottom window gets distorted and that window has to be redrawn.
+ */
+class WindowExposeEvent : public Event{};
+
+/**
+ * \brief Event triggered to indicate the window is resized.
+ */
+class WindowResizeEvent : public Event{
+	public:
+	//! new window dimensions
+	ivec2 dimensions = {0,0};
+};
+
+/**
+ * \brief Event triggered to indicate the window is moved.
+ */
+class WindowMoveEvent : public Event{
+	public:
+	//! The change in position relative to the last position (in pixels).
+	ivec2 delta_move = {0,0};
+};
+
+/**
+ * \brief Event triggered to indicate the window is minimized.
+ */
+class WindowMinimizeEvent : public Event{};
+
+/**
+ * \brief Event triggered to indicate the window is maximized
+ */
+class WindowMaximizeEvent : public Event{};
+
+/**
+ * \brief Event triggered to indicate the window gained focus
+ * 
+ * This event is triggered when the window receives focus, meaning it becomes the active window
+ * for user interaction.
+ */
+class WindowFocusGainEvent : public Event{};
+
+/**
+ * \brief Event triggered to indicate the window lost focus
+ * 
+ * This event is triggered when the window loses focus, meaning it is no longer the active window
+ * for user interaction.
+ */
+class WindowFocusLostEvent : public Event{};
+
 } // namespace crepe
diff --git a/src/crepe/api/Transform.h b/src/crepe/api/Transform.h
index 7ee6d65..78407ee 100644
--- a/src/crepe/api/Transform.h
+++ b/src/crepe/api/Transform.h
@@ -13,6 +13,14 @@ namespace crepe {
  */
 class Transform : public Component {
 public:
+	//! Specifies the coordinate space for transformations.
+	enum Space { 
+		//! coordinates are relative to the active camera
+		HUD, 
+		//! coordinates are relative to the game world
+		WORLD,
+	};
+	Space coordinate_space = Space::WORLD;
 	//! Translation (shift)
 	vec2 position = {0, 0};
 	//! Rotation, in degrees clockwise
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 4cc2206..e3410cb 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -375,65 +375,83 @@ ivec2 SDLContext::get_size(const Texture & ctx) {
 void SDLContext::delay(int ms) const { SDL_Delay(ms); }
 
 std::vector<SDLContext::EventData> SDLContext::get_events() {
-	std::vector<SDLContext::EventData> event_list;
-	SDL_Event event;
-	while (SDL_PollEvent(&event)) {
-		switch (event.type) {
-			case SDL_QUIT:
-				event_list.push_back(EventData{
-					.event_type = SDLContext::EventType::SHUTDOWN,
-				});
-				break;
-			case SDL_KEYDOWN:
-				event_list.push_back(EventData{
-					.event_type = SDLContext::EventType::KEYDOWN,
-					.key = sdl_to_keycode(event.key.keysym.scancode),
-					.key_repeat = (event.key.repeat != 0),
-				});
-				break;
-			case SDL_KEYUP:
-				event_list.push_back(EventData{
-					.event_type = SDLContext::EventType::KEYUP,
-					.key = sdl_to_keycode(event.key.keysym.scancode),
-				});
-				break;
-			case SDL_MOUSEBUTTONDOWN:
-				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},
-				});
-				break;
-			case SDL_MOUSEBUTTONUP: {
-				int x, y;
-				SDL_GetMouseState(&x, &y);
-				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},
-				});
-			} break;
-
-			case SDL_MOUSEMOTION: {
-				event_list.push_back(
-					EventData{.event_type = SDLContext::EventType::MOUSEMOVE,
-							  .mouse_position = {event.motion.x, event.motion.y},
-							  .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},
-					// TODO: why is this needed?
-					.scroll_direction = event.wheel.y < 0 ? -1 : 1,
-					.scroll_delta = event.wheel.preciseY,
-				});
-			} break;
-		}
-	}
-	return event_list;
+    std::vector<SDLContext::EventData> event_list;
+    SDL_Event event;
+
+    // Handle general SDL events
+    while (SDL_PollEvent(&event)) {
+        switch (event.type) {
+            case SDL_QUIT:
+                event_list.push_back({SDLContext::EventType::SHUTDOWN, {}, {}, {}});
+                break;
+            case SDL_KEYDOWN:
+                event_list.push_back({SDLContext::EventType::KEYDOWN, 
+                                      {sdl_to_keycode(event.key.keysym.scancode), event.key.repeat != 0}, {}, {}});
+                break;
+            case SDL_KEYUP:
+                event_list.push_back({SDLContext::EventType::KEYUP, 
+                                      {sdl_to_keycode(event.key.keysym.scancode), false}, {}, {}});
+                break;
+            case SDL_MOUSEBUTTONDOWN:
+                event_list.push_back({SDLContext::EventType::MOUSEDOWN, {}, 
+                                      {sdl_to_mousebutton(event.button.button), {event.button.x, event.button.y}}, {}});
+                break;
+            case SDL_MOUSEBUTTONUP:
+                event_list.push_back({SDLContext::EventType::MOUSEUP, {}, 
+                                      {sdl_to_mousebutton(event.button.button), {event.button.x, event.button.y}}, {}});
+                break;
+            case SDL_MOUSEMOTION:
+                event_list.push_back({SDLContext::EventType::MOUSEMOVE, {}, 
+                                      {{}, {event.motion.x, event.motion.y}, -1, INFINITY, {event.motion.xrel, event.motion.yrel}}, {}});
+                break;
+            case SDL_MOUSEWHEEL:
+                event_list.push_back({SDLContext::EventType::MOUSEWHEEL, {}, 
+                                      {{}, {}, event.wheel.y < 0 ? -1 : 1, event.wheel.preciseY, {}}, {}});
+                break;
+
+            // Forward window events for further processing
+            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;
+    }
 }
+
+
+
+
 void SDLContext::set_color_texture(const Texture & texture, const Color & color) {
 	SDL_SetTextureColorMod(texture.texture.get(), color.r, color.g, color.b);
 	SDL_SetTextureAlphaMod(texture.texture.get(), color.a);
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index e232511..1f83985 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -79,19 +79,37 @@ public:
 		KEYUP,
 		KEYDOWN,
 		SHUTDOWN,
-
+		WINDOW_MINIMIZE,
+		WINDOW_MAXIMIZE,
+		WINDOW_FOCUS_GAIN,
+		WINDOW_FOCUS_LOST,
+		WINDOW_MOVE,
+		WINDOW_RESIZE,
+		WINDOW_EXPOSE,
 	};
-	//! EventData struct for passing event data from facade
-	struct EventData {
-		SDLContext::EventType event_type = SDLContext::EventType::NONE;
+	struct KeyData{
 		Keycode key = Keycode::NONE;
 		bool key_repeat = false;
+	};
+	struct MouseData{
 		MouseButton mouse_button = MouseButton::NONE;
 		ivec2 mouse_position = {-1, -1};
 		int scroll_direction = -1;
 		float scroll_delta = INFINITY;
 		ivec2 rel_mouse_move = {-1, -1};
 	};
+	struct WindowData{
+		ivec2 move_delta;
+		ivec2 resize_dimension;
+	};
+	//! EventData struct for passing event data from facade
+	struct EventData {
+		SDLContext::EventType event_type = SDLContext::EventType::NONE;
+		KeyData key_data;
+		MouseData mouse_data;
+		WindowData window_data;
+	};
+	
 	/**
 	 * \brief Gets the singleton instance of SDLContext.
 	 * \return Reference to the SDLContext instance.
@@ -116,7 +134,14 @@ private:
 	 * \return Events that occurred since last call to `get_events()`
 	 */
 	std::vector<SDLContext::EventData> get_events();
-
+	/**
+	 * \brief Fills event_list with triggered window events
+	 *
+	 * This method checks if any window events are triggered and adds them to the event_list.
+	 *
+	 */
+	void handle_window_event(const SDL_WindowEvent& window_event,
+                                     std::vector<SDLContext::EventData>& event_list);
 	/**
 	 * \brief Converts an SDL key code to the custom Keycode type.
 	 *
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp
index aaa8bdf..b7d2eb4 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -26,29 +26,31 @@ void InputSystem::update() {
 	Transform & cam_transform = transform_vec.front().get();
 	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
+	int camera_origin_y = 
+	ivec2 camera_origin;
+	camera_origin.y = cam_transform.position.y + current_cam.data.postion_offset.y
 						  - (current_cam.viewport_size.y / 2);
-
+	camera_origin
 	for (const SDLContext::EventData & event : event_list) {
-		int world_mouse_x = event.mouse_position.x + camera_origin_x;
-		int world_mouse_y = event.mouse_position.y + camera_origin_y;
+		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;
 		// 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);
+			= !(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);
 
 		switch (event.event_type) {
 			case SDLContext::EventType::KEYDOWN:
 				event_mgr.queue_event<KeyPressEvent>(KeyPressEvent{
-					.repeat = event.key_repeat,
-					.key = event.key,
+					.repeat = event.key_data.key_repeat,
+					.key = event.key_data.key,
 				});
 				break;
 			case SDLContext::EventType::KEYUP:
 				event_mgr.queue_event<KeyReleaseEvent>(KeyReleaseEvent{
-					.key = event.key,
+					.key = event.key_data.key,
 				});
 				break;
 			case SDLContext::EventType::MOUSEDOWN:
@@ -56,36 +58,32 @@ void InputSystem::update() {
 					break;
 				}
 				event_mgr.queue_event<MousePressEvent>(MousePressEvent{
-					.mouse_x = world_mouse_x,
-					.mouse_y = world_mouse_y,
-					.button = event.mouse_button,
+					.mouse_pos = {adjusted_mouse_x,adjusted_mouse_y},
+					.button = event.mouse_data.mouse_button,
 				});
-				this->last_mouse_down_position = {world_mouse_x, world_mouse_y};
-				this->last_mouse_button = event.mouse_button;
+				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: {
 				if (!mouse_in_viewport) {
 					break;
 				}
 				event_mgr.queue_event<MouseReleaseEvent>(MouseReleaseEvent{
-					.mouse_x = world_mouse_x,
-					.mouse_y = world_mouse_y,
-					.button = event.mouse_button,
+					.mouse_pos = {adjusted_mouse_x,adjusted_mouse_y},
+					.button = event.mouse_data.mouse_button,
 				});
-				//check if its a click by checking the last button down
-				int delta_x = world_mouse_x - this->last_mouse_down_position.x;
-				int delta_y = world_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_button
+				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<MouseClickEvent>(MouseClickEvent{
-						.mouse_x = world_mouse_x,
-						.mouse_y = world_mouse_y,
-						.button = event.mouse_button,
+						.mouse_pos = {adjusted_mouse_x,adjusted_mouse_y},
+						.button = event.mouse_data.mouse_button,
 					});
 
-					this->handle_click(event.mouse_button, world_mouse_x, world_mouse_y);
+					this->handle_click(event.mouse_data.mouse_button, adjusted_mouse_x, adjusted_mouse_y);
 				}
 			} break;
 			case SDLContext::EventType::MOUSEMOVE:
@@ -93,31 +91,53 @@ void InputSystem::update() {
 					break;
 				}
 				event_mgr.queue_event<MouseMoveEvent>(MouseMoveEvent{
-					.mouse_x = world_mouse_x,
-					.mouse_y = world_mouse_y,
-					.delta_x = event.rel_mouse_move.x,
-					.delta_y = event.rel_mouse_move.y,
+					.mouse_pos = {adjusted_mouse_x,adjusted_mouse_y},
+					.mouse_delta = event.mouse_data.rel_mouse_move,
 				});
-				this->handle_move(event, world_mouse_x, world_mouse_y);
+				this->handle_move(event, adjusted_mouse_x, adjusted_mouse_y);
 				break;
 			case SDLContext::EventType::MOUSEWHEEL:
 				event_mgr.queue_event<MouseScrollEvent>(MouseScrollEvent{
-					.mouse_x = world_mouse_x,
-					.mouse_y = world_mouse_y,
-					.scroll_direction = event.scroll_direction,
-					.scroll_delta = event.scroll_delta,
+					.mouse_pos = {adjusted_mouse_x,adjusted_mouse_y},
+					.scroll_direction = event.mouse_data.scroll_direction,
+					.scroll_delta = event.mouse_data.scroll_delta,
 				});
 				break;
 			case SDLContext::EventType::SHUTDOWN:
 				event_mgr.queue_event<ShutDownEvent>(ShutDownEvent{});
 				break;
+			case SDLContext::EventType::WINDOW_EXPOSE:
+				event_mgr.queue_event<WindowExposeEvent>(WindowExposeEvent{});
+				break;
+            case SDLContext::EventType::WINDOW_RESIZE:
+				event_mgr.queue_event<WindowResizeEvent>(WindowResizeEvent{
+					.dimensions = event.window_data.resize_dimension,
+				});
+				break;
+            case SDLContext::EventType::WINDOW_MOVE:
+				event_mgr.queue_event<WindowMoveEvent>(WindowMoveEvent{
+					.delta_move = event.window_data.move_delta,
+				});
+				break;
+            case SDLContext::EventType::WINDOW_MINIMIZE:
+				event_mgr.queue_event<WindowMinimizeEvent>(WindowMinimizeEvent{});
+				break;
+            case SDLContext::EventType::WINDOW_MAXIMIZE:
+				event_mgr.queue_event<WindowMaximizeEvent>(WindowMaximizeEvent{});
+				break;
+            case SDLContext::EventType::WINDOW_FOCUS_GAIN:
+				event_mgr.queue_event<WindowFocusGainEvent>(WindowFocusGainEvent{});
+				break;
+            case SDLContext::EventType::WINDOW_FOCUS_LOST:
+				event_mgr.queue_event<WindowFocusLostEvent>(WindowFocusLostEvent{});
+				break;
 			default:
 				break;
 		}
 	}
 }
 void InputSystem::handle_move(const SDLContext::EventData & event_data,
-							  const int world_mouse_x, const int world_mouse_y) {
+							  const int adjusted_mouse_x, const int adjusted_mouse_y) {
 	ComponentManager & mgr = this->mediator.component_manager;
 
 	RefVector<Button> buttons = mgr.get_components_by_type<Button>();
@@ -129,7 +149,7 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data,
 
 		bool was_hovering = button.hover;
 		if (button.active
-			&& this->is_mouse_inside_button(world_mouse_x, world_mouse_y, button, transform)) {
+			&& this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, transform)) {
 			button.hover = true;
 			if (!was_hovering && button.on_mouse_enter) {
 				button.on_mouse_enter();
@@ -144,8 +164,8 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data,
 	}
 }
 
-void InputSystem::handle_click(const MouseButton & mouse_button, const int world_mouse_x,
-							   const int world_mouse_y) {
+void InputSystem::handle_click(const MouseButton & mouse_button, const int adjusted_mouse_x,
+							   const int adjusted_mouse_y) {
 	ComponentManager & mgr = this->mediator.component_manager;
 
 	RefVector<Button> buttons = mgr.get_components_by_type<Button>();
@@ -156,7 +176,7 @@ void InputSystem::handle_click(const MouseButton & mouse_button, const int world
 		Transform & transform = transform_vec.front().get();
 
 		if (button.active
-			&& this->is_mouse_inside_button(world_mouse_x, world_mouse_y, button, transform)) {
+			&& this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, transform)) {
 			this->handle_button_press(button);
 		}
 	}
diff --git a/src/test/EventTest.cpp b/src/test/EventTest.cpp
index 4a4872d..53c2469 100644
--- a/src/test/EventTest.cpp
+++ b/src/test/EventTest.cpp
@@ -63,16 +63,15 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_all_channels) {
 
 	EventHandler<MouseClickEvent> mouse_handler = [&](const MouseClickEvent & e) {
 		triggered = true;
-		EXPECT_EQ(e.mouse_x, 100);
-		EXPECT_EQ(e.mouse_y, 200);
+		EXPECT_EQ(e.mouse_pos.x, 100);
+		EXPECT_EQ(e.mouse_pos.y, 200);
 		EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE);
 		return false;
 	};
 	EventManager::get_instance().subscribe<MouseClickEvent>(mouse_handler,
 															EventManager::CHANNEL_ALL);
 
-	MouseClickEvent click_event{
-		.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE};
+	MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE};
 	EventManager::get_instance().trigger_event<MouseClickEvent>(click_event,
 																EventManager::CHANNEL_ALL);
 
@@ -83,15 +82,14 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_one_channel) {
 	int test_channel = 1;
 	EventHandler<MouseClickEvent> mouse_handler = [&](const MouseClickEvent & e) {
 		triggered = true;
-		EXPECT_EQ(e.mouse_x, 100);
-		EXPECT_EQ(e.mouse_y, 200);
+		EXPECT_EQ(e.mouse_pos.x, 100);
+		EXPECT_EQ(e.mouse_pos.y, 200);
 		EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE);
 		return false;
 	};
 	EventManager::get_instance().subscribe<MouseClickEvent>(mouse_handler, test_channel);
 
-	MouseClickEvent click_event{
-		.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE};
+	MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE};
 	EventManager::get_instance().trigger_event<MouseClickEvent>(click_event,
 																EventManager::CHANNEL_ALL);
 
@@ -109,23 +107,22 @@ TEST_F(EventManagerTest, EventManagerTest_callback_propagation) {
 	// Handlers
 	EventHandler<MouseClickEvent> mouse_handler_true = [&](const MouseClickEvent & e) {
 		triggered_true = true;
-		EXPECT_EQ(e.mouse_x, 100);
-		EXPECT_EQ(e.mouse_y, 200);
+		EXPECT_EQ(e.mouse_pos.x, 100);
+		EXPECT_EQ(e.mouse_pos.y, 200);
 		EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE);
 		return true; // Stops propagation
 	};
 
 	EventHandler<MouseClickEvent> mouse_handler_false = [&](const MouseClickEvent & e) {
 		triggered_false = true;
-		EXPECT_EQ(e.mouse_x, 100);
-		EXPECT_EQ(e.mouse_y, 200);
+		EXPECT_EQ(e.mouse_pos.x, 100);
+		EXPECT_EQ(e.mouse_pos.y, 200);
 		EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE);
 		return false; // Allows propagation
 	};
 
 	// Test event
-	MouseClickEvent click_event{
-		.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE};
+	MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE};
 	event_manager.subscribe<MouseClickEvent>(mouse_handler_true, EventManager::CHANNEL_ALL);
 	event_manager.subscribe<MouseClickEvent>(mouse_handler_false, EventManager::CHANNEL_ALL);
 
@@ -201,16 +198,16 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) {
 	// Define EventHandlers
 	EventHandler<MouseClickEvent> mouse_handler1 = [&](const MouseClickEvent & e) {
 		triggered1 = true;
-		EXPECT_EQ(e.mouse_x, 100);
-		EXPECT_EQ(e.mouse_y, 200);
+		EXPECT_EQ(e.mouse_pos.x, 100);
+		EXPECT_EQ(e.mouse_pos.y, 200);
 		EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE);
 		return false; // Allows propagation
 	};
 
 	EventHandler<MouseClickEvent> mouse_handler2 = [&](const MouseClickEvent & e) {
 		triggered2 = true;
-		EXPECT_EQ(e.mouse_x, 100);
-		EXPECT_EQ(e.mouse_y, 200);
+		EXPECT_EQ(e.mouse_pos.x, 100);
+		EXPECT_EQ(e.mouse_pos.y, 200);
 		EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE);
 		return false; // Allows propagation
 	};
@@ -220,7 +217,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) {
 
 	// Queue events
 	event_manager.queue_event<MouseClickEvent>(
-		MouseClickEvent{.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE});
+		MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE});
 
 	// Dispatch events - both handlers should be triggered
 	event_manager.dispatch_events();
@@ -236,7 +233,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) {
 
 	// Queue the same event again
 	event_manager.queue_event<MouseClickEvent>(
-		MouseClickEvent{.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE});
+		MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE});
 
 	// Dispatch events - only handler 2 should be triggered, handler 1 should NOT
 	event_manager.dispatch_events();
@@ -251,7 +248,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) {
 
 	// Queue the event again
 	event_manager.queue_event<MouseClickEvent>(
-		MouseClickEvent{.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE});
+		MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE});
 
 	// Dispatch events - no handler should be triggered
 	event_manager.dispatch_events();
diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp
index a7c0157..0b48d5b 100644
--- a/src/test/InputTest.cpp
+++ b/src/test/InputTest.cpp
@@ -1,293 +1,293 @@
-#include <gtest/gtest.h>
-#define protected public
-#define private public
-#include "api/KeyCodes.h"
-#include "manager/ComponentManager.h"
-#include "manager/EventManager.h"
-#include "manager/Mediator.h"
-#include "system/InputSystem.h"
-#include <SDL2/SDL.h>
-#include <SDL2/SDL_keycode.h>
-#include <crepe/api/Button.h>
-#include <crepe/api/Camera.h>
-#include <crepe/api/GameObject.h>
-#include <crepe/api/Metadata.h>
-#include <crepe/api/Transform.h>
-#include <crepe/api/Vector2.h>
-#include <gmock/gmock.h>
-
-using namespace std;
-using namespace std::chrono_literals;
-using namespace crepe;
-
-class InputTest : public ::testing::Test {
-public:
-	Mediator mediator;
-	ComponentManager mgr{mediator};
-
-	InputSystem input_system{mediator};
-
-	EventManager & event_manager = EventManager::get_instance();
-	//GameObject camera;
-
-protected:
-	void SetUp() override {
-		mediator.event_manager = event_manager;
-		mediator.component_manager = mgr;
-		event_manager.clear();
-	}
-
-	void simulate_mouse_click(int mouse_x, int mouse_y, Uint8 mouse_button) {
-		SDL_Event event;
-
-		// Simulate Mouse Button Down event
-		SDL_zero(event);
-		event.type = SDL_MOUSEBUTTONDOWN;
-		event.button.x = mouse_x;
-		event.button.y = mouse_y;
-		event.button.button = mouse_button;
-		SDL_PushEvent(&event);
-
-		// Simulate Mouse Button Up event
-		SDL_zero(event);
-		event.type = SDL_MOUSEBUTTONUP;
-		event.button.x = mouse_x;
-		event.button.y = mouse_y;
-		event.button.button = mouse_button;
-		SDL_PushEvent(&event);
-	}
-};
-
-TEST_F(InputTest, MouseDown) {
-	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
-	auto & camera = obj.add_component<Camera>(
-		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
-	camera.active = true;
-	bool mouse_triggered = false;
-	EventHandler<MousePressEvent> on_mouse_down = [&](const MousePressEvent & event) {
-		mouse_triggered = true;
-		//middle of the screen = 0,0
-		EXPECT_EQ(event.mouse_x, 0);
-		EXPECT_EQ(event.mouse_y, 0);
-		EXPECT_EQ(event.button, MouseButton::LEFT_MOUSE);
-		return false;
-	};
-	event_manager.subscribe<MousePressEvent>(on_mouse_down);
-
-	SDL_Event event;
-	SDL_zero(event);
-	event.type = SDL_MOUSEBUTTONDOWN;
-	// middle of the screen of a 500*500 camera = 250*250
-	event.button.x = 250;
-	event.button.y = 250;
-	event.button.button = SDL_BUTTON_LEFT;
-	SDL_PushEvent(&event);
-
-	input_system.update();
-	event_manager.dispatch_events();
-	EXPECT_TRUE(mouse_triggered);
-}
-
-TEST_F(InputTest, MouseUp) {
-	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
-	auto & camera = obj.add_component<Camera>(
-		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
-	camera.active = true;
-	bool function_triggered = false;
-	EventHandler<MouseReleaseEvent> on_mouse_release = [&](const MouseReleaseEvent & e) {
-		function_triggered = true;
-		EXPECT_EQ(e.mouse_x, 0);
-		EXPECT_EQ(e.mouse_y, 0);
-		EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE);
-		return false;
-	};
-	event_manager.subscribe<MouseReleaseEvent>(on_mouse_release);
-
-	SDL_Event event;
-	SDL_zero(event);
-	event.type = SDL_MOUSEBUTTONUP;
-	event.button.x = 250;
-	event.button.y = 250;
-	event.button.button = SDL_BUTTON_LEFT;
-	SDL_PushEvent(&event);
-
-	input_system.update();
-	event_manager.dispatch_events();
-	EXPECT_TRUE(function_triggered);
-}
-
-TEST_F(InputTest, MouseMove) {
-	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
-	auto & camera = obj.add_component<Camera>(
-		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
-	camera.active = true;
-	bool function_triggered = false;
-	EventHandler<MouseMoveEvent> on_mouse_move = [&](const MouseMoveEvent & e) {
-		function_triggered = true;
-		EXPECT_EQ(e.mouse_x, 0);
-		EXPECT_EQ(e.mouse_y, 0);
-		EXPECT_EQ(e.delta_x, 10);
-		EXPECT_EQ(e.delta_y, 10);
-		return false;
-	};
-	event_manager.subscribe<MouseMoveEvent>(on_mouse_move);
-
-	SDL_Event event;
-	SDL_zero(event);
-	event.type = SDL_MOUSEMOTION;
-	event.motion.x = 250;
-	event.motion.y = 250;
-	event.motion.xrel = 10;
-	event.motion.yrel = 10;
-	SDL_PushEvent(&event);
-
-	input_system.update();
-	event_manager.dispatch_events();
-	EXPECT_TRUE(function_triggered);
-}
-
-TEST_F(InputTest, KeyDown) {
-	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
-	auto & camera = obj.add_component<Camera>(
-		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
-	camera.active = true;
-	bool function_triggered = false;
-
-	// Define event handler for KeyPressEvent
-	EventHandler<KeyPressEvent> on_key_press = [&](const KeyPressEvent & event) {
-		function_triggered = true;
-		EXPECT_EQ(event.key, Keycode::B); // Validate the key is 'B'
-		EXPECT_EQ(event.repeat, true); // Validate repeat flag
-		return false;
-	};
-
-	event_manager.subscribe<KeyPressEvent>(on_key_press);
-
-	// Simulate SDL_KEYDOWN event
-	SDL_Event test_event;
-	SDL_zero(test_event);
-	test_event.type = SDL_KEYDOWN; // Key down event
-	test_event.key.keysym.scancode = SDL_SCANCODE_B; // Set scancode for 'B'
-	test_event.key.repeat = 1; // Set repeat flag
-	SDL_PushEvent(&test_event);
-
-	input_system.update(); // Process the event
-	event_manager.dispatch_events(); // Dispatch events to handlers
-
-	EXPECT_TRUE(function_triggered); // Check if the handler was triggered
-}
-
-TEST_F(InputTest, KeyUp) {
-	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
-	auto & camera = obj.add_component<Camera>(
-		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
-	camera.active = true;
-	bool function_triggered = false;
-	EventHandler<KeyReleaseEvent> on_key_release = [&](const KeyReleaseEvent & event) {
-		function_triggered = true;
-		EXPECT_EQ(event.key, Keycode::B);
-		return false;
-	};
-	event_manager.subscribe<KeyReleaseEvent>(on_key_release);
-
-	SDL_Event event;
-	SDL_zero(event);
-	event.type = SDL_KEYUP;
-	event.key.keysym.scancode = SDL_SCANCODE_B;
-	SDL_PushEvent(&event);
-
-	input_system.update();
-	event_manager.dispatch_events();
-	EXPECT_TRUE(function_triggered);
-}
-
-TEST_F(InputTest, MouseClick) {
-	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
-	auto & camera = obj.add_component<Camera>(
-		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
-	camera.active = true;
-	bool on_click_triggered = false;
-	EventHandler<MouseClickEvent> on_mouse_click = [&](const MouseClickEvent & event) {
-		on_click_triggered = true;
-		EXPECT_EQ(event.button, MouseButton::LEFT_MOUSE);
-		EXPECT_EQ(event.mouse_x, 0);
-		EXPECT_EQ(event.mouse_y, 0);
-		return false;
-	};
-	event_manager.subscribe<MouseClickEvent>(on_mouse_click);
-
-	this->simulate_mouse_click(250, 250, SDL_BUTTON_LEFT);
-	input_system.update();
-	event_manager.dispatch_events();
-	EXPECT_TRUE(on_click_triggered);
-}
-
-TEST_F(InputTest, testButtonClick) {
-	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
-	auto & camera = obj.add_component<Camera>(
-		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
-	camera.active = true;
-	GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1);
-	bool button_clicked = false;
-	std::function<void()> on_click = [&]() { button_clicked = true; };
-	auto & button
-		= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false);
-
-	bool hover = false;
-	button.active = true;
-
-	button.is_pressed = false;
-	button.is_toggle = false;
-	this->simulate_mouse_click(999, 999, SDL_BUTTON_LEFT);
-	input_system.update();
-	event_manager.dispatch_events();
-	EXPECT_FALSE(button_clicked);
-
-	this->simulate_mouse_click(250, 250, SDL_BUTTON_LEFT);
-	input_system.update();
-	event_manager.dispatch_events();
-	EXPECT_TRUE(button_clicked);
-}
-
-TEST_F(InputTest, testButtonHover) {
-	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
-	auto & camera = obj.add_component<Camera>(
-		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
-	camera.active = true;
-	GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1);
-	bool button_clicked = false;
-	std::function<void()> on_click = [&]() { button_clicked = true; };
-	auto & button
-		= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false);
-	button.active = true;
-	button.is_pressed = false;
-	button.is_toggle = false;
-
-	// Mouse not on button
-	SDL_Event event;
-	SDL_zero(event);
-	event.type = SDL_MOUSEMOTION;
-	event.motion.x = 700;
-	event.motion.y = 700;
-	event.motion.xrel = 10;
-	event.motion.yrel = 10;
-	SDL_PushEvent(&event);
-
-	input_system.update();
-	event_manager.dispatch_events();
-	EXPECT_FALSE(button.hover);
-
-	// Mouse on button
-	SDL_Event hover_event;
-	SDL_zero(hover_event);
-	hover_event.type = SDL_MOUSEMOTION;
-	hover_event.motion.x = 250;
-	hover_event.motion.y = 250;
-	hover_event.motion.xrel = 10;
-	hover_event.motion.yrel = 10;
-	SDL_PushEvent(&hover_event);
-
-	input_system.update();
-	event_manager.dispatch_events();
-	EXPECT_TRUE(button.hover);
-}
+// #include <gtest/gtest.h>
+// #define protected public
+// #define private public
+// #include "api/KeyCodes.h"
+// #include "manager/ComponentManager.h"
+// #include "manager/EventManager.h"
+// #include "manager/Mediator.h"
+// #include "system/InputSystem.h"
+// #include <SDL2/SDL.h>
+// #include <SDL2/SDL_keycode.h>
+// #include <crepe/api/Button.h>
+// #include <crepe/api/Camera.h>
+// #include <crepe/api/GameObject.h>
+// #include <crepe/api/Metadata.h>
+// #include <crepe/api/Transform.h>
+// #include <crepe/api/Vector2.h>
+// #include <gmock/gmock.h>
+
+// using namespace std;
+// using namespace std::chrono_literals;
+// using namespace crepe;
+
+// class InputTest : public ::testing::Test {
+// public:
+// 	Mediator mediator;
+// 	ComponentManager mgr{mediator};
+
+// 	InputSystem input_system{mediator};
+
+// 	EventManager & event_manager = EventManager::get_instance();
+// 	//GameObject camera;
+
+// protected:
+// 	void SetUp() override {
+// 		mediator.event_manager = event_manager;
+// 		mediator.component_manager = mgr;
+// 		event_manager.clear();
+// 	}
+
+// 	void simulate_mouse_click(int mouse_x, int mouse_y, Uint8 mouse_button) {
+// 		SDL_Event event;
+
+// 		// Simulate Mouse Button Down event
+// 		SDL_zero(event);
+// 		event.type = SDL_MOUSEBUTTONDOWN;
+// 		event.button.x = mouse_x;
+// 		event.button.y = mouse_y;
+// 		event.button.button = mouse_button;
+// 		SDL_PushEvent(&event);
+
+// 		// Simulate Mouse Button Up event
+// 		SDL_zero(event);
+// 		event.type = SDL_MOUSEBUTTONUP;
+// 		event.button.x = mouse_x;
+// 		event.button.y = mouse_y;
+// 		event.button.button = mouse_button;
+// 		SDL_PushEvent(&event);
+// 	}
+// };
+
+// TEST_F(InputTest, MouseDown) {
+// 	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
+// 	auto & camera = obj.add_component<Camera>(
+// 		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
+// 	camera.active = true;
+// 	bool mouse_triggered = false;
+// 	EventHandler<MousePressEvent> on_mouse_down = [&](const MousePressEvent & event) {
+// 		mouse_triggered = true;
+// 		//middle of the screen = 0,0
+// 		EXPECT_EQ(event.mouse_x, 0);
+// 		EXPECT_EQ(event.mouse_y, 0);
+// 		EXPECT_EQ(event.button, MouseButton::LEFT_MOUSE);
+// 		return false;
+// 	};
+// 	event_manager.subscribe<MousePressEvent>(on_mouse_down);
+
+// 	SDL_Event event;
+// 	SDL_zero(event);
+// 	event.type = SDL_MOUSEBUTTONDOWN;
+// 	// middle of the screen of a 500*500 camera = 250*250
+// 	event.button.x = 250;
+// 	event.button.y = 250;
+// 	event.button.button = SDL_BUTTON_LEFT;
+// 	SDL_PushEvent(&event);
+
+// 	input_system.update();
+// 	event_manager.dispatch_events();
+// 	EXPECT_TRUE(mouse_triggered);
+// }
+
+// TEST_F(InputTest, MouseUp) {
+// 	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
+// 	auto & camera = obj.add_component<Camera>(
+// 		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
+// 	camera.active = true;
+// 	bool function_triggered = false;
+// 	EventHandler<MouseReleaseEvent> on_mouse_release = [&](const MouseReleaseEvent & e) {
+// 		function_triggered = true;
+// 		EXPECT_EQ(e.mouse_x, 0);
+// 		EXPECT_EQ(e.mouse_y, 0);
+// 		EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE);
+// 		return false;
+// 	};
+// 	event_manager.subscribe<MouseReleaseEvent>(on_mouse_release);
+
+// 	SDL_Event event;
+// 	SDL_zero(event);
+// 	event.type = SDL_MOUSEBUTTONUP;
+// 	event.button.x = 250;
+// 	event.button.y = 250;
+// 	event.button.button = SDL_BUTTON_LEFT;
+// 	SDL_PushEvent(&event);
+
+// 	input_system.update();
+// 	event_manager.dispatch_events();
+// 	EXPECT_TRUE(function_triggered);
+// }
+
+// TEST_F(InputTest, MouseMove) {
+// 	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
+// 	auto & camera = obj.add_component<Camera>(
+// 		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
+// 	camera.active = true;
+// 	bool function_triggered = false;
+// 	EventHandler<MouseMoveEvent> on_mouse_move = [&](const MouseMoveEvent & e) {
+// 		function_triggered = true;
+// 		EXPECT_EQ(e.mouse_x, 0);
+// 		EXPECT_EQ(e.mouse_y, 0);
+// 		EXPECT_EQ(e.delta_x, 10);
+// 		EXPECT_EQ(e.delta_y, 10);
+// 		return false;
+// 	};
+// 	event_manager.subscribe<MouseMoveEvent>(on_mouse_move);
+
+// 	SDL_Event event;
+// 	SDL_zero(event);
+// 	event.type = SDL_MOUSEMOTION;
+// 	event.motion.x = 250;
+// 	event.motion.y = 250;
+// 	event.motion.xrel = 10;
+// 	event.motion.yrel = 10;
+// 	SDL_PushEvent(&event);
+
+// 	input_system.update();
+// 	event_manager.dispatch_events();
+// 	EXPECT_TRUE(function_triggered);
+// }
+
+// TEST_F(InputTest, KeyDown) {
+// 	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
+// 	auto & camera = obj.add_component<Camera>(
+// 		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
+// 	camera.active = true;
+// 	bool function_triggered = false;
+
+// 	// Define event handler for KeyPressEvent
+// 	EventHandler<KeyPressEvent> on_key_press = [&](const KeyPressEvent & event) {
+// 		function_triggered = true;
+// 		EXPECT_EQ(event.key, Keycode::B); // Validate the key is 'B'
+// 		EXPECT_EQ(event.repeat, true); // Validate repeat flag
+// 		return false;
+// 	};
+
+// 	event_manager.subscribe<KeyPressEvent>(on_key_press);
+
+// 	// Simulate SDL_KEYDOWN event
+// 	SDL_Event test_event;
+// 	SDL_zero(test_event);
+// 	test_event.type = SDL_KEYDOWN; // Key down event
+// 	test_event.key.keysym.scancode = SDL_SCANCODE_B; // Set scancode for 'B'
+// 	test_event.key.repeat = 1; // Set repeat flag
+// 	SDL_PushEvent(&test_event);
+
+// 	input_system.update(); // Process the event
+// 	event_manager.dispatch_events(); // Dispatch events to handlers
+
+// 	EXPECT_TRUE(function_triggered); // Check if the handler was triggered
+// }
+
+// TEST_F(InputTest, KeyUp) {
+// 	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
+// 	auto & camera = obj.add_component<Camera>(
+// 		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
+// 	camera.active = true;
+// 	bool function_triggered = false;
+// 	EventHandler<KeyReleaseEvent> on_key_release = [&](const KeyReleaseEvent & event) {
+// 		function_triggered = true;
+// 		EXPECT_EQ(event.key, Keycode::B);
+// 		return false;
+// 	};
+// 	event_manager.subscribe<KeyReleaseEvent>(on_key_release);
+
+// 	SDL_Event event;
+// 	SDL_zero(event);
+// 	event.type = SDL_KEYUP;
+// 	event.key.keysym.scancode = SDL_SCANCODE_B;
+// 	SDL_PushEvent(&event);
+
+// 	input_system.update();
+// 	event_manager.dispatch_events();
+// 	EXPECT_TRUE(function_triggered);
+// }
+
+// TEST_F(InputTest, MouseClick) {
+// 	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
+// 	auto & camera = obj.add_component<Camera>(
+// 		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
+// 	camera.active = true;
+// 	bool on_click_triggered = false;
+// 	EventHandler<MouseClickEvent> on_mouse_click = [&](const MouseClickEvent & event) {
+// 		on_click_triggered = true;
+// 		EXPECT_EQ(event.button, MouseButton::LEFT_MOUSE);
+// 		EXPECT_EQ(event.mouse_x, 0);
+// 		EXPECT_EQ(event.mouse_y, 0);
+// 		return false;
+// 	};
+// 	event_manager.subscribe<MouseClickEvent>(on_mouse_click);
+
+// 	this->simulate_mouse_click(250, 250, SDL_BUTTON_LEFT);
+// 	input_system.update();
+// 	event_manager.dispatch_events();
+// 	EXPECT_TRUE(on_click_triggered);
+// }
+
+// TEST_F(InputTest, testButtonClick) {
+// 	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
+// 	auto & camera = obj.add_component<Camera>(
+// 		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
+// 	camera.active = true;
+// 	GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1);
+// 	bool button_clicked = false;
+// 	std::function<void()> on_click = [&]() { button_clicked = true; };
+// 	auto & button
+// 		= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false);
+
+// 	bool hover = false;
+// 	button.active = true;
+
+// 	button.is_pressed = false;
+// 	button.is_toggle = false;
+// 	this->simulate_mouse_click(999, 999, SDL_BUTTON_LEFT);
+// 	input_system.update();
+// 	event_manager.dispatch_events();
+// 	EXPECT_FALSE(button_clicked);
+
+// 	this->simulate_mouse_click(250, 250, SDL_BUTTON_LEFT);
+// 	input_system.update();
+// 	event_manager.dispatch_events();
+// 	EXPECT_TRUE(button_clicked);
+// }
+
+// TEST_F(InputTest, testButtonHover) {
+// 	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
+// 	auto & camera = obj.add_component<Camera>(
+// 		ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
+// 	camera.active = true;
+// 	GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1);
+// 	bool button_clicked = false;
+// 	std::function<void()> on_click = [&]() { button_clicked = true; };
+// 	auto & button
+// 		= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false);
+// 	button.active = true;
+// 	button.is_pressed = false;
+// 	button.is_toggle = false;
+
+// 	// Mouse not on button
+// 	SDL_Event event;
+// 	SDL_zero(event);
+// 	event.type = SDL_MOUSEMOTION;
+// 	event.motion.x = 700;
+// 	event.motion.y = 700;
+// 	event.motion.xrel = 10;
+// 	event.motion.yrel = 10;
+// 	SDL_PushEvent(&event);
+
+// 	input_system.update();
+// 	event_manager.dispatch_events();
+// 	EXPECT_FALSE(button.hover);
+
+// 	// Mouse on button
+// 	SDL_Event hover_event;
+// 	SDL_zero(hover_event);
+// 	hover_event.type = SDL_MOUSEMOTION;
+// 	hover_event.motion.x = 250;
+// 	hover_event.motion.y = 250;
+// 	hover_event.motion.xrel = 10;
+// 	hover_event.motion.yrel = 10;
+// 	SDL_PushEvent(&hover_event);
+
+// 	input_system.update();
+// 	event_manager.dispatch_events();
+// 	EXPECT_TRUE(button.hover);
+// }
-- 
cgit v1.2.3


From 8c81bf4a33a13fc21dca7e3fe78a6dc334ac964b Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Sat, 7 Dec 2024 22:44:35 +0100
Subject: changed spawnrate of particles (bound to delta time)

---
 src/crepe/Particle.cpp              |  9 +++++----
 src/crepe/Particle.h                |  7 ++++---
 src/crepe/api/ParticleEmitter.h     |  2 ++
 src/crepe/system/ParticleSystem.cpp | 26 +++++++++-----------------
 src/crepe/system/ParticleSystem.h   | 11 +----------
 5 files changed, 21 insertions(+), 34 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/Particle.cpp b/src/crepe/Particle.cpp
index ce000a1..b340826 100644
--- a/src/crepe/Particle.cpp
+++ b/src/crepe/Particle.cpp
@@ -15,16 +15,17 @@ void Particle::reset(unsigned int lifespan, const vec2 & position, const vec2 &
 	this->force_over_time = {0, 0};
 }
 
-void Particle::update() {
+void Particle::update(double dt) {
 	// Deactivate particle if it has exceeded its lifespan
-	if (++time_in_life >= lifespan) {
+	time_in_life += dt;
+	if (time_in_life >= lifespan) {
 		this->active = false;
 		return;
 	}
 
 	// Update velocity based on accumulated force and update position
-	this->velocity += force_over_time;
-	this->position += velocity;
+	this->velocity += force_over_time * dt;
+	this->position += velocity * dt;
 }
 
 void Particle::stop_movement() {
diff --git a/src/crepe/Particle.h b/src/crepe/Particle.h
index 4fa93a1..49fec1f 100644
--- a/src/crepe/Particle.h
+++ b/src/crepe/Particle.h
@@ -24,11 +24,11 @@ public:
 	//! Accumulated force affecting the particle over time.
 	vec2 force_over_time;
 	//! Total lifespan of the particle in milliseconds.
-	unsigned int lifespan;
+	float lifespan;
 	//! Active state of the particle; true if it is in use, false otherwise.
 	bool active = false;
 	//! The time the particle has been alive, in milliseconds.
-	unsigned int time_in_life = 0;
+	float time_in_life = 0;
 	//! The angle at which the particle is oriented or moving.
 	float angle = 0;
 
@@ -49,8 +49,9 @@ public:
 	 *
 	 * Advances the particle's position based on its velocity and applies accumulated forces.
 	 * Deactivates the particle if its lifespan has expired.
+	 * \param dt The amount of fixed delta time that has passed.
 	 */
-	void update();
+	void update(double dt);
 	/**
 	 * \brief Stops the particle's movement.
 	 *
diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h
index e8fa15e..48c7625 100644
--- a/src/crepe/api/ParticleEmitter.h
+++ b/src/crepe/api/ParticleEmitter.h
@@ -52,6 +52,8 @@ public:
 		const unsigned int max_particles = 256;
 		//! rate of particle emission per update (Lowest value = 0.001 any lower is ignored)
 		float emission_rate = 1;
+		//! Saves time left over from last update event.
+		float spawn_accumulator  = 0;
 		//! min speed of the particles
 		float min_speed = 1;
 		//! min speed of the particles
diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index 596b4b0..db4bcaf 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -12,8 +12,10 @@ using namespace crepe;
 
 void ParticleSystem::update() {
 	// Get all emitters
+	
 	ComponentManager & mgr = this->mediator.component_manager;
 	RefVector<ParticleEmitter> emitters = mgr.get_components_by_type<ParticleEmitter>();
+	double dt = LoopTimer::get_instance().get_fixed_delta_time();
 
 	for (ParticleEmitter & emitter : emitters) {
 		// Get transform linked to emitter
@@ -21,15 +23,17 @@ void ParticleSystem::update() {
 			= mgr.get_components_by_id<Transform>(emitter.game_object_id).front().get();
 
 		// Emit particles based on emission_rate
-		int updates = this->calculate_update(this->update_count, emitter.data.emission_rate);
-		for (size_t i = 0; i < updates; i++) {
-			this->emit_particle(emitter, transform);
-		}
+		int spawn_amount = emitter.data.emission_rate * dt;
+		while (emitter.data.spawn_accumulator >= 1.0) {
+			emit_particle(emitter, transform);
+			emitter.data.spawn_accumulator -= 1.0;
+    }
+		
 
 		// Update all particles
 		for (Particle & particle : emitter.data.particles) {
 			if (particle.active) {
-				particle.update();
+				particle.update(dt);
 			}
 		}
 
@@ -61,18 +65,6 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform &
 	}
 }
 
-int ParticleSystem::calculate_update(int count, float emission) const {
-	float integer_part = std::floor(emission);
-	float fractional_part = emission - integer_part;
-
-	if (fractional_part > 0) {
-		int denominator = static_cast<int>(1.0 / fractional_part);
-		return (count % denominator == 0) ? 1 : 0;
-	}
-
-	return static_cast<int>(emission);
-}
-
 void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & transform) {
 	vec2 offset = emitter.data.boundary.offset + transform.position + emitter.data.position;
 	float half_width = emitter.data.boundary.width / 2.0;
diff --git a/src/crepe/system/ParticleSystem.h b/src/crepe/system/ParticleSystem.h
index 2adb0f0..454b65f 100644
--- a/src/crepe/system/ParticleSystem.h
+++ b/src/crepe/system/ParticleSystem.h
@@ -23,6 +23,7 @@ public:
 	void update() override;
 
 private:
+
 	/**
 	 * \brief Emits a particle from the specified emitter based on its emission properties.
 	 *
@@ -31,16 +32,6 @@ private:
 	 */
 	void emit_particle(ParticleEmitter & emitter, const Transform & transform);
 
-	/**
-	 * \brief Calculates the number of times particles should be emitted based on emission rate
-	 * and update count.
-	 *
-	 * \param count Current update count.
-	 * \param emission Emission rate.
-	 * \return The number of particles to emit.
-	 */
-	int calculate_update(int count, float emission) const;
-
 	/**
 	 * \brief Checks whether particles are within the emitter’s boundary, resets or stops
 	 * particles if they exit.
-- 
cgit v1.2.3


From dd7d5cf6b01b8a6a4238b66c27861ee76522067e Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Sat, 7 Dec 2024 22:48:05 +0100
Subject: added this

---
 src/crepe/system/ParticleSystem.cpp | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index db4bcaf..3befb03 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -23,13 +23,12 @@ void ParticleSystem::update() {
 			= mgr.get_components_by_id<Transform>(emitter.game_object_id).front().get();
 
 		// Emit particles based on emission_rate
-		int spawn_amount = emitter.data.emission_rate * dt;
+		emitter.data.spawn_accumulator = emitter.data.emission_rate * dt;
 		while (emitter.data.spawn_accumulator >= 1.0) {
-			emit_particle(emitter, transform);
+			this->emit_particle(emitter, transform);
 			emitter.data.spawn_accumulator -= 1.0;
     }
 		
-
 		// Update all particles
 		for (Particle & particle : emitter.data.particles) {
 			if (particle.active) {
@@ -48,9 +47,9 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform &
 	constexpr float DEG_TO_RAD = M_PI / 180.0;
 
 	vec2 initial_position = emitter.data.position + transform.position;
-	float random_angle = generate_random_angle(emitter.data.min_angle, emitter.data.max_angle);
+	float random_angle = this->generate_random_angle(emitter.data.min_angle, emitter.data.max_angle);
 
-	float random_speed = generate_random_speed(emitter.data.min_speed, emitter.data.max_speed);
+	float random_speed = this->generate_random_speed(emitter.data.min_speed, emitter.data.max_speed);
 	float angle_radians = random_angle * DEG_TO_RAD;
 
 	vec2 velocity
@@ -79,7 +78,6 @@ void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & t
 		const vec2 & position = particle.position;
 		bool within_bounds = (position.x >= LEFT && position.x <= RIGHT && position.y >= TOP
 							  && position.y <= BOTTOM);
-
 		if (!within_bounds) {
 			if (emitter.data.boundary.reset_on_exit) {
 				particle.active = false;
-- 
cgit v1.2.3


From e3318b7e0e075567a6a9e29239e074f4e02fc595 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Mon, 9 Dec 2024 11:41:16 +0100
Subject: made getKeyboardState

---
 src/crepe/api/KeyCodes.h         |   2 +
 src/crepe/facade/SDLContext.cpp  | 237 +++++++++++++++++++++------------------
 src/crepe/facade/SDLContext.h    |   3 +-
 src/crepe/system/InputSystem.cpp | 203 +++++++++++++++++----------------
 4 files changed, 235 insertions(+), 210 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h
index fcfc080..6204cf2 100644
--- a/src/crepe/api/KeyCodes.h
+++ b/src/crepe/api/KeyCodes.h
@@ -150,5 +150,7 @@ enum class Keycode {
 	RIGHT_SUPER = 347,
 	/// \}
 	MENU = 348, //!< Menu key.
+	//! Not actually a key instead its the amount of keycodes there are for array indexing
+	NUM_KEYCODES = 113,
 };
 } // namespace crepe
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index e3410cb..9e10803 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -77,118 +77,135 @@ SDLContext::~SDLContext() {
 	SDL_Quit();
 }
 
-Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) {
-	static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] {
-		std::array<Keycode, SDL_NUM_SCANCODES> table{};
-		table.fill(Keycode::NONE);
-
-		table[SDL_SCANCODE_SPACE] = Keycode::SPACE;
-		table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE;
-		table[SDL_SCANCODE_COMMA] = Keycode::COMMA;
-		table[SDL_SCANCODE_MINUS] = Keycode::MINUS;
-		table[SDL_SCANCODE_PERIOD] = Keycode::PERIOD;
-		table[SDL_SCANCODE_SLASH] = Keycode::SLASH;
-		table[SDL_SCANCODE_0] = Keycode::D0;
-		table[SDL_SCANCODE_1] = Keycode::D1;
-		table[SDL_SCANCODE_2] = Keycode::D2;
-		table[SDL_SCANCODE_3] = Keycode::D3;
-		table[SDL_SCANCODE_4] = Keycode::D4;
-		table[SDL_SCANCODE_5] = Keycode::D5;
-		table[SDL_SCANCODE_6] = Keycode::D6;
-		table[SDL_SCANCODE_7] = Keycode::D7;
-		table[SDL_SCANCODE_8] = Keycode::D8;
-		table[SDL_SCANCODE_9] = Keycode::D9;
-		table[SDL_SCANCODE_SEMICOLON] = Keycode::SEMICOLON;
-		table[SDL_SCANCODE_EQUALS] = Keycode::EQUAL;
-		table[SDL_SCANCODE_A] = Keycode::A;
-		table[SDL_SCANCODE_B] = Keycode::B;
-		table[SDL_SCANCODE_C] = Keycode::C;
-		table[SDL_SCANCODE_D] = Keycode::D;
-		table[SDL_SCANCODE_E] = Keycode::E;
-		table[SDL_SCANCODE_F] = Keycode::F;
-		table[SDL_SCANCODE_G] = Keycode::G;
-		table[SDL_SCANCODE_H] = Keycode::H;
-		table[SDL_SCANCODE_I] = Keycode::I;
-		table[SDL_SCANCODE_J] = Keycode::J;
-		table[SDL_SCANCODE_K] = Keycode::K;
-		table[SDL_SCANCODE_L] = Keycode::L;
-		table[SDL_SCANCODE_M] = Keycode::M;
-		table[SDL_SCANCODE_N] = Keycode::N;
-		table[SDL_SCANCODE_O] = Keycode::O;
-		table[SDL_SCANCODE_P] = Keycode::P;
-		table[SDL_SCANCODE_Q] = Keycode::Q;
-		table[SDL_SCANCODE_R] = Keycode::R;
-		table[SDL_SCANCODE_S] = Keycode::S;
-		table[SDL_SCANCODE_T] = Keycode::T;
-		table[SDL_SCANCODE_U] = Keycode::U;
-		table[SDL_SCANCODE_V] = Keycode::V;
-		table[SDL_SCANCODE_W] = Keycode::W;
-		table[SDL_SCANCODE_X] = Keycode::X;
-		table[SDL_SCANCODE_Y] = Keycode::Y;
-		table[SDL_SCANCODE_Z] = Keycode::Z;
-		table[SDL_SCANCODE_LEFTBRACKET] = Keycode::LEFT_BRACKET;
-		table[SDL_SCANCODE_BACKSLASH] = Keycode::BACKSLASH;
-		table[SDL_SCANCODE_RIGHTBRACKET] = Keycode::RIGHT_BRACKET;
-		table[SDL_SCANCODE_GRAVE] = Keycode::GRAVE_ACCENT;
-		table[SDL_SCANCODE_ESCAPE] = Keycode::ESCAPE;
-		table[SDL_SCANCODE_RETURN] = Keycode::ENTER;
-		table[SDL_SCANCODE_TAB] = Keycode::TAB;
-		table[SDL_SCANCODE_BACKSPACE] = Keycode::BACKSPACE;
-		table[SDL_SCANCODE_INSERT] = Keycode::INSERT;
-		table[SDL_SCANCODE_DELETE] = Keycode::DELETE;
-		table[SDL_SCANCODE_RIGHT] = Keycode::RIGHT;
-		table[SDL_SCANCODE_LEFT] = Keycode::LEFT;
-		table[SDL_SCANCODE_DOWN] = Keycode::DOWN;
-		table[SDL_SCANCODE_UP] = Keycode::UP;
-		table[SDL_SCANCODE_PAGEUP] = Keycode::PAGE_UP;
-		table[SDL_SCANCODE_PAGEDOWN] = Keycode::PAGE_DOWN;
-		table[SDL_SCANCODE_HOME] = Keycode::HOME;
-		table[SDL_SCANCODE_END] = Keycode::END;
-		table[SDL_SCANCODE_CAPSLOCK] = Keycode::CAPS_LOCK;
-		table[SDL_SCANCODE_SCROLLLOCK] = Keycode::SCROLL_LOCK;
-		table[SDL_SCANCODE_NUMLOCKCLEAR] = Keycode::NUM_LOCK;
-		table[SDL_SCANCODE_PRINTSCREEN] = Keycode::PRINT_SCREEN;
-		table[SDL_SCANCODE_PAUSE] = Keycode::PAUSE;
-		table[SDL_SCANCODE_F1] = Keycode::F1;
-		table[SDL_SCANCODE_F2] = Keycode::F2;
-		table[SDL_SCANCODE_F3] = Keycode::F3;
-		table[SDL_SCANCODE_F4] = Keycode::F4;
-		table[SDL_SCANCODE_F5] = Keycode::F5;
-		table[SDL_SCANCODE_F6] = Keycode::F6;
-		table[SDL_SCANCODE_F7] = Keycode::F7;
-		table[SDL_SCANCODE_F8] = Keycode::F8;
-		table[SDL_SCANCODE_F9] = Keycode::F9;
-		table[SDL_SCANCODE_F10] = Keycode::F10;
-		table[SDL_SCANCODE_F11] = Keycode::F11;
-		table[SDL_SCANCODE_F12] = Keycode::F12;
-		table[SDL_SCANCODE_KP_0] = Keycode::KP0;
-		table[SDL_SCANCODE_KP_1] = Keycode::KP1;
-		table[SDL_SCANCODE_KP_2] = Keycode::KP2;
-		table[SDL_SCANCODE_KP_3] = Keycode::KP3;
-		table[SDL_SCANCODE_KP_4] = Keycode::KP4;
-		table[SDL_SCANCODE_KP_5] = Keycode::KP5;
-		table[SDL_SCANCODE_KP_6] = Keycode::KP6;
-		table[SDL_SCANCODE_KP_7] = Keycode::KP7;
-		table[SDL_SCANCODE_KP_8] = Keycode::KP8;
-		table[SDL_SCANCODE_KP_9] = Keycode::KP9;
-		table[SDL_SCANCODE_LSHIFT] = Keycode::LEFT_SHIFT;
-		table[SDL_SCANCODE_LCTRL] = Keycode::LEFT_CONTROL;
-		table[SDL_SCANCODE_LALT] = Keycode::LEFT_ALT;
-		table[SDL_SCANCODE_LGUI] = Keycode::LEFT_SUPER;
-		table[SDL_SCANCODE_RSHIFT] = Keycode::RIGHT_SHIFT;
-		table[SDL_SCANCODE_RCTRL] = Keycode::RIGHT_CONTROL;
-		table[SDL_SCANCODE_RALT] = Keycode::RIGHT_ALT;
-		table[SDL_SCANCODE_RGUI] = Keycode::RIGHT_SUPER;
-		table[SDL_SCANCODE_MENU] = Keycode::MENU;
-
-		return table;
-	}();
+static const std::array<Keycode, SDL_NUM_SCANCODES>& get_lookup_table() {
+    static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] {
+        std::array<Keycode, SDL_NUM_SCANCODES> table{};
+        table.fill(Keycode::NONE);
+
+        // Map all SDL scancodes to Keycodes
+        table[SDL_SCANCODE_SPACE] = Keycode::SPACE;
+        table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE;
+        table[SDL_SCANCODE_COMMA] = Keycode::COMMA;
+        table[SDL_SCANCODE_MINUS] = Keycode::MINUS;
+        table[SDL_SCANCODE_PERIOD] = Keycode::PERIOD;
+        table[SDL_SCANCODE_SLASH] = Keycode::SLASH;
+        table[SDL_SCANCODE_0] = Keycode::D0;
+        table[SDL_SCANCODE_1] = Keycode::D1;
+        table[SDL_SCANCODE_2] = Keycode::D2;
+        table[SDL_SCANCODE_3] = Keycode::D3;
+        table[SDL_SCANCODE_4] = Keycode::D4;
+        table[SDL_SCANCODE_5] = Keycode::D5;
+        table[SDL_SCANCODE_6] = Keycode::D6;
+        table[SDL_SCANCODE_7] = Keycode::D7;
+        table[SDL_SCANCODE_8] = Keycode::D8;
+        table[SDL_SCANCODE_9] = Keycode::D9;
+        table[SDL_SCANCODE_SEMICOLON] = Keycode::SEMICOLON;
+        table[SDL_SCANCODE_EQUALS] = Keycode::EQUAL;
+        table[SDL_SCANCODE_A] = Keycode::A;
+        table[SDL_SCANCODE_B] = Keycode::B;
+        table[SDL_SCANCODE_C] = Keycode::C;
+        table[SDL_SCANCODE_D] = Keycode::D;
+        table[SDL_SCANCODE_E] = Keycode::E;
+        table[SDL_SCANCODE_F] = Keycode::F;
+        table[SDL_SCANCODE_G] = Keycode::G;
+        table[SDL_SCANCODE_H] = Keycode::H;
+        table[SDL_SCANCODE_I] = Keycode::I;
+        table[SDL_SCANCODE_J] = Keycode::J;
+        table[SDL_SCANCODE_K] = Keycode::K;
+        table[SDL_SCANCODE_L] = Keycode::L;
+        table[SDL_SCANCODE_M] = Keycode::M;
+        table[SDL_SCANCODE_N] = Keycode::N;
+        table[SDL_SCANCODE_O] = Keycode::O;
+        table[SDL_SCANCODE_P] = Keycode::P;
+        table[SDL_SCANCODE_Q] = Keycode::Q;
+        table[SDL_SCANCODE_R] = Keycode::R;
+        table[SDL_SCANCODE_S] = Keycode::S;
+        table[SDL_SCANCODE_T] = Keycode::T;
+        table[SDL_SCANCODE_U] = Keycode::U;
+        table[SDL_SCANCODE_V] = Keycode::V;
+        table[SDL_SCANCODE_W] = Keycode::W;
+        table[SDL_SCANCODE_X] = Keycode::X;
+        table[SDL_SCANCODE_Y] = Keycode::Y;
+        table[SDL_SCANCODE_Z] = Keycode::Z;
+        table[SDL_SCANCODE_LEFTBRACKET] = Keycode::LEFT_BRACKET;
+        table[SDL_SCANCODE_BACKSLASH] = Keycode::BACKSLASH;
+        table[SDL_SCANCODE_RIGHTBRACKET] = Keycode::RIGHT_BRACKET;
+        table[SDL_SCANCODE_GRAVE] = Keycode::GRAVE_ACCENT;
+        table[SDL_SCANCODE_ESCAPE] = Keycode::ESCAPE;
+        table[SDL_SCANCODE_RETURN] = Keycode::ENTER;
+        table[SDL_SCANCODE_TAB] = Keycode::TAB;
+        table[SDL_SCANCODE_BACKSPACE] = Keycode::BACKSPACE;
+        table[SDL_SCANCODE_INSERT] = Keycode::INSERT;
+        table[SDL_SCANCODE_DELETE] = Keycode::DELETE;
+        table[SDL_SCANCODE_RIGHT] = Keycode::RIGHT;
+        table[SDL_SCANCODE_LEFT] = Keycode::LEFT;
+        table[SDL_SCANCODE_DOWN] = Keycode::DOWN;
+        table[SDL_SCANCODE_UP] = Keycode::UP;
+        table[SDL_SCANCODE_PAGEUP] = Keycode::PAGE_UP;
+        table[SDL_SCANCODE_PAGEDOWN] = Keycode::PAGE_DOWN;
+        table[SDL_SCANCODE_HOME] = Keycode::HOME;
+        table[SDL_SCANCODE_END] = Keycode::END;
+        table[SDL_SCANCODE_CAPSLOCK] = Keycode::CAPS_LOCK;
+        table[SDL_SCANCODE_SCROLLLOCK] = Keycode::SCROLL_LOCK;
+        table[SDL_SCANCODE_NUMLOCKCLEAR] = Keycode::NUM_LOCK;
+        table[SDL_SCANCODE_PRINTSCREEN] = Keycode::PRINT_SCREEN;
+        table[SDL_SCANCODE_PAUSE] = Keycode::PAUSE;
+        table[SDL_SCANCODE_F1] = Keycode::F1;
+        table[SDL_SCANCODE_F2] = Keycode::F2;
+        table[SDL_SCANCODE_F3] = Keycode::F3;
+        table[SDL_SCANCODE_F4] = Keycode::F4;
+        table[SDL_SCANCODE_F5] = Keycode::F5;
+        table[SDL_SCANCODE_F6] = Keycode::F6;
+        table[SDL_SCANCODE_F7] = Keycode::F7;
+        table[SDL_SCANCODE_F8] = Keycode::F8;
+        table[SDL_SCANCODE_F9] = Keycode::F9;
+        table[SDL_SCANCODE_F10] = Keycode::F10;
+        table[SDL_SCANCODE_F11] = Keycode::F11;
+        table[SDL_SCANCODE_F12] = Keycode::F12;
+        table[SDL_SCANCODE_KP_0] = Keycode::KP0;
+        table[SDL_SCANCODE_KP_1] = Keycode::KP1;
+        table[SDL_SCANCODE_KP_2] = Keycode::KP2;
+        table[SDL_SCANCODE_KP_3] = Keycode::KP3;
+        table[SDL_SCANCODE_KP_4] = Keycode::KP4;
+        table[SDL_SCANCODE_KP_5] = Keycode::KP5;
+        table[SDL_SCANCODE_KP_6] = Keycode::KP6;
+        table[SDL_SCANCODE_KP_7] = Keycode::KP7;
+        table[SDL_SCANCODE_KP_8] = Keycode::KP8;
+        table[SDL_SCANCODE_KP_9] = Keycode::KP9;
+        table[SDL_SCANCODE_LSHIFT] = Keycode::LEFT_SHIFT;
+        table[SDL_SCANCODE_LCTRL] = Keycode::LEFT_CONTROL;
+        table[SDL_SCANCODE_LALT] = Keycode::LEFT_ALT;
+        table[SDL_SCANCODE_LGUI] = Keycode::LEFT_SUPER;
+        table[SDL_SCANCODE_RSHIFT] = Keycode::RIGHT_SHIFT;
+        table[SDL_SCANCODE_RCTRL] = Keycode::RIGHT_CONTROL;
+        table[SDL_SCANCODE_RALT] = Keycode::RIGHT_ALT;
+        table[SDL_SCANCODE_RGUI] = Keycode::RIGHT_SUPER;
+        table[SDL_SCANCODE_MENU] = Keycode::MENU;
+
+        return table;
+    }();
+    return LOOKUP_TABLE;
+}
 
-	if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) {
-		return Keycode::NONE;
-	}
+// Function that uses the shared table
+Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) {
+    if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) {
+        return Keycode::NONE;
+    }
+    return get_lookup_table()[sdl_key];
+}
+std::array<bool, SDL_NUM_SCANCODES> SDLContext::get_keyboard_state() {
+    // Array to hold the key states (true if pressed, false if not)
+    std::array<bool, SDL_NUM_SCANCODES> keyState;
+
+    const Uint8* current_state = SDL_GetKeyboardState(nullptr);
+	
+    for (int i = 0; i < SDL_NUM_SCANCODES; ++i) {
+        // Set true if the key is pressed, false if not
+        keyState[i] = currentState[i] != 0;
+    }
 
-	return LOOKUP_TABLE[sdl_key];
+    return keyState;
 }
 
 MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) {
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index 1f83985..0f503f3 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -152,7 +152,8 @@ private:
 	 * \return The corresponding `Keycode` value or `Keycode::NONE` if the key is unrecognized.
 	 */
 	Keycode sdl_to_keycode(SDL_Keycode sdl_key);
-
+	static const std::array<Keycode, SDL_NUM_SCANCODES>& get_lookup_table();
+	std::array<Keycode, SDL_NUM_SCANCODES> get_keyboard_state();
 	/**
 	 * \brief Converts an SDL mouse button code to the custom MouseButton type.
 	 *
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp
index b7d2eb4..c3bf4d4 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -13,6 +13,7 @@ void InputSystem::update() {
 	RefVector<Button> buttons = mgr.get_components_by_type<Button>();
 	RefVector<Camera> cameras = mgr.get_components_by_type<Camera>();
 	OptionalRef<Camera> curr_cam_ref;
+
 	// Find the active camera
 	for (Camera & cam : cameras) {
 		if (!cam.active) continue;
@@ -20,122 +21,126 @@ void InputSystem::update() {
 		break;
 	}
 	if (!curr_cam_ref) return;
+
 	Camera & current_cam = curr_cam_ref;
 	RefVector<Transform> transform_vec
 		= mgr.get_components_by_id<Transform>(current_cam.game_object_id);
 	Transform & cam_transform = transform_vec.front().get();
-	int camera_origin_x = cam_transform.position.x + current_cam.data.postion_offset.x
-						  - (current_cam.viewport_size.x / 2);
-	int camera_origin_y = 
+
 	ivec2 camera_origin;
 	camera_origin.y = cam_transform.position.y + current_cam.data.postion_offset.y
 						  - (current_cam.viewport_size.y / 2);
-	camera_origin
+	camera_origin.x = cam_transform.position.x + current_cam.data.postion_offset.x
+						  - (current_cam.viewport_size.x / 2);
+
 	for (const SDLContext::EventData & event : event_list) {
-		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;
-		// 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);
-
-		switch (event.event_type) {
-			case SDLContext::EventType::KEYDOWN:
-				event_mgr.queue_event<KeyPressEvent>(KeyPressEvent{
-					.repeat = event.key_data.key_repeat,
-					.key = event.key_data.key,
-				});
-				break;
-			case SDLContext::EventType::KEYUP:
-				event_mgr.queue_event<KeyReleaseEvent>(KeyReleaseEvent{
-					.key = event.key_data.key,
-				});
-				break;
-			case SDLContext::EventType::MOUSEDOWN:
-				if (!mouse_in_viewport) {
+		// 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) {
+
+			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;
+
+			// 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);
+
+			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.mouse_data.mouse_button,
+					});
+					this->last_mouse_down_position = {adjusted_mouse_x, adjusted_mouse_y};
+					this->last_mouse_button = event.mouse_data.mouse_button;
 					break;
-				}
-				event_mgr.queue_event<MousePressEvent>(MousePressEvent{
-					.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_button = event.mouse_data.mouse_button;
-				break;
-			case SDLContext::EventType::MOUSEUP: {
-				if (!mouse_in_viewport) {
+
+				case SDLContext::EventType::MOUSEUP: {
+					event_mgr.queue_event<MouseReleaseEvent>({
+						.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;
+
+					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<MouseClickEvent>({
+							.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);
+					}
 					break;
 				}
-				event_mgr.queue_event<MouseReleaseEvent>(MouseReleaseEvent{
-					.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;
-
-				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<MouseClickEvent>(MouseClickEvent{
-						.mouse_pos = {adjusted_mouse_x,adjusted_mouse_y},
-						.button = event.mouse_data.mouse_button,
+
+				case SDLContext::EventType::MOUSEMOVE:
+					event_mgr.queue_event<MouseMoveEvent>({
+						.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);
+					break;
 
-					this->handle_click(event.mouse_data.mouse_button, adjusted_mouse_x, adjusted_mouse_y);
-				}
-			} break;
-			case SDLContext::EventType::MOUSEMOVE:
-				if (!mouse_in_viewport) {
+				case SDLContext::EventType::MOUSEWHEEL:
+					event_mgr.queue_event<MouseScrollEvent>({
+						.mouse_pos = {adjusted_mouse_x, adjusted_mouse_y},
+						.scroll_direction = event.mouse_data.scroll_direction,
+						.scroll_delta = event.mouse_data.scroll_delta,
+					});
 					break;
-				}
-				event_mgr.queue_event<MouseMoveEvent>(MouseMoveEvent{
-					.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);
-				break;
-			case SDLContext::EventType::MOUSEWHEEL:
-				event_mgr.queue_event<MouseScrollEvent>(MouseScrollEvent{
-					.mouse_pos = {adjusted_mouse_x,adjusted_mouse_y},
-					.scroll_direction = event.mouse_data.scroll_direction,
-					.scroll_delta = event.mouse_data.scroll_delta,
-				});
-				break;
-			case SDLContext::EventType::SHUTDOWN:
-				event_mgr.queue_event<ShutDownEvent>(ShutDownEvent{});
-				break;
-			case SDLContext::EventType::WINDOW_EXPOSE:
-				event_mgr.queue_event<WindowExposeEvent>(WindowExposeEvent{});
-				break;
-            case SDLContext::EventType::WINDOW_RESIZE:
-				event_mgr.queue_event<WindowResizeEvent>(WindowResizeEvent{
-					.dimensions = event.window_data.resize_dimension,
-				});
-				break;
-            case SDLContext::EventType::WINDOW_MOVE:
-				event_mgr.queue_event<WindowMoveEvent>(WindowMoveEvent{
-					.delta_move = event.window_data.move_delta,
-				});
-				break;
-            case SDLContext::EventType::WINDOW_MINIMIZE:
-				event_mgr.queue_event<WindowMinimizeEvent>(WindowMinimizeEvent{});
-				break;
-            case SDLContext::EventType::WINDOW_MAXIMIZE:
-				event_mgr.queue_event<WindowMaximizeEvent>(WindowMaximizeEvent{});
-				break;
-            case SDLContext::EventType::WINDOW_FOCUS_GAIN:
-				event_mgr.queue_event<WindowFocusGainEvent>(WindowFocusGainEvent{});
-				break;
-            case SDLContext::EventType::WINDOW_FOCUS_LOST:
-				event_mgr.queue_event<WindowFocusLostEvent>(WindowFocusLostEvent{});
-				break;
-			default:
-				break;
+
+				default:
+					break;
+			}
+		} else {
+			// Handle non-mouse events
+			switch (event.event_type) {
+				case SDLContext::EventType::KEYDOWN:
+					event_mgr.queue_event<KeyPressEvent>({.repeat = event.key_data.key_repeat, .key = event.key_data.key});
+					break;
+				case SDLContext::EventType::KEYUP:
+					event_mgr.queue_event<KeyReleaseEvent>({.key = event.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>({.dimensions = event.window_data.resize_dimension});
+					break;
+				case SDLContext::EventType::WINDOW_MOVE:
+					event_mgr.queue_event<WindowMoveEvent>({.delta_move = event.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;
+			}
 		}
 	}
 }
+
 void InputSystem::handle_move(const SDLContext::EventData & event_data,
 							  const int adjusted_mouse_x, const int adjusted_mouse_y) {
 	ComponentManager & mgr = this->mediator.component_manager;
-- 
cgit v1.2.3


From 87c41870e7e66308ee0c74270e1f91f4943bd733 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Mon, 9 Dec 2024 13:46:45 +0100
Subject: testing window events

---
 src/crepe/api/KeyCodes.h         |  6 +--
 src/crepe/facade/SDLContext.cpp  | 85 +++++++++++++++++++++-------------------
 src/crepe/facade/SDLContext.h    | 32 ++++++++++-----
 src/crepe/system/InputSystem.cpp |  8 +++-
 src/test/InputTest.cpp           | 27 ++++++++++++-
 5 files changed, 101 insertions(+), 57 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h
index 6204cf2..f704fbb 100644
--- a/src/crepe/api/KeyCodes.h
+++ b/src/crepe/api/KeyCodes.h
@@ -13,7 +13,7 @@ enum class MouseButton {
 };
 
 //! Enumeration for keyboard key inputs, including printable characters, function keys, and keypad keys.
-enum class Keycode {
+typedef enum {
 	NONE = 0, //!< No key input.
 	SPACE = 32, //!< Spacebar.
 	APOSTROPHE = 39, //!< Apostrophe (').
@@ -151,6 +151,6 @@ enum class Keycode {
 	/// \}
 	MENU = 348, //!< Menu key.
 	//! Not actually a key instead its the amount of keycodes there are for array indexing
-	NUM_KEYCODES = 113,
-};
+	NUM_KEYCODES = 512,
+} Keycode;
 } // namespace crepe
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 9e10803..fdc83b2 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -6,6 +6,9 @@
 #include <SDL2/SDL_render.h>
 #include <SDL2/SDL_surface.h>
 #include <SDL2/SDL_video.h>
+
+#include <iostream>
+
 #include <array>
 #include <cmath>
 #include <cstddef>
@@ -77,8 +80,9 @@ SDLContext::~SDLContext() {
 	SDL_Quit();
 }
 
-static const std::array<Keycode, SDL_NUM_SCANCODES>& get_lookup_table() {
-    static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] {
+// Function that uses the shared table
+Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) {
+	static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] {
         std::array<Keycode, SDL_NUM_SCANCODES> table{};
         table.fill(Keycode::NONE);
 
@@ -184,25 +188,20 @@ static const std::array<Keycode, SDL_NUM_SCANCODES>& get_lookup_table() {
 
         return table;
     }();
-    return LOOKUP_TABLE;
-}
-
-// Function that uses the shared table
-Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) {
     if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) {
         return Keycode::NONE;
     }
-    return get_lookup_table()[sdl_key];
+    return LOOKUP_TABLE[sdl_key];
 }
-std::array<bool, SDL_NUM_SCANCODES> SDLContext::get_keyboard_state() {
+std::array<bool, Keycode::NUM_KEYCODES> SDLContext::get_keyboard_state() {
     // Array to hold the key states (true if pressed, false if not)
     std::array<bool, SDL_NUM_SCANCODES> keyState;
 
     const Uint8* current_state = SDL_GetKeyboardState(nullptr);
-	
+
     for (int i = 0; i < SDL_NUM_SCANCODES; ++i) {
         // Set true if the key is pressed, false if not
-        keyState[i] = currentState[i] != 0;
+        keyState[i] = current_state[i] != 0;
     }
 
     return keyState;
@@ -428,7 +427,36 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 
             // Forward window events for further processing
             case SDL_WINDOWEVENT:
-                handle_window_event(event.window, event_list);
+                switch (event.window.event) {
+					case SDL_WINDOWEVENT_EXPOSED:
+						event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}});
+						break;
+					case SDL_WINDOWEVENT_RESIZED:
+					{
+						std::cout << "window resize" << std::endl;
+						SDLContext::EventData event_data;
+						event_data.event_type = SDLContext::EventType::WINDOW_RESIZE;
+						event_data.window_data.resize_dimension = {event.window.data1,event.window.data2};
+						event_list.push_back(event_data);
+						break;
+					}
+					case SDL_WINDOWEVENT_MOVED:
+						event_list.push_back({SDLContext::EventType::WINDOW_MOVE, {}, {}, 
+											{{event.window.data1, event.window.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;
+				}
                 break;
         }
     }
@@ -436,35 +464,10 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
     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;
-    }
-}
+// // Separate function for SDL_WINDOWEVENT subtypes
+// void SDLContext::handle_event(const SDL_WindowEvent& event,
+//                                      std::vector<SDLContext::EventData>& event_list) {
+// }
 
 
 
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index 0f503f3..98be988 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -9,6 +9,7 @@
 #include <functional>
 #include <memory>
 #include <string>
+#include <array>
 
 #include "api/Camera.h"
 #include "api/Color.h"
@@ -134,14 +135,14 @@ private:
 	 * \return Events that occurred since last call to `get_events()`
 	 */
 	std::vector<SDLContext::EventData> get_events();
-	/**
-	 * \brief Fills event_list with triggered window events
-	 *
-	 * This method checks if any window events are triggered and adds them to the event_list.
-	 *
-	 */
-	void handle_window_event(const SDL_WindowEvent& window_event,
-                                     std::vector<SDLContext::EventData>& event_list);
+	// /**
+	//  * \brief Fills event_list with triggered window events
+	//  *
+	//  * This method checks if any window events are triggered and adds them to the event_list.
+	//  *
+	//  */
+	// void handle_window_event(const SDL_WindowEvent& window_event,
+    //                                  std::vector<SDLContext::EventData>& event_list);
 	/**
 	 * \brief Converts an SDL key code to the custom Keycode type.
 	 *
@@ -152,8 +153,19 @@ private:
 	 * \return The corresponding `Keycode` value or `Keycode::NONE` if the key is unrecognized.
 	 */
 	Keycode sdl_to_keycode(SDL_Keycode sdl_key);
-	static const std::array<Keycode, SDL_NUM_SCANCODES>& get_lookup_table();
-	std::array<Keycode, SDL_NUM_SCANCODES> get_keyboard_state();
+	/**
+	 * \brief Retrieves the current state of the keyboard.
+	 *
+	 * This method returns the state of all keys on the keyboard, represented as a
+	 * `std::array` of boolean values. Each element of the array corresponds to a
+	 * specific key defined in the `Keycode` enum, and the value indicates whether
+	 * the key is currently pressed (true) or not pressed (false).
+	 *
+	 * \return A `std::array<bool, Keycode::NUM_KEYCODES>` representing the state of
+	 *         each key on the keyboard, where `true` means the key is pressed, and
+	 *         `false` means it is not pressed.
+	 */
+	std::array<bool, Keycode::NUM_KEYCODES> get_keyboard_state();
 	/**
 	 * \brief Converts an SDL mouse button code to the custom MouseButton type.
 	 *
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp
index c3bf4d4..7c33308 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -1,3 +1,6 @@
+
+#include <iostream>
+
 #include "../api/Button.h"
 #include "../manager/ComponentManager.h"
 #include "../manager/EventManager.h"
@@ -34,6 +37,7 @@ void InputSystem::update() {
 						  - (current_cam.viewport_size.x / 2);
 
 	for (const SDLContext::EventData & event : event_list) {
+		std::cout << "event type: " << event.event_type << std::endl;
 		// Only calculate mouse coordinates for relevant events
 		if (event.event_type == SDLContext::EventType::MOUSEDOWN 
 			|| event.event_type == SDLContext::EventType::MOUSEUP
@@ -102,6 +106,7 @@ void InputSystem::update() {
 					break;
 			}
 		} else {
+			std::cout << "non mouse event" << std::endl;
 			// Handle non-mouse events
 			switch (event.event_type) {
 				case SDLContext::EventType::KEYDOWN:
@@ -117,7 +122,8 @@ void InputSystem::update() {
 					event_mgr.queue_event<WindowExposeEvent>({});
 					break;
 				case SDLContext::EventType::WINDOW_RESIZE:
-					event_mgr.queue_event<WindowResizeEvent>({.dimensions = event.window_data.resize_dimension});
+					std::cout << "input system queue" << std::endl;
+					event_mgr.queue_event<WindowResizeEvent>(WindowResizeEvent{.dimensions = event.window_data.resize_dimension});
 					break;
 				case SDLContext::EventType::WINDOW_MOVE:
 					event_mgr.queue_event<WindowMoveEvent>({.delta_move = event.window_data.move_delta});
diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp
index 4d35eef..7d4a017 100644
--- a/src/test/InputTest.cpp
+++ b/src/test/InputTest.cpp
@@ -1,4 +1,7 @@
 #include <gtest/gtest.h>
+
+#include <iostream>
+
 #define protected public
 #define private public
 #include "api/KeyCodes.h"
@@ -32,8 +35,6 @@ public:
 
 protected:
 	void SetUp() override {
-		mediator.event_manager = event_manager;
-		mediator.component_manager = mgr;
 		event_manager.clear();
 	}
 
@@ -291,3 +292,25 @@ TEST_F(InputTest, testButtonHover) {
 	event_manager.dispatch_events();
 	EXPECT_TRUE(button.hover);
 }
+
+TEST_F(InputTest, WindowResizeTest) {
+	bool callback_triggered = false;
+	EventHandler<WindowResizeEvent> on_window_resize = [&](const WindowResizeEvent & event) {
+		std::cout << "test callback" << std::endl;
+		callback_triggered = true;
+		EXPECT_EQ(event.dimensions.x, 0);
+		EXPECT_EQ(event.dimensions.y, 0);
+		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);
+}
-- 
cgit v1.2.3


From ae141f77fc54638bed0cea9213fe8900769e5d92 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Mon, 9 Dec 2024 13:49:22 +0100
Subject: seperated long function

---
 src/crepe/facade/SDLContext.cpp | 65 ++++++++++++++++++++---------------------
 src/crepe/facade/SDLContext.h   | 16 +++++-----
 2 files changed, 39 insertions(+), 42 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index fdc83b2..f336fd3 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -427,36 +427,7 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 
             // Forward window events for further processing
             case SDL_WINDOWEVENT:
-                switch (event.window.event) {
-					case SDL_WINDOWEVENT_EXPOSED:
-						event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}});
-						break;
-					case SDL_WINDOWEVENT_RESIZED:
-					{
-						std::cout << "window resize" << std::endl;
-						SDLContext::EventData event_data;
-						event_data.event_type = SDLContext::EventType::WINDOW_RESIZE;
-						event_data.window_data.resize_dimension = {event.window.data1,event.window.data2};
-						event_list.push_back(event_data);
-						break;
-					}
-					case SDL_WINDOWEVENT_MOVED:
-						event_list.push_back({SDLContext::EventType::WINDOW_MOVE, {}, {}, 
-											{{event.window.data1, event.window.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;
-				}
+                this->handle_window_event(event.window, event_list);
                 break;
         }
     }
@@ -464,10 +435,36 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
     return event_list;
 }
 
-// // Separate function for SDL_WINDOWEVENT subtypes
-// void SDLContext::handle_event(const SDL_WindowEvent& event,
-//                                      std::vector<SDLContext::EventData>& 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:
+			std::cout << "window resize" << std::endl;
+            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;
+    }
+}
 
 
 
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index 98be988..21d17c7 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -135,14 +135,14 @@ private:
 	 * \return Events that occurred since last call to `get_events()`
 	 */
 	std::vector<SDLContext::EventData> get_events();
-	// /**
-	//  * \brief Fills event_list with triggered window events
-	//  *
-	//  * This method checks if any window events are triggered and adds them to the event_list.
-	//  *
-	//  */
-	// void handle_window_event(const SDL_WindowEvent& window_event,
-    //                                  std::vector<SDLContext::EventData>& event_list);
+	/**
+	 * \brief Fills event_list with triggered window events
+	 *
+	 * This method checks if any window events are triggered and adds them to the event_list.
+	 *
+	 */
+	void handle_window_event(const SDL_WindowEvent& window_event,
+                                     std::vector<SDLContext::EventData>& event_list);
 	/**
 	 * \brief Converts an SDL key code to the custom Keycode type.
 	 *
-- 
cgit v1.2.3


From 65747afc0dadd7f0d9d93f1d0984f442c11eec82 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Mon, 9 Dec 2024 14:14:11 +0100
Subject: resize/move tests working

---
 src/crepe/facade/SDLContext.cpp  |  3 ---
 src/crepe/system/InputSystem.cpp |  5 -----
 src/test/InputTest.cpp           | 36 ++++++++++++++++++++++++++++++------
 3 files changed, 30 insertions(+), 14 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index b761ca1..ce8218a 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -7,8 +7,6 @@
 #include <SDL2/SDL_surface.h>
 #include <SDL2/SDL_video.h>
 
-#include <iostream>
-
 #include <array>
 #include <cmath>
 #include <cstddef>
@@ -443,7 +441,6 @@ void SDLContext::handle_window_event(const SDL_WindowEvent& window_event,
             event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}});
             break;
         case SDL_WINDOWEVENT_RESIZED:
-			std::cout << "window resize" << std::endl;
             event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, {}, {}, 
                                   {{}, {window_event.data1, window_event.data2}}});
             break;
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp
index 7c33308..dd45821 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -1,6 +1,4 @@
 
-#include <iostream>
-
 #include "../api/Button.h"
 #include "../manager/ComponentManager.h"
 #include "../manager/EventManager.h"
@@ -37,7 +35,6 @@ void InputSystem::update() {
 						  - (current_cam.viewport_size.x / 2);
 
 	for (const SDLContext::EventData & event : event_list) {
-		std::cout << "event type: " << event.event_type << std::endl;
 		// Only calculate mouse coordinates for relevant events
 		if (event.event_type == SDLContext::EventType::MOUSEDOWN 
 			|| event.event_type == SDLContext::EventType::MOUSEUP
@@ -106,7 +103,6 @@ void InputSystem::update() {
 					break;
 			}
 		} else {
-			std::cout << "non mouse event" << std::endl;
 			// Handle non-mouse events
 			switch (event.event_type) {
 				case SDLContext::EventType::KEYDOWN:
@@ -122,7 +118,6 @@ void InputSystem::update() {
 					event_mgr.queue_event<WindowExposeEvent>({});
 					break;
 				case SDLContext::EventType::WINDOW_RESIZE:
-					std::cout << "input system queue" << std::endl;
 					event_mgr.queue_event<WindowResizeEvent>(WindowResizeEvent{.dimensions = event.window_data.resize_dimension});
 					break;
 				case SDLContext::EventType::WINDOW_MOVE:
diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp
index 7d4a017..0c81cfa 100644
--- a/src/test/InputTest.cpp
+++ b/src/test/InputTest.cpp
@@ -1,7 +1,4 @@
 #include <gtest/gtest.h>
-
-#include <iostream>
-
 #define protected public
 #define private public
 #include "api/KeyCodes.h"
@@ -294,12 +291,15 @@ TEST_F(InputTest, testButtonHover) {
 }
 
 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) {
-		std::cout << "test callback" << std::endl;
 		callback_triggered = true;
-		EXPECT_EQ(event.dimensions.x, 0);
-		EXPECT_EQ(event.dimensions.y, 0);
+		EXPECT_EQ(event.dimensions.x, 800);
+		EXPECT_EQ(event.dimensions.y, 600);
 		return false;
 	};
 	event_manager.subscribe<WindowResizeEvent>(on_window_resize);
@@ -314,3 +314,27 @@ TEST_F(InputTest, WindowResizeTest) {
 	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);
+}
-- 
cgit v1.2.3


From 2ff3369a7aaf98936bf93f1c7c0dbfcaa38c31d7 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Mon, 9 Dec 2024 14:20:39 +0100
Subject: make format

---
 src/crepe/api/Event.h            |  34 ++--
 src/crepe/api/Transform.h        |   4 +-
 src/crepe/facade/SDLContext.cpp  | 399 ++++++++++++++++++++-------------------
 src/crepe/facade/SDLContext.h    |  14 +-
 src/crepe/system/InputSystem.cpp |  33 ++--
 src/test/EventTest.cpp           |  12 +-
 src/test/InputTest.cpp           |  28 ++-
 7 files changed, 275 insertions(+), 249 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h
index 265e925..d3e99af 100644
--- a/src/crepe/api/Event.h
+++ b/src/crepe/api/Event.h
@@ -39,7 +39,7 @@ public:
 class MousePressEvent : public Event {
 public:
 	//! mouse position
-	ivec2 mouse_pos = {0,0};
+	ivec2 mouse_pos = {0, 0};
 
 	//! The mouse button that was pressed.
 	MouseButton button = MouseButton::NONE;
@@ -51,7 +51,7 @@ public:
 class MouseClickEvent : public Event {
 public:
 	//! mouse position
-	ivec2 mouse_pos = {0,0};
+	ivec2 mouse_pos = {0, 0};
 
 	//! The mouse button that was clicked.
 	MouseButton button = MouseButton::NONE;
@@ -63,7 +63,7 @@ public:
 class MouseReleaseEvent : public Event {
 public:
 	//! mouse position
-	ivec2 mouse_pos = {0,0};
+	ivec2 mouse_pos = {0, 0};
 
 	//! The mouse button that was released.
 	MouseButton button = MouseButton::NONE;
@@ -75,9 +75,9 @@ public:
 class MouseMoveEvent : public Event {
 public:
 	//! new mouse position
-	ivec2 mouse_pos = {0,0};
+	ivec2 mouse_pos = {0, 0};
 	//! The change in mouse position relative to the last position (in pixels).
-	ivec2 mouse_delta = {0,0};
+	ivec2 mouse_delta = {0, 0};
 };
 
 /**
@@ -86,7 +86,7 @@ public:
 class MouseScrollEvent : public Event {
 public:
 	//! mouse position when the scroll happened.
-	ivec2 mouse_pos = {0,0};
+	ivec2 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).
@@ -112,35 +112,35 @@ class ShutDownEvent : public Event {};
  * 
  * When two windows overlap the bottom window gets distorted and that window has to be redrawn.
  */
-class WindowExposeEvent : public Event{};
+class WindowExposeEvent : public Event {};
 
 /**
  * \brief Event triggered to indicate the window is resized.
  */
-class WindowResizeEvent : public Event{
-	public:
+class WindowResizeEvent : public Event {
+public:
 	//! new window dimensions
-	ivec2 dimensions = {0,0};
+	ivec2 dimensions = {0, 0};
 };
 
 /**
  * \brief Event triggered to indicate the window is moved.
  */
-class WindowMoveEvent : public Event{
-	public:
+class WindowMoveEvent : public Event {
+public:
 	//! The change in position relative to the last position (in pixels).
-	ivec2 delta_move = {0,0};
+	ivec2 delta_move = {0, 0};
 };
 
 /**
  * \brief Event triggered to indicate the window is minimized.
  */
-class WindowMinimizeEvent : public Event{};
+class WindowMinimizeEvent : public Event {};
 
 /**
  * \brief Event triggered to indicate the window is maximized
  */
-class WindowMaximizeEvent : public Event{};
+class WindowMaximizeEvent : public Event {};
 
 /**
  * \brief Event triggered to indicate the window gained focus
@@ -148,7 +148,7 @@ class WindowMaximizeEvent : public Event{};
  * This event is triggered when the window receives focus, meaning it becomes the active window
  * for user interaction.
  */
-class WindowFocusGainEvent : public Event{};
+class WindowFocusGainEvent : public Event {};
 
 /**
  * \brief Event triggered to indicate the window lost focus
@@ -156,6 +156,6 @@ class WindowFocusGainEvent : public Event{};
  * This event is triggered when the window loses focus, meaning it is no longer the active window
  * for user interaction.
  */
-class WindowFocusLostEvent : public Event{};
+class WindowFocusLostEvent : public Event {};
 
 } // namespace crepe
diff --git a/src/crepe/api/Transform.h b/src/crepe/api/Transform.h
index 78407ee..b63acaf 100644
--- a/src/crepe/api/Transform.h
+++ b/src/crepe/api/Transform.h
@@ -14,9 +14,9 @@ namespace crepe {
 class Transform : public Component {
 public:
 	//! Specifies the coordinate space for transformations.
-	enum Space { 
+	enum Space {
 		//! coordinates are relative to the active camera
-		HUD, 
+		HUD,
 		//! coordinates are relative to the game world
 		WORLD,
 	};
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index ce8218a..722c165 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -81,128 +81,128 @@ SDLContext::~SDLContext() {
 // Function that uses the shared table
 Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) {
 	static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] {
-        std::array<Keycode, SDL_NUM_SCANCODES> table{};
-        table.fill(Keycode::NONE);
-
-        // Map all SDL scancodes to Keycodes
-        table[SDL_SCANCODE_SPACE] = Keycode::SPACE;
-        table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE;
-        table[SDL_SCANCODE_COMMA] = Keycode::COMMA;
-        table[SDL_SCANCODE_MINUS] = Keycode::MINUS;
-        table[SDL_SCANCODE_PERIOD] = Keycode::PERIOD;
-        table[SDL_SCANCODE_SLASH] = Keycode::SLASH;
-        table[SDL_SCANCODE_0] = Keycode::D0;
-        table[SDL_SCANCODE_1] = Keycode::D1;
-        table[SDL_SCANCODE_2] = Keycode::D2;
-        table[SDL_SCANCODE_3] = Keycode::D3;
-        table[SDL_SCANCODE_4] = Keycode::D4;
-        table[SDL_SCANCODE_5] = Keycode::D5;
-        table[SDL_SCANCODE_6] = Keycode::D6;
-        table[SDL_SCANCODE_7] = Keycode::D7;
-        table[SDL_SCANCODE_8] = Keycode::D8;
-        table[SDL_SCANCODE_9] = Keycode::D9;
-        table[SDL_SCANCODE_SEMICOLON] = Keycode::SEMICOLON;
-        table[SDL_SCANCODE_EQUALS] = Keycode::EQUAL;
-        table[SDL_SCANCODE_A] = Keycode::A;
-        table[SDL_SCANCODE_B] = Keycode::B;
-        table[SDL_SCANCODE_C] = Keycode::C;
-        table[SDL_SCANCODE_D] = Keycode::D;
-        table[SDL_SCANCODE_E] = Keycode::E;
-        table[SDL_SCANCODE_F] = Keycode::F;
-        table[SDL_SCANCODE_G] = Keycode::G;
-        table[SDL_SCANCODE_H] = Keycode::H;
-        table[SDL_SCANCODE_I] = Keycode::I;
-        table[SDL_SCANCODE_J] = Keycode::J;
-        table[SDL_SCANCODE_K] = Keycode::K;
-        table[SDL_SCANCODE_L] = Keycode::L;
-        table[SDL_SCANCODE_M] = Keycode::M;
-        table[SDL_SCANCODE_N] = Keycode::N;
-        table[SDL_SCANCODE_O] = Keycode::O;
-        table[SDL_SCANCODE_P] = Keycode::P;
-        table[SDL_SCANCODE_Q] = Keycode::Q;
-        table[SDL_SCANCODE_R] = Keycode::R;
-        table[SDL_SCANCODE_S] = Keycode::S;
-        table[SDL_SCANCODE_T] = Keycode::T;
-        table[SDL_SCANCODE_U] = Keycode::U;
-        table[SDL_SCANCODE_V] = Keycode::V;
-        table[SDL_SCANCODE_W] = Keycode::W;
-        table[SDL_SCANCODE_X] = Keycode::X;
-        table[SDL_SCANCODE_Y] = Keycode::Y;
-        table[SDL_SCANCODE_Z] = Keycode::Z;
-        table[SDL_SCANCODE_LEFTBRACKET] = Keycode::LEFT_BRACKET;
-        table[SDL_SCANCODE_BACKSLASH] = Keycode::BACKSLASH;
-        table[SDL_SCANCODE_RIGHTBRACKET] = Keycode::RIGHT_BRACKET;
-        table[SDL_SCANCODE_GRAVE] = Keycode::GRAVE_ACCENT;
-        table[SDL_SCANCODE_ESCAPE] = Keycode::ESCAPE;
-        table[SDL_SCANCODE_RETURN] = Keycode::ENTER;
-        table[SDL_SCANCODE_TAB] = Keycode::TAB;
-        table[SDL_SCANCODE_BACKSPACE] = Keycode::BACKSPACE;
-        table[SDL_SCANCODE_INSERT] = Keycode::INSERT;
-        table[SDL_SCANCODE_DELETE] = Keycode::DELETE;
-        table[SDL_SCANCODE_RIGHT] = Keycode::RIGHT;
-        table[SDL_SCANCODE_LEFT] = Keycode::LEFT;
-        table[SDL_SCANCODE_DOWN] = Keycode::DOWN;
-        table[SDL_SCANCODE_UP] = Keycode::UP;
-        table[SDL_SCANCODE_PAGEUP] = Keycode::PAGE_UP;
-        table[SDL_SCANCODE_PAGEDOWN] = Keycode::PAGE_DOWN;
-        table[SDL_SCANCODE_HOME] = Keycode::HOME;
-        table[SDL_SCANCODE_END] = Keycode::END;
-        table[SDL_SCANCODE_CAPSLOCK] = Keycode::CAPS_LOCK;
-        table[SDL_SCANCODE_SCROLLLOCK] = Keycode::SCROLL_LOCK;
-        table[SDL_SCANCODE_NUMLOCKCLEAR] = Keycode::NUM_LOCK;
-        table[SDL_SCANCODE_PRINTSCREEN] = Keycode::PRINT_SCREEN;
-        table[SDL_SCANCODE_PAUSE] = Keycode::PAUSE;
-        table[SDL_SCANCODE_F1] = Keycode::F1;
-        table[SDL_SCANCODE_F2] = Keycode::F2;
-        table[SDL_SCANCODE_F3] = Keycode::F3;
-        table[SDL_SCANCODE_F4] = Keycode::F4;
-        table[SDL_SCANCODE_F5] = Keycode::F5;
-        table[SDL_SCANCODE_F6] = Keycode::F6;
-        table[SDL_SCANCODE_F7] = Keycode::F7;
-        table[SDL_SCANCODE_F8] = Keycode::F8;
-        table[SDL_SCANCODE_F9] = Keycode::F9;
-        table[SDL_SCANCODE_F10] = Keycode::F10;
-        table[SDL_SCANCODE_F11] = Keycode::F11;
-        table[SDL_SCANCODE_F12] = Keycode::F12;
-        table[SDL_SCANCODE_KP_0] = Keycode::KP0;
-        table[SDL_SCANCODE_KP_1] = Keycode::KP1;
-        table[SDL_SCANCODE_KP_2] = Keycode::KP2;
-        table[SDL_SCANCODE_KP_3] = Keycode::KP3;
-        table[SDL_SCANCODE_KP_4] = Keycode::KP4;
-        table[SDL_SCANCODE_KP_5] = Keycode::KP5;
-        table[SDL_SCANCODE_KP_6] = Keycode::KP6;
-        table[SDL_SCANCODE_KP_7] = Keycode::KP7;
-        table[SDL_SCANCODE_KP_8] = Keycode::KP8;
-        table[SDL_SCANCODE_KP_9] = Keycode::KP9;
-        table[SDL_SCANCODE_LSHIFT] = Keycode::LEFT_SHIFT;
-        table[SDL_SCANCODE_LCTRL] = Keycode::LEFT_CONTROL;
-        table[SDL_SCANCODE_LALT] = Keycode::LEFT_ALT;
-        table[SDL_SCANCODE_LGUI] = Keycode::LEFT_SUPER;
-        table[SDL_SCANCODE_RSHIFT] = Keycode::RIGHT_SHIFT;
-        table[SDL_SCANCODE_RCTRL] = Keycode::RIGHT_CONTROL;
-        table[SDL_SCANCODE_RALT] = Keycode::RIGHT_ALT;
-        table[SDL_SCANCODE_RGUI] = Keycode::RIGHT_SUPER;
-        table[SDL_SCANCODE_MENU] = Keycode::MENU;
-
-        return table;
-    }();
-    if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) {
-        return Keycode::NONE;
-    }
-    return LOOKUP_TABLE[sdl_key];
+		std::array<Keycode, SDL_NUM_SCANCODES> table{};
+		table.fill(Keycode::NONE);
+
+		// Map all SDL scancodes to Keycodes
+		table[SDL_SCANCODE_SPACE] = Keycode::SPACE;
+		table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE;
+		table[SDL_SCANCODE_COMMA] = Keycode::COMMA;
+		table[SDL_SCANCODE_MINUS] = Keycode::MINUS;
+		table[SDL_SCANCODE_PERIOD] = Keycode::PERIOD;
+		table[SDL_SCANCODE_SLASH] = Keycode::SLASH;
+		table[SDL_SCANCODE_0] = Keycode::D0;
+		table[SDL_SCANCODE_1] = Keycode::D1;
+		table[SDL_SCANCODE_2] = Keycode::D2;
+		table[SDL_SCANCODE_3] = Keycode::D3;
+		table[SDL_SCANCODE_4] = Keycode::D4;
+		table[SDL_SCANCODE_5] = Keycode::D5;
+		table[SDL_SCANCODE_6] = Keycode::D6;
+		table[SDL_SCANCODE_7] = Keycode::D7;
+		table[SDL_SCANCODE_8] = Keycode::D8;
+		table[SDL_SCANCODE_9] = Keycode::D9;
+		table[SDL_SCANCODE_SEMICOLON] = Keycode::SEMICOLON;
+		table[SDL_SCANCODE_EQUALS] = Keycode::EQUAL;
+		table[SDL_SCANCODE_A] = Keycode::A;
+		table[SDL_SCANCODE_B] = Keycode::B;
+		table[SDL_SCANCODE_C] = Keycode::C;
+		table[SDL_SCANCODE_D] = Keycode::D;
+		table[SDL_SCANCODE_E] = Keycode::E;
+		table[SDL_SCANCODE_F] = Keycode::F;
+		table[SDL_SCANCODE_G] = Keycode::G;
+		table[SDL_SCANCODE_H] = Keycode::H;
+		table[SDL_SCANCODE_I] = Keycode::I;
+		table[SDL_SCANCODE_J] = Keycode::J;
+		table[SDL_SCANCODE_K] = Keycode::K;
+		table[SDL_SCANCODE_L] = Keycode::L;
+		table[SDL_SCANCODE_M] = Keycode::M;
+		table[SDL_SCANCODE_N] = Keycode::N;
+		table[SDL_SCANCODE_O] = Keycode::O;
+		table[SDL_SCANCODE_P] = Keycode::P;
+		table[SDL_SCANCODE_Q] = Keycode::Q;
+		table[SDL_SCANCODE_R] = Keycode::R;
+		table[SDL_SCANCODE_S] = Keycode::S;
+		table[SDL_SCANCODE_T] = Keycode::T;
+		table[SDL_SCANCODE_U] = Keycode::U;
+		table[SDL_SCANCODE_V] = Keycode::V;
+		table[SDL_SCANCODE_W] = Keycode::W;
+		table[SDL_SCANCODE_X] = Keycode::X;
+		table[SDL_SCANCODE_Y] = Keycode::Y;
+		table[SDL_SCANCODE_Z] = Keycode::Z;
+		table[SDL_SCANCODE_LEFTBRACKET] = Keycode::LEFT_BRACKET;
+		table[SDL_SCANCODE_BACKSLASH] = Keycode::BACKSLASH;
+		table[SDL_SCANCODE_RIGHTBRACKET] = Keycode::RIGHT_BRACKET;
+		table[SDL_SCANCODE_GRAVE] = Keycode::GRAVE_ACCENT;
+		table[SDL_SCANCODE_ESCAPE] = Keycode::ESCAPE;
+		table[SDL_SCANCODE_RETURN] = Keycode::ENTER;
+		table[SDL_SCANCODE_TAB] = Keycode::TAB;
+		table[SDL_SCANCODE_BACKSPACE] = Keycode::BACKSPACE;
+		table[SDL_SCANCODE_INSERT] = Keycode::INSERT;
+		table[SDL_SCANCODE_DELETE] = Keycode::DELETE;
+		table[SDL_SCANCODE_RIGHT] = Keycode::RIGHT;
+		table[SDL_SCANCODE_LEFT] = Keycode::LEFT;
+		table[SDL_SCANCODE_DOWN] = Keycode::DOWN;
+		table[SDL_SCANCODE_UP] = Keycode::UP;
+		table[SDL_SCANCODE_PAGEUP] = Keycode::PAGE_UP;
+		table[SDL_SCANCODE_PAGEDOWN] = Keycode::PAGE_DOWN;
+		table[SDL_SCANCODE_HOME] = Keycode::HOME;
+		table[SDL_SCANCODE_END] = Keycode::END;
+		table[SDL_SCANCODE_CAPSLOCK] = Keycode::CAPS_LOCK;
+		table[SDL_SCANCODE_SCROLLLOCK] = Keycode::SCROLL_LOCK;
+		table[SDL_SCANCODE_NUMLOCKCLEAR] = Keycode::NUM_LOCK;
+		table[SDL_SCANCODE_PRINTSCREEN] = Keycode::PRINT_SCREEN;
+		table[SDL_SCANCODE_PAUSE] = Keycode::PAUSE;
+		table[SDL_SCANCODE_F1] = Keycode::F1;
+		table[SDL_SCANCODE_F2] = Keycode::F2;
+		table[SDL_SCANCODE_F3] = Keycode::F3;
+		table[SDL_SCANCODE_F4] = Keycode::F4;
+		table[SDL_SCANCODE_F5] = Keycode::F5;
+		table[SDL_SCANCODE_F6] = Keycode::F6;
+		table[SDL_SCANCODE_F7] = Keycode::F7;
+		table[SDL_SCANCODE_F8] = Keycode::F8;
+		table[SDL_SCANCODE_F9] = Keycode::F9;
+		table[SDL_SCANCODE_F10] = Keycode::F10;
+		table[SDL_SCANCODE_F11] = Keycode::F11;
+		table[SDL_SCANCODE_F12] = Keycode::F12;
+		table[SDL_SCANCODE_KP_0] = Keycode::KP0;
+		table[SDL_SCANCODE_KP_1] = Keycode::KP1;
+		table[SDL_SCANCODE_KP_2] = Keycode::KP2;
+		table[SDL_SCANCODE_KP_3] = Keycode::KP3;
+		table[SDL_SCANCODE_KP_4] = Keycode::KP4;
+		table[SDL_SCANCODE_KP_5] = Keycode::KP5;
+		table[SDL_SCANCODE_KP_6] = Keycode::KP6;
+		table[SDL_SCANCODE_KP_7] = Keycode::KP7;
+		table[SDL_SCANCODE_KP_8] = Keycode::KP8;
+		table[SDL_SCANCODE_KP_9] = Keycode::KP9;
+		table[SDL_SCANCODE_LSHIFT] = Keycode::LEFT_SHIFT;
+		table[SDL_SCANCODE_LCTRL] = Keycode::LEFT_CONTROL;
+		table[SDL_SCANCODE_LALT] = Keycode::LEFT_ALT;
+		table[SDL_SCANCODE_LGUI] = Keycode::LEFT_SUPER;
+		table[SDL_SCANCODE_RSHIFT] = Keycode::RIGHT_SHIFT;
+		table[SDL_SCANCODE_RCTRL] = Keycode::RIGHT_CONTROL;
+		table[SDL_SCANCODE_RALT] = Keycode::RIGHT_ALT;
+		table[SDL_SCANCODE_RGUI] = Keycode::RIGHT_SUPER;
+		table[SDL_SCANCODE_MENU] = Keycode::MENU;
+
+		return table;
+	}();
+	if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) {
+		return Keycode::NONE;
+	}
+	return LOOKUP_TABLE[sdl_key];
 }
 std::array<bool, Keycode::NUM_KEYCODES> SDLContext::get_keyboard_state() {
-    // Array to hold the key states (true if pressed, false if not)
-    std::array<bool, SDL_NUM_SCANCODES> keyState;
+	// Array to hold the key states (true if pressed, false if not)
+	std::array<bool, SDL_NUM_SCANCODES> keyState;
 
-    const Uint8* current_state = SDL_GetKeyboardState(nullptr);
+	const Uint8 * current_state = SDL_GetKeyboardState(nullptr);
 
-    for (int i = 0; i < SDL_NUM_SCANCODES; ++i) {
-        // Set true if the key is pressed, false if not
-        keyState[i] = current_state[i] != 0;
-    }
+	for (int i = 0; i < SDL_NUM_SCANCODES; ++i) {
+		// Set true if the key is pressed, false if not
+		keyState[i] = current_state[i] != 0;
+	}
 
-    return keyState;
+	return keyState;
 }
 
 MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) {
@@ -389,83 +389,104 @@ ivec2 SDLContext::get_size(const Texture & ctx) {
 void SDLContext::delay(int ms) const { SDL_Delay(ms); }
 
 std::vector<SDLContext::EventData> SDLContext::get_events() {
-    std::vector<SDLContext::EventData> event_list;
-    SDL_Event event;
-
-    // Handle general SDL events
-    while (SDL_PollEvent(&event)) {
-        switch (event.type) {
-            case SDL_QUIT:
-                event_list.push_back({SDLContext::EventType::SHUTDOWN, {}, {}, {}});
-                break;
-            case SDL_KEYDOWN:
-                event_list.push_back({SDLContext::EventType::KEYDOWN, 
-                                      {sdl_to_keycode(event.key.keysym.scancode), event.key.repeat != 0}, {}, {}});
-                break;
-            case SDL_KEYUP:
-                event_list.push_back({SDLContext::EventType::KEYUP, 
-                                      {sdl_to_keycode(event.key.keysym.scancode), false}, {}, {}});
-                break;
-            case SDL_MOUSEBUTTONDOWN:
-                event_list.push_back({SDLContext::EventType::MOUSEDOWN, {}, 
-                                      {sdl_to_mousebutton(event.button.button), {event.button.x, event.button.y}}, {}});
-                break;
-            case SDL_MOUSEBUTTONUP:
-                event_list.push_back({SDLContext::EventType::MOUSEUP, {}, 
-                                      {sdl_to_mousebutton(event.button.button), {event.button.x, event.button.y}}, {}});
-                break;
-            case SDL_MOUSEMOTION:
-                event_list.push_back({SDLContext::EventType::MOUSEMOVE, {}, 
-                                      {{}, {event.motion.x, event.motion.y}, -1, INFINITY, {event.motion.xrel, event.motion.yrel}}, {}});
-                break;
-            case SDL_MOUSEWHEEL:
-                event_list.push_back({SDLContext::EventType::MOUSEWHEEL, {}, 
-                                      {{}, {}, event.wheel.y < 0 ? -1 : 1, event.wheel.preciseY, {}}, {}});
-                break;
-
-            // Forward window events for further processing
-            case SDL_WINDOWEVENT:
-                this->handle_window_event(event.window, event_list);
-                break;
-        }
-    }
-
-    return event_list;
+	std::vector<SDLContext::EventData> event_list;
+	SDL_Event event;
+
+	// Handle general SDL events
+	while (SDL_PollEvent(&event)) {
+		switch (event.type) {
+			case SDL_QUIT:
+				event_list.push_back({SDLContext::EventType::SHUTDOWN, {}, {}, {}});
+				break;
+			case SDL_KEYDOWN:
+				event_list.push_back(
+					{SDLContext::EventType::KEYDOWN,
+					 {sdl_to_keycode(event.key.keysym.scancode), event.key.repeat != 0},
+					 {},
+					 {}});
+				break;
+			case SDL_KEYUP:
+				event_list.push_back({SDLContext::EventType::KEYUP,
+									  {sdl_to_keycode(event.key.keysym.scancode), false},
+									  {},
+									  {}});
+				break;
+			case SDL_MOUSEBUTTONDOWN:
+				event_list.push_back({SDLContext::EventType::MOUSEDOWN,
+									  {},
+									  {sdl_to_mousebutton(event.button.button),
+									   {event.button.x, event.button.y}},
+									  {}});
+				break;
+			case SDL_MOUSEBUTTONUP:
+				event_list.push_back({SDLContext::EventType::MOUSEUP,
+									  {},
+									  {sdl_to_mousebutton(event.button.button),
+									   {event.button.x, event.button.y}},
+									  {}});
+				break;
+			case SDL_MOUSEMOTION:
+				event_list.push_back({SDLContext::EventType::MOUSEMOVE,
+									  {},
+									  {{},
+									   {event.motion.x, event.motion.y},
+									   -1,
+									   INFINITY,
+									   {event.motion.xrel, event.motion.yrel}},
+									  {}});
+				break;
+			case SDL_MOUSEWHEEL:
+				event_list.push_back(
+					{SDLContext::EventType::MOUSEWHEEL,
+					 {},
+					 {{}, {}, event.wheel.y < 0 ? -1 : 1, event.wheel.preciseY, {}},
+					 {}});
+				break;
+
+			// Forward window events for further processing
+			case SDL_WINDOWEVENT:
+				this->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;
-    }
+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;
+	}
 }
 
-
-
-
 void SDLContext::set_color_texture(const Texture & texture, const Color & color) {
 	SDL_SetTextureColorMod(texture.texture.get(), color.r, color.g, color.b);
 	SDL_SetTextureAlphaMod(texture.texture.get(), color.a);
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index 21d17c7..b65ba9c 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -5,11 +5,11 @@
 #include <SDL2/SDL_rect.h>
 #include <SDL2/SDL_render.h>
 #include <SDL2/SDL_video.h>
+#include <array>
 #include <cmath>
 #include <functional>
 #include <memory>
 #include <string>
-#include <array>
 
 #include "api/Camera.h"
 #include "api/Color.h"
@@ -88,18 +88,18 @@ public:
 		WINDOW_RESIZE,
 		WINDOW_EXPOSE,
 	};
-	struct KeyData{
+	struct KeyData {
 		Keycode key = Keycode::NONE;
 		bool key_repeat = false;
 	};
-	struct MouseData{
+	struct MouseData {
 		MouseButton mouse_button = MouseButton::NONE;
 		ivec2 mouse_position = {-1, -1};
 		int scroll_direction = -1;
 		float scroll_delta = INFINITY;
 		ivec2 rel_mouse_move = {-1, -1};
 	};
-	struct WindowData{
+	struct WindowData {
 		ivec2 move_delta;
 		ivec2 resize_dimension;
 	};
@@ -110,7 +110,7 @@ public:
 		MouseData mouse_data;
 		WindowData window_data;
 	};
-	
+
 	/**
 	 * \brief Gets the singleton instance of SDLContext.
 	 * \return Reference to the SDLContext instance.
@@ -141,8 +141,8 @@ private:
 	 * This method checks if any window events are triggered and adds them to the event_list.
 	 *
 	 */
-	void handle_window_event(const SDL_WindowEvent& window_event,
-                                     std::vector<SDLContext::EventData>& event_list);
+	void handle_window_event(const SDL_WindowEvent & window_event,
+							 std::vector<SDLContext::EventData> & event_list);
 	/**
 	 * \brief Converts an SDL key code to the custom Keycode type.
 	 *
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp
index dd45821..f5d8536 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -30,13 +30,13 @@ void InputSystem::update() {
 
 	ivec2 camera_origin;
 	camera_origin.y = cam_transform.position.y + current_cam.data.postion_offset.y
-						  - (current_cam.viewport_size.y / 2);
+					  - (current_cam.viewport_size.y / 2);
 	camera_origin.x = cam_transform.position.x + current_cam.data.postion_offset.x
-						  - (current_cam.viewport_size.x / 2);
+					  - (current_cam.viewport_size.x / 2);
 
 	for (const SDLContext::EventData & event : event_list) {
 		// Only calculate mouse coordinates for relevant events
-		if (event.event_type == SDLContext::EventType::MOUSEDOWN 
+		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) {
@@ -45,10 +45,11 @@ void InputSystem::update() {
 			int 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);
+			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);
 
 			if (!mouse_in_viewport) continue;
 
@@ -78,7 +79,8 @@ void InputSystem::update() {
 							.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_x,
+										   adjusted_mouse_y);
 					}
 					break;
 				}
@@ -106,7 +108,8 @@ void InputSystem::update() {
 			// Handle non-mouse events
 			switch (event.event_type) {
 				case SDLContext::EventType::KEYDOWN:
-					event_mgr.queue_event<KeyPressEvent>({.repeat = event.key_data.key_repeat, .key = event.key_data.key});
+					event_mgr.queue_event<KeyPressEvent>(
+						{.repeat = event.key_data.key_repeat, .key = event.key_data.key});
 					break;
 				case SDLContext::EventType::KEYUP:
 					event_mgr.queue_event<KeyReleaseEvent>({.key = event.key_data.key});
@@ -118,10 +121,12 @@ void InputSystem::update() {
 					event_mgr.queue_event<WindowExposeEvent>({});
 					break;
 				case SDLContext::EventType::WINDOW_RESIZE:
-					event_mgr.queue_event<WindowResizeEvent>(WindowResizeEvent{.dimensions = event.window_data.resize_dimension});
+					event_mgr.queue_event<WindowResizeEvent>(
+						WindowResizeEvent{.dimensions = event.window_data.resize_dimension});
 					break;
 				case SDLContext::EventType::WINDOW_MOVE:
-					event_mgr.queue_event<WindowMoveEvent>({.delta_move = event.window_data.move_delta});
+					event_mgr.queue_event<WindowMoveEvent>(
+						{.delta_move = event.window_data.move_delta});
 					break;
 				case SDLContext::EventType::WINDOW_MINIMIZE:
 					event_mgr.queue_event<WindowMinimizeEvent>({});
@@ -155,7 +160,8 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data,
 
 		bool was_hovering = button.hover;
 		if (button.active
-			&& this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, transform)) {
+			&& this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button,
+											transform)) {
 			button.hover = true;
 			if (!was_hovering && button.on_mouse_enter) {
 				button.on_mouse_enter();
@@ -182,7 +188,8 @@ void InputSystem::handle_click(const MouseButton & mouse_button, const int adjus
 		Transform & transform = transform_vec.front().get();
 
 		if (button.active
-			&& this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, transform)) {
+			&& this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button,
+											transform)) {
 			this->handle_button_press(button);
 		}
 	}
diff --git a/src/test/EventTest.cpp b/src/test/EventTest.cpp
index 53c2469..ef7fc10 100644
--- a/src/test/EventTest.cpp
+++ b/src/test/EventTest.cpp
@@ -71,7 +71,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_all_channels) {
 	EventManager::get_instance().subscribe<MouseClickEvent>(mouse_handler,
 															EventManager::CHANNEL_ALL);
 
-	MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE};
+	MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE};
 	EventManager::get_instance().trigger_event<MouseClickEvent>(click_event,
 																EventManager::CHANNEL_ALL);
 
@@ -89,7 +89,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_one_channel) {
 	};
 	EventManager::get_instance().subscribe<MouseClickEvent>(mouse_handler, test_channel);
 
-	MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE};
+	MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE};
 	EventManager::get_instance().trigger_event<MouseClickEvent>(click_event,
 																EventManager::CHANNEL_ALL);
 
@@ -122,7 +122,7 @@ TEST_F(EventManagerTest, EventManagerTest_callback_propagation) {
 	};
 
 	// Test event
-	MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE};
+	MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE};
 	event_manager.subscribe<MouseClickEvent>(mouse_handler_true, EventManager::CHANNEL_ALL);
 	event_manager.subscribe<MouseClickEvent>(mouse_handler_false, EventManager::CHANNEL_ALL);
 
@@ -217,7 +217,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) {
 
 	// Queue events
 	event_manager.queue_event<MouseClickEvent>(
-		MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE});
+		MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE});
 
 	// Dispatch events - both handlers should be triggered
 	event_manager.dispatch_events();
@@ -233,7 +233,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) {
 
 	// Queue the same event again
 	event_manager.queue_event<MouseClickEvent>(
-		MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE});
+		MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE});
 
 	// Dispatch events - only handler 2 should be triggered, handler 1 should NOT
 	event_manager.dispatch_events();
@@ -248,7 +248,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) {
 
 	// Queue the event again
 	event_manager.queue_event<MouseClickEvent>(
-		MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE});
+		MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE});
 
 	// Dispatch events - no handler should be triggered
 	event_manager.dispatch_events();
diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp
index cde774f..94549a0 100644
--- a/src/test/InputTest.cpp
+++ b/src/test/InputTest.cpp
@@ -31,9 +31,7 @@ public:
 	//GameObject camera;
 
 protected:
-	void SetUp() override {
-		event_manager.clear();
-	}
+	void SetUp() override { event_manager.clear(); }
 
 	void simulate_mouse_click(int mouse_x, int mouse_y, Uint8 mouse_button) {
 		SDL_Event event;
@@ -299,12 +297,12 @@ TEST_F(InputTest, WindowResizeTest) {
 	};
 	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);
+	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);
@@ -323,12 +321,12 @@ TEST_F(InputTest, WindowMoveTest) {
 	};
 	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);
+	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);
-- 
cgit v1.2.3


From a80477f2e7f4c18adcc6441828d17582aad2598f Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Mon, 9 Dec 2024 15:29:18 +0100
Subject: get_keyboard_state working

---
 src/crepe/api/Config.h          |  6 ++++++
 src/crepe/facade/SDLContext.cpp | 29 ++++++++++++++++-------------
 src/crepe/facade/SDLContext.h   | 36 ++++++++++++++++++------------------
 src/crepe/system/InputSystem.h  |  5 +++--
 src/example/button.cpp          |  1 -
 src/test/InputTest.cpp          | 28 ++++++++++++++++++++++++++++
 6 files changed, 71 insertions(+), 34 deletions(-)

(limited to 'src/crepe')

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
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 722c165..1e8af41 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -78,8 +78,7 @@ SDLContext::~SDLContext() {
 	SDL_Quit();
 }
 
-// Function that uses the shared table
-Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) {
+Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) {
 	static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] {
 		std::array<Keycode, SDL_NUM_SCANCODES> table{};
 		table.fill(Keycode::NONE);
@@ -192,19 +191,23 @@ Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) {
 	return LOOKUP_TABLE[sdl_key];
 }
 std::array<bool, Keycode::NUM_KEYCODES> SDLContext::get_keyboard_state() {
-	// Array to hold the key states (true if pressed, false if not)
-	std::array<bool, SDL_NUM_SCANCODES> keyState;
-
-	const Uint8 * current_state = SDL_GetKeyboardState(nullptr);
-
-	for (int i = 0; i < SDL_NUM_SCANCODES; ++i) {
-		// Set true if the key is pressed, false if not
-		keyState[i] = current_state[i] != 0;
-	}
-
-	return keyState;
+    // 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);
+    
+    for (int i = 0; i < SDL_NUM_SCANCODES; ++i) {
+        Keycode key = sdl_to_keycode(static_cast<SDL_Scancode>(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<MouseButton, 5> MOUSE_BUTTON_LOOKUP_TABLE = [] {
 		std::array<MouseButton, 5> table{};
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index b65ba9c..5182dca 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -110,7 +110,19 @@ public:
 		MouseData mouse_data;
 		WindowData window_data;
 	};
-
+	/**
+	 * \brief Retrieves the current state of the keyboard.
+	 *
+	 * This method returns the state of all keys on the keyboard, represented as a
+	 * `std::array` of boolean values. Each element of the array corresponds to a
+	 * specific key defined in the `Keycode` enum, and the value indicates whether
+	 * the key is currently pressed (true) or not pressed (false).
+	 *
+	 * \return A `std::array<bool, Keycode::NUM_KEYCODES>` representing the state of
+	 *         each key on the keyboard, where `true` means the key is pressed, and
+	 *         `false` means it is not pressed.
+	 */
+	std::array<bool, Keycode::NUM_KEYCODES> get_keyboard_state();
 	/**
 	 * \brief Gets the singleton instance of SDLContext.
 	 * \return Reference to the SDLContext instance.
@@ -144,28 +156,16 @@ private:
 	void handle_window_event(const SDL_WindowEvent & window_event,
 							 std::vector<SDLContext::EventData> & event_list);
 	/**
-	 * \brief Converts an SDL key code to the custom Keycode type.
+	 * \brief Converts an SDL scan code to the custom Keycode type.
 	 *
-	 * This method maps an SDL key code to the corresponding `Keycode` enum value,
+	 * This method maps an SDL scan code to the corresponding `Keycode` enum value,
 	 * which is used internally by the system to identify the keys.
 	 *
-	 * \param sdl_key The SDL key code to convert.
+	 * \param sdl_key The SDL scan code to convert.
 	 * \return The corresponding `Keycode` value or `Keycode::NONE` if the key is unrecognized.
 	 */
-	Keycode sdl_to_keycode(SDL_Keycode sdl_key);
-	/**
-	 * \brief Retrieves the current state of the keyboard.
-	 *
-	 * This method returns the state of all keys on the keyboard, represented as a
-	 * `std::array` of boolean values. Each element of the array corresponds to a
-	 * specific key defined in the `Keycode` enum, and the value indicates whether
-	 * the key is currently pressed (true) or not pressed (false).
-	 *
-	 * \return A `std::array<bool, Keycode::NUM_KEYCODES>` representing the state of
-	 *         each key on the keyboard, where `true` means the key is pressed, and
-	 *         `false` means it is not pressed.
-	 */
-	std::array<bool, Keycode::NUM_KEYCODES> get_keyboard_state();
+	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 87e86f8..1d6e79c 100644
--- a/src/crepe/system/InputSystem.h
+++ b/src/crepe/system/InputSystem.h
@@ -3,6 +3,7 @@
 #include "../facade/SDLContext.h"
 #include "../types.h"
 #include "../util/OptionalRef.h"
+#include "../api/Config.h"
 
 #include "System.h"
 
@@ -37,8 +38,8 @@ private:
 	//! 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;
+	//! 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().click_tolerance.tolerance;
 
 	/**
 	* \brief Handles the mouse click event.
diff --git a/src/example/button.cpp b/src/example/button.cpp
index 00bdc28..f2e77f6 100644
--- a/src/example/button.cpp
+++ b/src/example/button.cpp
@@ -15,7 +15,6 @@
 #include <crepe/system/InputSystem.h>
 #include <crepe/system/RenderSystem.h>
 #include <crepe/types.h>
-#include <iostream>
 using namespace crepe;
 using namespace std;
 
diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp
index 94549a0..e9dc645 100644
--- a/src/test/InputTest.cpp
+++ b/src/test/InputTest.cpp
@@ -331,3 +331,31 @@ TEST_F(InputTest, WindowMoveTest) {
 	event_manager.dispatch_events();
 	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;
+	key_down_event.key.keysym.sym = SDL_SCANCODE_A;
+    SDL_PushEvent(&key_down_event);
+
+    // 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]);
+
+    // 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]);
+}
-- 
cgit v1.2.3


From f6633670594e04baf77c14399c9f3bdaa49aecea Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
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')

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<bool, Keycode::NUM_KEYCODES> SDLContext::get_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);
-    
-    for (int i = 0; i < SDL_NUM_SCANCODES; ++i) {
-        Keycode key = sdl_to_keycode(static_cast<SDL_Scancode>(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<bool, Keycode::NUM_KEYCODES> 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<SDL_Scancode>(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<MouseButton, 5> 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 923d66394610a756e58a977415810c2902b84c67 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Mon, 9 Dec 2024 15:31:16 +0100
Subject: removed space coordinates

---
 src/crepe/api/Transform.h | 8 --------
 1 file changed, 8 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/Transform.h b/src/crepe/api/Transform.h
index b63acaf..7ee6d65 100644
--- a/src/crepe/api/Transform.h
+++ b/src/crepe/api/Transform.h
@@ -13,14 +13,6 @@ namespace crepe {
  */
 class Transform : public Component {
 public:
-	//! Specifies the coordinate space for transformations.
-	enum Space {
-		//! coordinates are relative to the active camera
-		HUD,
-		//! coordinates are relative to the game world
-		WORLD,
-	};
-	Space coordinate_space = Space::WORLD;
 	//! Translation (shift)
 	vec2 position = {0, 0};
 	//! Rotation, in degrees clockwise
-- 
cgit v1.2.3


From 69a7df392482884fc9dd2ce5012fdb028c37e469 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Mon, 9 Dec 2024 15:31:41 +0100
Subject: removed enter

---
 src/crepe/facade/SDLContext.cpp | 1 -
 1 file changed, 1 deletion(-)

(limited to 'src/crepe')

diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 4504b95..8f6c02c 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -6,7 +6,6 @@
 #include <SDL2/SDL_render.h>
 #include <SDL2/SDL_surface.h>
 #include <SDL2/SDL_video.h>
-
 #include <array>
 #include <cmath>
 #include <cstddef>
-- 
cgit v1.2.3


From 73f8d5c558ebc0820ede241e64a876ff1c5ccefb Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
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')

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<void()> & on_click, bool is_toggle)
+			   const std::function<void()> & 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<void()> & on_click, bool is_toggle = false);
+		   const std::function<void()> & 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<MousePressEvent>({
-						.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<MouseReleaseEvent>({
-						.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<MouseClickEvent>({
-							.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<MouseMoveEvent>({
-						.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<MouseScrollEvent>({
-						.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<Button> buttons = mgr.get_components_by_type<Button>();
 
 	for (Button & button : buttons) {
+		if(!button.active) continue;
 		RefVector<Transform> transform_vec
 			= mgr.get_components_by_id<Transform>(button.game_object_id);
 		Transform & transform(transform_vec.front().get());
 
 		bool was_hovering = button.hover;
-		if (button.active
-			&& this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button,
+		if (this->is_mouse_inside_button(mouse_pos, button,
 											transform)) {
 			button.hover = true;
-			if (!was_hovering && button.on_mouse_enter) {
+			if(!button.on_mouse_enter) continue;
+			if (!was_hovering) {
 				button.on_mouse_enter();
 			}
 		} else {
 			button.hover = false;
 			// Trigger the on_exit callback if the hover state just changed to false
-			if (was_hovering && button.on_mouse_exit) {
+			if(!button.on_mouse_exit) continue;
+			if (was_hovering) {
 				button.on_mouse_exit();
 			}
 		}
 	}
 }
 
-void InputSystem::handle_click(const MouseButton & mouse_button, const int adjusted_mouse_x,
-							   const int adjusted_mouse_y) {
+void InputSystem::handle_click(const MouseButton & mouse_button, const ivec2& mouse_pos) {
 	ComponentManager & mgr = this->mediator.component_manager;
 
 	RefVector<Button> buttons = mgr.get_components_by_type<Button>();
 
 	for (Button & button : buttons) {
+		if(!button.active) continue;
+		if (!button.on_click) continue;
 		RefVector<Transform> transform_vec
 			= mgr.get_components_by_id<Transform>(button.game_object_id);
 		Transform & transform = transform_vec.front().get();
-
-		if (button.active
-			&& this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button,
+		
+		if (this->is_mouse_inside_button(mouse_pos, button,
 											transform)) {
-			this->handle_button_press(button);
+			 
+			button.on_click();
 		}
 	}
 }
 
-bool InputSystem::is_mouse_inside_button(const int mouse_x, const int mouse_y,
+bool InputSystem::is_mouse_inside_button(const ivec2& 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;
@@ -204,17 +205,7 @@ bool InputSystem::is_mouse_inside_button(const int mouse_x, const int mouse_y,
 	int half_height = button.dimensions.y / 2;
 
 	// Check if the mouse is within the button's boundaries
-	return mouse_x >= actual_x - half_width && mouse_x <= actual_x + half_width
-		   && mouse_y >= actual_y - half_height && mouse_y <= actual_y + half_height;
+	return mouse_pos.x >= actual_x - half_width && mouse_pos.x <= actual_x + half_width
+		   && mouse_pos.y >= actual_y - half_height && mouse_pos.y <= actual_y + half_height;
 }
 
-void InputSystem::handle_button_press(Button & button) {
-	if (button.is_toggle) {
-		if (!button.is_pressed && button.on_click) {
-			button.on_click();
-		}
-		button.is_pressed = !button.is_pressed;
-	} else if (button.on_click) {
-		button.on_click();
-	}
-}
diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h
index 5da8f32..3703635 100644
--- a/src/crepe/system/InputSystem.h
+++ b/src/crepe/system/InputSystem.h
@@ -39,7 +39,7 @@ private:
 	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().click_tolerance.tolerance;
+	int click_tolerance = Config::get_instance().input.click_tolerance;
 
 	/**
 	* \brief Handles the mouse click event.
@@ -49,8 +49,7 @@ private:
 	*
 	* 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);
+	void handle_click(const MouseButton & mouse_button,const ivec2& mouse_pos);
 
 	/**
 	* \brief Handles the mouse movement event.
@@ -60,8 +59,7 @@ private:
 	*
 	* 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);
+	void handle_move(const SDLContext::EventData & event_data, const ivec2& mouse_pos);
 
 	/**
 	* \brief Checks if the mouse position is inside the bounds of the button.
@@ -71,7 +69,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 int world_mouse_x, const int world_mouse_y,
+	bool is_mouse_inside_button(const ivec2& mouse_pos,
 								const Button & button, const Transform & transform);
 
 	/**
diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp
index 94549a0..a7058b2 100644
--- a/src/test/InputTest.cpp
+++ b/src/test/InputTest.cpp
@@ -227,7 +227,7 @@ TEST_F(InputTest, testButtonClick) {
 	bool button_clicked = false;
 	std::function<void()> on_click = [&]() { button_clicked = true; };
 	auto & button
-		= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false);
+		= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click);
 
 	bool hover = false;
 	button.active = true;
@@ -251,7 +251,7 @@ TEST_F(InputTest, testButtonHover) {
 	bool button_clicked = false;
 	std::function<void()> on_click = [&]() { button_clicked = true; };
 	auto & button
-		= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false);
+		= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click);
 	button.active = true;
 
 	// Mouse not on button
-- 
cgit v1.2.3


From 44cab6ad59d257d949112dcd4a9e0bdc9302e92b Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Thu, 12 Dec 2024 08:58:08 +0100
Subject: save

---
 src/crepe/facade/SDLContext.cpp  | 144 +++++++++++++++++++++++----------------
 src/crepe/facade/SDLContext.h    |  19 ++++--
 src/crepe/system/InputSystem.cpp |  53 +++++++-------
 src/test/EventTest.cpp           |  26 +++----
 4 files changed, 140 insertions(+), 102 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 4552605..75ad0e8 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -1,3 +1,4 @@
+#include <iostream>
 #include <SDL2/SDL.h>
 #include <SDL2/SDL_blendmode.h>
 #include <SDL2/SDL_image.h>
@@ -383,59 +384,82 @@ ivec2 SDLContext::get_size(const Texture & ctx) {
 std::vector<SDLContext::EventData> SDLContext::get_events() {
 	std::vector<SDLContext::EventData> event_list;
 	SDL_Event event;
+	const CameraAuxiliaryData & cam = this->cam_aux_data;
 	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;
+		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({SDLContext::EventType::SHUTDOWN, {}, {}, {}});
+				event_list.push_back({.event_type = SDLContext::EventType::SHUTDOWN});
 				break;
 			case SDL_KEYDOWN:
-				event_list.push_back(
-					{SDLContext::EventType::KEYDOWN,
-					 {sdl_to_keycode(event.key.keysym.scancode), event.key.repeat != 0},
-					 {},
-					 {}});
+			{
+
+				EventData transfer_event;
+				transfer_event.event_type = SDLContext::EventType::KEYDOWN;
+				transfer_event.data.key_data = KeyData{
+					.key = sdl_to_keycode(event.key.keysym.scancode),
+					.key_repeat = event.key.repeat != 0,
+				};
+				event_list.push_back(transfer_event);
+			}
 				break;
 			case SDL_KEYUP:
-				event_list.push_back({SDLContext::EventType::KEYUP,
-									  {sdl_to_keycode(event.key.keysym.scancode), false},
-									  {},
-									  {}});
+			{
+				EventData transfer_event;
+				transfer_event.event_type = SDLContext::EventType::KEYUP;
+				transfer_event.data.key_data = KeyData{
+					.key = sdl_to_keycode(event.key.keysym.scancode),
+					.key_repeat = false,
+				};
+				event_list.push_back(transfer_event);
+			}
 				break;
 			case SDL_MOUSEBUTTONDOWN:
-				event_list.push_back(EventData{
-					.event_type = SDLContext::EventType::MOUSEDOWN,
+			{
+				EventData transfer_event;
+				transfer_event.event_type = SDLContext::EventType::MOUSEDOWN;
+				transfer_event.data.mouse_data = MouseData{
 					.mouse_button = sdl_to_mousebutton(event.button.button),
-					.mouse_position = {event.button.x, event.button.y},
-				});
-				break;
-			case SDL_MOUSEBUTTONUP: {
-				int x, y;
-				SDL_GetMouseState(&x, &y);
-				event_list.push_back(EventData{
-					.event_type = SDLContext::EventType::MOUSEUP,
+					.mouse_position = mouse_pos,
+				};
+				event_list.push_back(transfer_event);
+				
+			} break;
+			case SDL_MOUSEBUTTONUP: 
+			{
+				EventData transfer_event;
+				transfer_event.event_type = SDLContext::EventType::MOUSEUP;
+				transfer_event.data.mouse_data = MouseData{
 					.mouse_button = sdl_to_mousebutton(event.button.button),
-					.mouse_position = {event.button.x, event.button.y},
-				});
+					.mouse_position = mouse_pos,
+				};
+				event_list.push_back(transfer_event);
+				
 			} break;
 
 			case SDL_MOUSEMOTION: {
-				event_list.push_back(
-					EventData{.event_type = SDLContext::EventType::MOUSEMOVE,
-							  .mouse_position = {event.motion.x, event.motion.y},
-							  .rel_mouse_move = {event.motion.xrel, event.motion.yrel}});
+				EventData transfer_event;
+				transfer_event.event_type = SDLContext::EventType::MOUSEMOVE;
+				transfer_event.data.mouse_data = MouseData{
+					.mouse_position = mouse_pos,
+					.rel_mouse_move = {event.motion.xrel, event.motion.yrel},
+				};
+				event_list.push_back(transfer_event);
 			} break;
 
 			case SDL_MOUSEWHEEL: {
-				event_list.push_back(EventData{
-					.event_type = SDLContext::EventType::MOUSEWHEEL,
-					.mouse_position = {event.motion.x, event.motion.y},
-					// TODO: why is this needed?
+				EventData transfer_event;
+				transfer_event.event_type = SDLContext::EventType::MOUSEWHEEL;
+				transfer_event.data.mouse_data = MouseData{
+					.mouse_position = mouse_pos,
 					.scroll_direction = event.wheel.y < 0 ? -1 : 1,
 					.scroll_delta = event.wheel.preciseY,
-				});
+				};
+				event_list.push_back(transfer_event);
 			} break;
 		}
 	}
@@ -446,35 +470,35 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 // 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({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;
+	// }
 }
 
 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 0a2456d..d7af226 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -105,10 +105,21 @@ public:
 	};
 	//! EventData struct for passing event data from facade
 	struct EventData {
-		SDLContext::EventType event_type = SDLContext::EventType::NONE;
-		KeyData key_data;
-		MouseData mouse_data;
-		WindowData window_data;
+    SDLContext::EventType event_type = SDLContext::EventType::NONE;
+
+    union EventDataUnion {
+        KeyData key_data;
+        MouseData mouse_data;
+        WindowData window_data;
+
+        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 459feb3..32538e8 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -1,4 +1,4 @@
-
+#include <iostream>
 #include "../api/Button.h"
 #include "../manager/ComponentManager.h"
 #include "../manager/EventManager.h"
@@ -32,10 +32,10 @@ void InputSystem::update() {
 	Transform & cam_transform = transform_vec.front().get();
 
 	ivec2 camera_origin;
-	camera_origin.y = cam_transform.position.y + current_cam.data.postion_offset.y
-					  - (current_cam.viewport_size.y / 2);
-	camera_origin.x = cam_transform.position.x + current_cam.data.postion_offset.x
-					  - (current_cam.viewport_size.x / 2);
+	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);
 
 	for (const SDLContext::EventData & event : event_list) {
 		// Only calculate mouse coordinates for relevant events
@@ -45,15 +45,17 @@ void InputSystem::update() {
 			|| event.event_type == SDLContext::EventType::MOUSEWHEEL) {
 
 			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;
+			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
-				= !(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);
-
+			= !(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
@@ -61,28 +63,28 @@ void InputSystem::update() {
 				case SDLContext::EventType::MOUSEDOWN:
 					event_mgr.queue_event<MousePressEvent>({
 						.mouse_pos = {adjusted_mouse.x, adjusted_mouse.y},
-						.button = event.mouse_data.mouse_button,
+						.button = event.data.mouse_data.mouse_button,
 					});
 					this->last_mouse_down_position = {adjusted_mouse.x, adjusted_mouse.y};
-					this->last_mouse_button = event.mouse_data.mouse_button;
+					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.mouse_data.mouse_button,
+						.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.mouse_data.mouse_button
+					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.mouse_data.mouse_button,
+							.button = event.data.mouse_data.mouse_button,
 						});
-						this->handle_click(event.mouse_data.mouse_button, adjusted_mouse);
+						this->handle_click(event.data.mouse_data.mouse_button, adjusted_mouse);
 					}
 					break;
 				}
@@ -90,7 +92,7 @@ void InputSystem::update() {
 				case SDLContext::EventType::MOUSEMOVE:
 					event_mgr.queue_event<MouseMoveEvent>({
 						.mouse_pos = {adjusted_mouse.x, adjusted_mouse.y},
-						.mouse_delta = event.mouse_data.rel_mouse_move,
+						.mouse_delta = event.data.mouse_data.rel_mouse_move,
 					});
 					this->handle_move(event, adjusted_mouse);
 					break;
@@ -98,8 +100,8 @@ void InputSystem::update() {
 				case SDLContext::EventType::MOUSEWHEEL:
 					event_mgr.queue_event<MouseScrollEvent>({
 						.mouse_pos = {adjusted_mouse.x, adjusted_mouse.y},
-						.scroll_direction = event.mouse_data.scroll_direction,
-						.scroll_delta = event.mouse_data.scroll_delta,
+						.scroll_direction = event.data.mouse_data.scroll_direction,
+						.scroll_delta = event.data.mouse_data.scroll_delta,
 					});
 					break;
 
@@ -110,11 +112,12 @@ void InputSystem::update() {
 			// Handle non-mouse events
 			switch (event.event_type) {
 				case SDLContext::EventType::KEYDOWN:
+					
 					event_mgr.queue_event<KeyPressEvent>(
-						{.repeat = event.key_data.key_repeat, .key = event.key_data.key});
+						{.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.key_data.key});
+					event_mgr.queue_event<KeyReleaseEvent>({.key = event.data.key_data.key});
 					break;
 				case SDLContext::EventType::SHUTDOWN:
 					event_mgr.queue_event<ShutDownEvent>({});
@@ -124,11 +127,11 @@ void InputSystem::update() {
 					break;
 				case SDLContext::EventType::WINDOW_RESIZE:
 					event_mgr.queue_event<WindowResizeEvent>(
-						WindowResizeEvent{.dimensions = event.window_data.resize_dimension});
+						WindowResizeEvent{.dimensions = event.data.window_data.resize_dimension});
 					break;
 				case SDLContext::EventType::WINDOW_MOVE:
 					event_mgr.queue_event<WindowMoveEvent>(
-						{.delta_move = event.window_data.move_delta});
+						{.delta_move = event.data.window_data.move_delta});
 					break;
 				case SDLContext::EventType::WINDOW_MINIMIZE:
 					event_mgr.queue_event<WindowMinimizeEvent>({});
diff --git a/src/test/EventTest.cpp b/src/test/EventTest.cpp
index f57a6de..f30f15a 100644
--- a/src/test/EventTest.cpp
+++ b/src/test/EventTest.cpp
@@ -56,7 +56,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_all_channels) {
 	event_mgr.subscribe<MouseClickEvent>(mouse_handler, EventManager::CHANNEL_ALL);
 
 	MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE};
-	EventManager::get_instance().trigger_event<MouseClickEvent>(click_event,
+	event_mgr.trigger_event<MouseClickEvent>(click_event,
 																EventManager::CHANNEL_ALL);
 
 	EXPECT_TRUE(triggered);
@@ -74,7 +74,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_one_channel) {
 	event_mgr.subscribe<MouseClickEvent>(mouse_handler, test_channel);
 
 	MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE};
-	EventManager::get_instance().trigger_event<MouseClickEvent>(click_event,
+	event_mgr.trigger_event<MouseClickEvent>(click_event,
 																EventManager::CHANNEL_ALL);
 
 	EXPECT_FALSE(triggered);
@@ -106,8 +106,8 @@ TEST_F(EventManagerTest, EventManagerTest_callback_propagation) {
 
 	// Test event
 	MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE};
-	event_manager.subscribe<MouseClickEvent>(mouse_handler_true, EventManager::CHANNEL_ALL);
-	event_manager.subscribe<MouseClickEvent>(mouse_handler_false, EventManager::CHANNEL_ALL);
+	event_mgr.subscribe<MouseClickEvent>(mouse_handler_true, EventManager::CHANNEL_ALL);
+	event_mgr.subscribe<MouseClickEvent>(mouse_handler_false, EventManager::CHANNEL_ALL);
 
 	// Trigger event
 	event_mgr.trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL);
@@ -137,15 +137,15 @@ TEST_F(EventManagerTest, EventManagerTest_queue_dispatch) {
 	int test_channel = 1;
 	EventHandler<MouseClickEvent> mouse_handler1 = [&](const MouseClickEvent & e) {
 		triggered1 = true;
-		EXPECT_EQ(e.mouse_x, 100);
-		EXPECT_EQ(e.mouse_y, 200);
+		EXPECT_EQ(e.mouse_pos.x, 100);
+		EXPECT_EQ(e.mouse_pos.y, 200);
 		EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE);
 		return false; // Allows propagation
 	};
 	EventHandler<MouseClickEvent> mouse_handler2 = [&](const MouseClickEvent & e) {
 		triggered2 = true;
-		EXPECT_EQ(e.mouse_x, 100);
-		EXPECT_EQ(e.mouse_y, 200);
+		EXPECT_EQ(e.mouse_pos.x, 100);
+		EXPECT_EQ(e.mouse_pos.y, 200);
 		EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE);
 		return false; // Allows propagation
 	};
@@ -153,9 +153,9 @@ TEST_F(EventManagerTest, EventManagerTest_queue_dispatch) {
 	event_mgr.subscribe<MouseClickEvent>(mouse_handler2, test_channel);
 
 	event_mgr.queue_event<MouseClickEvent>(
-		MouseClickEvent{.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE});
+		MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE});
 	event_mgr.queue_event<MouseClickEvent>(
-		MouseClickEvent{.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE},
+		MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE},
 		test_channel);
 	event_mgr.dispatch_events();
 	EXPECT_TRUE(triggered1);
@@ -189,7 +189,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) {
 	subscription_t handler2_id = event_mgr.subscribe<MouseClickEvent>(mouse_handler2);
 
 	// Queue events
-	event_manager.queue_event<MouseClickEvent>(
+	event_mgr.queue_event<MouseClickEvent>(
 		MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE});
 
 	// Dispatch events - both handlers should be triggered
@@ -205,7 +205,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) {
 	event_mgr.unsubscribe(handler1_id);
 
 	// Queue the same event again
-	event_manager.queue_event<MouseClickEvent>(
+	event_mgr.queue_event<MouseClickEvent>(
 		MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE});
 
 	// Dispatch events - only handler 2 should be triggered, handler 1 should NOT
@@ -220,7 +220,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) {
 	event_mgr.unsubscribe(handler2_id);
 
 	// Queue the event again
-	event_manager.queue_event<MouseClickEvent>(
+	event_mgr.queue_event<MouseClickEvent>(
 		MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE});
 
 	// Dispatch events - no handler should be triggered
-- 
cgit v1.2.3


From afd81007153f05c8f8b42bcf08a8cdf8ce13a98c Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Thu, 12 Dec 2024 15:32:07 +0100
Subject: updated particle emitter

---
 src/crepe/api/LoopManager.cpp       |  1 +
 src/crepe/api/ParticleEmitter.h     |  7 +++++--
 src/crepe/system/ParticleSystem.cpp | 16 ++++++++++------
 src/crepe/system/RenderSystem.cpp   |  2 +-
 src/example/game.cpp                | 21 +++++++++++++++++++++
 src/example/rendering_particle.cpp  | 23 +----------------------
 6 files changed, 39 insertions(+), 31 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/LoopManager.cpp b/src/crepe/api/LoopManager.cpp
index b5e5ff7..7a78019 100644
--- a/src/crepe/api/LoopManager.cpp
+++ b/src/crepe/api/LoopManager.cpp
@@ -65,6 +65,7 @@ void LoopManager::fixed_update() {
 	this->get_system<InputSystem>().update();
 	this->event_manager.dispatch_events();
 	this->get_system<ScriptSystem>().update();
+	this->get_system<ParticleSystem>().update();
 	this->get_system<AISystem>().update();
 	this->get_system<PhysicsSystem>().update();
 	this->get_system<CollisionSystem>().update();
diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h
index 48c7625..cdea69a 100644
--- a/src/crepe/api/ParticleEmitter.h
+++ b/src/crepe/api/ParticleEmitter.h
@@ -5,6 +5,7 @@
 
 #include "Component.h"
 #include "Particle.h"
+#include "system/ParticleSystem.h"
 #include "types.h"
 
 namespace crepe {
@@ -52,8 +53,6 @@ public:
 		const unsigned int max_particles = 256;
 		//! rate of particle emission per update (Lowest value = 0.001 any lower is ignored)
 		float emission_rate = 1;
-		//! Saves time left over from last update event.
-		float spawn_accumulator  = 0;
 		//! min speed of the particles
 		float min_speed = 1;
 		//! min speed of the particles
@@ -85,6 +84,10 @@ public:
 public:
 	//! Configuration data for particle emission settings.
 	Data data;
+private:
+	//! Saves time left over from last update event.
+	friend ParticleSystem;
+	float spawn_accumulator  = 0;
 };
 
 } // namespace crepe
diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index 3befb03..941e502 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -1,3 +1,4 @@
+#include <chrono>
 #include <cmath>
 #include <cstdlib>
 #include <ctime>
@@ -5,6 +6,7 @@
 #include "../api/ParticleEmitter.h"
 #include "../api/Transform.h"
 #include "../manager/ComponentManager.h"
+#include "../manager/LoopTimerManager.h"
 
 #include "ParticleSystem.h"
 
@@ -12,10 +14,12 @@ using namespace crepe;
 
 void ParticleSystem::update() {
 	// Get all emitters
-	
-	ComponentManager & mgr = this->mediator.component_manager;
+	const Mediator & mediator = this->mediator;
+	LoopTimerManager & loop_timer = mediator.loop_timer;
+	ComponentManager & mgr = mediator.component_manager;
+	float dt = std::chrono::duration<float>(loop_timer.get_scaled_fixed_delta_time()).count();
+
 	RefVector<ParticleEmitter> emitters = mgr.get_components_by_type<ParticleEmitter>();
-	double dt = LoopTimer::get_instance().get_fixed_delta_time();
 
 	for (ParticleEmitter & emitter : emitters) {
 		// Get transform linked to emitter
@@ -23,10 +27,10 @@ void ParticleSystem::update() {
 			= mgr.get_components_by_id<Transform>(emitter.game_object_id).front().get();
 
 		// Emit particles based on emission_rate
-		emitter.data.spawn_accumulator = emitter.data.emission_rate * dt;
-		while (emitter.data.spawn_accumulator >= 1.0) {
+		emitter.spawn_accumulator = emitter.data.emission_rate * dt;
+		while (emitter.spawn_accumulator >= 1.0) {
 			this->emit_particle(emitter, transform);
-			emitter.data.spawn_accumulator -= 1.0;
+			emitter.spawn_accumulator -= 1.0;
     }
 		
 		// Update all particles
diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp
index afd9548..cc633e8 100644
--- a/src/crepe/system/RenderSystem.cpp
+++ b/src/crepe/system/RenderSystem.cpp
@@ -83,7 +83,7 @@ bool RenderSystem::render_particle(const Sprite & sprite, const double & scale)
 	bool rendering_particles = false;
 
 	for (const ParticleEmitter & em : emitters) {
-		if (&em.data.sprite != &sprite) continue;
+		if (&em.sprite != &sprite) continue;
 		rendering_particles = true;
 		if (!em.active) continue;
 
diff --git a/src/example/game.cpp b/src/example/game.cpp
index 5361f3a..279648e 100644
--- a/src/example/game.cpp
+++ b/src/example/game.cpp
@@ -1,4 +1,5 @@
 #include "api/CircleCollider.h"
+#include "api/ParticleEmitter.h"
 #include "api/Scene.h"
 #include "manager/ComponentManager.h"
 #include "manager/Mediator.h"
@@ -258,6 +259,26 @@ public:
 								   })
 			.active
 			= false;
+		Asset img5{"asset/texture/square.png"};
+
+		
+
+		GameObject particle = mgr.new_object(
+			"Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1);
+		auto & particle_image = particle.add_component<Sprite>(img5, Sprite::Data{.size = {5, 5},});
+		auto & test = particle.add_component<ParticleEmitter>(particle_image,ParticleEmitter::Data{
+		.position = {0, 0},
+		.max_particles = 256,
+		.emission_rate = 50,
+		.min_speed = 10,
+		.max_speed = 20,
+		.min_angle = -20,
+		.max_angle = 20,
+		.begin_lifespan = 0,
+		.end_lifespan = 5,
+	}
+	);
+
 	}
 
 	string get_name() const { return "scene1"; }
diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp
index 13e625f..2b5c041 100644
--- a/src/example/rendering_particle.cpp
+++ b/src/example/rendering_particle.cpp
@@ -17,28 +17,7 @@
 
 using namespace crepe;
 using namespace std;
-
-/*
-	auto & test = game_object.add_component<ParticleEmitter>(ParticleEmitter::Data{
-		.position = {0, 0},
-		.max_particles = 10,
-		.emission_rate = 0.1,
-		.min_speed = 6,
-		.max_speed = 20,
-		.min_angle = -20,
-		.max_angle = 20,
-		.begin_lifespan = 0,
-		.end_lifespan = 60,
-		.force_over_time = vec2{0, 0},
-		.boundary{
-			.width = 1000,
-			.height = 1000,
-			.offset = vec2{0, 0},
-			.reset_on_exit = false,
-		},
-		.sprite = test_sprite,
-	});
-	*/
+	
 
 class TestScene : public Scene {
 public:
-- 
cgit v1.2.3


From 5b1c45c2c3bd695ee8d8b5baa4b1988e24596559 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Thu, 12 Dec 2024 15:42:03 +0100
Subject: restore file

---
 src/crepe/system/CollisionSystem.cpp | 1 +
 1 file changed, 1 insertion(+)

(limited to 'src/crepe')

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 d4b4a54f919872ef1295890cd36ac46d89a4426d Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Thu, 12 Dec 2024 15:51:29 +0100
Subject: removed old code

---
 src/crepe/system/ParticleSystem.cpp | 2 --
 src/crepe/system/ParticleSystem.h   | 8 --------
 2 files changed, 10 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index 941e502..204afaf 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -43,8 +43,6 @@ void ParticleSystem::update() {
 		// Check if within boundary
 		this->check_bounds(emitter, transform);
 	}
-
-	this->update_count = (this->update_count + 1) % this->MAX_UPDATE_COUNT;
 }
 
 void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform & transform) {
diff --git a/src/crepe/system/ParticleSystem.h b/src/crepe/system/ParticleSystem.h
index 454b65f..95a2bd5 100644
--- a/src/crepe/system/ParticleSystem.h
+++ b/src/crepe/system/ParticleSystem.h
@@ -58,14 +58,6 @@ private:
 	 * \return Random speed.
 	 */
 	float generate_random_speed(float min_speed, float max_speed) const;
-
-private:
-	//! Counter to count updates to determine how many times emit_particle is
-	// called.
-	unsigned int update_count = 0;
-	//! Determines the lowest amount of emission rate (1000 = 0.001 = 1 particle per 1000
-	// updates).
-	static constexpr unsigned int MAX_UPDATE_COUNT = 100;
 };
 
 } // namespace crepe
-- 
cgit v1.2.3


From 6e2aa75019a28c298454f50b7bfb0dca100e0936 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Thu, 12 Dec 2024 17:46:21 +0100
Subject: save

---
 src/crepe/api/Event.h           |   5 ++
 src/crepe/api/KeyCodes.h        |   5 ++
 src/crepe/facade/SDLContext.cpp | 122 ++++------------------------------------
 src/crepe/facade/SDLContext.h   | 107 ++++++++++++++++++++++++++++++++++-
 4 files changed, 125 insertions(+), 114 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h
index d3e99af..d222e51 100644
--- a/src/crepe/api/Event.h
+++ b/src/crepe/api/Event.h
@@ -2,9 +2,12 @@
 // TODO discussing the location of these events
 
 #include <string>
+#include <unordered_map>
+
 
 #include "KeyCodes.h"
 #include "types.h"
+
 namespace crepe {
 
 /**
@@ -22,6 +25,7 @@ public:
 
 	//! The key that was pressed.
 	Keycode key = Keycode::NONE;
+	keyboard_state_t keyboard_state;
 };
 
 /**
@@ -31,6 +35,7 @@ class KeyReleaseEvent : public Event {
 public:
 	//! The key that was released.
 	Keycode key = Keycode::NONE;
+	keyboard_state_t keyboard_state;
 };
 
 /**
diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h
index f704fbb..4a3bf57 100644
--- a/src/crepe/api/KeyCodes.h
+++ b/src/crepe/api/KeyCodes.h
@@ -1,4 +1,7 @@
 #pragma once
+
+#include <unordered_map>
+
 namespace crepe {
 //! Enumeration for mouse button inputs, including standard and extended buttons.
 enum class MouseButton {
@@ -153,4 +156,6 @@ typedef enum {
 	//! Not actually a key instead its the amount of keycodes there are for array indexing
 	NUM_KEYCODES = 512,
 } Keycode;
+
+typedef std::unordered_map<Keycode, bool> keyboard_state_t;
 } // namespace crepe
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 75ad0e8..d70a7bb 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -77,118 +77,14 @@ SDLContext::~SDLContext() {
 }
 
 Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) {
-	static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] {
-		std::array<Keycode, SDL_NUM_SCANCODES> table{};
-		table.fill(Keycode::NONE);
-
-		// Map all SDL scancodes to Keycodes
-		table[SDL_SCANCODE_SPACE] = Keycode::SPACE;
-		table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE;
-		table[SDL_SCANCODE_COMMA] = Keycode::COMMA;
-		table[SDL_SCANCODE_MINUS] = Keycode::MINUS;
-		table[SDL_SCANCODE_PERIOD] = Keycode::PERIOD;
-		table[SDL_SCANCODE_SLASH] = Keycode::SLASH;
-		table[SDL_SCANCODE_0] = Keycode::D0;
-		table[SDL_SCANCODE_1] = Keycode::D1;
-		table[SDL_SCANCODE_2] = Keycode::D2;
-		table[SDL_SCANCODE_3] = Keycode::D3;
-		table[SDL_SCANCODE_4] = Keycode::D4;
-		table[SDL_SCANCODE_5] = Keycode::D5;
-		table[SDL_SCANCODE_6] = Keycode::D6;
-		table[SDL_SCANCODE_7] = Keycode::D7;
-		table[SDL_SCANCODE_8] = Keycode::D8;
-		table[SDL_SCANCODE_9] = Keycode::D9;
-		table[SDL_SCANCODE_SEMICOLON] = Keycode::SEMICOLON;
-		table[SDL_SCANCODE_EQUALS] = Keycode::EQUAL;
-		table[SDL_SCANCODE_A] = Keycode::A;
-		table[SDL_SCANCODE_B] = Keycode::B;
-		table[SDL_SCANCODE_C] = Keycode::C;
-		table[SDL_SCANCODE_D] = Keycode::D;
-		table[SDL_SCANCODE_E] = Keycode::E;
-		table[SDL_SCANCODE_F] = Keycode::F;
-		table[SDL_SCANCODE_G] = Keycode::G;
-		table[SDL_SCANCODE_H] = Keycode::H;
-		table[SDL_SCANCODE_I] = Keycode::I;
-		table[SDL_SCANCODE_J] = Keycode::J;
-		table[SDL_SCANCODE_K] = Keycode::K;
-		table[SDL_SCANCODE_L] = Keycode::L;
-		table[SDL_SCANCODE_M] = Keycode::M;
-		table[SDL_SCANCODE_N] = Keycode::N;
-		table[SDL_SCANCODE_O] = Keycode::O;
-		table[SDL_SCANCODE_P] = Keycode::P;
-		table[SDL_SCANCODE_Q] = Keycode::Q;
-		table[SDL_SCANCODE_R] = Keycode::R;
-		table[SDL_SCANCODE_S] = Keycode::S;
-		table[SDL_SCANCODE_T] = Keycode::T;
-		table[SDL_SCANCODE_U] = Keycode::U;
-		table[SDL_SCANCODE_V] = Keycode::V;
-		table[SDL_SCANCODE_W] = Keycode::W;
-		table[SDL_SCANCODE_X] = Keycode::X;
-		table[SDL_SCANCODE_Y] = Keycode::Y;
-		table[SDL_SCANCODE_Z] = Keycode::Z;
-		table[SDL_SCANCODE_LEFTBRACKET] = Keycode::LEFT_BRACKET;
-		table[SDL_SCANCODE_BACKSLASH] = Keycode::BACKSLASH;
-		table[SDL_SCANCODE_RIGHTBRACKET] = Keycode::RIGHT_BRACKET;
-		table[SDL_SCANCODE_GRAVE] = Keycode::GRAVE_ACCENT;
-		table[SDL_SCANCODE_ESCAPE] = Keycode::ESCAPE;
-		table[SDL_SCANCODE_RETURN] = Keycode::ENTER;
-		table[SDL_SCANCODE_TAB] = Keycode::TAB;
-		table[SDL_SCANCODE_BACKSPACE] = Keycode::BACKSPACE;
-		table[SDL_SCANCODE_INSERT] = Keycode::INSERT;
-		table[SDL_SCANCODE_DELETE] = Keycode::DELETE;
-		table[SDL_SCANCODE_RIGHT] = Keycode::RIGHT;
-		table[SDL_SCANCODE_LEFT] = Keycode::LEFT;
-		table[SDL_SCANCODE_DOWN] = Keycode::DOWN;
-		table[SDL_SCANCODE_UP] = Keycode::UP;
-		table[SDL_SCANCODE_PAGEUP] = Keycode::PAGE_UP;
-		table[SDL_SCANCODE_PAGEDOWN] = Keycode::PAGE_DOWN;
-		table[SDL_SCANCODE_HOME] = Keycode::HOME;
-		table[SDL_SCANCODE_END] = Keycode::END;
-		table[SDL_SCANCODE_CAPSLOCK] = Keycode::CAPS_LOCK;
-		table[SDL_SCANCODE_SCROLLLOCK] = Keycode::SCROLL_LOCK;
-		table[SDL_SCANCODE_NUMLOCKCLEAR] = Keycode::NUM_LOCK;
-		table[SDL_SCANCODE_PRINTSCREEN] = Keycode::PRINT_SCREEN;
-		table[SDL_SCANCODE_PAUSE] = Keycode::PAUSE;
-		table[SDL_SCANCODE_F1] = Keycode::F1;
-		table[SDL_SCANCODE_F2] = Keycode::F2;
-		table[SDL_SCANCODE_F3] = Keycode::F3;
-		table[SDL_SCANCODE_F4] = Keycode::F4;
-		table[SDL_SCANCODE_F5] = Keycode::F5;
-		table[SDL_SCANCODE_F6] = Keycode::F6;
-		table[SDL_SCANCODE_F7] = Keycode::F7;
-		table[SDL_SCANCODE_F8] = Keycode::F8;
-		table[SDL_SCANCODE_F9] = Keycode::F9;
-		table[SDL_SCANCODE_F10] = Keycode::F10;
-		table[SDL_SCANCODE_F11] = Keycode::F11;
-		table[SDL_SCANCODE_F12] = Keycode::F12;
-		table[SDL_SCANCODE_KP_0] = Keycode::KP0;
-		table[SDL_SCANCODE_KP_1] = Keycode::KP1;
-		table[SDL_SCANCODE_KP_2] = Keycode::KP2;
-		table[SDL_SCANCODE_KP_3] = Keycode::KP3;
-		table[SDL_SCANCODE_KP_4] = Keycode::KP4;
-		table[SDL_SCANCODE_KP_5] = Keycode::KP5;
-		table[SDL_SCANCODE_KP_6] = Keycode::KP6;
-		table[SDL_SCANCODE_KP_7] = Keycode::KP7;
-		table[SDL_SCANCODE_KP_8] = Keycode::KP8;
-		table[SDL_SCANCODE_KP_9] = Keycode::KP9;
-		table[SDL_SCANCODE_LSHIFT] = Keycode::LEFT_SHIFT;
-		table[SDL_SCANCODE_LCTRL] = Keycode::LEFT_CONTROL;
-		table[SDL_SCANCODE_LALT] = Keycode::LEFT_ALT;
-		table[SDL_SCANCODE_LGUI] = Keycode::LEFT_SUPER;
-		table[SDL_SCANCODE_RSHIFT] = Keycode::RIGHT_SHIFT;
-		table[SDL_SCANCODE_RCTRL] = Keycode::RIGHT_CONTROL;
-		table[SDL_SCANCODE_RALT] = Keycode::RIGHT_ALT;
-		table[SDL_SCANCODE_RGUI] = Keycode::RIGHT_SUPER;
-		table[SDL_SCANCODE_MENU] = Keycode::MENU;
+	auto it = LOOKUP_TABLE.find(sdl_key);
+    if (it != LOOKUP_TABLE.end()) {
+        return it->second;
+    }
 
-		return table;
-	}();
-	if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) {
-		return Keycode::NONE;
-	}
-	return LOOKUP_TABLE[sdl_key];
+    return Keycode::NONE;
 }
-std::array<bool, Keycode::NUM_KEYCODES> SDLContext::get_keyboard_state() {
+keyboard_state_t SDLContext::get_keyboard_state() {
 	// Array to hold the key states (true if pressed, false if not)
 	std::array<bool, Keycode::NUM_KEYCODES> keyState{};
 	SDL_PumpEvents();
@@ -198,11 +94,11 @@ std::array<bool, Keycode::NUM_KEYCODES> SDLContext::get_keyboard_state() {
 		Keycode key = sdl_to_keycode(static_cast<SDL_Scancode>(i));
 
 		if (key != Keycode::NONE) {
-			keyState[key] = current_state[i] != 0;
+			keyboard_state[key] = current_state[i] != 0;
 		}
 	}
 
-	return keyState;
+	return keyboard_state;
 }
 
 MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) {
@@ -403,6 +299,7 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 				transfer_event.data.key_data = KeyData{
 					.key = sdl_to_keycode(event.key.keysym.scancode),
 					.key_repeat = event.key.repeat != 0,
+					.keyboard_state = this->get_keyboard_state(),
 				};
 				event_list.push_back(transfer_event);
 			}
@@ -414,6 +311,7 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 				transfer_event.data.key_data = KeyData{
 					.key = sdl_to_keycode(event.key.keysym.scancode),
 					.key_repeat = false,
+					.keyboard_state = this->get_keyboard_state(),
 				};
 				event_list.push_back(transfer_event);
 			}
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index d7af226..feb51f4 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -10,6 +10,7 @@
 #include <functional>
 #include <memory>
 #include <string>
+#include <unordered_map>
 
 #include "api/Camera.h"
 #include "api/Color.h"
@@ -129,11 +130,11 @@ public:
 	 * specific key defined in the `Keycode` enum, and the value indicates whether
 	 * the key is currently pressed (true) or not pressed (false).
 	 *
-	 * \return A `std::array<bool, Keycode::NUM_KEYCODES>` representing the state of
+	 * \return A `keyboard_state_t` representing the state of
 	 *         each key on the keyboard, where `true` means the key is pressed, and
 	 *         `false` means it is not pressed.
 	 */
-	std::array<bool, Keycode::NUM_KEYCODES> get_keyboard_state();
+	keyboard_state_t get_keyboard_state();
 	/**
 	 * \brief Gets the singleton instance of SDLContext.
 	 * \return Reference to the SDLContext instance.
@@ -294,6 +295,108 @@ private:
 	 * - this is defined in this class because get_events() needs this information aswell
 	 */
 	CameraAuxiliaryData cam_aux_data;
+private: 
+	keyboard_state_t keyboard_state;
+	const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE = {
+        {SDL_SCANCODE_SPACE, Keycode::SPACE},
+        {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE},
+        {SDL_SCANCODE_COMMA, Keycode::COMMA},
+        {SDL_SCANCODE_MINUS, Keycode::MINUS},
+        {SDL_SCANCODE_PERIOD, Keycode::PERIOD},
+        {SDL_SCANCODE_SLASH, Keycode::SLASH},
+        {SDL_SCANCODE_0, Keycode::D0},
+        {SDL_SCANCODE_1, Keycode::D1},
+        {SDL_SCANCODE_2, Keycode::D2},
+        {SDL_SCANCODE_3, Keycode::D3},
+        {SDL_SCANCODE_4, Keycode::D4},
+        {SDL_SCANCODE_5, Keycode::D5},
+        {SDL_SCANCODE_6, Keycode::D6},
+        {SDL_SCANCODE_7, Keycode::D7},
+        {SDL_SCANCODE_8, Keycode::D8},
+        {SDL_SCANCODE_9, Keycode::D9},
+        {SDL_SCANCODE_SEMICOLON, Keycode::SEMICOLON},
+        {SDL_SCANCODE_EQUALS, Keycode::EQUAL},
+        {SDL_SCANCODE_A, Keycode::A},
+        {SDL_SCANCODE_B, Keycode::B},
+        {SDL_SCANCODE_C, Keycode::C},
+        {SDL_SCANCODE_D, Keycode::D},
+        {SDL_SCANCODE_E, Keycode::E},
+        {SDL_SCANCODE_F, Keycode::F},
+        {SDL_SCANCODE_G, Keycode::G},
+        {SDL_SCANCODE_H, Keycode::H},
+        {SDL_SCANCODE_I, Keycode::I},
+        {SDL_SCANCODE_J, Keycode::J},
+        {SDL_SCANCODE_K, Keycode::K},
+        {SDL_SCANCODE_L, Keycode::L},
+        {SDL_SCANCODE_M, Keycode::M},
+        {SDL_SCANCODE_N, Keycode::N},
+        {SDL_SCANCODE_O, Keycode::O},
+        {SDL_SCANCODE_P, Keycode::P},
+        {SDL_SCANCODE_Q, Keycode::Q},
+        {SDL_SCANCODE_R, Keycode::R},
+        {SDL_SCANCODE_S, Keycode::S},
+        {SDL_SCANCODE_T, Keycode::T},
+        {SDL_SCANCODE_U, Keycode::U},
+        {SDL_SCANCODE_V, Keycode::V},
+        {SDL_SCANCODE_W, Keycode::W},
+        {SDL_SCANCODE_X, Keycode::X},
+        {SDL_SCANCODE_Y, Keycode::Y},
+        {SDL_SCANCODE_Z, Keycode::Z},
+        {SDL_SCANCODE_LEFTBRACKET, Keycode::LEFT_BRACKET},
+        {SDL_SCANCODE_BACKSLASH, Keycode::BACKSLASH},
+        {SDL_SCANCODE_RIGHTBRACKET, Keycode::RIGHT_BRACKET},
+        {SDL_SCANCODE_GRAVE, Keycode::GRAVE_ACCENT},
+        {SDL_SCANCODE_ESCAPE, Keycode::ESCAPE},
+        {SDL_SCANCODE_RETURN, Keycode::ENTER},
+        {SDL_SCANCODE_TAB, Keycode::TAB},
+        {SDL_SCANCODE_BACKSPACE, Keycode::BACKSPACE},
+        {SDL_SCANCODE_INSERT, Keycode::INSERT},
+        {SDL_SCANCODE_DELETE, Keycode::DELETE},
+        {SDL_SCANCODE_RIGHT, Keycode::RIGHT},
+        {SDL_SCANCODE_LEFT, Keycode::LEFT},
+        {SDL_SCANCODE_DOWN, Keycode::DOWN},
+        {SDL_SCANCODE_UP, Keycode::UP},
+        {SDL_SCANCODE_PAGEUP, Keycode::PAGE_UP},
+        {SDL_SCANCODE_PAGEDOWN, Keycode::PAGE_DOWN},
+        {SDL_SCANCODE_HOME, Keycode::HOME},
+        {SDL_SCANCODE_END, Keycode::END},
+        {SDL_SCANCODE_CAPSLOCK, Keycode::CAPS_LOCK},
+        {SDL_SCANCODE_SCROLLLOCK, Keycode::SCROLL_LOCK},
+        {SDL_SCANCODE_NUMLOCKCLEAR, Keycode::NUM_LOCK},
+        {SDL_SCANCODE_PRINTSCREEN, Keycode::PRINT_SCREEN},
+        {SDL_SCANCODE_PAUSE, Keycode::PAUSE},
+        {SDL_SCANCODE_F1, Keycode::F1},
+        {SDL_SCANCODE_F2, Keycode::F2},
+        {SDL_SCANCODE_F3, Keycode::F3},
+        {SDL_SCANCODE_F4, Keycode::F4},
+        {SDL_SCANCODE_F5, Keycode::F5},
+        {SDL_SCANCODE_F6, Keycode::F6},
+        {SDL_SCANCODE_F7, Keycode::F7},
+        {SDL_SCANCODE_F8, Keycode::F8},
+        {SDL_SCANCODE_F9, Keycode::F9},
+        {SDL_SCANCODE_F10, Keycode::F10},
+        {SDL_SCANCODE_F11, Keycode::F11},
+        {SDL_SCANCODE_F12, Keycode::F12},
+        {SDL_SCANCODE_KP_0, Keycode::KP0},
+        {SDL_SCANCODE_KP_1, Keycode::KP1},
+        {SDL_SCANCODE_KP_2, Keycode::KP2},
+        {SDL_SCANCODE_KP_3, Keycode::KP3},
+        {SDL_SCANCODE_KP_4, Keycode::KP4},
+        {SDL_SCANCODE_KP_5, Keycode::KP5},
+        {SDL_SCANCODE_KP_6, Keycode::KP6},
+        {SDL_SCANCODE_KP_7, Keycode::KP7},
+        {SDL_SCANCODE_KP_8, Keycode::KP8},
+        {SDL_SCANCODE_KP_9, Keycode::KP9},
+        {SDL_SCANCODE_LSHIFT, Keycode::LEFT_SHIFT},
+        {SDL_SCANCODE_LCTRL, Keycode::LEFT_CONTROL},
+        {SDL_SCANCODE_LALT, Keycode::LEFT_ALT},
+        {SDL_SCANCODE_LGUI, Keycode::LEFT_SUPER},
+        {SDL_SCANCODE_RSHIFT, Keycode::RIGHT_SHIFT},
+        {SDL_SCANCODE_RCTRL, Keycode::RIGHT_CONTROL},
+        {SDL_SCANCODE_RALT, Keycode::RIGHT_ALT},
+        {SDL_SCANCODE_RGUI, Keycode::RIGHT_SUPER},
+        {SDL_SCANCODE_MENU, Keycode::MENU}
+    };
 };
 
 } // namespace crepe
-- 
cgit v1.2.3


From 9e1c0d08a8e1813799cf5002562d3f503524d718 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Thu, 12 Dec 2024 18:14:08 +0100
Subject: updated comment

---
 src/crepe/api/ParticleEmitter.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h
index cdea69a..1251a30 100644
--- a/src/crepe/api/ParticleEmitter.h
+++ b/src/crepe/api/ParticleEmitter.h
@@ -51,7 +51,7 @@ public:
 		vec2 position;
 		//! maximum number of particles
 		const unsigned int max_particles = 256;
-		//! rate of particle emission per update (Lowest value = 0.001 any lower is ignored)
+		//! rate of particle emission per second
 		float emission_rate = 1;
 		//! min speed of the particles
 		float min_speed = 1;
-- 
cgit v1.2.3


From 1e42d6669b462a3d1490788d3b20141d15c881db Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Thu, 12 Dec 2024 18:14:47 +0100
Subject: update comment

---
 src/crepe/api/ParticleEmitter.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h
index 1251a30..cc54ffb 100644
--- a/src/crepe/api/ParticleEmitter.h
+++ b/src/crepe/api/ParticleEmitter.h
@@ -61,9 +61,9 @@ public:
 		float min_angle = 0;
 		//! max angle of particle emission
 		float max_angle = 0;
-		//! begin Lifespan of particle (only visual)
+		//! begin Lifespan of particle in seconds (only visual)
 		float begin_lifespan = 0.0;
-		//! end Lifespan of particle
+		//! end Lifespan of particle in seconds
 		float end_lifespan = 10.0;
 		//! force over time (physics)
 		vec2 force_over_time;
-- 
cgit v1.2.3


From bef438ff7790acbe2dc376097e1782e60356bf45 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Thu, 12 Dec 2024 18:25:11 +0100
Subject: changed get dt

---
 src/crepe/system/ParticleSystem.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/crepe')

diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index 204afaf..a58edf0 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -17,7 +17,7 @@ void ParticleSystem::update() {
 	const Mediator & mediator = this->mediator;
 	LoopTimerManager & loop_timer = mediator.loop_timer;
 	ComponentManager & mgr = mediator.component_manager;
-	float dt = std::chrono::duration<float>(loop_timer.get_scaled_fixed_delta_time()).count();
+	float dt = loop_timer.get_scaled_fixed_delta_time();
 
 	RefVector<ParticleEmitter> emitters = mgr.get_components_by_type<ParticleEmitter>();
 
-- 
cgit v1.2.3


From feb27ebdc4086dec62e45e3a6c83bdd021568dd5 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Thu, 12 Dec 2024 18:47:18 +0100
Subject: reverted dt

---
 src/crepe/system/ParticleSystem.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/crepe')

diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index a58edf0..85b8248 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -17,7 +17,7 @@ void ParticleSystem::update() {
 	const Mediator & mediator = this->mediator;
 	LoopTimerManager & loop_timer = mediator.loop_timer;
 	ComponentManager & mgr = mediator.component_manager;
-	float dt = loop_timer.get_scaled_fixed_delta_time();
+	float dt = loop_timer.get_scaled_fixed_delta_time().count();
 
 	RefVector<ParticleEmitter> emitters = mgr.get_components_by_type<ParticleEmitter>();
 
-- 
cgit v1.2.3


From 927aab8cf424d1f3bf25056ce4b4126ce9f4edab Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Thu, 12 Dec 2024 18:49:50 +0100
Subject: reverted

---
 src/crepe/system/CollisionSystem.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/crepe')

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 d3a04fb1e8b119017375caab74c43674006a7348 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Thu, 12 Dec 2024 22:04:49 +0100
Subject: broken particle test

---
 src/crepe/api/ParticleEmitter.cpp   |  2 +-
 src/crepe/api/ParticleEmitter.h     | 10 ++++++----
 src/crepe/system/ParticleSystem.cpp |  6 +++---
 src/crepe/system/RenderSystem.cpp   |  2 +-
 src/test/ParticleTest.cpp           | 37 +++++++++++++++++++++----------------
 5 files changed, 32 insertions(+), 25 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/ParticleEmitter.cpp b/src/crepe/api/ParticleEmitter.cpp
index 1cfdceb..1e9cfaa 100644
--- a/src/crepe/api/ParticleEmitter.cpp
+++ b/src/crepe/api/ParticleEmitter.cpp
@@ -7,6 +7,6 @@ ParticleEmitter::ParticleEmitter(game_object_id_t game_object_id, const Sprite &
 	: Component(game_object_id),
 	  sprite(sprite), data(data) {
 	for (size_t i = 0; i < this->data.max_particles; i++) {
-		this->data.particles.emplace_back();
+		this->particles.emplace_back();
 	}
 }
diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h
index cc54ffb..e0b117a 100644
--- a/src/crepe/api/ParticleEmitter.h
+++ b/src/crepe/api/ParticleEmitter.h
@@ -3,9 +3,11 @@
 #include <cmath>
 #include <vector>
 
+#include "system/ParticleSystem.h"
+#include "system/RenderSystem.h"
+
 #include "Component.h"
 #include "Particle.h"
-#include "system/ParticleSystem.h"
 #include "types.h"
 
 namespace crepe {
@@ -69,9 +71,6 @@ public:
 		vec2 force_over_time;
 		//! particle boundary
 		Boundary boundary;
-		//! collection of particles
-		std::vector<Particle> particles;
-		
 	};
 
 public:
@@ -87,7 +86,10 @@ public:
 private:
 	//! Saves time left over from last update event.
 	friend ParticleSystem;
+	friend RenderSystem;
 	float spawn_accumulator  = 0;
+	//! collection of particles
+	std::vector<Particle> particles;
 };
 
 } // namespace crepe
diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index 85b8248..a56de60 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -34,7 +34,7 @@ void ParticleSystem::update() {
     }
 		
 		// Update all particles
-		for (Particle & particle : emitter.data.particles) {
+		for (Particle & particle : emitter.particles) {
 			if (particle.active) {
 				particle.update(dt);
 			}
@@ -57,7 +57,7 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform &
 	vec2 velocity
 		= {random_speed * std::cos(angle_radians), random_speed * std::sin(angle_radians)};
 
-	for (Particle & particle : emitter.data.particles) {
+	for (Particle & particle : emitter.particles) {
 		if (!particle.active) {
 			particle.reset(emitter.data.end_lifespan, initial_position, velocity,
 						   random_angle);
@@ -76,7 +76,7 @@ void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & t
 	const float TOP = offset.y - half_height;
 	const float BOTTOM = offset.y + half_height;
 
-	for (Particle & particle : emitter.data.particles) {
+	for (Particle & particle : emitter.particles) {
 		const vec2 & position = particle.position;
 		bool within_bounds = (position.x >= LEFT && position.x <= RIGHT && position.y >= TOP
 							  && position.y <= BOTTOM);
diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp
index cc633e8..505433a 100644
--- a/src/crepe/system/RenderSystem.cpp
+++ b/src/crepe/system/RenderSystem.cpp
@@ -87,7 +87,7 @@ bool RenderSystem::render_particle(const Sprite & sprite, const double & scale)
 		rendering_particles = true;
 		if (!em.active) continue;
 
-		for (const Particle & p : em.data.particles) {
+		for (const Particle & p : em.particles) {
 			if (!p.active) continue;
 
 			ctx.draw(SDLContext::RenderContext{
diff --git a/src/test/ParticleTest.cpp b/src/test/ParticleTest.cpp
index 9112a3f..70534f3 100644
--- a/src/test/ParticleTest.cpp
+++ b/src/test/ParticleTest.cpp
@@ -11,10 +11,14 @@
 #include <gtest/gtest.h>
 #include <math.h>
 
+#define protected public
+#define private public
+
 using namespace std;
 using namespace std::chrono_literals;
 using namespace crepe;
 
+
 class ParticlesTest : public ::testing::Test {
 	Mediator m;
 
@@ -57,6 +61,7 @@ public:
 				},
 				.sprite = test_sprite,
 			});
+			
 		}
 		transforms = mgr.get_components_by_id<Transform>(0);
 		Transform & transform = transforms.front().get();
@@ -76,7 +81,7 @@ public:
 		emitter.data.end_lifespan = 0;
 		emitter.data.force_over_time = vec2{0, 0};
 		emitter.data.boundary = {0, 0, vec2{0, 0}, false};
-		for (auto & particle : emitter.data.particles) {
+		for (auto & particle : emitter.particles) {
 			particle.active = false;
 		}
 	}
@@ -95,19 +100,19 @@ TEST_F(ParticlesTest, spawnParticle) {
 	emitter.data.max_angle = 10;
 	particle_system.update();
 	//check if nothing happend
-	EXPECT_EQ(emitter.data.particles[0].active, false);
+	EXPECT_EQ(emitter.particles[0].active, false);
 	emitter.data.emission_rate = 1;
 	//check particle spawnes
 	particle_system.update();
-	EXPECT_EQ(emitter.data.particles[0].active, true);
+	EXPECT_EQ(emitter.particles[0].active, true);
 	particle_system.update();
-	EXPECT_EQ(emitter.data.particles[1].active, true);
+	EXPECT_EQ(emitter.particles[1].active, true);
 	particle_system.update();
-	EXPECT_EQ(emitter.data.particles[2].active, true);
+	EXPECT_EQ(emitter.particles[2].active, true);
 	particle_system.update();
-	EXPECT_EQ(emitter.data.particles[3].active, true);
+	EXPECT_EQ(emitter.particles[3].active, true);
 
-	for (auto & particle : emitter.data.particles) {
+	for (auto & particle : emitter.particles) {
 		// Check velocity range
 		EXPECT_GE(particle.velocity.x, emitter.data.min_speed);
 		// Speed should be greater than or equal to min_speed
@@ -139,7 +144,7 @@ TEST_F(ParticlesTest, moveParticleHorizontal) {
 	emitter.data.emission_rate = 1;
 	for (int a = 1; a < emitter.data.boundary.width / 2; a++) {
 		particle_system.update();
-		EXPECT_EQ(emitter.data.particles[0].position.x, a);
+		EXPECT_EQ(emitter.particles[0].position.x, a);
 	}
 }
 
@@ -157,7 +162,7 @@ TEST_F(ParticlesTest, moveParticleVertical) {
 	emitter.data.emission_rate = 1;
 	for (int a = 1; a < emitter.data.boundary.width / 2; a++) {
 		particle_system.update();
-		EXPECT_EQ(emitter.data.particles[0].position.y, a);
+		EXPECT_EQ(emitter.particles[0].position.y, a);
 	}
 }
 
@@ -177,7 +182,7 @@ TEST_F(ParticlesTest, boundaryParticleReset) {
 	for (int a = 0; a < emitter.data.boundary.width / 2 + 1; a++) {
 		particle_system.update();
 	}
-	EXPECT_EQ(emitter.data.particles[0].active, false);
+	EXPECT_EQ(emitter.particles[0].active, false);
 }
 
 TEST_F(ParticlesTest, boundaryParticleStop) {
@@ -197,12 +202,12 @@ TEST_F(ParticlesTest, boundaryParticleStop) {
 		particle_system.update();
 	}
 	const double TOLERANCE = 0.01;
-	EXPECT_NEAR(emitter.data.particles[0].velocity.x, 0, TOLERANCE);
-	EXPECT_NEAR(emitter.data.particles[0].velocity.y, 0, TOLERANCE);
-	if (emitter.data.particles[0].velocity.x != 0)
-		EXPECT_NEAR(std::abs(emitter.data.particles[0].position.x),
+	EXPECT_NEAR(emitter.particles[0].velocity.x, 0, TOLERANCE);
+	EXPECT_NEAR(emitter.particles[0].velocity.y, 0, TOLERANCE);
+	if (emitter.particles[0].velocity.x != 0)
+		EXPECT_NEAR(std::abs(emitter.particles[0].position.x),
 					emitter.data.boundary.height / 2, TOLERANCE);
-	if (emitter.data.particles[0].velocity.y != 0)
-		EXPECT_NEAR(std::abs(emitter.data.particles[0].position.y),
+	if (emitter.particles[0].velocity.y != 0)
+		EXPECT_NEAR(std::abs(emitter.particles[0].position.y),
 					emitter.data.boundary.width / 2, TOLERANCE);
 }
-- 
cgit v1.2.3


From 193d5bf4d9577e63202cec45b21ed85a76a89f09 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Fri, 13 Dec 2024 08:16:48 +0100
Subject: keyboard state implemented

---
 src/crepe/api/Event.h           |  4 ----
 src/crepe/api/KeyCodes.h        |  2 +-
 src/crepe/facade/SDLContext.cpp | 10 ++++------
 src/crepe/facade/SDLContext.h   | 12 ++++--------
 4 files changed, 9 insertions(+), 19 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h
index d222e51..66dd0cc 100644
--- a/src/crepe/api/Event.h
+++ b/src/crepe/api/Event.h
@@ -2,8 +2,6 @@
 // TODO discussing the location of these events
 
 #include <string>
-#include <unordered_map>
-
 
 #include "KeyCodes.h"
 #include "types.h"
@@ -25,7 +23,6 @@ public:
 
 	//! The key that was pressed.
 	Keycode key = Keycode::NONE;
-	keyboard_state_t keyboard_state;
 };
 
 /**
@@ -35,7 +32,6 @@ class KeyReleaseEvent : public Event {
 public:
 	//! The key that was released.
 	Keycode key = Keycode::NONE;
-	keyboard_state_t keyboard_state;
 };
 
 /**
diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h
index 4a3bf57..fa0d17c 100644
--- a/src/crepe/api/KeyCodes.h
+++ b/src/crepe/api/KeyCodes.h
@@ -157,5 +157,5 @@ typedef enum {
 	NUM_KEYCODES = 512,
 } Keycode;
 
-typedef std::unordered_map<Keycode, bool> keyboard_state_t;
+
 } // namespace crepe
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index d70a7bb..6e47561 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -84,7 +84,7 @@ Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) {
 
     return Keycode::NONE;
 }
-keyboard_state_t SDLContext::get_keyboard_state() {
+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();
@@ -94,11 +94,10 @@ keyboard_state_t SDLContext::get_keyboard_state() {
 		Keycode key = sdl_to_keycode(static_cast<SDL_Scancode>(i));
 
 		if (key != Keycode::NONE) {
-			keyboard_state[key] = current_state[i] != 0;
+			this->keyboard_state[key] = current_state[i] != 0;
 		}
 	}
 
-	return keyboard_state;
 }
 
 MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) {
@@ -293,25 +292,24 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 				break;
 			case SDL_KEYDOWN:
 			{
-
+				this->update_keyboard_state();
 				EventData transfer_event;
 				transfer_event.event_type = SDLContext::EventType::KEYDOWN;
 				transfer_event.data.key_data = KeyData{
 					.key = sdl_to_keycode(event.key.keysym.scancode),
 					.key_repeat = event.key.repeat != 0,
-					.keyboard_state = this->get_keyboard_state(),
 				};
 				event_list.push_back(transfer_event);
 			}
 				break;
 			case SDL_KEYUP:
 			{
+				this->update_keyboard_state();
 				EventData transfer_event;
 				transfer_event.event_type = SDLContext::EventType::KEYUP;
 				transfer_event.data.key_data = KeyData{
 					.key = sdl_to_keycode(event.key.keysym.scancode),
 					.key_repeat = false,
-					.keyboard_state = this->get_keyboard_state(),
 				};
 				event_list.push_back(transfer_event);
 			}
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index feb51f4..b10bcfe 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -125,16 +125,12 @@ public:
 	/**
 	 * \brief Retrieves the current state of the keyboard.
 	 *
-	 * This method returns the state of all keys on the keyboard, represented as a
-	 * `std::array` of boolean values. Each element of the array corresponds to a
+	 * This method updates the state of all keys on the keyboard. Each element of the unordered map corresponds to a
 	 * specific key defined in the `Keycode` enum, and the value indicates whether
 	 * the key is currently pressed (true) or not pressed (false).
-	 *
-	 * \return A `keyboard_state_t` representing the state of
-	 *         each key on the keyboard, where `true` means the key is pressed, and
-	 *         `false` means it is not pressed.
+	 * 
 	 */
-	keyboard_state_t get_keyboard_state();
+	void update_keyboard_state();
 	/**
 	 * \brief Gets the singleton instance of SDLContext.
 	 * \return Reference to the SDLContext instance.
@@ -296,7 +292,7 @@ private:
 	 */
 	CameraAuxiliaryData cam_aux_data;
 private: 
-	keyboard_state_t keyboard_state;
+	std::unordered_map<Keycode, bool> keyboard_state;
 	const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE = {
         {SDL_SCANCODE_SPACE, Keycode::SPACE},
         {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE},
-- 
cgit v1.2.3


From 2b3659c8c5dace0ff9ff9cb8b9421f7f3f890218 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Fri, 13 Dec 2024 09:15:56 +0100
Subject: added window events back to code and function cleanup

---
 src/crepe/api/Event.h            |  10 +-
 src/crepe/api/KeyCodes.h         |   2 -
 src/crepe/facade/SDLContext.cpp  |  72 ++++++------
 src/crepe/facade/SDLContext.h    |   5 -
 src/crepe/system/InputSystem.cpp | 239 ++++++++++++++++++++-------------------
 src/crepe/system/InputSystem.h   |  37 ++++--
 src/test/InputTest.cpp           |  52 +--------
 7 files changed, 196 insertions(+), 221 deletions(-)

(limited to 'src/crepe')

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 &current_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 &current_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);
-}
-- 
cgit v1.2.3


From 4b816c460d3b2fb81123ac7ce6113216fc7c9b17 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Fri, 13 Dec 2024 09:18:03 +0100
Subject: reverted Keycode back

---
 src/crepe/api/KeyCodes.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h
index a9141e2..a13d1af 100644
--- a/src/crepe/api/KeyCodes.h
+++ b/src/crepe/api/KeyCodes.h
@@ -16,7 +16,7 @@ enum class MouseButton {
 };
 
 //! Enumeration for keyboard key inputs, including printable characters, function keys, and keypad keys.
-typedef enum {
+enum class Keycode {
 	NONE = 0, //!< No key input.
 	SPACE = 32, //!< Spacebar.
 	APOSTROPHE = 39, //!< Apostrophe (').
@@ -153,7 +153,7 @@ typedef enum {
 	RIGHT_SUPER = 347,
 	/// \}
 	MENU = 348, //!< Menu key.
-} Keycode;
+};
 
 
 } // namespace crepe
-- 
cgit v1.2.3


From a03f90fa9bcbd5a0c5b5d1f2e50df183c7c3640c Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Fri, 13 Dec 2024 09:19:55 +0100
Subject: make format

---
 src/crepe/api/KeyCodes.h         |   1 -
 src/crepe/facade/SDLContext.cpp  |  57 +++++-----
 src/crepe/facade/SDLContext.h    | 218 +++++++++++++++++++--------------------
 src/crepe/system/InputSystem.cpp |  57 +++++-----
 src/crepe/system/InputSystem.h   |  14 +--
 src/test/EventTest.cpp           |   6 +-
 src/test/InputTest.cpp           |   9 +-
 7 files changed, 175 insertions(+), 187 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h
index a13d1af..dc3219a 100644
--- a/src/crepe/api/KeyCodes.h
+++ b/src/crepe/api/KeyCodes.h
@@ -155,5 +155,4 @@ enum class Keycode {
 	MENU = 348, //!< Menu key.
 };
 
-
 } // namespace crepe
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 7c7d58e..7e19ede 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -77,11 +77,11 @@ SDLContext::~SDLContext() {
 
 Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) {
 	auto it = LOOKUP_TABLE.find(sdl_key);
-    if (it != LOOKUP_TABLE.end()) {
-        return it->second;
-    }
+	if (it != LOOKUP_TABLE.end()) {
+		return it->second;
+	}
 
-    return Keycode::NONE;
+	return Keycode::NONE;
 }
 void SDLContext::update_keyboard_state() {
 	// Array to hold the key states (true if pressed, false if not)
@@ -95,7 +95,6 @@ void SDLContext::update_keyboard_state() {
 			this->keyboard_state[key] = current_state[i] != 0;
 		}
 	}
-
 }
 
 MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) {
@@ -286,8 +285,7 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 			case SDL_QUIT:
 				event_list.push_back({.event_type = SDLContext::EventType::SHUTDOWN});
 				break;
-			case SDL_KEYDOWN:
-			{
+			case SDL_KEYDOWN: {
 				this->update_keyboard_state();
 				EventData transfer_event;
 				transfer_event.event_type = SDLContext::EventType::KEYDOWN;
@@ -296,10 +294,10 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 					.key_repeat = event.key.repeat != 0,
 				};
 				event_list.push_back(transfer_event);
-			}
 				break;
-			case SDL_KEYUP:
-			{
+			}
+
+			case SDL_KEYUP: {
 				this->update_keyboard_state();
 				EventData transfer_event;
 				transfer_event.event_type = SDLContext::EventType::KEYUP;
@@ -308,10 +306,10 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 					.key_repeat = false,
 				};
 				event_list.push_back(transfer_event);
-			}
 				break;
-			case SDL_MOUSEBUTTONDOWN:
-			{
+			}
+
+			case SDL_MOUSEBUTTONDOWN: {
 				EventData transfer_event;
 				transfer_event.event_type = SDLContext::EventType::MOUSEDOWN;
 				transfer_event.data.mouse_data = MouseData{
@@ -319,10 +317,9 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 					.mouse_position = mouse_pos,
 				};
 				event_list.push_back(transfer_event);
-				
-			} break;
-			case SDL_MOUSEBUTTONUP: 
-			{
+				break;
+			}
+			case SDL_MOUSEBUTTONUP: {
 				EventData transfer_event;
 				transfer_event.event_type = SDLContext::EventType::MOUSEUP;
 				transfer_event.data.mouse_data = MouseData{
@@ -330,8 +327,8 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 					.mouse_position = mouse_pos,
 				};
 				event_list.push_back(transfer_event);
-				
-			} break;
+				break;
+			}
 
 			case SDL_MOUSEMOTION: {
 				EventData transfer_event;
@@ -341,7 +338,8 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 					.rel_mouse_move = {event.motion.xrel, event.motion.yrel},
 				};
 				event_list.push_back(transfer_event);
-			} break;
+				break;
+			}
 
 			case SDL_MOUSEWHEEL: {
 				EventData transfer_event;
@@ -352,10 +350,11 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 					.scroll_delta = event.wheel.preciseY,
 				};
 				event_list.push_back(transfer_event);
-			} break;
-            case SDL_WINDOWEVENT:
-                handle_window_event(event.window, event_list);
-                break;
+				break;
+			}
+			case SDL_WINDOWEVENT:
+				handle_window_event(event.window, event_list);
+				break;
 		}
 	}
 
@@ -371,18 +370,16 @@ void SDLContext::handle_window_event(const SDL_WindowEvent & window_event,
 		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}
-			};
+			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}
-			};
+			transfer_event.data.window_data
+				= WindowData{.move_delta = {window_event.data1, window_event.data2}};
 			event_list.push_back(transfer_event);
 			break;
 		}
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index e56d531..7ccefeb 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -106,16 +106,16 @@ public:
 	};
 	//! EventData struct for passing event data from facade
 	struct EventData {
-    SDLContext::EventType event_type = SDLContext::EventType::NONE;
+		SDLContext::EventType event_type = SDLContext::EventType::NONE;
 
-    union EventDataUnion {
-        KeyData key_data;
-        MouseData mouse_data;
-        WindowData window_data;
+		union EventDataUnion {
+			KeyData key_data;
+			MouseData mouse_data;
+			WindowData window_data;
 
-        EventDataUnion() {}
-        ~EventDataUnion() {}
-    } data;
+			EventDataUnion() {}
+			~EventDataUnion() {}
+		} data;
 	};
 	/**
 	 * \brief Retrieves the current state of the keyboard.
@@ -286,108 +286,108 @@ private:
 	 * - this is defined in this class because get_events() needs this information aswell
 	 */
 	CameraAuxiliaryData cam_aux_data;
-private: 
+
+private:
 	std::unordered_map<Keycode, bool> keyboard_state;
-	const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE = {
-        {SDL_SCANCODE_SPACE, Keycode::SPACE},
-        {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE},
-        {SDL_SCANCODE_COMMA, Keycode::COMMA},
-        {SDL_SCANCODE_MINUS, Keycode::MINUS},
-        {SDL_SCANCODE_PERIOD, Keycode::PERIOD},
-        {SDL_SCANCODE_SLASH, Keycode::SLASH},
-        {SDL_SCANCODE_0, Keycode::D0},
-        {SDL_SCANCODE_1, Keycode::D1},
-        {SDL_SCANCODE_2, Keycode::D2},
-        {SDL_SCANCODE_3, Keycode::D3},
-        {SDL_SCANCODE_4, Keycode::D4},
-        {SDL_SCANCODE_5, Keycode::D5},
-        {SDL_SCANCODE_6, Keycode::D6},
-        {SDL_SCANCODE_7, Keycode::D7},
-        {SDL_SCANCODE_8, Keycode::D8},
-        {SDL_SCANCODE_9, Keycode::D9},
-        {SDL_SCANCODE_SEMICOLON, Keycode::SEMICOLON},
-        {SDL_SCANCODE_EQUALS, Keycode::EQUAL},
-        {SDL_SCANCODE_A, Keycode::A},
-        {SDL_SCANCODE_B, Keycode::B},
-        {SDL_SCANCODE_C, Keycode::C},
-        {SDL_SCANCODE_D, Keycode::D},
-        {SDL_SCANCODE_E, Keycode::E},
-        {SDL_SCANCODE_F, Keycode::F},
-        {SDL_SCANCODE_G, Keycode::G},
-        {SDL_SCANCODE_H, Keycode::H},
-        {SDL_SCANCODE_I, Keycode::I},
-        {SDL_SCANCODE_J, Keycode::J},
-        {SDL_SCANCODE_K, Keycode::K},
-        {SDL_SCANCODE_L, Keycode::L},
-        {SDL_SCANCODE_M, Keycode::M},
-        {SDL_SCANCODE_N, Keycode::N},
-        {SDL_SCANCODE_O, Keycode::O},
-        {SDL_SCANCODE_P, Keycode::P},
-        {SDL_SCANCODE_Q, Keycode::Q},
-        {SDL_SCANCODE_R, Keycode::R},
-        {SDL_SCANCODE_S, Keycode::S},
-        {SDL_SCANCODE_T, Keycode::T},
-        {SDL_SCANCODE_U, Keycode::U},
-        {SDL_SCANCODE_V, Keycode::V},
-        {SDL_SCANCODE_W, Keycode::W},
-        {SDL_SCANCODE_X, Keycode::X},
-        {SDL_SCANCODE_Y, Keycode::Y},
-        {SDL_SCANCODE_Z, Keycode::Z},
-        {SDL_SCANCODE_LEFTBRACKET, Keycode::LEFT_BRACKET},
-        {SDL_SCANCODE_BACKSLASH, Keycode::BACKSLASH},
-        {SDL_SCANCODE_RIGHTBRACKET, Keycode::RIGHT_BRACKET},
-        {SDL_SCANCODE_GRAVE, Keycode::GRAVE_ACCENT},
-        {SDL_SCANCODE_ESCAPE, Keycode::ESCAPE},
-        {SDL_SCANCODE_RETURN, Keycode::ENTER},
-        {SDL_SCANCODE_TAB, Keycode::TAB},
-        {SDL_SCANCODE_BACKSPACE, Keycode::BACKSPACE},
-        {SDL_SCANCODE_INSERT, Keycode::INSERT},
-        {SDL_SCANCODE_DELETE, Keycode::DELETE},
-        {SDL_SCANCODE_RIGHT, Keycode::RIGHT},
-        {SDL_SCANCODE_LEFT, Keycode::LEFT},
-        {SDL_SCANCODE_DOWN, Keycode::DOWN},
-        {SDL_SCANCODE_UP, Keycode::UP},
-        {SDL_SCANCODE_PAGEUP, Keycode::PAGE_UP},
-        {SDL_SCANCODE_PAGEDOWN, Keycode::PAGE_DOWN},
-        {SDL_SCANCODE_HOME, Keycode::HOME},
-        {SDL_SCANCODE_END, Keycode::END},
-        {SDL_SCANCODE_CAPSLOCK, Keycode::CAPS_LOCK},
-        {SDL_SCANCODE_SCROLLLOCK, Keycode::SCROLL_LOCK},
-        {SDL_SCANCODE_NUMLOCKCLEAR, Keycode::NUM_LOCK},
-        {SDL_SCANCODE_PRINTSCREEN, Keycode::PRINT_SCREEN},
-        {SDL_SCANCODE_PAUSE, Keycode::PAUSE},
-        {SDL_SCANCODE_F1, Keycode::F1},
-        {SDL_SCANCODE_F2, Keycode::F2},
-        {SDL_SCANCODE_F3, Keycode::F3},
-        {SDL_SCANCODE_F4, Keycode::F4},
-        {SDL_SCANCODE_F5, Keycode::F5},
-        {SDL_SCANCODE_F6, Keycode::F6},
-        {SDL_SCANCODE_F7, Keycode::F7},
-        {SDL_SCANCODE_F8, Keycode::F8},
-        {SDL_SCANCODE_F9, Keycode::F9},
-        {SDL_SCANCODE_F10, Keycode::F10},
-        {SDL_SCANCODE_F11, Keycode::F11},
-        {SDL_SCANCODE_F12, Keycode::F12},
-        {SDL_SCANCODE_KP_0, Keycode::KP0},
-        {SDL_SCANCODE_KP_1, Keycode::KP1},
-        {SDL_SCANCODE_KP_2, Keycode::KP2},
-        {SDL_SCANCODE_KP_3, Keycode::KP3},
-        {SDL_SCANCODE_KP_4, Keycode::KP4},
-        {SDL_SCANCODE_KP_5, Keycode::KP5},
-        {SDL_SCANCODE_KP_6, Keycode::KP6},
-        {SDL_SCANCODE_KP_7, Keycode::KP7},
-        {SDL_SCANCODE_KP_8, Keycode::KP8},
-        {SDL_SCANCODE_KP_9, Keycode::KP9},
-        {SDL_SCANCODE_LSHIFT, Keycode::LEFT_SHIFT},
-        {SDL_SCANCODE_LCTRL, Keycode::LEFT_CONTROL},
-        {SDL_SCANCODE_LALT, Keycode::LEFT_ALT},
-        {SDL_SCANCODE_LGUI, Keycode::LEFT_SUPER},
-        {SDL_SCANCODE_RSHIFT, Keycode::RIGHT_SHIFT},
-        {SDL_SCANCODE_RCTRL, Keycode::RIGHT_CONTROL},
-        {SDL_SCANCODE_RALT, Keycode::RIGHT_ALT},
-        {SDL_SCANCODE_RGUI, Keycode::RIGHT_SUPER},
-        {SDL_SCANCODE_MENU, Keycode::MENU}
-    };
+	const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE
+		= {{SDL_SCANCODE_SPACE, Keycode::SPACE},
+		   {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE},
+		   {SDL_SCANCODE_COMMA, Keycode::COMMA},
+		   {SDL_SCANCODE_MINUS, Keycode::MINUS},
+		   {SDL_SCANCODE_PERIOD, Keycode::PERIOD},
+		   {SDL_SCANCODE_SLASH, Keycode::SLASH},
+		   {SDL_SCANCODE_0, Keycode::D0},
+		   {SDL_SCANCODE_1, Keycode::D1},
+		   {SDL_SCANCODE_2, Keycode::D2},
+		   {SDL_SCANCODE_3, Keycode::D3},
+		   {SDL_SCANCODE_4, Keycode::D4},
+		   {SDL_SCANCODE_5, Keycode::D5},
+		   {SDL_SCANCODE_6, Keycode::D6},
+		   {SDL_SCANCODE_7, Keycode::D7},
+		   {SDL_SCANCODE_8, Keycode::D8},
+		   {SDL_SCANCODE_9, Keycode::D9},
+		   {SDL_SCANCODE_SEMICOLON, Keycode::SEMICOLON},
+		   {SDL_SCANCODE_EQUALS, Keycode::EQUAL},
+		   {SDL_SCANCODE_A, Keycode::A},
+		   {SDL_SCANCODE_B, Keycode::B},
+		   {SDL_SCANCODE_C, Keycode::C},
+		   {SDL_SCANCODE_D, Keycode::D},
+		   {SDL_SCANCODE_E, Keycode::E},
+		   {SDL_SCANCODE_F, Keycode::F},
+		   {SDL_SCANCODE_G, Keycode::G},
+		   {SDL_SCANCODE_H, Keycode::H},
+		   {SDL_SCANCODE_I, Keycode::I},
+		   {SDL_SCANCODE_J, Keycode::J},
+		   {SDL_SCANCODE_K, Keycode::K},
+		   {SDL_SCANCODE_L, Keycode::L},
+		   {SDL_SCANCODE_M, Keycode::M},
+		   {SDL_SCANCODE_N, Keycode::N},
+		   {SDL_SCANCODE_O, Keycode::O},
+		   {SDL_SCANCODE_P, Keycode::P},
+		   {SDL_SCANCODE_Q, Keycode::Q},
+		   {SDL_SCANCODE_R, Keycode::R},
+		   {SDL_SCANCODE_S, Keycode::S},
+		   {SDL_SCANCODE_T, Keycode::T},
+		   {SDL_SCANCODE_U, Keycode::U},
+		   {SDL_SCANCODE_V, Keycode::V},
+		   {SDL_SCANCODE_W, Keycode::W},
+		   {SDL_SCANCODE_X, Keycode::X},
+		   {SDL_SCANCODE_Y, Keycode::Y},
+		   {SDL_SCANCODE_Z, Keycode::Z},
+		   {SDL_SCANCODE_LEFTBRACKET, Keycode::LEFT_BRACKET},
+		   {SDL_SCANCODE_BACKSLASH, Keycode::BACKSLASH},
+		   {SDL_SCANCODE_RIGHTBRACKET, Keycode::RIGHT_BRACKET},
+		   {SDL_SCANCODE_GRAVE, Keycode::GRAVE_ACCENT},
+		   {SDL_SCANCODE_ESCAPE, Keycode::ESCAPE},
+		   {SDL_SCANCODE_RETURN, Keycode::ENTER},
+		   {SDL_SCANCODE_TAB, Keycode::TAB},
+		   {SDL_SCANCODE_BACKSPACE, Keycode::BACKSPACE},
+		   {SDL_SCANCODE_INSERT, Keycode::INSERT},
+		   {SDL_SCANCODE_DELETE, Keycode::DELETE},
+		   {SDL_SCANCODE_RIGHT, Keycode::RIGHT},
+		   {SDL_SCANCODE_LEFT, Keycode::LEFT},
+		   {SDL_SCANCODE_DOWN, Keycode::DOWN},
+		   {SDL_SCANCODE_UP, Keycode::UP},
+		   {SDL_SCANCODE_PAGEUP, Keycode::PAGE_UP},
+		   {SDL_SCANCODE_PAGEDOWN, Keycode::PAGE_DOWN},
+		   {SDL_SCANCODE_HOME, Keycode::HOME},
+		   {SDL_SCANCODE_END, Keycode::END},
+		   {SDL_SCANCODE_CAPSLOCK, Keycode::CAPS_LOCK},
+		   {SDL_SCANCODE_SCROLLLOCK, Keycode::SCROLL_LOCK},
+		   {SDL_SCANCODE_NUMLOCKCLEAR, Keycode::NUM_LOCK},
+		   {SDL_SCANCODE_PRINTSCREEN, Keycode::PRINT_SCREEN},
+		   {SDL_SCANCODE_PAUSE, Keycode::PAUSE},
+		   {SDL_SCANCODE_F1, Keycode::F1},
+		   {SDL_SCANCODE_F2, Keycode::F2},
+		   {SDL_SCANCODE_F3, Keycode::F3},
+		   {SDL_SCANCODE_F4, Keycode::F4},
+		   {SDL_SCANCODE_F5, Keycode::F5},
+		   {SDL_SCANCODE_F6, Keycode::F6},
+		   {SDL_SCANCODE_F7, Keycode::F7},
+		   {SDL_SCANCODE_F8, Keycode::F8},
+		   {SDL_SCANCODE_F9, Keycode::F9},
+		   {SDL_SCANCODE_F10, Keycode::F10},
+		   {SDL_SCANCODE_F11, Keycode::F11},
+		   {SDL_SCANCODE_F12, Keycode::F12},
+		   {SDL_SCANCODE_KP_0, Keycode::KP0},
+		   {SDL_SCANCODE_KP_1, Keycode::KP1},
+		   {SDL_SCANCODE_KP_2, Keycode::KP2},
+		   {SDL_SCANCODE_KP_3, Keycode::KP3},
+		   {SDL_SCANCODE_KP_4, Keycode::KP4},
+		   {SDL_SCANCODE_KP_5, Keycode::KP5},
+		   {SDL_SCANCODE_KP_6, Keycode::KP6},
+		   {SDL_SCANCODE_KP_7, Keycode::KP7},
+		   {SDL_SCANCODE_KP_8, Keycode::KP8},
+		   {SDL_SCANCODE_KP_9, Keycode::KP9},
+		   {SDL_SCANCODE_LSHIFT, Keycode::LEFT_SHIFT},
+		   {SDL_SCANCODE_LCTRL, Keycode::LEFT_CONTROL},
+		   {SDL_SCANCODE_LALT, Keycode::LEFT_ALT},
+		   {SDL_SCANCODE_LGUI, Keycode::LEFT_SUPER},
+		   {SDL_SCANCODE_RSHIFT, Keycode::RIGHT_SHIFT},
+		   {SDL_SCANCODE_RCTRL, Keycode::RIGHT_CONTROL},
+		   {SDL_SCANCODE_RALT, Keycode::RIGHT_ALT},
+		   {SDL_SCANCODE_RGUI, Keycode::RIGHT_SUPER},
+		   {SDL_SCANCODE_MENU, Keycode::MENU}};
 };
 
 } // namespace crepe
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp
index bb454af..8de700b 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -10,7 +10,7 @@ using namespace crepe;
 
 void InputSystem::update() {
 	ComponentManager & mgr = this->mediator.component_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,31 +31,31 @@ void InputSystem::update() {
 	Transform & cam_transform = transform_vec.front().get();
 
 	vec2 camera_origin = cam_transform.position + current_cam.data.postion_offset
-						  - (current_cam.viewport_size / 2);
+						 - (current_cam.viewport_size / 2);
 
 	for (const SDLContext::EventData & event : event_list) {
 		// Only calculate mouse coordinates for relevant events
-		if(this->is_mouse_event(event.event_type)) {
-			this->handle_mouse_event(event,camera_origin,current_cam);
-			
+		if (this->is_mouse_event(event.event_type)) {
+			this->handle_mouse_event(event, camera_origin, current_cam);
+
 		} else {
 			this->handle_non_mouse_event(event);
-			
 		}
 	}
 }
 
-void InputSystem::handle_mouse_event(const SDLContext::EventData &event, const vec2 &camera_origin, 
-                                     const Camera &current_cam){
+void InputSystem::handle_mouse_event(const SDLContext::EventData & event,
+									 const vec2 & camera_origin, const Camera & current_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;
+		 || 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) {
@@ -105,14 +105,14 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData &event, const v
 
 		default:
 			break;
-	}									
+	}
 }
 
-void InputSystem::handle_non_mouse_event(const SDLContext::EventData &event){
+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;
@@ -150,7 +150,7 @@ void InputSystem::handle_non_mouse_event(const SDLContext::EventData &event){
 	}
 }
 
-bool InputSystem::is_mouse_event(SDLContext::EventType event_type){
+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
@@ -158,29 +158,28 @@ bool InputSystem::is_mouse_event(SDLContext::EventType event_type){
 }
 
 void InputSystem::handle_move(const SDLContext::EventData & event_data,
-							  const vec2& mouse_pos) {
+							  const vec2 & mouse_pos) {
 	ComponentManager & mgr = this->mediator.component_manager;
 
 	RefVector<Button> buttons = mgr.get_components_by_type<Button>();
 
 	for (Button & button : buttons) {
-		if(!button.active) continue;
+		if (!button.active) continue;
 		RefVector<Transform> transform_vec
 			= mgr.get_components_by_id<Transform>(button.game_object_id);
 		Transform & transform(transform_vec.front().get());
 
 		bool was_hovering = button.hover;
-		if (this->is_mouse_inside_button(mouse_pos, button,
-											transform)) {
+		if (this->is_mouse_inside_button(mouse_pos, button, transform)) {
 			button.hover = true;
-			if(!button.on_mouse_enter) continue;
+			if (!button.on_mouse_enter) continue;
 			if (!was_hovering) {
 				button.on_mouse_enter();
 			}
 		} else {
 			button.hover = false;
 			// Trigger the on_exit callback if the hover state just changed to false
-			if(!button.on_mouse_exit) continue;
+			if (!button.on_mouse_exit) continue;
 			if (was_hovering) {
 				button.on_mouse_exit();
 			}
@@ -188,28 +187,27 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data,
 	}
 }
 
-void InputSystem::handle_click(const MouseButton & mouse_button, const vec2& 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>();
 
 	for (Button & button : buttons) {
-		if(!button.active) continue;
+		if (!button.active) continue;
 		if (!button.on_click) continue;
 		RefVector<Transform> transform_vec
 			= mgr.get_components_by_id<Transform>(button.game_object_id);
 		Transform & transform = transform_vec.front().get();
-		
-		if (this->is_mouse_inside_button(mouse_pos, button,
-											transform)) {
-			 
+
+		if (this->is_mouse_inside_button(mouse_pos, button, transform)) {
+
 			button.on_click();
 		}
 	}
 }
 
-bool InputSystem::is_mouse_inside_button(const vec2& mouse_pos,
-										 const Button & button, const Transform & transform) {
+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;
 
@@ -220,4 +218,3 @@ bool InputSystem::is_mouse_inside_button(const vec2& mouse_pos,
 	return mouse_pos.x >= actual_x - half_width && mouse_pos.x <= actual_x + half_width
 		   && mouse_pos.y >= actual_y - half_height && mouse_pos.y <= actual_y + half_height;
 }
-
diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h
index 7b8f510..63dfae5 100644
--- a/src/crepe/system/InputSystem.h
+++ b/src/crepe/system/InputSystem.h
@@ -52,8 +52,8 @@ private:
 	 * 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 &current_cam);
+	void handle_mouse_event(const SDLContext::EventData & event, const vec2 & camera_origin,
+							const Camera & current_cam);
 	/**
 	 * \brief Handles non-mouse-related events.
 	 * \param event The event data for the non-mouse event.
@@ -61,7 +61,7 @@ private:
 	 * 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);
+	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.
@@ -70,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 vec2& mouse_pos);
+	void handle_click(const MouseButton & mouse_button, const vec2 & mouse_pos);
 
 	/**
 	* \brief Handles the mouse movement event.
@@ -80,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 vec2& 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.
@@ -90,8 +90,8 @@ 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 vec2& mouse_pos,
-								const Button & button, const Transform & transform);
+	bool is_mouse_inside_button(const vec2 & mouse_pos, const Button & button,
+								const Transform & transform);
 
 	/**
 	* \brief Handles the button press event, calling the on_click callback if necessary.
diff --git a/src/test/EventTest.cpp b/src/test/EventTest.cpp
index f30f15a..f8be3fe 100644
--- a/src/test/EventTest.cpp
+++ b/src/test/EventTest.cpp
@@ -56,8 +56,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_all_channels) {
 	event_mgr.subscribe<MouseClickEvent>(mouse_handler, EventManager::CHANNEL_ALL);
 
 	MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE};
-	event_mgr.trigger_event<MouseClickEvent>(click_event,
-																EventManager::CHANNEL_ALL);
+	event_mgr.trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL);
 
 	EXPECT_TRUE(triggered);
 }
@@ -74,8 +73,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_one_channel) {
 	event_mgr.subscribe<MouseClickEvent>(mouse_handler, test_channel);
 
 	MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE};
-	event_mgr.trigger_event<MouseClickEvent>(click_event,
-																EventManager::CHANNEL_ALL);
+	event_mgr.trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL);
 
 	EXPECT_FALSE(triggered);
 	event_mgr.trigger_event<MouseClickEvent>(click_event, test_channel);
diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp
index 7063561..09163a6 100644
--- a/src/test/InputTest.cpp
+++ b/src/test/InputTest.cpp
@@ -43,8 +43,7 @@ protected:
 		//mediator.component_manager = mgr;
 		//event_manager.clear();
 	}
-	void TearDown() override {
-    }
+	void TearDown() override {}
 	void simulate_mouse_click(int mouse_x, int mouse_y, Uint8 mouse_button) {
 		SDL_Event event;
 
@@ -210,8 +209,7 @@ TEST_F(InputTest, testButtonClick) {
 	GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1);
 	bool button_clicked = false;
 	std::function<void()> on_click = [&]() { button_clicked = true; };
-	auto & button
-		= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click);
+	auto & button = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click);
 
 	bool hover = false;
 	button.active = true;
@@ -230,8 +228,7 @@ TEST_F(InputTest, testButtonHover) {
 	GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1);
 	bool button_clicked = false;
 	std::function<void()> on_click = [&]() { button_clicked = true; };
-	auto & button
-		= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click);
+	auto & button = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click);
 	button.active = true;
 
 	// Mouse not on button
-- 
cgit v1.2.3


From 5ad9f5c81ae20f4b7aa2c1773bce8906096754f3 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Fri, 13 Dec 2024 18:49:51 +0100
Subject: friend explained

---
 src/crepe/Particle.h            |  2 --
 src/crepe/api/ParticleEmitter.h | 10 ++++++----
 2 files changed, 6 insertions(+), 6 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/Particle.h b/src/crepe/Particle.h
index 49fec1f..0170117 100644
--- a/src/crepe/Particle.h
+++ b/src/crepe/Particle.h
@@ -14,8 +14,6 @@ namespace crepe {
  * can also be reset or stopped.
  */
 class Particle {
-	// TODO: add friend particleSsytem and rendersystem. Unit test will fail.
-
 public:
 	//! Position of the particle in 2D space.
 	vec2 position;
diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h
index e0b117a..5b8e8e3 100644
--- a/src/crepe/api/ParticleEmitter.h
+++ b/src/crepe/api/ParticleEmitter.h
@@ -54,11 +54,11 @@ public:
 		//! maximum number of particles
 		const unsigned int max_particles = 256;
 		//! rate of particle emission per second
-		float emission_rate = 1;
+		float emission_rate = 50;
 		//! min speed of the particles
-		float min_speed = 1;
+		float min_speed = 100;
 		//! min speed of the particles
-		float max_speed = 2;
+		float max_speed = 100;
 		//! min angle of particle emission
 		float min_angle = 0;
 		//! max angle of particle emission
@@ -84,9 +84,11 @@ public:
 	//! Configuration data for particle emission settings.
 	Data data;
 private:
-	//! Saves time left over from last update event.
+	//! Only ParticleSystem can move and read particles
 	friend ParticleSystem;
+	//! Only RenderSystem can read particles
 	friend RenderSystem;
+	//! Saves time left over from last update event.
 	float spawn_accumulator  = 0;
 	//! collection of particles
 	std::vector<Particle> particles;
-- 
cgit v1.2.3


From 79741613fdf915bfb8b7517826205d2cb1715971 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Fri, 13 Dec 2024 18:54:30 +0100
Subject: removed some not needed const

---
 src/crepe/system/ParticleSystem.cpp | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index a56de60..f98f245 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -71,24 +71,25 @@ void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & t
 	float half_width = emitter.data.boundary.width / 2.0;
 	float half_height = emitter.data.boundary.height / 2.0;
 
-	const float LEFT = offset.x - half_width;
-	const float RIGHT = offset.x + half_width;
-	const float TOP = offset.y - half_height;
-	const float BOTTOM = offset.y + half_height;
+	float left = offset.x - half_width;
+	float right = offset.x + half_width;
+	float top = offset.y - half_height;
+	float bottom = offset.y + half_height;
 
 	for (Particle & particle : emitter.particles) {
 		const vec2 & position = particle.position;
-		bool within_bounds = (position.x >= LEFT && position.x <= RIGHT && position.y >= TOP
-							  && position.y <= BOTTOM);
+		bool within_bounds = (position.x >= left && position.x <= right && position.y >= top
+							  && position.y <= bottom);
+		//if not within bounds do a reset or stop velocity
 		if (!within_bounds) {
 			if (emitter.data.boundary.reset_on_exit) {
 				particle.active = false;
 			} else {
 				particle.velocity = {0, 0};
-				if (position.x < LEFT) particle.position.x = LEFT;
-				else if (position.x > RIGHT) particle.position.x = RIGHT;
-				if (position.y < TOP) particle.position.y = TOP;
-				else if (position.y > BOTTOM) particle.position.y = BOTTOM;
+				if (position.x < left) particle.position.x = left;
+				else if (position.x > right) particle.position.x = right;
+				if (position.y < top) particle.position.y = top;
+				else if (position.y > bottom) particle.position.y = bottom;
 			}
 		}
 	}
-- 
cgit v1.2.3


From 512aa7f54b88994d3095971b2001930b4e612947 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Fri, 13 Dec 2024 20:44:32 +0100
Subject: make format

---
 src/crepe/Particle.h                |  3 ++-
 src/crepe/api/ParticleEmitter.cpp   |  6 +++--
 src/crepe/api/ParticleEmitter.h     |  5 ++--
 src/crepe/system/ParticleSystem.cpp | 10 ++++----
 src/crepe/system/ParticleSystem.h   |  1 -
 src/example/game.cpp                | 31 ++++++++++++------------
 src/example/rendering_particle.cpp  |  1 -
 src/test/ParticleTest.cpp           | 48 ++++++++++++++++++-------------------
 8 files changed, 53 insertions(+), 52 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/Particle.h b/src/crepe/Particle.h
index 0170117..ee0cd66 100644
--- a/src/crepe/Particle.h
+++ b/src/crepe/Particle.h
@@ -41,7 +41,8 @@ public:
 	 * \param velocity  The initial velocity of the particle.
 	 * \param angle     The angle of the particle's trajectory or orientation.
 	 */
-	void reset(unsigned int lifespan, const vec2 & position, const vec2 & velocity, float angle);
+	void reset(unsigned int lifespan, const vec2 & position, const vec2 & velocity,
+			   float angle);
 	/**
 	 * \brief Updates the particle's state.
 	 *
diff --git a/src/crepe/api/ParticleEmitter.cpp b/src/crepe/api/ParticleEmitter.cpp
index 1e9cfaa..4f54bbd 100644
--- a/src/crepe/api/ParticleEmitter.cpp
+++ b/src/crepe/api/ParticleEmitter.cpp
@@ -3,9 +3,11 @@
 
 using namespace crepe;
 
-ParticleEmitter::ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite, const Data & data)
+ParticleEmitter::ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite,
+								 const Data & data)
 	: Component(game_object_id),
-	  sprite(sprite), data(data) {
+	  sprite(sprite),
+	  data(data) {
 	for (size_t i = 0; i < this->data.max_particles; i++) {
 		this->particles.emplace_back();
 	}
diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h
index 5b8e8e3..be970f5 100644
--- a/src/crepe/api/ParticleEmitter.h
+++ b/src/crepe/api/ParticleEmitter.h
@@ -78,18 +78,19 @@ public:
 	 * \param game_object_id  Identifier for the game object using this emitter.
 	 * \param data            Configuration data defining particle properties.
 	 */
-	ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite,const Data & data);
+	ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite, const Data & data);
 
 public:
 	//! Configuration data for particle emission settings.
 	Data data;
+
 private:
 	//! Only ParticleSystem can move and read particles
 	friend ParticleSystem;
 	//! Only RenderSystem can read particles
 	friend RenderSystem;
 	//! Saves time left over from last update event.
-	float spawn_accumulator  = 0;
+	float spawn_accumulator = 0;
 	//! collection of particles
 	std::vector<Particle> particles;
 };
diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index f98f245..31a4e9e 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -31,8 +31,8 @@ void ParticleSystem::update() {
 		while (emitter.spawn_accumulator >= 1.0) {
 			this->emit_particle(emitter, transform);
 			emitter.spawn_accumulator -= 1.0;
-    }
-		
+		}
+
 		// Update all particles
 		for (Particle & particle : emitter.particles) {
 			if (particle.active) {
@@ -49,9 +49,11 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform &
 	constexpr float DEG_TO_RAD = M_PI / 180.0;
 
 	vec2 initial_position = emitter.data.position + transform.position;
-	float random_angle = this->generate_random_angle(emitter.data.min_angle, emitter.data.max_angle);
+	float random_angle
+		= this->generate_random_angle(emitter.data.min_angle, emitter.data.max_angle);
 
-	float random_speed = this->generate_random_speed(emitter.data.min_speed, emitter.data.max_speed);
+	float random_speed
+		= this->generate_random_speed(emitter.data.min_speed, emitter.data.max_speed);
 	float angle_radians = random_angle * DEG_TO_RAD;
 
 	vec2 velocity
diff --git a/src/crepe/system/ParticleSystem.h b/src/crepe/system/ParticleSystem.h
index 95a2bd5..154521d 100644
--- a/src/crepe/system/ParticleSystem.h
+++ b/src/crepe/system/ParticleSystem.h
@@ -23,7 +23,6 @@ public:
 	void update() override;
 
 private:
-
 	/**
 	 * \brief Emits a particle from the specified emitter based on its emission properties.
 	 *
diff --git a/src/example/game.cpp b/src/example/game.cpp
index 279648e..2d25153 100644
--- a/src/example/game.cpp
+++ b/src/example/game.cpp
@@ -261,24 +261,23 @@ public:
 			= false;
 		Asset img5{"asset/texture/square.png"};
 
-		
-
 		GameObject particle = mgr.new_object(
 			"Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1);
-		auto & particle_image = particle.add_component<Sprite>(img5, Sprite::Data{.size = {5, 5},});
-		auto & test = particle.add_component<ParticleEmitter>(particle_image,ParticleEmitter::Data{
-		.position = {0, 0},
-		.max_particles = 256,
-		.emission_rate = 50,
-		.min_speed = 10,
-		.max_speed = 20,
-		.min_angle = -20,
-		.max_angle = 20,
-		.begin_lifespan = 0,
-		.end_lifespan = 5,
-	}
-	);
-
+		auto & particle_image = particle.add_component<Sprite>(img5, Sprite::Data{
+																		 .size = {5, 5},
+																	 });
+		auto & test
+			= particle.add_component<ParticleEmitter>(particle_image, ParticleEmitter::Data{
+																		  .position = {0, 0},
+																		  .max_particles = 256,
+																		  .emission_rate = 50,
+																		  .min_speed = 10,
+																		  .max_speed = 20,
+																		  .min_angle = -20,
+																		  .max_angle = 20,
+																		  .begin_lifespan = 0,
+																		  .end_lifespan = 5,
+																	  });
 	}
 
 	string get_name() const { return "scene1"; }
diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp
index 2b5c041..add43f4 100644
--- a/src/example/rendering_particle.cpp
+++ b/src/example/rendering_particle.cpp
@@ -17,7 +17,6 @@
 
 using namespace crepe;
 using namespace std;
-	
 
 class TestScene : public Scene {
 public:
diff --git a/src/test/ParticleTest.cpp b/src/test/ParticleTest.cpp
index a9a26c6..8ffb140 100644
--- a/src/test/ParticleTest.cpp
+++ b/src/test/ParticleTest.cpp
@@ -1,6 +1,4 @@
 #include "api/Asset.h"
-#include <math.h>
-#include <gtest/gtest.h>
 #include <crepe/api/Config.h>
 #include <crepe/api/GameObject.h>
 #include <crepe/api/Rigidbody.h>
@@ -8,18 +6,18 @@
 #include <crepe/api/Transform.h>
 #include <crepe/manager/ComponentManager.h>
 #include <crepe/manager/LoopTimerManager.h>
+#include <gtest/gtest.h>
+#include <math.h>
 #define protected public
 #define private public
 #include <crepe/Particle.h>
 #include <crepe/api/ParticleEmitter.h>
 #include <crepe/system/ParticleSystem.h>
 
-
 using namespace std;
 using namespace std::chrono_literals;
 using namespace crepe;
 
-
 class ParticlesTest : public ::testing::Test {
 	Mediator m;
 
@@ -44,25 +42,25 @@ public:
 						.size = {10, 10},
 					});
 
-			game_object.add_component<ParticleEmitter>(test_sprite,ParticleEmitter::Data{
-				.position = {0, 0},
-				.max_particles = 100,
-				.emission_rate = 0,
-				.min_speed = 0,
-				.max_speed = 0,
-				.min_angle = 0,
-				.max_angle = 0,
-				.begin_lifespan = 0,
-				.end_lifespan = 0,
-				.force_over_time = vec2{0, 0},
-				.boundary{
-					.width = 0,
-					.height = 0,
-					.offset = vec2{0, 0},
-					.reset_on_exit = false,
-				},
-			});
-			
+			game_object.add_component<ParticleEmitter>(test_sprite,
+													   ParticleEmitter::Data{
+														   .position = {0, 0},
+														   .max_particles = 100,
+														   .emission_rate = 0,
+														   .min_speed = 0,
+														   .max_speed = 0,
+														   .min_angle = 0,
+														   .max_angle = 0,
+														   .begin_lifespan = 0,
+														   .end_lifespan = 0,
+														   .force_over_time = vec2{0, 0},
+														   .boundary{
+															   .width = 0,
+															   .height = 0,
+															   .offset = vec2{0, 0},
+															   .reset_on_exit = false,
+														   },
+													   });
 		}
 		transforms = mgr.get_components_by_id<Transform>(0);
 		Transform & transform = transforms.front().get();
@@ -209,6 +207,6 @@ TEST_F(ParticlesTest, boundaryParticleStop) {
 		EXPECT_NEAR(std::abs(emitter.particles[0].position.x),
 					emitter.data.boundary.height / 2, TOLERANCE);
 	if (emitter.particles[0].velocity.y != 0)
-		EXPECT_NEAR(std::abs(emitter.particles[0].position.y),
-					emitter.data.boundary.width / 2, TOLERANCE);
+		EXPECT_NEAR(std::abs(emitter.particles[0].position.y), emitter.data.boundary.width / 2,
+					TOLERANCE);
 }
-- 
cgit v1.2.3


From ccbfb97a11cd931655f2762443ffc36f5f25e86f Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Sat, 14 Dec 2024 12:38:22 +0100
Subject: removed sdlcontext from header and implemented initiliser list for
 EventData

---
 src/crepe/api/Event.h            |  10 +--
 src/crepe/api/KeyCodes.h         |   4 +-
 src/crepe/api/Script.cpp         |   7 +-
 src/crepe/api/Script.h           |  10 ++-
 src/crepe/facade/EventData.h     |  55 ++++++++++++
 src/crepe/facade/SDLContext.cpp  | 188 +++++++++++++++++++++------------------
 src/crepe/facade/SDLContext.h    |  80 ++++-------------
 src/crepe/system/InputSystem.cpp |  51 +++++------
 src/crepe/system/InputSystem.h   |  16 ++--
 src/test/InputTest.cpp           |   1 +
 10 files changed, 228 insertions(+), 194 deletions(-)
 create mode 100644 src/crepe/facade/EventData.h

(limited to 'src/crepe')

diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h
index 17ae809..d353a5b 100644
--- a/src/crepe/api/Event.h
+++ b/src/crepe/api/Event.h
@@ -39,7 +39,7 @@ public:
  */
 class MousePressEvent : public Event {
 public:
-	//! mouse position
+	//! mouse position in game units
 	vec2 mouse_pos = {0, 0};
 
 	//! The mouse button that was pressed.
@@ -51,7 +51,7 @@ public:
  */
 class MouseClickEvent : public Event {
 public:
-	//! mouse position
+	//! mouse position in game units
 	vec2 mouse_pos = {0, 0};
 
 	//! The mouse button that was clicked.
@@ -63,7 +63,7 @@ public:
  */
 class MouseReleaseEvent : public Event {
 public:
-	//! mouse position
+	//! mouse position in game units
 	vec2 mouse_pos = {0, 0};
 
 	//! The mouse button that was released.
@@ -75,7 +75,7 @@ public:
  */
 class MouseMoveEvent : public Event {
 public:
-	//! new mouse position
+	//! mouse position in game units
 	vec2 mouse_pos = {0, 0};
 	//! The change in mouse position relative to the last position (in pixels).
 	ivec2 mouse_delta = {0, 0};
@@ -86,7 +86,7 @@ public:
  */
 class MouseScrollEvent : public Event {
 public:
-	//! mouse position when the scroll happened.
+	//! mouse position in game units when the scroll happened.
 	vec2 mouse_pos = {0, 0};
 	//! scroll direction (-1 = down, 1 = up)
 	int scroll_direction = 0;
diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h
index dc3219a..1b9573a 100644
--- a/src/crepe/api/KeyCodes.h
+++ b/src/crepe/api/KeyCodes.h
@@ -3,6 +3,7 @@
 #include <unordered_map>
 
 namespace crepe {
+
 //! Enumeration for mouse button inputs, including standard and extended buttons.
 enum class MouseButton {
 	NONE = 0, //!< No mouse button input.
@@ -154,5 +155,6 @@ enum class Keycode {
 	/// \}
 	MENU = 348, //!< Menu key.
 };
-
+//! Typedef for keyboard state.
+typedef std::unordered_map<Keycode, bool> keyboard_state_t;
 } // namespace crepe
diff --git a/src/crepe/api/Script.cpp b/src/crepe/api/Script.cpp
index 753a9e3..7b56f61 100644
--- a/src/crepe/api/Script.cpp
+++ b/src/crepe/api/Script.cpp
@@ -1,7 +1,7 @@
 #include <string>
 
 #include "../manager/SceneManager.h"
-
+#include "../facade/SDLContext.h"
 #include "Script.h"
 
 using namespace crepe;
@@ -25,3 +25,8 @@ void Script::set_next_scene(const string & name) {
 }
 
 SaveManager & Script::get_save_manager() const { return this->mediator->save_manager; }
+
+const keyboard_state_t&  Script::get_keyboard_state() const{
+	SDLContext& sdl_context = this->mediator->sdl_context;
+	return sdl_context.get_keyboard_state();
+}
diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h
index 668e5d1..4fbf344 100644
--- a/src/crepe/api/Script.h
+++ b/src/crepe/api/Script.h
@@ -6,6 +6,7 @@
 #include "../manager/Mediator.h"
 #include "../system/CollisionSystem.h"
 #include "../types.h"
+#include "../api/KeyCodes.h"
 #include "../util/OptionalRef.h"
 
 namespace crepe {
@@ -134,7 +135,14 @@ protected:
 
 	//! Retrieve SaveManager reference
 	SaveManager & get_save_manager() const;
-
+	/**
+	 * \brief Utility function to retrieve the keyboard state
+	 * \see SDLContext::get_keyboard_state
+	 * 
+	 * \return current keyboard state map with Keycode as key and bool as value(true = pressed, false = not pressed)
+	 * 
+	 */
+	const keyboard_state_t& get_keyboard_state() const;
 	//! \}
 
 private:
diff --git a/src/crepe/facade/EventData.h b/src/crepe/facade/EventData.h
new file mode 100644
index 0000000..d0ca07f
--- /dev/null
+++ b/src/crepe/facade/EventData.h
@@ -0,0 +1,55 @@
+#pragma once
+#include "../api/KeyCodes.h"
+#include "../types.h"
+namespace crepe {
+//! EventType enum for passing eventType
+	enum EventType {
+		NONE = 0,
+		MOUSE_DOWN,
+		MOUSE_UP,
+		MOUSE_MOVE,
+		MOUSE_WHEEL,
+		KEY_UP,
+		KEY_DOWN,
+		SHUTDOWN,
+		WINDOW_MINIMIZE,
+		WINDOW_MAXIMIZE,
+		WINDOW_FOCUS_GAIN,
+		WINDOW_FOCUS_LOST,
+		WINDOW_MOVE,
+		WINDOW_RESIZE,
+		WINDOW_EXPOSE,
+	};
+
+	//! Struct for storing key data.
+	struct KeyData {
+		Keycode key = Keycode::NONE;
+		bool key_repeat = false;
+	};
+
+	//! Struct for storing mouse data.
+	struct MouseData {
+		MouseButton mouse_button = MouseButton::NONE;
+		ivec2 mouse_position = {-1, -1};
+		int scroll_direction = -1;
+		float scroll_delta = INFINITY;
+		ivec2 rel_mouse_move = {-1, -1};
+	};
+
+	//! Struct for storing window data.
+	struct WindowData {
+		ivec2 move_delta;
+		ivec2 resize_dimension;
+	};
+	
+	//! EventData struct for passing event data from facade
+	struct EventData {
+	EventType event_type = EventType::NONE;
+		union {
+			KeyData key_data;
+			MouseData mouse_data;
+			WindowData window_data;
+		} data;
+
+	};
+} // namespace crepe
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 7e19ede..bb65e3b 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -76,13 +76,16 @@ SDLContext::~SDLContext() {
 }
 
 Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) {
-	auto it = LOOKUP_TABLE.find(sdl_key);
-	if (it != LOOKUP_TABLE.end()) {
-		return it->second;
-	}
+	if (!LOOKUP_TABLE.contains(sdl_key)) 
+		return Keycode::NONE;
+
+	return LOOKUP_TABLE.at(sdl_key);
+}
 
-	return Keycode::NONE;
+const keyboard_state_t& SDLContext::get_keyboard_state() const{
+	return this->keyboard_state;
 }
+
 void SDLContext::update_keyboard_state() {
 	// Array to hold the key states (true if pressed, false if not)
 	SDL_PumpEvents();
@@ -273,8 +276,8 @@ ivec2 SDLContext::get_size(const Texture & ctx) {
 	return size;
 }
 
-std::vector<SDLContext::EventData> SDLContext::get_events() {
-	std::vector<SDLContext::EventData> event_list;
+std::vector<EventData> SDLContext::get_events() {
+	std::vector<EventData> event_list;
 	SDL_Event event;
 	const CameraAuxiliaryData & cam = this->cam_aux_data;
 	while (SDL_PollEvent(&event)) {
@@ -283,77 +286,83 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 		mouse_pos.y = (event.button.y - cam.bar_size.y) / cam.render_scale.y;
 		switch (event.type) {
 			case SDL_QUIT:
-				event_list.push_back({.event_type = SDLContext::EventType::SHUTDOWN});
+				event_list.push_back({.event_type = EventType::SHUTDOWN});
 				break;
-			case SDL_KEYDOWN: {
+			case SDL_KEYDOWN: 
 				this->update_keyboard_state();
-				EventData transfer_event;
-				transfer_event.event_type = SDLContext::EventType::KEYDOWN;
-				transfer_event.data.key_data = KeyData{
-					.key = sdl_to_keycode(event.key.keysym.scancode),
-					.key_repeat = event.key.repeat != 0,
-				};
-				event_list.push_back(transfer_event);
+				event_list.push_back(EventData{
+					.event_type = EventType::KEY_DOWN,
+					.data = {
+						.key_data = {
+							.key = this->sdl_to_keycode(event.key.keysym.scancode),
+							.key_repeat = event.key.repeat != 0,
+						},
+					},
+				});
 				break;
-			}
 
-			case SDL_KEYUP: {
+			case SDL_KEYUP:
 				this->update_keyboard_state();
-				EventData transfer_event;
-				transfer_event.event_type = SDLContext::EventType::KEYUP;
-				transfer_event.data.key_data = KeyData{
-					.key = sdl_to_keycode(event.key.keysym.scancode),
-					.key_repeat = false,
-				};
-				event_list.push_back(transfer_event);
+				event_list.push_back(EventData{
+					.event_type = EventType::KEY_UP,
+					.data = {
+						.key_data = {
+							.key = this->sdl_to_keycode(event.key.keysym.scancode),
+							.key_repeat = event.key.repeat != 0,
+						},
+					},
+				});
 				break;
-			}
-
-			case SDL_MOUSEBUTTONDOWN: {
-				EventData transfer_event;
-				transfer_event.event_type = SDLContext::EventType::MOUSEDOWN;
-				transfer_event.data.mouse_data = MouseData{
-					.mouse_button = sdl_to_mousebutton(event.button.button),
-					.mouse_position = mouse_pos,
-				};
-				event_list.push_back(transfer_event);
+
+			case SDL_MOUSEBUTTONDOWN:
+				event_list.push_back(EventData{
+					.event_type = EventType::MOUSE_DOWN,
+					.data = {
+						.mouse_data = {
+							.mouse_button = this->sdl_to_mousebutton(event.button.button),
+							.mouse_position = mouse_pos,
+						},
+					},
+				});
 				break;
-			}
-			case SDL_MOUSEBUTTONUP: {
-				EventData transfer_event;
-				transfer_event.event_type = SDLContext::EventType::MOUSEUP;
-				transfer_event.data.mouse_data = MouseData{
-					.mouse_button = sdl_to_mousebutton(event.button.button),
-					.mouse_position = mouse_pos,
-				};
-				event_list.push_back(transfer_event);
+			case SDL_MOUSEBUTTONUP:
+				event_list.push_back(EventData{
+					.event_type = EventType::MOUSE_UP,
+					.data = {
+						.mouse_data = {
+							.mouse_button = this->sdl_to_mousebutton(event.button.button),
+							.mouse_position = mouse_pos,
+						},
+					},
+				});
 				break;
-			}
-
-			case SDL_MOUSEMOTION: {
-				EventData transfer_event;
-				transfer_event.event_type = SDLContext::EventType::MOUSEMOVE;
-				transfer_event.data.mouse_data = MouseData{
-					.mouse_position = mouse_pos,
-					.rel_mouse_move = {event.motion.xrel, event.motion.yrel},
-				};
-				event_list.push_back(transfer_event);
+
+			case SDL_MOUSEMOTION:
+				event_list.push_back(EventData{
+					.event_type = EventType::MOUSE_MOVE,
+					.data = {
+						.mouse_data = {
+							.mouse_position = mouse_pos,
+							.rel_mouse_move = {event.motion.xrel, event.motion.yrel},
+						},
+					},
+				});
 				break;
-			}
-
-			case SDL_MOUSEWHEEL: {
-				EventData transfer_event;
-				transfer_event.event_type = SDLContext::EventType::MOUSEWHEEL;
-				transfer_event.data.mouse_data = MouseData{
-					.mouse_position = mouse_pos,
-					.scroll_direction = event.wheel.y < 0 ? -1 : 1,
-					.scroll_delta = event.wheel.preciseY,
-				};
-				event_list.push_back(transfer_event);
+
+			case SDL_MOUSEWHEEL:
+				event_list.push_back(EventData{
+					.event_type = EventType::MOUSE_WHEEL,
+					.data = {
+						.mouse_data = {
+							.mouse_position = mouse_pos,
+							.scroll_direction = event.wheel.y < 0 ? -1 : 1,
+							.scroll_delta = event.wheel.preciseY,
+						},
+					},
+				});
 				break;
-			}
 			case SDL_WINDOWEVENT:
-				handle_window_event(event.window, event_list);
+				this->handle_window_event(event.window, event_list);
 				break;
 		}
 	}
@@ -362,38 +371,43 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 }
 
 void SDLContext::handle_window_event(const SDL_WindowEvent & window_event,
-									 std::vector<SDLContext::EventData> & event_list) {
+									 std::vector<EventData> & event_list) {
 	switch (window_event.event) {
 		case SDL_WINDOWEVENT_EXPOSED:
-			event_list.push_back(EventData{SDLContext::EventType::WINDOW_EXPOSE});
+			event_list.push_back(EventData{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);
+		case SDL_WINDOWEVENT_RESIZED:
+			event_list.push_back(EventData{
+					.event_type = EventType::WINDOW_RESIZE,
+					.data = {
+						.window_data = {
+							.resize_dimension = {window_event.data1, window_event.data2}
+						},
+					},
+				});
 			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);
+		case SDL_WINDOWEVENT_MOVED:
+			event_list.push_back(EventData{
+					.event_type = EventType::WINDOW_MOVE,
+					.data = {
+						.window_data = {
+							.move_delta = {window_event.data1, window_event.data2}
+						},
+					},
+				});
 			break;
-		}
+
 		case SDL_WINDOWEVENT_MINIMIZED:
-			event_list.push_back(EventData{SDLContext::EventType::WINDOW_MINIMIZE});
+			event_list.push_back(EventData{EventType::WINDOW_MINIMIZE});
 			break;
 		case SDL_WINDOWEVENT_MAXIMIZED:
-			event_list.push_back(EventData{SDLContext::EventType::WINDOW_MAXIMIZE});
+			event_list.push_back(EventData{EventType::WINDOW_MAXIMIZE});
 			break;
 		case SDL_WINDOWEVENT_FOCUS_GAINED:
-			event_list.push_back(EventData{SDLContext::EventType::WINDOW_FOCUS_GAIN});
+			event_list.push_back(EventData{EventType::WINDOW_FOCUS_GAIN});
 			break;
 		case SDL_WINDOWEVENT_FOCUS_LOST:
-			event_list.push_back(EventData{SDLContext::EventType::WINDOW_FOCUS_LOST});
+			event_list.push_back(EventData{EventType::WINDOW_FOCUS_LOST});
 			break;
 	}
 }
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index 7ccefeb..34a4a09 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -17,11 +17,11 @@
 #include "api/KeyCodes.h"
 #include "api/Sprite.h"
 #include "api/Transform.h"
+#include "../types.h"
 
-#include "types.h"
+#include "EventData.h"
 
 namespace crepe {
-
 class Texture;
 class Mediator;
 
@@ -71,61 +71,7 @@ public:
 	};
 
 public:
-	//! EventType enum for passing eventType
-	enum EventType {
-		NONE = 0,
-		MOUSEDOWN,
-		MOUSEUP,
-		MOUSEMOVE,
-		MOUSEWHEEL,
-		KEYUP,
-		KEYDOWN,
-		SHUTDOWN,
-		WINDOW_MINIMIZE,
-		WINDOW_MAXIMIZE,
-		WINDOW_FOCUS_GAIN,
-		WINDOW_FOCUS_LOST,
-		WINDOW_MOVE,
-		WINDOW_RESIZE,
-		WINDOW_EXPOSE,
-	};
-	struct KeyData {
-		Keycode key = Keycode::NONE;
-		bool key_repeat = false;
-	};
-	struct MouseData {
-		MouseButton mouse_button = MouseButton::NONE;
-		ivec2 mouse_position = {-1, -1};
-		int scroll_direction = -1;
-		float scroll_delta = INFINITY;
-		ivec2 rel_mouse_move = {-1, -1};
-	};
-	struct WindowData {
-		ivec2 move_delta;
-		ivec2 resize_dimension;
-	};
-	//! EventData struct for passing event data from facade
-	struct EventData {
-		SDLContext::EventType event_type = SDLContext::EventType::NONE;
-
-		union EventDataUnion {
-			KeyData key_data;
-			MouseData mouse_data;
-			WindowData window_data;
-
-			EventDataUnion() {}
-			~EventDataUnion() {}
-		} data;
-	};
-	/**
-	 * \brief Retrieves the current state of the keyboard.
-	 *
-	 * This method updates the state of all keys on the keyboard. Each element of the unordered map corresponds to a
-	 * specific key defined in the `Keycode` enum, and the value indicates whether
-	 * the key is currently pressed (true) or not pressed (false).
-	 * 
-	 */
-	void update_keyboard_state();
+	
 	/**
 	 * \brief Gets the singleton instance of SDLContext.
 	 * \return Reference to the SDLContext instance.
@@ -161,7 +107,7 @@ public:
 	 *
 	 * \return Events that occurred since last call to `get_events()`
 	 */
-	std::vector<SDLContext::EventData> get_events();
+	std::vector<EventData> get_events();
 	/**
 	 * \brief Fills event_list with triggered window events
 	 *
@@ -169,7 +115,7 @@ public:
 	 *
 	 */
 	void handle_window_event(const SDL_WindowEvent & window_event,
-							 std::vector<SDLContext::EventData> & event_list);
+							 std::vector<EventData> & event_list);
 	/**
 	 * \brief Converts an SDL scan code to the custom Keycode type.
 	 *
@@ -191,7 +137,8 @@ public:
 	 * \return The corresponding `MouseButton` value or `MouseButton::NONE` if the key is unrecognized
 	 */
 	MouseButton sdl_to_mousebutton(Uint8 sdl_button);
-
+	const keyboard_state_t& get_keyboard_state() const;
+	
 public:
 	/**
 	 * \brief Gets the current SDL ticks since the program started.
@@ -288,7 +235,18 @@ private:
 	CameraAuxiliaryData cam_aux_data;
 
 private:
-	std::unordered_map<Keycode, bool> keyboard_state;
+	/**
+	 * \brief Retrieves the current state of the keyboard.
+	 *
+	 * This method updates the state of all keys on the keyboard. Each element of the unordered map corresponds to a
+	 * specific key defined in the `Keycode` enum, and the value indicates whether
+	 * the key is currently pressed (true) or not pressed (false).
+	 * 
+	 */
+	void update_keyboard_state();
+	//! variable to store the state of each key (true = pressed, false = not pressed)
+	keyboard_state_t keyboard_state;
+	//! lookup table for converting SDL_SCANCODES to Keycodes
 	const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE
 		= {{SDL_SCANCODE_SPACE, Keycode::SPACE},
 		   {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE},
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp
index 8de700b..1427adf 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -1,7 +1,7 @@
 #include "../api/Button.h"
 #include "../manager/ComponentManager.h"
 #include "../manager/EventManager.h"
-#include "facade/SDLContext.h"
+#include "../facade/SDLContext.h"
 #include "util/Log.h"
 
 #include "InputSystem.h"
@@ -12,7 +12,7 @@ void InputSystem::update() {
 	ComponentManager & mgr = this->mediator.component_manager;
 
 	SDLContext & context = this->mediator.sdl_context;
-	std::vector<SDLContext::EventData> event_list = context.get_events();
+	std::vector<EventData> event_list = context.get_events();
 	RefVector<Button> buttons = mgr.get_components_by_type<Button>();
 	RefVector<Camera> cameras = mgr.get_components_by_type<Camera>();
 	OptionalRef<Camera> curr_cam_ref;
@@ -33,9 +33,12 @@ void InputSystem::update() {
 	vec2 camera_origin = cam_transform.position + current_cam.data.postion_offset
 						 - (current_cam.viewport_size / 2);
 
-	for (const SDLContext::EventData & event : event_list) {
+	for (const EventData & event : event_list) {
 		// Only calculate mouse coordinates for relevant events
-		if (this->is_mouse_event(event.event_type)) {
+		if (event.event_type == EventType::MOUSE_DOWN
+			|| event.event_type == EventType::MOUSE_UP
+			|| event.event_type == EventType::MOUSE_MOVE
+			|| event.event_type == EventType::MOUSE_WHEEL) {
 			this->handle_mouse_event(event, camera_origin, current_cam);
 
 		} else {
@@ -44,7 +47,7 @@ void InputSystem::update() {
 	}
 }
 
-void InputSystem::handle_mouse_event(const SDLContext::EventData & event,
+void InputSystem::handle_mouse_event(const EventData & event,
 									 const vec2 & camera_origin, const Camera & current_cam) {
 	EventManager & event_mgr = this->mediator.event_manager;
 	vec2 adjusted_mouse;
@@ -59,7 +62,7 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData & event,
 
 	// Handle mouse-specific events
 	switch (event.event_type) {
-		case SDLContext::EventType::MOUSEDOWN:
+		case EventType::MOUSE_DOWN:
 			event_mgr.queue_event<MousePressEvent>({
 				.mouse_pos = adjusted_mouse,
 				.button = event.data.mouse_data.mouse_button,
@@ -68,7 +71,7 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData & event,
 			this->last_mouse_button = event.data.mouse_data.mouse_button;
 			break;
 
-		case SDLContext::EventType::MOUSEUP: {
+		case EventType::MOUSE_UP: {
 			event_mgr.queue_event<MouseReleaseEvent>({
 				.mouse_pos = adjusted_mouse,
 				.button = event.data.mouse_data.mouse_button,
@@ -87,7 +90,7 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData & event,
 			break;
 		}
 
-		case SDLContext::EventType::MOUSEMOVE:
+		case EventType::MOUSE_MOVE:
 			event_mgr.queue_event<MouseMoveEvent>({
 				.mouse_pos = adjusted_mouse,
 				.mouse_delta = event.data.mouse_data.rel_mouse_move,
@@ -95,7 +98,7 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData & event,
 			this->handle_move(event, adjusted_mouse);
 			break;
 
-		case SDLContext::EventType::MOUSEWHEEL:
+		case EventType::MOUSE_WHEEL:
 			event_mgr.queue_event<MouseScrollEvent>({
 				.mouse_pos = adjusted_mouse,
 				.scroll_direction = event.data.mouse_data.scroll_direction,
@@ -108,41 +111,41 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData & event,
 	}
 }
 
-void InputSystem::handle_non_mouse_event(const SDLContext::EventData & event) {
+void InputSystem::handle_non_mouse_event(const EventData & event) {
 	EventManager & event_mgr = this->mediator.event_manager;
 	switch (event.event_type) {
-		case SDLContext::EventType::KEYDOWN:
+		case EventType::KEY_DOWN:
 
 			event_mgr.queue_event<KeyPressEvent>(
 				{.repeat = event.data.key_data.key_repeat, .key = event.data.key_data.key});
 			break;
-		case SDLContext::EventType::KEYUP:
+		case EventType::KEY_UP:
 			event_mgr.queue_event<KeyReleaseEvent>({.key = event.data.key_data.key});
 			break;
-		case SDLContext::EventType::SHUTDOWN:
+		case EventType::SHUTDOWN:
 			event_mgr.queue_event<ShutDownEvent>({});
 			break;
-		case SDLContext::EventType::WINDOW_EXPOSE:
+		case EventType::WINDOW_EXPOSE:
 			event_mgr.queue_event<WindowExposeEvent>({});
 			break;
-		case SDLContext::EventType::WINDOW_RESIZE:
+		case EventType::WINDOW_RESIZE:
 			event_mgr.queue_event<WindowResizeEvent>(
 				WindowResizeEvent{.dimensions = event.data.window_data.resize_dimension});
 			break;
-		case SDLContext::EventType::WINDOW_MOVE:
+		case EventType::WINDOW_MOVE:
 			event_mgr.queue_event<WindowMoveEvent>(
 				{.delta_move = event.data.window_data.move_delta});
 			break;
-		case SDLContext::EventType::WINDOW_MINIMIZE:
+		case EventType::WINDOW_MINIMIZE:
 			event_mgr.queue_event<WindowMinimizeEvent>({});
 			break;
-		case SDLContext::EventType::WINDOW_MAXIMIZE:
+		case EventType::WINDOW_MAXIMIZE:
 			event_mgr.queue_event<WindowMaximizeEvent>({});
 			break;
-		case SDLContext::EventType::WINDOW_FOCUS_GAIN:
+		case EventType::WINDOW_FOCUS_GAIN:
 			event_mgr.queue_event<WindowFocusGainEvent>({});
 			break;
-		case SDLContext::EventType::WINDOW_FOCUS_LOST:
+		case EventType::WINDOW_FOCUS_LOST:
 			event_mgr.queue_event<WindowFocusLostEvent>({});
 			break;
 		default:
@@ -150,14 +153,8 @@ void InputSystem::handle_non_mouse_event(const SDLContext::EventData & event) {
 	}
 }
 
-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,
+void InputSystem::handle_move(const EventData & event_data,
 							  const vec2 & mouse_pos) {
 	ComponentManager & mgr = this->mediator.component_manager;
 
diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h
index 63dfae5..eefd9fe 100644
--- a/src/crepe/system/InputSystem.h
+++ b/src/crepe/system/InputSystem.h
@@ -1,7 +1,8 @@
 #pragma once
 
 #include "../api/Config.h"
-#include "../facade/SDLContext.h"
+#include "../facade/EventData.h"
+
 #include "../types.h"
 #include "../util/OptionalRef.h"
 
@@ -12,7 +13,6 @@ namespace crepe {
 class Camera;
 class Button;
 class Transform;
-
 /**
  * \brief Handles the processing of input events created by SDLContext
  *
@@ -37,12 +37,6 @@ private:
 
 	//! Stores the last mouse button pressed.
 	MouseButton last_mouse_button = MouseButton::NONE;
-	/**
-	 * \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.
@@ -52,7 +46,7 @@ private:
 	 * 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,
+	void handle_mouse_event(const EventData & event, const vec2 & camera_origin,
 							const Camera & current_cam);
 	/**
 	 * \brief Handles non-mouse-related events.
@@ -61,7 +55,7 @@ private:
 	 * 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);
+	void handle_non_mouse_event(const EventData & event);
 	/**
 	* \brief Handles the mouse click event.
 	* \param mouse_button The mouse button involved in the click.
@@ -80,7 +74,7 @@ private:
 	*
 	* This method processes the mouse movement event and updates the button hover state.
 	*/
-	void handle_move(const SDLContext::EventData & event_data, const vec2 & mouse_pos);
+	void handle_move(const EventData & event_data, const vec2 & mouse_pos);
 
 	/**
 	* \brief Checks if the mouse position is inside the bounds of the button.
diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp
index 09163a6..a707444 100644
--- a/src/test/InputTest.cpp
+++ b/src/test/InputTest.cpp
@@ -13,6 +13,7 @@
 #include <crepe/api/Camera.h>
 #include <crepe/api/GameObject.h>
 #include <crepe/api/Metadata.h>
+#include <crepe/facade/SDLContext.h>
 #include <crepe/api/Transform.h>
 #include <crepe/api/Vector2.h>
 #include <gmock/gmock.h>
-- 
cgit v1.2.3


From 76d3108c44d6920c8f6f245c80c10a15267f1d3b Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Sat, 14 Dec 2024 13:14:01 +0100
Subject: change position to offset

---
 src/crepe/api/ParticleEmitter.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h
index be970f5..8ac2e72 100644
--- a/src/crepe/api/ParticleEmitter.h
+++ b/src/crepe/api/ParticleEmitter.h
@@ -49,8 +49,8 @@ public:
 	 * and the sprite used for rendering particles.
 	 */
 	struct Data {
-		//! position of the emitter
-		vec2 position;
+		//! offset of the emitter relative to transform
+		vec2 offset;
 		//! maximum number of particles
 		const unsigned int max_particles = 256;
 		//! rate of particle emission per second
-- 
cgit v1.2.3


From 1a5116b944bcbdeeb3474faefbe150e82f8697b1 Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Sat, 14 Dec 2024 13:24:14 +0100
Subject: updated api and game

---
 src/crepe/api/BoxCollider.cpp    |  3 +--
 src/crepe/api/BoxCollider.h      |  2 +-
 src/crepe/api/CircleCollider.cpp |  3 +--
 src/crepe/api/CircleCollider.h   |  2 +-
 src/crepe/api/Rigidbody.h        |  2 +-
 src/example/game.cpp             | 26 ++++++++------------------
 6 files changed, 13 insertions(+), 25 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/BoxCollider.cpp b/src/crepe/api/BoxCollider.cpp
index c097a24..302bdd2 100644
--- a/src/crepe/api/BoxCollider.cpp
+++ b/src/crepe/api/BoxCollider.cpp
@@ -4,7 +4,6 @@
 
 using namespace crepe;
 
-BoxCollider::BoxCollider(game_object_id_t game_object_id, const vec2 & offset,
-						 const vec2 & dimensions)
+BoxCollider::BoxCollider(game_object_id_t game_object_id,const vec2 & dimensions,const vec2 & offset)
 	: Collider(game_object_id, offset),
 	  dimensions(dimensions) {}
diff --git a/src/crepe/api/BoxCollider.h b/src/crepe/api/BoxCollider.h
index 1ac4d46..a507e0c 100644
--- a/src/crepe/api/BoxCollider.h
+++ b/src/crepe/api/BoxCollider.h
@@ -13,7 +13,7 @@ namespace crepe {
  */
 class BoxCollider : public Collider {
 public:
-	BoxCollider(game_object_id_t game_object_id, const vec2 & offset, const vec2 & dimensions);
+	BoxCollider(game_object_id_t game_object_id, const vec2 & dimensions,const vec2 & offset= {0,0});
 
 	//! Width and height of the box collider
 	vec2 dimensions;
diff --git a/src/crepe/api/CircleCollider.cpp b/src/crepe/api/CircleCollider.cpp
index a4271e9..e542275 100644
--- a/src/crepe/api/CircleCollider.cpp
+++ b/src/crepe/api/CircleCollider.cpp
@@ -2,7 +2,6 @@
 
 using namespace crepe;
 
-CircleCollider::CircleCollider(game_object_id_t game_object_id, const vec2 & offset,
-							   float radius)
+CircleCollider::CircleCollider(game_object_id_t game_object_id, float radius, const vec2 & offset)
 	: Collider(game_object_id, offset),
 	  radius(radius) {}
diff --git a/src/crepe/api/CircleCollider.h b/src/crepe/api/CircleCollider.h
index c7bf66e..ea40068 100644
--- a/src/crepe/api/CircleCollider.h
+++ b/src/crepe/api/CircleCollider.h
@@ -13,7 +13,7 @@ namespace crepe {
  */
 class CircleCollider : public Collider {
 public:
-	CircleCollider(game_object_id_t game_object_id, const vec2 & offset, float radius);
+	CircleCollider(game_object_id_t game_object_id, float radius, const vec2 & offset= {0,0});
 
 	//! Radius of the circle collider.
 	float radius;
diff --git a/src/crepe/api/Rigidbody.h b/src/crepe/api/Rigidbody.h
index b08c8db..6900295 100644
--- a/src/crepe/api/Rigidbody.h
+++ b/src/crepe/api/Rigidbody.h
@@ -139,7 +139,7 @@ public:
 		 * Each element represents a layer ID, and the GameObject will only detect
 		 * collisions with other GameObjects that belong to these layers.
 		 */
-		std::set<int> collision_layers;
+		std::set<int> collision_layers = {0};
 	};
 
 public:
diff --git a/src/example/game.cpp b/src/example/game.cpp
index 8ea50ea..60c9088 100644
--- a/src/example/game.cpp
+++ b/src/example/game.cpp
@@ -176,19 +176,11 @@ public:
 			.gravity_scale = 0,
 			.body_type = Rigidbody::BodyType::STATIC,
 			.offset = {0, 0},
-			.collision_layers = {0},
 		});
-		world.add_component<BoxCollider>(
-			vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)},
-			vec2{world_collider, world_collider});
-		; // Top
-		world.add_component<BoxCollider>(vec2{0, screen_size_height / 2 + world_collider / 2},
-										 vec2{world_collider, world_collider}); // Bottom
-		world.add_component<BoxCollider>(
-			vec2{0 - (screen_size_width / 2 + world_collider / 2), 0},
-			vec2{world_collider, world_collider}); // Left
-		world.add_component<BoxCollider>(vec2{screen_size_width / 2 + world_collider / 2, 0},
-										 vec2{world_collider, world_collider}); // right
+		world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)}); // Top
+		world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0, screen_size_height / 2 + world_collider / 2}); // Bottom
+		world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0 - (screen_size_width / 2 + world_collider / 2), 0}); // Left
+		world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{screen_size_width / 2 + world_collider / 2, 0}); // right
 		world.add_component<Camera>(
 			ivec2{static_cast<int>(screen_size_width), static_cast<int>(screen_size_height)},
 			vec2{screen_size_width, screen_size_height},
@@ -207,10 +199,9 @@ public:
 			.constraints = {0, 0, 0},
 			.elastisity_coefficient = 1,
 			.offset = {0, 0},
-			.collision_layers = {0},
 		});
 		// add box with boxcollider
-		game_object1.add_component<BoxCollider>(vec2{0, 0}, vec2{20, 20});
+		game_object1.add_component<BoxCollider>(vec2{20, 20});
 		game_object1.add_component<BehaviorScript>().set_script<MyScript1>();
 
 		Asset img1{"asset/texture/square.png"};
@@ -219,7 +210,7 @@ public:
 												 });
 
 		//add circle with cirlcecollider deactiveated
-		game_object1.add_component<CircleCollider>(vec2{0, 0}, 10).active = false;
+		game_object1.add_component<CircleCollider>(10).active = false;
 		Asset img2{"asset/texture/circle.png"};
 		game_object1
 			.add_component<Sprite>(img2,
@@ -239,10 +230,9 @@ public:
 			.constraints = {0, 0, 0},
 			.elastisity_coefficient = 1,
 			.offset = {0, 0},
-			.collision_layers = {0},
 		});
 		// add box with boxcollider
-		game_object2.add_component<BoxCollider>(vec2{0, 0}, vec2{20, 20});
+		game_object2.add_component<BoxCollider>(vec2{20, 20});
 		game_object2.add_component<BehaviorScript>().set_script<MyScript2>();
 
 		game_object2.add_component<Sprite>(img1, Sprite::Data{
@@ -250,7 +240,7 @@ public:
 												 });
 
 		//add circle with cirlcecollider deactiveated
-		game_object2.add_component<CircleCollider>(vec2{0, 0}, 10).active = false;
+		game_object2.add_component<CircleCollider>(10).active = false;
 
 		game_object2
 			.add_component<Sprite>(img2,
-- 
cgit v1.2.3


From c17233b10bd8e35bead60c5f44bb8a14836d755f Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Sat, 14 Dec 2024 13:49:40 +0100
Subject: keyboard state working

---
 src/crepe/api/Event.h           |  2 +-
 src/crepe/facade/SDLContext.cpp | 13 +++--------
 src/crepe/facade/SDLContext.h   | 20 ++++++++--------
 src/example/button.cpp          | 51 ++++++++++++++++++++++-------------------
 src/test/InputTest.cpp          |  1 +
 5 files changed, 42 insertions(+), 45 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h
index d353a5b..4e57b45 100644
--- a/src/crepe/api/Event.h
+++ b/src/crepe/api/Event.h
@@ -3,7 +3,7 @@
 
 #include <string>
 
-#include "KeyCodes.h"
+#include "api/KeyCodes.h"
 #include "types.h"
 
 namespace crepe {
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index bb65e3b..e5b0284 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -6,7 +6,6 @@
 #include <SDL2/SDL_rect.h>
 #include <SDL2/SDL_render.h>
 #include <SDL2/SDL_surface.h>
-#include <SDL2/SDL_video.h>
 #include <array>
 #include <cmath>
 #include <cstddef>
@@ -82,22 +81,18 @@ Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) {
 	return LOOKUP_TABLE.at(sdl_key);
 }
 
-const keyboard_state_t& SDLContext::get_keyboard_state() const{
-	return this->keyboard_state;
-}
-
-void SDLContext::update_keyboard_state() {
-	// Array to hold the key states (true if pressed, false if not)
+const keyboard_state_t& SDLContext::get_keyboard_state(){
 	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<SDL_Scancode>(i));
-
 		if (key != Keycode::NONE) {
 			this->keyboard_state[key] = current_state[i] != 0;
 		}
 	}
+	return this->keyboard_state;
 }
 
 MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) {
@@ -289,7 +284,6 @@ std::vector<EventData> SDLContext::get_events() {
 				event_list.push_back({.event_type = EventType::SHUTDOWN});
 				break;
 			case SDL_KEYDOWN: 
-				this->update_keyboard_state();
 				event_list.push_back(EventData{
 					.event_type = EventType::KEY_DOWN,
 					.data = {
@@ -302,7 +296,6 @@ std::vector<EventData> SDLContext::get_events() {
 				break;
 
 			case SDL_KEYUP:
-				this->update_keyboard_state();
 				event_list.push_back(EventData{
 					.event_type = EventType::KEY_UP,
 					.data = {
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index 34a4a09..3531680 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -137,7 +137,16 @@ public:
 	 * \return The corresponding `MouseButton` value or `MouseButton::NONE` if the key is unrecognized
 	 */
 	MouseButton sdl_to_mousebutton(Uint8 sdl_button);
-	const keyboard_state_t& get_keyboard_state() const;
+	/**
+	 * \brief Gets the current state of the keyboard.
+	 *
+	 * Updates the internal keyboard state by checking the current key states using
+	 * SDL's `SDL_GetKeyboardState()`, and returns a reference to the `keyboard_state_t`.
+	 *
+	 * \return A constant reference to the `keyboard_state_t`, which holds the state
+	 *         of each key (true = pressed, false = not pressed).
+	 */
+	const keyboard_state_t& get_keyboard_state();
 	
 public:
 	/**
@@ -235,15 +244,6 @@ private:
 	CameraAuxiliaryData cam_aux_data;
 
 private:
-	/**
-	 * \brief Retrieves the current state of the keyboard.
-	 *
-	 * This method updates the state of all keys on the keyboard. Each element of the unordered map corresponds to a
-	 * specific key defined in the `Keycode` enum, and the value indicates whether
-	 * the key is currently pressed (true) or not pressed (false).
-	 * 
-	 */
-	void update_keyboard_state();
 	//! variable to store the state of each key (true = pressed, false = not pressed)
 	keyboard_state_t keyboard_state;
 	//! lookup table for converting SDL_SCANCODES to Keycodes
diff --git a/src/example/button.cpp b/src/example/button.cpp
index f2e77f6..c4e9a47 100644
--- a/src/example/button.cpp
+++ b/src/example/button.cpp
@@ -1,17 +1,18 @@
 #include <SDL2/SDL_timer.h>
 #include <chrono>
 #include <crepe/Component.h>
-#include <crepe/ComponentManager.h>
+#include <crepe/manager/ComponentManager.h>
 #include <crepe/api/Animator.h>
 #include <crepe/api/Button.h>
 #include <crepe/api/Camera.h>
 #include <crepe/api/Color.h>
-#include <crepe/api/EventManager.h>
+#include <crepe/manager/EventManager.h>
 #include <crepe/api/GameObject.h>
 #include <crepe/api/Sprite.h>
 #include <crepe/api/Texture.h>
 #include <crepe/api/Transform.h>
 #include <crepe/system/AnimatorSystem.h>
+#include <crepe/facade/SDLContext.h>
 #include <crepe/system/InputSystem.h>
 #include <crepe/system/RenderSystem.h>
 #include <crepe/types.h>
@@ -19,33 +20,35 @@ using namespace crepe;
 using namespace std;
 
 int main(int argc, char * argv[]) {
-	ComponentManager mgr;
-	RenderSystem sys{mgr};
-	EventManager & event_mgr = EventManager::get_instance();
-	InputSystem input_sys{mgr};
-	AnimatorSystem asys{mgr};
-	GameObject camera_obj = mgr.new_object("", "", vec2{1000, 1000}, 0, 1);
-	camera_obj.add_component<Camera>(Color::WHITE, ivec2{1080, 720}, vec2{2000, 2000}, 1.0f);
+	Mediator mediator;
+	ComponentManager mgr{mediator};
+	RenderSystem sys{mediator};
+	EventManager event_mgr{mediator};
+	InputSystem input_sys{mediator};
+	SDLContext sdl_context{mediator};
+	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
+	auto & camera = obj.add_component<Camera>(ivec2{500, 500}, vec2{500, 500},
+										Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
 
-	GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1);
-	auto s2 = Texture("asset/texture/test_ap43.png");
-	bool button_clicked = false;
-	auto & sprite2 = button_obj.add_component<Sprite>(
-		s2, Color::GREEN, Sprite::FlipSettings{false, false}, 2, 1, 100);
-	std::function<void()> on_click = [&]() { std::cout << "button clicked" << std::endl; };
-	std::function<void()> on_enter = [&]() { std::cout << "enter" << std::endl; };
-	std::function<void()> on_exit = [&]() { std::cout << "exit" << std::endl; };
-	auto & button
-		= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false);
-	button.on_mouse_enter = on_enter;
-	button.on_mouse_exit = on_exit;
-	button.is_toggle = true;
-	button.active = true;
+	// GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1);
+	// auto s2 = Texture("asset/texture/test_ap43.png");
+	// bool button_clicked = false;
+	// auto & sprite2 = button_obj.add_component<Sprite>(
+	// 	s2, Color::GREEN, Sprite::FlipSettings{false, false}, 2, 1, 100);
+	// std::function<void()> on_click = [&]() { std::cout << "button clicked" << std::endl; };
+	// std::function<void()> on_enter = [&]() { std::cout << "enter" << std::endl; };
+	// std::function<void()> on_exit = [&]() { std::cout << "exit" << std::endl; };
+	// auto & button
+	// 	= button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false);
+	// button.on_mouse_enter = on_enter;
+	// button.on_mouse_exit = on_exit;
+	// button.is_toggle = true;
+	// button.active = true;
 	auto start = std::chrono::steady_clock::now();
 	while (true) {
+		const keyboard_state_t& keyboard_state = sdl_context.get_keyboard_state();
 		input_sys.update();
 		sys.update();
-		asys.update();
 		event_mgr.dispatch_events();
 		SDL_Delay(30);
 	}
diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp
index a707444..f974d0c 100644
--- a/src/test/InputTest.cpp
+++ b/src/test/InputTest.cpp
@@ -260,3 +260,4 @@ TEST_F(InputTest, testButtonHover) {
 	event_manager.dispatch_events();
 	EXPECT_TRUE(button.hover);
 }
+
-- 
cgit v1.2.3


From dbe779ca850ec0bf5d9b5066a7a6df44f3762e4d Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Sat, 14 Dec 2024 13:52:56 +0100
Subject: make format

---
 src/crepe/api/Event.h            | 10 ++---
 src/crepe/api/Script.cpp         |  6 +--
 src/crepe/api/Script.h           |  4 +-
 src/crepe/facade/EventData.h     | 89 ++++++++++++++++++++--------------------
 src/crepe/facade/SDLContext.cpp  |  9 ++--
 src/crepe/facade/SDLContext.h    |  8 ++--
 src/crepe/system/InputSystem.cpp | 10 ++---
 src/example/button.cpp           | 12 +++---
 src/test/InputTest.cpp           |  3 +-
 9 files changed, 72 insertions(+), 79 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h
index 4e57b45..73bf461 100644
--- a/src/crepe/api/Event.h
+++ b/src/crepe/api/Event.h
@@ -39,7 +39,7 @@ public:
  */
 class MousePressEvent : public Event {
 public:
-	//! mouse position in game units
+	//! mouse position in world coordinates (game units).
 	vec2 mouse_pos = {0, 0};
 
 	//! The mouse button that was pressed.
@@ -51,7 +51,7 @@ public:
  */
 class MouseClickEvent : public Event {
 public:
-	//! mouse position in game units
+	//! mouse position in world coordinates (game units).
 	vec2 mouse_pos = {0, 0};
 
 	//! The mouse button that was clicked.
@@ -63,7 +63,7 @@ public:
  */
 class MouseReleaseEvent : public Event {
 public:
-	//! mouse position in game units
+	//! mouse position in world coordinates (game units).
 	vec2 mouse_pos = {0, 0};
 
 	//! The mouse button that was released.
@@ -75,7 +75,7 @@ public:
  */
 class MouseMoveEvent : public Event {
 public:
-	//! mouse position in game units
+	//! mouse position in world coordinates (game units).
 	vec2 mouse_pos = {0, 0};
 	//! The change in mouse position relative to the last position (in pixels).
 	ivec2 mouse_delta = {0, 0};
@@ -86,7 +86,7 @@ public:
  */
 class MouseScrollEvent : public Event {
 public:
-	//! mouse position in game units when the scroll happened.
+	//! mouse position in world coordinates (game units) when the scroll happened.
 	vec2 mouse_pos = {0, 0};
 	//! scroll direction (-1 = down, 1 = up)
 	int scroll_direction = 0;
diff --git a/src/crepe/api/Script.cpp b/src/crepe/api/Script.cpp
index 7b56f61..638cca7 100644
--- a/src/crepe/api/Script.cpp
+++ b/src/crepe/api/Script.cpp
@@ -1,7 +1,7 @@
 #include <string>
 
-#include "../manager/SceneManager.h"
 #include "../facade/SDLContext.h"
+#include "../manager/SceneManager.h"
 #include "Script.h"
 
 using namespace crepe;
@@ -26,7 +26,7 @@ void Script::set_next_scene(const string & name) {
 
 SaveManager & Script::get_save_manager() const { return this->mediator->save_manager; }
 
-const keyboard_state_t&  Script::get_keyboard_state() const{
-	SDLContext& sdl_context = this->mediator->sdl_context;
+const keyboard_state_t & Script::get_keyboard_state() const {
+	SDLContext & sdl_context = this->mediator->sdl_context;
 	return sdl_context.get_keyboard_state();
 }
diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h
index 4fbf344..dcecc07 100644
--- a/src/crepe/api/Script.h
+++ b/src/crepe/api/Script.h
@@ -2,11 +2,11 @@
 
 #include <vector>
 
+#include "../api/KeyCodes.h"
 #include "../manager/EventManager.h"
 #include "../manager/Mediator.h"
 #include "../system/CollisionSystem.h"
 #include "../types.h"
-#include "../api/KeyCodes.h"
 #include "../util/OptionalRef.h"
 
 namespace crepe {
@@ -142,7 +142,7 @@ protected:
 	 * \return current keyboard state map with Keycode as key and bool as value(true = pressed, false = not pressed)
 	 * 
 	 */
-	const keyboard_state_t& get_keyboard_state() const;
+	const keyboard_state_t & get_keyboard_state() const;
 	//! \}
 
 private:
diff --git a/src/crepe/facade/EventData.h b/src/crepe/facade/EventData.h
index d0ca07f..a7526b4 100644
--- a/src/crepe/facade/EventData.h
+++ b/src/crepe/facade/EventData.h
@@ -3,53 +3,52 @@
 #include "../types.h"
 namespace crepe {
 //! EventType enum for passing eventType
-	enum EventType {
-		NONE = 0,
-		MOUSE_DOWN,
-		MOUSE_UP,
-		MOUSE_MOVE,
-		MOUSE_WHEEL,
-		KEY_UP,
-		KEY_DOWN,
-		SHUTDOWN,
-		WINDOW_MINIMIZE,
-		WINDOW_MAXIMIZE,
-		WINDOW_FOCUS_GAIN,
-		WINDOW_FOCUS_LOST,
-		WINDOW_MOVE,
-		WINDOW_RESIZE,
-		WINDOW_EXPOSE,
-	};
+enum EventType {
+	NONE = 0,
+	MOUSE_DOWN,
+	MOUSE_UP,
+	MOUSE_MOVE,
+	MOUSE_WHEEL,
+	KEY_UP,
+	KEY_DOWN,
+	SHUTDOWN,
+	WINDOW_MINIMIZE,
+	WINDOW_MAXIMIZE,
+	WINDOW_FOCUS_GAIN,
+	WINDOW_FOCUS_LOST,
+	WINDOW_MOVE,
+	WINDOW_RESIZE,
+	WINDOW_EXPOSE,
+};
 
-	//! Struct for storing key data.
-	struct KeyData {
-		Keycode key = Keycode::NONE;
-		bool key_repeat = false;
-	};
+//! Struct for storing key data.
+struct KeyData {
+	Keycode key = Keycode::NONE;
+	bool key_repeat = false;
+};
 
-	//! Struct for storing mouse data.
-	struct MouseData {
-		MouseButton mouse_button = MouseButton::NONE;
-		ivec2 mouse_position = {-1, -1};
-		int scroll_direction = -1;
-		float scroll_delta = INFINITY;
-		ivec2 rel_mouse_move = {-1, -1};
-	};
+//! Struct for storing mouse data.
+struct MouseData {
+	MouseButton mouse_button = MouseButton::NONE;
+	ivec2 mouse_position = {-1, -1};
+	int scroll_direction = -1;
+	float scroll_delta = INFINITY;
+	ivec2 rel_mouse_move = {-1, -1};
+};
 
-	//! Struct for storing window data.
-	struct WindowData {
-		ivec2 move_delta;
-		ivec2 resize_dimension;
-	};
-	
-	//! EventData struct for passing event data from facade
-	struct EventData {
-	EventType event_type = EventType::NONE;
-		union {
-			KeyData key_data;
-			MouseData mouse_data;
-			WindowData window_data;
-		} data;
+//! Struct for storing window data.
+struct WindowData {
+	ivec2 move_delta;
+	ivec2 resize_dimension;
+};
 
-	};
+//! EventData struct for passing event data from facade
+struct EventData {
+	EventType event_type = EventType::NONE;
+	union {
+		KeyData key_data;
+		MouseData mouse_data;
+		WindowData window_data;
+	} data;
+};
 } // namespace crepe
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index e5b0284..7ccc243 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -75,18 +75,17 @@ SDLContext::~SDLContext() {
 }
 
 Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) {
-	if (!LOOKUP_TABLE.contains(sdl_key)) 
-		return Keycode::NONE;
+	if (!LOOKUP_TABLE.contains(sdl_key)) return Keycode::NONE;
 
 	return LOOKUP_TABLE.at(sdl_key);
 }
 
-const keyboard_state_t& SDLContext::get_keyboard_state(){
+const keyboard_state_t & SDLContext::get_keyboard_state() {
 	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<SDL_Scancode>(i));
 		if (key != Keycode::NONE) {
 			this->keyboard_state[key] = current_state[i] != 0;
@@ -283,7 +282,7 @@ std::vector<EventData> SDLContext::get_events() {
 			case SDL_QUIT:
 				event_list.push_back({.event_type = EventType::SHUTDOWN});
 				break;
-			case SDL_KEYDOWN: 
+			case SDL_KEYDOWN:
 				event_list.push_back(EventData{
 					.event_type = EventType::KEY_DOWN,
 					.data = {
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index 3531680..8f4760e 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -5,19 +5,18 @@
 #include <SDL2/SDL_rect.h>
 #include <SDL2/SDL_render.h>
 #include <SDL2/SDL_video.h>
-#include <array>
 #include <cmath>
 #include <functional>
 #include <memory>
 #include <string>
 #include <unordered_map>
 
+#include "../types.h"
 #include "api/Camera.h"
 #include "api/Color.h"
 #include "api/KeyCodes.h"
 #include "api/Sprite.h"
 #include "api/Transform.h"
-#include "../types.h"
 
 #include "EventData.h"
 
@@ -71,7 +70,6 @@ public:
 	};
 
 public:
-	
 	/**
 	 * \brief Gets the singleton instance of SDLContext.
 	 * \return Reference to the SDLContext instance.
@@ -146,8 +144,8 @@ public:
 	 * \return A constant reference to the `keyboard_state_t`, which holds the state
 	 *         of each key (true = pressed, false = not pressed).
 	 */
-	const keyboard_state_t& get_keyboard_state();
-	
+	const keyboard_state_t & get_keyboard_state();
+
 public:
 	/**
 	 * \brief Gets the current SDL ticks since the program started.
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp
index 1427adf..fca540f 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -1,7 +1,7 @@
 #include "../api/Button.h"
+#include "../facade/SDLContext.h"
 #include "../manager/ComponentManager.h"
 #include "../manager/EventManager.h"
-#include "../facade/SDLContext.h"
 #include "util/Log.h"
 
 #include "InputSystem.h"
@@ -47,8 +47,8 @@ void InputSystem::update() {
 	}
 }
 
-void InputSystem::handle_mouse_event(const EventData & event,
-									 const vec2 & camera_origin, const Camera & current_cam) {
+void InputSystem::handle_mouse_event(const EventData & event, const vec2 & camera_origin,
+									 const Camera & current_cam) {
 	EventManager & event_mgr = this->mediator.event_manager;
 	vec2 adjusted_mouse;
 	adjusted_mouse.x = event.data.mouse_data.mouse_position.x + camera_origin.x;
@@ -153,9 +153,7 @@ void InputSystem::handle_non_mouse_event(const EventData & event) {
 	}
 }
 
-
-void InputSystem::handle_move(const EventData & event_data,
-							  const vec2 & mouse_pos) {
+void InputSystem::handle_move(const EventData & event_data, const vec2 & mouse_pos) {
 	ComponentManager & mgr = this->mediator.component_manager;
 
 	RefVector<Button> buttons = mgr.get_components_by_type<Button>();
diff --git a/src/example/button.cpp b/src/example/button.cpp
index c4e9a47..6c8b1bc 100644
--- a/src/example/button.cpp
+++ b/src/example/button.cpp
@@ -1,18 +1,18 @@
 #include <SDL2/SDL_timer.h>
 #include <chrono>
 #include <crepe/Component.h>
-#include <crepe/manager/ComponentManager.h>
 #include <crepe/api/Animator.h>
 #include <crepe/api/Button.h>
 #include <crepe/api/Camera.h>
 #include <crepe/api/Color.h>
-#include <crepe/manager/EventManager.h>
 #include <crepe/api/GameObject.h>
 #include <crepe/api/Sprite.h>
 #include <crepe/api/Texture.h>
 #include <crepe/api/Transform.h>
-#include <crepe/system/AnimatorSystem.h>
 #include <crepe/facade/SDLContext.h>
+#include <crepe/manager/ComponentManager.h>
+#include <crepe/manager/EventManager.h>
+#include <crepe/system/AnimatorSystem.h>
 #include <crepe/system/InputSystem.h>
 #include <crepe/system/RenderSystem.h>
 #include <crepe/types.h>
@@ -27,8 +27,8 @@ int main(int argc, char * argv[]) {
 	InputSystem input_sys{mediator};
 	SDLContext sdl_context{mediator};
 	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1);
-	auto & camera = obj.add_component<Camera>(ivec2{500, 500}, vec2{500, 500},
-										Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
+	auto & camera = obj.add_component<Camera>(
+		ivec2{500, 500}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f});
 
 	// GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1);
 	// auto s2 = Texture("asset/texture/test_ap43.png");
@@ -46,7 +46,7 @@ int main(int argc, char * argv[]) {
 	// button.active = true;
 	auto start = std::chrono::steady_clock::now();
 	while (true) {
-		const keyboard_state_t& keyboard_state = sdl_context.get_keyboard_state();
+		const keyboard_state_t & keyboard_state = sdl_context.get_keyboard_state();
 		input_sys.update();
 		sys.update();
 		event_mgr.dispatch_events();
diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp
index f974d0c..d893276 100644
--- a/src/test/InputTest.cpp
+++ b/src/test/InputTest.cpp
@@ -13,9 +13,9 @@
 #include <crepe/api/Camera.h>
 #include <crepe/api/GameObject.h>
 #include <crepe/api/Metadata.h>
-#include <crepe/facade/SDLContext.h>
 #include <crepe/api/Transform.h>
 #include <crepe/api/Vector2.h>
+#include <crepe/facade/SDLContext.h>
 #include <gmock/gmock.h>
 
 using namespace std;
@@ -260,4 +260,3 @@ TEST_F(InputTest, testButtonHover) {
 	event_manager.dispatch_events();
 	EXPECT_TRUE(button.hover);
 }
-
-- 
cgit v1.2.3


From 4cddaf8e8b809a69a8e03e79c4f7902920745a9a Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Sat, 14 Dec 2024 18:23:31 +0100
Subject: make format

---
 src/crepe/api/BoxCollider.cpp    |  3 ++-
 src/crepe/api/BoxCollider.h      |  3 ++-
 src/crepe/api/CircleCollider.cpp |  3 ++-
 src/crepe/api/CircleCollider.h   |  3 ++-
 src/example/game.cpp             | 18 +++++++++++++-----
 src/test/CollisionTest.cpp       | 12 ++++++------
 6 files changed, 27 insertions(+), 15 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/BoxCollider.cpp b/src/crepe/api/BoxCollider.cpp
index 302bdd2..a893d41 100644
--- a/src/crepe/api/BoxCollider.cpp
+++ b/src/crepe/api/BoxCollider.cpp
@@ -4,6 +4,7 @@
 
 using namespace crepe;
 
-BoxCollider::BoxCollider(game_object_id_t game_object_id,const vec2 & dimensions,const vec2 & offset)
+BoxCollider::BoxCollider(game_object_id_t game_object_id, const vec2 & dimensions,
+						 const vec2 & offset)
 	: Collider(game_object_id, offset),
 	  dimensions(dimensions) {}
diff --git a/src/crepe/api/BoxCollider.h b/src/crepe/api/BoxCollider.h
index a507e0c..d643e7f 100644
--- a/src/crepe/api/BoxCollider.h
+++ b/src/crepe/api/BoxCollider.h
@@ -13,7 +13,8 @@ namespace crepe {
  */
 class BoxCollider : public Collider {
 public:
-	BoxCollider(game_object_id_t game_object_id, const vec2 & dimensions,const vec2 & offset= {0,0});
+	BoxCollider(game_object_id_t game_object_id, const vec2 & dimensions,
+				const vec2 & offset = {0, 0});
 
 	//! Width and height of the box collider
 	vec2 dimensions;
diff --git a/src/crepe/api/CircleCollider.cpp b/src/crepe/api/CircleCollider.cpp
index e542275..90ab5e7 100644
--- a/src/crepe/api/CircleCollider.cpp
+++ b/src/crepe/api/CircleCollider.cpp
@@ -2,6 +2,7 @@
 
 using namespace crepe;
 
-CircleCollider::CircleCollider(game_object_id_t game_object_id, float radius, const vec2 & offset)
+CircleCollider::CircleCollider(game_object_id_t game_object_id, float radius,
+							   const vec2 & offset)
 	: Collider(game_object_id, offset),
 	  radius(radius) {}
diff --git a/src/crepe/api/CircleCollider.h b/src/crepe/api/CircleCollider.h
index ea40068..22da836 100644
--- a/src/crepe/api/CircleCollider.h
+++ b/src/crepe/api/CircleCollider.h
@@ -13,7 +13,8 @@ namespace crepe {
  */
 class CircleCollider : public Collider {
 public:
-	CircleCollider(game_object_id_t game_object_id, float radius, const vec2 & offset= {0,0});
+	CircleCollider(game_object_id_t game_object_id, float radius,
+				   const vec2 & offset = {0, 0});
 
 	//! Radius of the circle collider.
 	float radius;
diff --git a/src/example/game.cpp b/src/example/game.cpp
index d03d78d..61f8760 100644
--- a/src/example/game.cpp
+++ b/src/example/game.cpp
@@ -36,7 +36,7 @@ class MyScript1 : public Script {
 			case Keycode::W: {
 				Rigidbody & tf = this->get_component<Rigidbody>();
 				// tf.data.linear_velocity.y -= 1;
-				tf.add_force_linear({0,-1});
+				tf.add_force_linear({0, -1});
 				break;
 			}
 			case Keycode::S: {
@@ -178,10 +178,18 @@ public:
 			.body_type = Rigidbody::BodyType::STATIC,
 			.offset = {0, 0},
 		});
-		world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)}); // Top
-		world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0, screen_size_height / 2 + world_collider / 2}); // Bottom
-		world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0 - (screen_size_width / 2 + world_collider / 2), 0}); // Left
-		world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{screen_size_width / 2 + world_collider / 2, 0}); // right
+		world.add_component<BoxCollider>(
+			vec2{world_collider, world_collider},
+			vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)}); // Top
+		world.add_component<BoxCollider>(
+			vec2{world_collider, world_collider},
+			vec2{0, screen_size_height / 2 + world_collider / 2}); // Bottom
+		world.add_component<BoxCollider>(
+			vec2{world_collider, world_collider},
+			vec2{0 - (screen_size_width / 2 + world_collider / 2), 0}); // Left
+		world.add_component<BoxCollider>(
+			vec2{world_collider, world_collider},
+			vec2{screen_size_width / 2 + world_collider / 2, 0}); // right
 		world.add_component<Camera>(
 			ivec2{static_cast<int>(screen_size_width), static_cast<int>(screen_size_height)},
 			vec2{screen_size_width, screen_size_height},
diff --git a/src/test/CollisionTest.cpp b/src/test/CollisionTest.cpp
index b34bede..ff9e7cc 100644
--- a/src/test/CollisionTest.cpp
+++ b/src/test/CollisionTest.cpp
@@ -69,10 +69,10 @@ public:
 			.offset = {0, 0},
 		});
 		// Create a box with an inner size of 10x10 units
-		world.add_component<BoxCollider>(vec2{100, 100},vec2{0, -100}); // Top
-		world.add_component<BoxCollider>(vec2{100, 100},vec2{0, 100}); // Bottom
-		world.add_component<BoxCollider>(vec2{100, 100},vec2{-100, 0}); // Left
-		world.add_component<BoxCollider>(vec2{100, 100},vec2{100, 0}); // right
+		world.add_component<BoxCollider>(vec2{100, 100}, vec2{0, -100}); // Top
+		world.add_component<BoxCollider>(vec2{100, 100}, vec2{0, 100}); // Bottom
+		world.add_component<BoxCollider>(vec2{100, 100}, vec2{-100, 0}); // Left
+		world.add_component<BoxCollider>(vec2{100, 100}, vec2{100, 0}); // right
 
 		game_object1.add_component<Rigidbody>(Rigidbody::Data{
 			.mass = 1,
@@ -84,7 +84,7 @@ public:
 			.offset = {0, 0},
 			.collision_layers = {0},
 		});
-		game_object1.add_component<BoxCollider>(vec2{10, 10},vec2{0, 0});
+		game_object1.add_component<BoxCollider>(vec2{10, 10}, vec2{0, 0});
 		BehaviorScript & script_object1
 			= game_object1.add_component<BehaviorScript>().set_script<CollisionHandler>(1);
 		script_object1_ref = static_cast<CollisionHandler *>(script_object1.script.get());
@@ -100,7 +100,7 @@ public:
 			.offset = {0, 0},
 			.collision_layers = {0},
 		});
-		game_object2.add_component<BoxCollider>(vec2{10, 10},vec2{0, 0});
+		game_object2.add_component<BoxCollider>(vec2{10, 10}, vec2{0, 0});
 		BehaviorScript & script_object2
 			= game_object2.add_component<BehaviorScript>().set_script<CollisionHandler>(2);
 		script_object2_ref = static_cast<CollisionHandler *>(script_object2.script.get());
-- 
cgit v1.2.3


From ff2f5120b53792fe5e8cfd45a4335680baf487cf Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Sat, 14 Dec 2024 20:00:40 +0100
Subject: updated offset

---
 src/crepe/system/ParticleSystem.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index 31a4e9e..e61f0ce 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -48,7 +48,7 @@ void ParticleSystem::update() {
 void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform & transform) {
 	constexpr float DEG_TO_RAD = M_PI / 180.0;
 
-	vec2 initial_position = emitter.data.position + transform.position;
+	vec2 initial_position = emitter.data.offset + transform.position;
 	float random_angle
 		= this->generate_random_angle(emitter.data.min_angle, emitter.data.max_angle);
 
@@ -69,7 +69,7 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform &
 }
 
 void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & transform) {
-	vec2 offset = emitter.data.boundary.offset + transform.position + emitter.data.position;
+	vec2 offset = emitter.data.boundary.offset + transform.position + emitter.data.offset;
 	float half_width = emitter.data.boundary.width / 2.0;
 	float half_height = emitter.data.boundary.height / 2.0;
 
-- 
cgit v1.2.3


From 20d19e3c714d3e8ca3e35c170c07c563ecc719bb Mon Sep 17 00:00:00 2001
From: JAROWMR <jarorutjes07@gmail.com>
Date: Sat, 14 Dec 2024 21:30:32 +0100
Subject: fixed bug with lower than one particle per second

---
 src/crepe/system/ParticleSystem.cpp | 2 +-
 src/example/game.cpp                | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp
index e61f0ce..35a1d41 100644
--- a/src/crepe/system/ParticleSystem.cpp
+++ b/src/crepe/system/ParticleSystem.cpp
@@ -27,7 +27,7 @@ void ParticleSystem::update() {
 			= mgr.get_components_by_id<Transform>(emitter.game_object_id).front().get();
 
 		// Emit particles based on emission_rate
-		emitter.spawn_accumulator = emitter.data.emission_rate * dt;
+		emitter.spawn_accumulator += emitter.data.emission_rate * dt;
 		while (emitter.spawn_accumulator >= 1.0) {
 			this->emit_particle(emitter, transform);
 			emitter.spawn_accumulator -= 1.0;
diff --git a/src/example/game.cpp b/src/example/game.cpp
index ed6afac..db0d04b 100644
--- a/src/example/game.cpp
+++ b/src/example/game.cpp
@@ -271,7 +271,7 @@ public:
 			= particle.add_component<ParticleEmitter>(particle_image, ParticleEmitter::Data{
 																		  .offset = {0, 0},
 																		  .max_particles = 256,
-																		  .emission_rate = 50,
+																		  .emission_rate = 1,
 																		  .min_speed = 10,
 																		  .max_speed = 20,
 																		  .min_angle = -20,
-- 
cgit v1.2.3


From ff969f4e676d8cb565da1581733a35eb64eb03c6 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Sun, 15 Dec 2024 22:43:37 +0100
Subject: added keystate

---
 src/crepe/api/Script.cpp | 8 ++++++++
 src/crepe/api/Script.h   | 8 ++++++++
 2 files changed, 16 insertions(+)

(limited to 'src/crepe')

diff --git a/src/crepe/api/Script.cpp b/src/crepe/api/Script.cpp
index 638cca7..4cd59a5 100644
--- a/src/crepe/api/Script.cpp
+++ b/src/crepe/api/Script.cpp
@@ -30,3 +30,11 @@ const keyboard_state_t & Script::get_keyboard_state() const {
 	SDLContext & sdl_context = this->mediator->sdl_context;
 	return sdl_context.get_keyboard_state();
 }
+bool Script::get_key_state(Keycode key) const{
+	try {
+		return this->get_keyboard_state().at(key);
+	} catch (...) {
+		return false;
+	}
+}
+
diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h
index dcecc07..b5d3dd2 100644
--- a/src/crepe/api/Script.h
+++ b/src/crepe/api/Script.h
@@ -143,6 +143,14 @@ protected:
 	 * 
 	 */
 	const keyboard_state_t & get_keyboard_state() const;
+	/**
+	 * \brief Utility function to retrieve a single key state.
+	 * \see SDLContext::get_keyboard_state
+	 * 
+	 * \return Keycode state (true if pressed, false if not pressed).
+	 * 
+	 */
+	bool get_key_state(Keycode key) const;
 	//! \}
 
 private:
-- 
cgit v1.2.3


From 3c99c73f3c1c31ba97f7e8c74f434c880f8a9036 Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Sun, 15 Dec 2024 22:44:09 +0100
Subject: enter between functions

---
 src/crepe/api/Script.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/Script.cpp b/src/crepe/api/Script.cpp
index 4cd59a5..d4eaae9 100644
--- a/src/crepe/api/Script.cpp
+++ b/src/crepe/api/Script.cpp
@@ -30,11 +30,11 @@ const keyboard_state_t & Script::get_keyboard_state() const {
 	SDLContext & sdl_context = this->mediator->sdl_context;
 	return sdl_context.get_keyboard_state();
 }
-bool Script::get_key_state(Keycode key) const{
+
+bool Script::get_key_state(Keycode key) const {
 	try {
 		return this->get_keyboard_state().at(key);
 	} catch (...) {
 		return false;
 	}
 }
-
-- 
cgit v1.2.3


From c96ef5f62a1369d66e8eba9bf8ed192e3cf8e716 Mon Sep 17 00:00:00 2001
From: Loek Le Blansch <loek@pipeframe.xyz>
Date: Tue, 17 Dec 2024 14:19:09 +0100
Subject: add noexcept qualifier to Script::get_key_state

---
 src/crepe/api/Script.cpp | 2 +-
 src/crepe/api/Script.h   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/Script.cpp b/src/crepe/api/Script.cpp
index d4eaae9..583c04f 100644
--- a/src/crepe/api/Script.cpp
+++ b/src/crepe/api/Script.cpp
@@ -31,7 +31,7 @@ const keyboard_state_t & Script::get_keyboard_state() const {
 	return sdl_context.get_keyboard_state();
 }
 
-bool Script::get_key_state(Keycode key) const {
+bool Script::get_key_state(Keycode key) const noexcept {
 	try {
 		return this->get_keyboard_state().at(key);
 	} catch (...) {
diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h
index b5d3dd2..65306cd 100644
--- a/src/crepe/api/Script.h
+++ b/src/crepe/api/Script.h
@@ -150,7 +150,7 @@ protected:
 	 * \return Keycode state (true if pressed, false if not pressed).
 	 * 
 	 */
-	bool get_key_state(Keycode key) const;
+	bool get_key_state(Keycode key) const noexcept;
 	//! \}
 
 private:
-- 
cgit v1.2.3


From 9232a98b72eee7af4f7f2153c1b2ccedbfa4cc65 Mon Sep 17 00:00:00 2001
From: Loek Le Blansch <loek@pipeframe.xyz>
Date: Tue, 17 Dec 2024 14:42:29 +0100
Subject: fix code standard

---
 src/crepe/facade/SDLContext.cpp | 5 ++---
 src/crepe/facade/SDLContext.h   | 2 +-
 2 files changed, 3 insertions(+), 4 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 7ccc243..f331517 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -75,9 +75,8 @@ SDLContext::~SDLContext() {
 }
 
 Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) {
-	if (!LOOKUP_TABLE.contains(sdl_key)) return Keycode::NONE;
-
-	return LOOKUP_TABLE.at(sdl_key);
+	if (!lookup_table.contains(sdl_key)) return Keycode::NONE;
+	return lookup_table.at(sdl_key);
 }
 
 const keyboard_state_t & SDLContext::get_keyboard_state() {
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index 8f4760e..b9c7fbd 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -245,7 +245,7 @@ private:
 	//! variable to store the state of each key (true = pressed, false = not pressed)
 	keyboard_state_t keyboard_state;
 	//! lookup table for converting SDL_SCANCODES to Keycodes
-	const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE
+	const std::unordered_map<SDL_Scancode, Keycode> lookup_table
 		= {{SDL_SCANCODE_SPACE, Keycode::SPACE},
 		   {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE},
 		   {SDL_SCANCODE_COMMA, Keycode::COMMA},
-- 
cgit v1.2.3