1 module evael.system.input_handler;
2 
3 public import bindbc.glfw;
4 
5 import std.traits : EnumMembers;
6 
7 import evael.system.input;
8 import evael.utils.math;
9 import evael.lib.memory.no_gc_class;
10 
11 /**
12  * Input handler.
13  * Handle mouse movements and mouse buttons / keys states.
14  */
15 class InputHandler : NoGCClass
16 {
17     private bool[ [EnumMembers!(MouseButton)].length ] m_mouseButtonsStates;
18 
19     private vec2 m_mousePosition;
20     private bool m_mouseButtonClicked;
21     
22     /**
23      * InputHandler constructor.
24      */
25     @nogc
26     public this() nothrow
27     {
28         this.m_mouseButtonsStates = [false, false];
29         this.m_mouseButtonClicked = false;
30     }
31 
32     /**
33      * InputHandler destructor.
34      */
35     @nogc
36     public ~this()
37     {
38 
39     }
40 
41     /**
42      * Updates input states and triggers events.
43      */
44     public void update()
45     {
46         if (this.m_mouseButtonClicked)
47         {
48             static bool[2] lastMouseButtonsStates = [false, false];
49 
50             bool isMouseButtonPressed;
51             int enumIndex;
52 
53             static foreach (e; [EnumMembers!(MouseButton)])
54             {
55                 enumIndex = cast(int) e;
56                 isMouseButtonPressed = this.m_mouseButtonsStates[enumIndex];
57 
58                 if (isMouseButtonPressed != lastMouseButtonsStates[enumIndex])
59                 {
60                     lastMouseButtonsStates[enumIndex] = isMouseButtonPressed;
61                 }
62             }
63 
64             this.m_mouseButtonClicked = false;
65         }
66     }
67 
68     /**
69      * Checks if a specific mouse button is clicked.
70      * Params:
71      *      button : mouse button
72      */
73     @nogc
74     public bool isMouseButtonClicked(in MouseButton button) nothrow
75     {
76         return this.m_mouseButtonsStates[button] == GLFW_PRESS;
77     }
78 
79     /**
80      * Checks if a specific key is pressed.
81      * Params:
82      *      key : key
83      */
84     @nogc
85     public bool isKeyPressed(in Key key) nothrow
86     {
87         // TODO: ASAP!!!
88         return false;
89     }
90 
91     /**
92      * Event called on mouse button action.
93      * Params:
94      *		button : mouse button
95      *		pressed : pressed or released
96      */
97     @nogc
98     public void onMouseButton(in MouseButton button, in bool pressed)
99     {
100         this.m_mouseButtonsStates[button] = pressed;
101         this.m_mouseButtonClicked = true;
102     }
103 
104     /**
105      * Event called on mouse movement.
106      * Params:
107      *		x : x mouse coord
108      *		y : y moue coord
109      */
110     @nogc
111     public void onMouseMove(in ref vec2 position)
112     {
113         this.m_mousePosition = position;
114     }
115 
116     @nogc
117     @property nothrow
118     {
119         public ref const(vec2) mousePosition() const
120         {
121             return this.m_mousePosition;
122         }
123     }
124 }