Skip to content

Commit a07f0e4

Browse files
committed
-
1 parent 6edada3 commit a07f0e4

9 files changed

Lines changed: 222 additions & 2 deletions

File tree

src/CarnageGame.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ void CarnageGame::InputEvent(KeyCharEvent& inputEvent)
161161
{
162162
}
163163

164+
void CarnageGame::InputEvent(GamepadInputEvent& inputEvent)
165+
{
166+
167+
}
168+
164169
void CarnageGame::SetCameraController(CameraController* controller)
165170
{
166171
if (mCameraController == controller)

src/CarnageGame.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class CarnageGame final: public cxx::noncopyable
3434
void InputEvent(MouseMovedInputEvent& inputEvent);
3535
void InputEvent(MouseScrollInputEvent& inputEvent);
3636
void InputEvent(KeyCharEvent& inputEvent);
37+
void InputEvent(GamepadInputEvent& inputEvent);
3738

3839
// public for debug purposes
3940
void SetCameraController(CameraController* controller);

src/GraphicsDevice.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

89112
GraphicsDevice::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

745828
void GraphicsDevice::SetViewportRect(const Rect2D& sourceRectangle)

src/GraphicsDevice.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ class GraphicsDevice final: public cxx::noncopyable
162162

163163
void SetupVertexAttributes(const VertexFormat& streamDefinition);
164164

165+
void ProcessGamepadsInputs();
166+
165167
private:
166168
GraphicsContext mGraphicsContext;
167169
GLFWwindow* mGraphicsWindow;

src/Inputs.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ void Inputs::HandleEvent(MouseScrollInputEvent& inputEvent)
2323
{
2424
}
2525

26+
void Inputs::HandleEvent(GamepadInputEvent& inputEvent)
27+
{
28+
debug_assert(inputEvent.mGamepad < MAX_GAMEPADS);
29+
debug_assert(inputEvent.mButton < eGamepadButton_COUNT);
30+
mGamepadsState[inputEvent.mGamepad].mButtons[inputEvent.mButton] = inputEvent.mPressed;
31+
}
32+
2633
void Inputs::HandleEvent(KeyInputEvent& inputEvent)
2734
{
2835
mKeyboardKeys[inputEvent.mKeycode] = inputEvent.mPressed;
@@ -32,8 +39,17 @@ void Inputs::Cleanup()
3239
{
3340
::memset(mMouseButtons, 0, sizeof(mMouseButtons));
3441
::memset(mKeyboardKeys, 0, sizeof(mKeyboardKeys));
42+
::memset(mGamepadsState, 0, sizeof(mGamepadsState));
3543
}
3644

3745
void Inputs::HandleEvent(KeyCharEvent& inputEvent)
3846
{
39-
}
47+
}
48+
49+
void Inputs::SetGamepadPresent(int gamepad, bool isPresent)
50+
{
51+
debug_assert(gamepad < MAX_GAMEPADS);
52+
53+
mGamepadsState[gamepad].mPresent = isPresent;
54+
::memset(mGamepadsState[gamepad].mButtons, 0, sizeof(mGamepadsState[gamepad].mButtons));
55+
}

src/Inputs.h

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#pragma once
22

3-
enum //key mods
3+
enum
44
{
5+
MAX_GAMEPADS = 4,
6+
//key mods
57
KEYMOD_SHIFT = GLFW_MOD_SHIFT,
68
KEYMOD_CTRL = GLFW_MOD_CONTROL,
79
KEYMOD_ALT = GLFW_MOD_ALT,
@@ -85,6 +87,55 @@ enum eKeycode
8587

8688
decl_enum_strings(eKeycode);
8789

90+
// gamepad inputs
91+
enum eGamepadButton
92+
{
93+
eGamepadButton_null, // invalid button
94+
eGamepadButton_A,
95+
eGamepadButton_B,
96+
eGamepadButton_X,
97+
eGamepadButton_Y,
98+
eGamepadButton_LeftBumper,
99+
eGamepadButton_RightBumper,
100+
eGamepadButton_Back,
101+
eGamepadButton_Start,
102+
eGamepadButton_Guide,
103+
eGamepadButton_LeftThumb,
104+
eGamepadButton_RightThumb,
105+
eGamepadButton_DPAD_Up,
106+
eGamepadButton_DPAD_Right,
107+
eGamepadButton_DPAD_Down,
108+
eGamepadButton_DPAD_Left,
109+
eGamepadButton_LeftTrigger,
110+
eGamepadButton_RightTrigger,
111+
eGamepadButton_COUNT
112+
};
113+
114+
decl_enum_strings(eGamepadButton);
115+
116+
// input controller
117+
enum eInputControllerType
118+
{
119+
eInputControllerType_Keyboard,
120+
eInputControllerType_Gamepad1,
121+
eInputControllerType_Gamepad2,
122+
eInputControllerType_Gamepad3,
123+
eInputControllerType_Gamepad4,
124+
eInputControllerType_COUNT
125+
};
126+
127+
decl_enum_strings(eInputControllerType);
128+
129+
// gamepad state
130+
struct GamepadState
131+
{
132+
public:
133+
GamepadState() = default;
134+
public:
135+
bool mButtons[eGamepadButton_COUNT];
136+
bool mPresent;
137+
};
138+
88139
// input events
89140
struct BaseInputEvent
90141
{
@@ -181,6 +232,22 @@ struct MouseScrollInputEvent: public BaseInputEvent
181232
int mScrollY;
182233
};
183234

235+
struct GamepadInputEvent: public BaseInputEvent
236+
{
237+
public:
238+
GamepadInputEvent() = default;
239+
GamepadInputEvent(int gamepad, eGamepadButton button, bool pressed)
240+
: mButton(button)
241+
, mGamepad(gamepad)
242+
, mPressed(pressed)
243+
{
244+
}
245+
public:
246+
int mGamepad;
247+
eGamepadButton mButton;
248+
bool mPressed;
249+
};
250+
184251
//////////////////////////////////////////////////////////////////////////
185252
// Input State Holder
186253
//////////////////////////////////////////////////////////////////////////
@@ -190,9 +257,12 @@ class Inputs final: public cxx::noncopyable
190257
public:
191258
bool mMouseButtons[eMButton_COUNT];
192259
bool mKeyboardKeys[eKeycode_COUNT];
260+
193261
int mCursorPositionX;
194262
int mCursorPositionY;
195263

264+
GamepadState mGamepadsState[MAX_GAMEPADS];
265+
196266
public:
197267
Inputs();
198268

@@ -203,6 +273,7 @@ class Inputs final: public cxx::noncopyable
203273
void HandleEvent(MouseScrollInputEvent& inputEvent);
204274
void HandleEvent(KeyInputEvent& inputEvent);
205275
void HandleEvent(KeyCharEvent& inputEvent);
276+
void HandleEvent(GamepadInputEvent& inputEvent);
206277

207278
// Reset all keys and mouse buttons state
208279
void Cleanup();
@@ -248,6 +319,8 @@ class Inputs final: public cxx::noncopyable
248319
debug_assert(button < eMButton_COUNT && button > eMButton_null);
249320
return mMouseButtons[button];
250321
}
322+
323+
void SetGamepadPresent(int gamepad, bool isPresent);
251324
};
252325

