@@ -84,6 +84,29 @@ static eMButton GlfwMouseButtonToNative(int mbutton)
8484 return eMButton_null;
8585}
8686
87+ static eGamepadButton GlfwGamepadButtonToNative (int gpbutton)
88+ {
89+ switch (gpbutton)
90+ {
91+ case GLFW_GAMEPAD_BUTTON_A: return eGamepadButton_A;
92+ case GLFW_GAMEPAD_BUTTON_B: return eGamepadButton_B;
93+ case GLFW_GAMEPAD_BUTTON_X: return eGamepadButton_X;
94+ case GLFW_GAMEPAD_BUTTON_Y: return eGamepadButton_Y;
95+ case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER: return eGamepadButton_LeftBumper;
96+ case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER: return eGamepadButton_RightBumper;
97+ case GLFW_GAMEPAD_BUTTON_BACK: return eGamepadButton_Back;
98+ case GLFW_GAMEPAD_BUTTON_START: return eGamepadButton_Start;
99+ case GLFW_GAMEPAD_BUTTON_GUIDE: return eGamepadButton_Guide;
100+ case GLFW_GAMEPAD_BUTTON_LEFT_THUMB: return eGamepadButton_LeftThumb;
101+ case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB: return eGamepadButton_RightThumb;
102+ case GLFW_GAMEPAD_BUTTON_DPAD_UP: return eGamepadButton_DPAD_Up;
103+ case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT: return eGamepadButton_DPAD_Right;
104+ case GLFW_GAMEPAD_BUTTON_DPAD_DOWN: return eGamepadButton_DPAD_Down;
105+ case GLFW_GAMEPAD_BUTTON_DPAD_LEFT: return eGamepadButton_DPAD_Left;
106+ };
107+ return eGamepadButton_null;
108+ }
109+
87110// ////////////////////////////////////////////////////////////////////////
88111
89112GraphicsDevice::GraphicsDevice ()
@@ -210,6 +233,13 @@ bool GraphicsDevice::Initialize(int screensizex, int screensizey, bool fullscree
210233 };
211234 gSystem .HandleEvent (ev);
212235 });
236+ ::glfwSetJoystickCallback ([](int gamepad, int gamepadStatus)
237+ {
238+ if (gamepad < MAX_GAMEPADS)
239+ {
240+ gInputs .SetGamepadPresent (gamepad, (gamepadStatus == GLFW_CONNECTED));
241+ }
242+ });
213243
214244 // setup opengl extensions
215245 if (!InitializeOGLExtensions ())
@@ -266,6 +296,14 @@ bool GraphicsDevice::Initialize(int screensizex, int screensizey, bool fullscree
266296
267297 EnableFullscreen (fullscreen);
268298 EnableVSync (vsync);
299+
300+ // init gamepads
301+ for (int icurr = 0 ; icurr < MAX_GAMEPADS; ++icurr)
302+ {
303+ bool isGamepad = ::glfwJoystickIsGamepad (icurr) == GLFW_TRUE;
304+ gInputs .SetGamepadPresent (icurr, isGamepad);
305+ }
306+
269307 return true ;
270308}
271309
@@ -740,6 +778,51 @@ void GraphicsDevice::Present()
740778 gSystem .QuitRequest ();
741779 return ;
742780 }
781+ ProcessGamepadsInputs ();
782+ }
783+
784+ void GraphicsDevice::ProcessGamepadsInputs ()
785+ {
786+ GLFWgamepadstate gamepadstate;
787+
788+ for (int icurr = 0 ; icurr < MAX_GAMEPADS; ++icurr)
789+ {
790+ GamepadState& currGamepad = gInputs .mGamepadsState [icurr];
791+ if (!currGamepad.mPresent )
792+ continue ;
793+
794+ if (::glfwGetGamepadState (icurr, &gamepadstate) != GLFW_TRUE)
795+ continue ;
796+
797+ for (int ibutton = 0 ; ibutton < GLFW_JOYSTICK_LAST + 1 ; ++ibutton)
798+ {
799+ eGamepadButton buttonNative = GlfwGamepadButtonToNative (ibutton);
800+ if (buttonNative == eGamepadButton_null)
801+ continue ;
802+
803+ bool newPressed = gamepadstate.buttons [ibutton] == GLFW_PRESS;
804+ if (currGamepad.mButtons [buttonNative] == newPressed)
805+ continue ;
806+
807+ GamepadInputEvent inputEvent { icurr, buttonNative, newPressed };
808+ gSystem .HandleEvent (inputEvent);
809+ }
810+
811+ // triggers
812+ bool leftTriggerPressed = gamepadstate.axes [GLFW_GAMEPAD_AXIS_LEFT_TRIGGER] > 0 .5f ;
813+ if (leftTriggerPressed != currGamepad.mButtons [eGamepadButton_LeftTrigger])
814+ {
815+ GamepadInputEvent inputEvent { icurr, eGamepadButton_LeftTrigger, leftTriggerPressed };
816+ gSystem .HandleEvent (inputEvent);
817+ }
818+
819+ bool rightTriggerPressed = gamepadstate.axes [GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER] > 0 .5f ;
820+ if (rightTriggerPressed != currGamepad.mButtons [eGamepadButton_RightTrigger])
821+ {
822+ GamepadInputEvent inputEvent { icurr, eGamepadButton_RightTrigger, rightTriggerPressed };
823+ gSystem .HandleEvent (inputEvent);
824+ }
825+ }
743826}
744827
745828void GraphicsDevice::SetViewportRect (const Rect2D& sourceRectangle)
0 commit comments