diff options
| -rw-r--r-- | src/crepe/facade/SDLContext.cpp | 144 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.h | 19 | ||||
| -rw-r--r-- | src/crepe/system/InputSystem.cpp | 53 | ||||
| -rw-r--r-- | src/test/EventTest.cpp | 26 | 
4 files changed, 140 insertions, 102 deletions
| 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 |