InputTracker.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics.CodeAnalysis;
  4. using System.Numerics;
  5. using Veldrid;
  6. namespace Veldrid.Common
  7. {
  8. internal class InputTracker
  9. {
  10. private HashSet<Key> _currentlyPressedKeys = new HashSet<Key>();
  11. private HashSet<Key> _newKeysThisFrame = new HashSet<Key>();
  12. private HashSet<MouseButton> _currentlyPressedMouseButtons = new HashSet<MouseButton>();
  13. private HashSet<MouseButton> _newMouseButtonsThisFrame = new HashSet<MouseButton>();
  14. public Vector2 MousePosition;
  15. [AllowNull]
  16. public InputSnapshot FrameSnapshot { get; private set; }
  17. public bool GetKey(Key key)
  18. {
  19. return _currentlyPressedKeys.Contains(key);
  20. }
  21. public bool GetKeyDown(Key key)
  22. {
  23. return _newKeysThisFrame.Contains(key);
  24. }
  25. public bool GetMouseButton(MouseButton button)
  26. {
  27. return _currentlyPressedMouseButtons.Contains(button);
  28. }
  29. public bool GetMouseButtonDown(MouseButton button)
  30. {
  31. return _newMouseButtonsThisFrame.Contains(button);
  32. }
  33. public void UpdateFrameInput(InputSnapshot snapshot)
  34. {
  35. FrameSnapshot = snapshot;
  36. _newKeysThisFrame.Clear();
  37. _newMouseButtonsThisFrame.Clear();
  38. MousePosition = snapshot.MousePosition;
  39. for (int i = 0; i < snapshot.KeyEvents.Count; i++)
  40. {
  41. KeyEvent ke = snapshot.KeyEvents[i];
  42. if (ke.Down)
  43. {
  44. KeyDown(ke.Key);
  45. }
  46. else
  47. {
  48. KeyUp(ke.Key);
  49. }
  50. }
  51. for (int i = 0; i < snapshot.MouseEvents.Count; i++)
  52. {
  53. MouseEvent me = snapshot.MouseEvents[i];
  54. if (me.Down)
  55. {
  56. MouseDown(me.MouseButton);
  57. }
  58. else
  59. {
  60. MouseUp(me.MouseButton);
  61. }
  62. }
  63. }
  64. private void MouseUp(MouseButton mouseButton)
  65. {
  66. _currentlyPressedMouseButtons.Remove(mouseButton);
  67. _newMouseButtonsThisFrame.Remove(mouseButton);
  68. }
  69. private void MouseDown(MouseButton mouseButton)
  70. {
  71. if (_currentlyPressedMouseButtons.Add(mouseButton))
  72. {
  73. _newMouseButtonsThisFrame.Add(mouseButton);
  74. }
  75. }
  76. private void KeyUp(Key key)
  77. {
  78. _currentlyPressedKeys.Remove(key);
  79. _newKeysThisFrame.Remove(key);
  80. }
  81. private void KeyDown(Key key)
  82. {
  83. if (_currentlyPressedKeys.Add(key))
  84. {
  85. _newKeysThisFrame.Add(key);
  86. }
  87. }
  88. }
  89. }