aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/system/InputSystem.cpp
blob: c61a80fed4981d092b193a94ea23a680efabf167 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "ComponentManager.h"
#include "../api/Button.h"
#include "../api/EventManager.h"
#include "../api/Transform.h"
#include "../facade/SDLContext.h"
#include "../api/Event.h"

#include "system/InputSystem.h"

using namespace crepe;



void InputSystem::update() {
	EventManager& event_mgr = EventManager::get_instance();
    std::vector<SDLContext::EventData> event_list = SDLContext::get_instance().get_events();

    for (SDLContext::EventData event : event_list) {
        switch (event.event_type) {
            case SDLContext::Event::KEYDOWN: {
                event_mgr.queue_event(KeyPressEvent{
                    .key = event.key,
                    .repeat = event.key_repeat,
                });
                break;
            }
            case SDLContext::Event::KEYUP: {
                event_mgr.queue_event(KeyReleaseEvent{
                    .key = event.key,
                });
                break;
            }
            case SDLContext::Event::MOUSEDOWN: {
                event_mgr.queue_event(MousePressEvent{
                    .mouse_x = event.mouse_position.first,
                    .mouse_y = event.mouse_position.second,
                    .button = event.mouse_button,
                });
                break;
            }
            case SDLContext::Event::MOUSEMOVE: {
                event_mgr.queue_event(MouseMoveEvent{
                    .mouse_x = event.mouse_position.first,
                    .mouse_y = event.mouse_position.second,
                    .rel_x = event.rel_mouse_move.first,  
                    .rel_y = event.rel_mouse_move.second,
                });
                break;
            }
            case SDLContext::Event::MOUSEUP: {
                event_mgr.queue_event(MouseReleaseEvent{
                    .mouse_x = event.mouse_position.first,
                    .mouse_y = event.mouse_position.second,
                    .button = event.mouse_button,
                });
                int delta_x = event.mouse_position.first - last_mouse_down_position.first;
                int delta_y = event.mouse_position.second - last_mouse_down_position.second;
                if (last_mouse_button == event.mouse_button &&
                    std::abs(delta_x) <= click_tolerance &&
                    std::abs(delta_y) <= click_tolerance) {
                    event_mgr.queue_event(MouseClickEvent{
                        .mouse_x = event.mouse_position.first,
                        .mouse_y = event.mouse_position.second,
                        .button = event.mouse_button,
                    });
                }
                break;
            }
            case SDLContext::Event::MOUSEWHEEL: {
                event_mgr.queue_event(MouseScrollEvent{
                    .scroll_x = event.mouse_position.first,
                    .scroll_y = event.mouse_position.second,
                    .direction = event.wheel_delta,
                });
                break;
            }
            case SDLContext::Event::SHUTDOWN: {
                event_mgr.queue_event(ShutDownEvent{});
                break;
            }
            default:
                break;
        }
    }
}

bool InputSystem::handle_click(const MouseClickEvent &event) {
    ComponentManager &mgr = this->component_manager;

    std::vector<std::reference_wrapper<Button>> buttons =
        mgr.get_components_by_type<Button>();
	
	std::vector<std::reference_wrapper<Transform>> transforms =
        mgr.get_components_by_type<Transform>();
    for (Button &button : buttons) {
		for(Transform& transform : transforms){
			if(button.game_object_id != transform.game_object_id){continue;}
			if (!button.interactable) {break;}
            if (event.mouse_x >= transform.position.x && event.mouse_x <= transform.position.x + button.width &&
                event.mouse_y >= transform.position.y && event.mouse_y <= transform.position.y + button.height) {
                button.on_click();
            }
		}
    }
    return false;
}