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 }