253326
extern Inputs gInputs;

src/System.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,15 @@ void System::HandleEvent(KeyCharEvent& inputEvent)
222222
gCarnageGame.InputEvent(inputEvent);
223223
}
224224

225+
void System::HandleEvent(GamepadInputEvent& inputEvent)
226+
{
227+
if (mIgnoreInputs)
228+
return;
229+
230+
gInputs.HandleEvent(inputEvent);
231+
gCarnageGame.InputEvent(inputEvent);
232+
}
233+
225234
long System::GetSysMilliseconds() const
226235
{
227236
double totalSeconds = ::glfwGetTime();

src/System.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class System final: public cxx::noncopyable
6767
void HandleEvent(MouseScrollInputEvent& inputEvent);
6868
void HandleEvent(KeyInputEvent& inputEvent);
6969
void HandleEvent(KeyCharEvent& inputEvent);
70+
void HandleEvent(GamepadInputEvent& inputEvent);
7071

7172
// Set application exit request flag, execution will be interrupted soon
7273
void QuitRequest();

src/enums_impl.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,36 @@ impl_enum_strings(eMButton)
6666
{eMButton_MIDDLE, "Middle"},
6767
};
6868

69+
impl_enum_strings(eGamepadButton)
70+
{
71+
{eGamepadButton_A, "A"},
72+
{eGamepadButton_B, "B"},
73+
{eGamepadButton_X, "X"},
74+
{eGamepadButton_Y, "Y"},
75+
{eGamepadButton_LeftBumper, "LeftBumper"},
76+
{eGamepadButton_RightBumper, "RightBumper"},
77+
{eGamepadButton_Back, "Back"},
78+
{eGamepadButton_Start, "Start"},
79+
{eGamepadButton_Guide, "Guide"},
80+
{eGamepadButton_LeftThumb, "LeftThumb"},
81+
{eGamepadButton_RightThumb, "RightThumb"},
82+
{eGamepadButton_DPAD_Up, "Up"},
83+
{eGamepadButton_DPAD_Right, "Right"},
84+
{eGamepadButton_DPAD_Down, "Down"},
85+
{eGamepadButton_DPAD_Left, "Left"},
86+
{eGamepadButton_LeftTrigger, "LeftTrigger"},
87+
{eGamepadButton_RightTrigger, "RightTrigger"},
88+
};
89+
90+
impl_enum_strings(eInputControllerType)
91+
{
92+
{eInputControllerType_Keyboard, "Keyboard"},
93+
{eInputControllerType_Gamepad1, "Gamepad1"},
94+
{eInputControllerType_Gamepad2, "Gamepad2"},
95+
{eInputControllerType_Gamepad3, "Gamepad3"},
96+
{eInputControllerType_Gamepad4, "Gamepad4"},
97+
};
98+
6999
impl_enum_strings(eLogMessage)
70100
{
71101
{eLogMessage_Debug, "debug"},

0 commit comments

Comments
 (0)