Polyphase Game Engine
Loading...
Searching...
No Matches
PlayerInputSystem.h
Go to the documentation of this file.
1#pragma once
2
3#include "InputTypes.h"
4
5#include <string>
6#include <vector>
7#include <unordered_map>
8#include <stdint.h>
9
10enum class InputSourceType : uint8_t
11{
17};
18
19enum class InputDeviceKind : uint8_t
20{
22 Mouse,
23 Gamepad,
24
25 Count
26};
27
29{
31 int32_t gamepadIndex = -1; // valid only when kind == Gamepad
32 GamepadType gamepadType = GamepadType::Standard; // valid only when kind == Gamepad
33};
34
35enum class AxisDirection : uint8_t
36{
39 Full
40};
41
42enum class TriggerMode : uint8_t
43{
45 Hold,
48};
49
61
69
71{
72 bool isActive = false;
73 bool wasJustActivated = false;
74 bool wasJustDeactivated = false;
75 float value = 0.0f;
76
77 // Internal tracking
78 bool rawDown = false;
79 bool prevRawDown = false;
80 float holdTimer = 0.0f;
81 bool holdTriggered = false;
82 int32_t pressCount = 0;
83 float multiPressTimer = 0.0f;
84};
85
87{
88 std::string name;
89 std::string category;
90 std::vector<InputActionBinding> bindings;
93};
94
96{
97public:
98
99 static void Create();
100 static void Destroy();
101 static PlayerInputSystem* Get();
102
103 void Update(float deltaTime);
104
105 // Registration
106 void RegisterAction(const std::string& category, const std::string& name,
108 void UnregisterAction(const std::string& category, const std::string& name);
109 void AddBinding(const std::string& category, const std::string& name,
110 const InputActionBinding& binding);
111 void ClearBindings(const std::string& category, const std::string& name);
112 void SetTrigger(const std::string& category, const std::string& name,
113 const InputActionTrigger& trigger);
114
115 // Queries (playerIndex: -1 = any, 0-3 = specific gamepad/pointer)
116 bool IsActionActive(const std::string& category, const std::string& name, int32_t playerIndex = -1) const;
117 bool WasActionJustActivated(const std::string& category, const std::string& name, int32_t playerIndex = -1) const;
118 bool WasActionJustDeactivated(const std::string& category, const std::string& name, int32_t playerIndex = -1) const;
119 float GetActionValue(const std::string& category, const std::string& name, int32_t playerIndex = -1) const;
120
121 // Connected players
122 int32_t GetPlayersConnected() const;
123
124 // Bulk access (for editor/debugger)
125 const std::vector<InputAction>& GetActions() const;
126 InputAction* FindAction(const std::string& category, const std::string& name);
127 const InputAction* FindAction(const std::string& category, const std::string& name) const;
128
129 // Serialization
130 void SaveProjectActions();
131 void LoadProjectActions();
132
133 // Replace the in-memory action set wholesale (used by the editor when
134 // opening a specific InputActionsAsset). Rebuilds the lookup table.
135 void SetActions(const std::vector<InputAction>& actions);
136
137 // Enable/disable
138 void SetEnabled(bool enabled);
139 bool IsEnabled() const;
140
141 // Last-active input device. Updated each Update() based on edge-triggered
142 // input. Consumers (e.g. InputPromptResolver) compare GetDeviceChangeFrame()
143 // against a cached epoch to know when to re-resolve.
144 //
145 // If a forced device is set via SetForcedDevice(), GetLastActiveDevice
146 // returns the forced descriptor instead of the auto-detected one. The
147 // change-frame counter bumps whenever the forced device is set, changed,
148 // or cleared, so InputPromptResolver flushes its cache and every widget
149 // immediately reflects the override.
151 uint32_t GetDeviceChangeFrame() const;
152
153 // Editor-only force-device override. Used by the InputPromptMapInspector's
154 // Test Device combobox so an artist can preview "what does the Gamepad.A
155 // prompt look like on DualSense?" without unplugging real controllers.
156 // Pass nullptr (or call ClearForcedDevice) to resume real auto-detection.
157 void SetForcedDevice(const InputDeviceDescriptor& device);
158 void ClearForcedDevice();
159 bool HasForcedDevice() const;
160
161 // Editor capture modal mute gate. While disabled, Update() still tracks the
162 // last-active device and clears per-frame edge flags, but action evaluation
163 // is skipped so a captured key doesn't also fire a registered game action.
164 void SetActionEvaluationEnabled(bool enabled);
165 bool AreInputActionsActive() const;
166
167private:
168
169 static PlayerInputSystem* sInstance;
170
172
173 bool PollBindingDown(const InputActionBinding& binding, int32_t playerIndex = -1) const;
174 float PollBindingValue(const InputActionBinding& binding, int32_t playerIndex = -1) const;
175 bool PollActionRawDown(const InputAction& action, int32_t playerIndex = -1) const;
176 float PollActionRawValue(const InputAction& action, int32_t playerIndex = -1) const;
177 bool CheckModifiers(const InputActionBinding& binding) const;
178 void EvaluateTrigger(InputAction& action, float deltaTime);
179
180 std::string MakeKey(const std::string& category, const std::string& name) const;
181 bool LoadFromJsonFile(const std::string& filePath);
182 void RebuildLookup();
183
184 void UpdateLastActiveDevice();
185
186 std::vector<InputAction> mActions;
187 std::unordered_map<std::string, size_t> mActionLookup;
188 bool mEnabled = true;
189 bool mActionEvaluationEnabled = true;
190
191 InputDeviceDescriptor mLastActiveDevice;
192 uint32_t mDeviceChangeFrame = 0;
193 uint32_t mFrameCounter = 0;
194
195 InputDeviceDescriptor mForcedDevice;
196 bool mHasForcedDevice = false;
197};
bool Update()
Definition Engine.cpp:790
GamepadType
Definition InputTypes.h:27
InputDeviceKind
Definition PlayerInputSystem.h:20
AxisDirection
Definition PlayerInputSystem.h:36
InputSourceType
Definition PlayerInputSystem.h:11
TriggerMode
Definition PlayerInputSystem.h:43
Definition PlayerInputSystem.h:96
void SetEnabled(bool enabled)
Definition PlayerInputSystem.cpp:701
void SetActions(const std::vector< InputAction > &actions)
Definition PlayerInputSystem.cpp:806
void RegisterAction(const std::string &category, const std::string &name, TriggerMode mode=TriggerMode::SinglePress)
Definition PlayerInputSystem.cpp:552
void ClearForcedDevice()
Definition PlayerInputSystem.cpp:475
bool AreInputActionsActive() const
Definition PlayerInputSystem.cpp:494
void SetForcedDevice(const InputDeviceDescriptor &device)
Definition PlayerInputSystem.cpp:460
void SetTrigger(const std::string &category, const std::string &name, const InputActionTrigger &trigger)
Definition PlayerInputSystem.cpp:601
void UnregisterAction(const std::string &category, const std::string &name)
Definition PlayerInputSystem.cpp:570
void AddBinding(const std::string &category, const std::string &name, const InputActionBinding &binding)
Definition PlayerInputSystem.cpp:582
bool HasForcedDevice() const
Definition PlayerInputSystem.cpp:484
const InputDeviceDescriptor & GetLastActiveDevice() const
Definition PlayerInputSystem.cpp:450
void LoadProjectActions()
Definition PlayerInputSystem.cpp:837
bool WasActionJustActivated(const std::string &category, const std::string &name, int32_t playerIndex=-1) const
Definition PlayerInputSystem.cpp:625
int32_t GetPlayersConnected() const
Definition PlayerInputSystem.cpp:663
bool IsActionActive(const std::string &category, const std::string &name, int32_t playerIndex=-1) const
Definition PlayerInputSystem.cpp:613
bool IsEnabled() const
Definition PlayerInputSystem.cpp:702
void SaveProjectActions()
Definition PlayerInputSystem.cpp:812
void ClearBindings(const std::string &category, const std::string &name)
Definition PlayerInputSystem.cpp:592
bool WasActionJustDeactivated(const std::string &category, const std::string &name, int32_t playerIndex=-1) const
Definition PlayerInputSystem.cpp:641
uint32_t GetDeviceChangeFrame() const
Definition PlayerInputSystem.cpp:455
InputAction * FindAction(const std::string &category, const std::string &name)
Definition PlayerInputSystem.cpp:681
const std::vector< InputAction > & GetActions() const
Definition PlayerInputSystem.cpp:676
float GetActionValue(const std::string &category, const std::string &name, int32_t playerIndex=-1) const
Definition PlayerInputSystem.cpp:652
void SetActionEvaluationEnabled(bool enabled)
Definition PlayerInputSystem.cpp:489
static void Create()
Definition PlayerInputSystem.cpp:23
static void Destroy()
Definition PlayerInputSystem.cpp:29
static PlayerInputSystem * Get()
Definition PlayerInputSystem.cpp:38
Definition PlayerInputSystem.h:51
AxisDirection axisDirection
Definition PlayerInputSystem.h:54
InputSourceType sourceType
Definition PlayerInputSystem.h:52
float axisThreshold
Definition PlayerInputSystem.h:55
bool requireCtrl
Definition PlayerInputSystem.h:57
bool requireAlt
Definition PlayerInputSystem.h:59
bool requireShift
Definition PlayerInputSystem.h:58
int32_t code
Definition PlayerInputSystem.h:53
int32_t gamepadIndex
Definition PlayerInputSystem.h:56
Definition PlayerInputSystem.h:71
bool isActive
Definition PlayerInputSystem.h:72
int32_t pressCount
Definition PlayerInputSystem.h:82
bool holdTriggered
Definition PlayerInputSystem.h:81
float holdTimer
Definition PlayerInputSystem.h:80
bool wasJustActivated
Definition PlayerInputSystem.h:73
bool wasJustDeactivated
Definition PlayerInputSystem.h:74
float value
Definition PlayerInputSystem.h:75
float multiPressTimer
Definition PlayerInputSystem.h:83
bool prevRawDown
Definition PlayerInputSystem.h:79
bool rawDown
Definition PlayerInputSystem.h:78
Definition PlayerInputSystem.h:63
float multiPressWindow
Definition PlayerInputSystem.h:67
TriggerMode mode
Definition PlayerInputSystem.h:64
int32_t multiPressCount
Definition PlayerInputSystem.h:66
float holdDuration
Definition PlayerInputSystem.h:65
Definition PlayerInputSystem.h:87
std::vector< InputActionBinding > bindings
Definition PlayerInputSystem.h:90
InputActionState state
Definition PlayerInputSystem.h:92
InputActionTrigger trigger
Definition PlayerInputSystem.h:91
std::string name
Definition PlayerInputSystem.h:88
std::string category
Definition PlayerInputSystem.h:89
Definition PlayerInputSystem.h:29
GamepadType gamepadType
Definition PlayerInputSystem.h:32
InputDeviceKind kind
Definition PlayerInputSystem.h:30
int32_t gamepadIndex
Definition PlayerInputSystem.h:31