ezEngine  Milestone 7
InputManager.h
1 #pragma once
2 
3 #include <Core/Input/InputDevice.h>
4 #include <Foundation/Containers/Map.h>
5 #include <Foundation/Containers/DynamicArray.h>
6 #include <Foundation/Communication/Event.h>
7 
9 struct EZ_CORE_DLL ezInputActionConfig
10 {
12  enum { MaxInputSlotAlternatives = 3 };
13 
15 
31 
33  ezString m_sInputSlotTrigger[MaxInputSlotAlternatives];
34 
36  float m_fInputSlotScale[MaxInputSlotAlternatives];
37 
39  ezString m_sFilterByInputSlotX[MaxInputSlotAlternatives];
40 
42  ezString m_sFilterByInputSlotY[MaxInputSlotAlternatives];
43 
48 
50 
53  {
56  };
57 
60  {
63  };
64 
67 };
68 
69 
80 class EZ_CORE_DLL ezInputManager
81 {
82 public:
83 
88  static void Update(ezTime tTimeDifference); // [tested]
89 
91  static void SetInputSlotDisplayName(const char* szInputSlot, const char* szDefaultDisplayName); // [tested]
92 
94  static const char* GetInputSlotDisplayName(const char* szInputSlot); // [tested]
95 
97  static void SetInputSlotDeadZone(const char* szInputSlot, float fDeadZone); // [tested]
98 
100  static float GetInputSlotDeadZone(const char* szInputSlot); // [tested]
101 
103  static ezBitflags<ezInputSlotFlags> GetInputSlotFlags(const char* szInputSlot); // [tested]
104 
109  static ezKeyState::Enum GetInputSlotState(const char* szInputSlot, float* pValue = nullptr); // [tested]
110 
112  static void RetrieveAllKnownInputSlots(ezDynamicArray<const char*>& out_InputSlots);
113 
118  static ezUInt32 RetrieveLastCharacter(bool bResetCurrent = true); // [tested]
119 
128  static void PollHardware();
129 
133  static void ClearInputMapping(const char* szInputSet, const char* szInputSlot); // [tested]
134 
160  static void SetInputActionConfig(const char* szInputSet, const char* szAction, const ezInputActionConfig& Config, bool bClearPreviousInputMappings); // [tested]
161 
163  static ezInputActionConfig GetInputActionConfig(const char* szInputSet, const char* szAction); // [tested]
164 
168  static void RemoveInputAction(const char* szInputSet, const char* szAction); // [tested]
169 
174  static ezKeyState::Enum GetInputActionState(const char* szInputSet, const char* szAction, float* pValue = nullptr, ezInt8* iTriggeredSlot = nullptr); // [tested]
175 
177  static void SetActionDisplayName(const char* szAction, const char* szDisplayName); // [tested]
178 
180  static const char* GetActionDisplayName(const char* szAction); // [tested]
181 
183  static void GetAllInputSets(ezDynamicArray<ezString>& out_InputSetNames); // [tested]
184 
186  static void GetAllInputActions(const char* szInputSetName, ezDynamicArray<ezString>& out_InputActions); // [tested]
187 
197  static void InjectInputSlotValue(const char* szInputSlot, float fValue); // [tested]
198 
202  static const char* GetPressedInputSlot(ezInputSlotFlags::Enum MustHaveFlags, ezInputSlotFlags::Enum MustNotHaveFlags); // [tested]
203 
205  static const char* ConvertScanCodeToEngineName(ezUInt8 uiScanCode, bool bIsExtendedKey);
206 
209  {
211  {
214  };
215 
216  EventType m_EventType;
217  const char* m_szInputSlot;
218  const char* m_szInputSet;
219  const char* m_szInputAction;
220 
222  {
223  m_szInputSlot = nullptr;
224  m_szInputSet = nullptr;
225  m_szInputAction = nullptr;
226  }
227  };
228 
229  typedef ezEvent<const InputEventData&> ezEventInput;
230 
232  static void AddEventHandler(ezEventInput::Handler handler) { s_InputEvents.AddEventHandler (handler); }
233 
235  static void RemoveEventHandler(ezEventInput::Handler handler) { s_InputEvents.RemoveEventHandler (handler); }
236 
237 private:
238  friend class ezInputDevice;
239 
244  static void RegisterInputSlot(const char* szName, const char* szDefaultDisplayName, ezBitflags<ezInputSlotFlags> SlotFlags);
245 
246 
247 private:
248 
250  struct ezInputSlot
251  {
252  ezInputSlot();
253 
255  float m_fValue;
257  float m_fDeadZone;
259  };
260 
263  {
264  ezActionData();
265 
267 
268  float m_fValue;
270 
271  ezInt8 m_iTriggeredViaAlternative;
272  };
273 
277 
280  {
284  ezMap<ezString, float> s_InjectedInputSlots;
285  };
286 
288  static ezUInt32 s_LastCharacter;
289 
290  static bool s_bInputSlotResetRequired;
291 
293  static void ResetInputSlotValues();
294 
296  static void GatherDeviceInputSlotValues();
297 
299  static void UpdateInputSlotStates();
300 
302  static void UpdateInputActions(ezTime tTimeDifference);
303 
305  static void UpdateInputActions(const char* szInputSet, ezActionMap& Actions, ezTime tTimeDifference);
306 
310  static ezActionMap::Iterator GetBestAction(ezActionMap& Actions, const ezString& sSlot, const ezActionMap::Iterator& itFirst);
311 
312 private:
313  EZ_MAKE_SUBSYSTEM_STARTUP_FRIEND(Core, InputManager);
314 
315  static void DeallocateInternals();
316  static InternalData& GetInternals();
317 
318  static ezEventInput s_InputEvents;
319 
320  static InternalData* s_pData;
321 };
322 
323 
324