説明なし
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

FastMouse.partial.cs 2.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using UnityEngine.InputSystem.LowLevel;
  2. namespace UnityEngine.InputSystem
  3. {
  4. internal partial class FastMouse : IInputStateCallbackReceiver, IEventMerger
  5. {
  6. protected new void OnNextUpdate()
  7. {
  8. // Changing these separately seems to not result in much of a difference
  9. // compared to just doing an InputState.Change with a complete MouseState.
  10. InputState.Change(delta, Vector2.zero, InputState.currentUpdateType);
  11. InputState.Change(scroll, Vector2.zero, InputState.currentUpdateType);
  12. }
  13. // For FastMouse, we know that our layout is MouseState so we can just go directly
  14. // to memory.
  15. protected new unsafe void OnStateEvent(InputEventPtr eventPtr)
  16. {
  17. if (eventPtr.type != StateEvent.Type)
  18. {
  19. base.OnStateEvent(eventPtr);
  20. return;
  21. }
  22. var stateEvent = StateEvent.FromUnchecked(eventPtr);
  23. if (stateEvent->stateFormat != MouseState.Format)
  24. {
  25. base.OnStateEvent(eventPtr);
  26. return;
  27. }
  28. var newState = *(MouseState*)stateEvent->state;
  29. var stateFromDevice = (MouseState*)((byte*)currentStatePtr + m_StateBlock.byteOffset);
  30. newState.delta += stateFromDevice->delta;
  31. newState.scroll += stateFromDevice->scroll;
  32. InputState.Change(this, ref newState, InputState.currentUpdateType, eventPtr: eventPtr);
  33. }
  34. void IInputStateCallbackReceiver.OnNextUpdate()
  35. {
  36. OnNextUpdate();
  37. }
  38. void IInputStateCallbackReceiver.OnStateEvent(InputEventPtr eventPtr)
  39. {
  40. OnStateEvent(eventPtr);
  41. }
  42. internal static unsafe bool MergeForward(InputEventPtr currentEventPtr, InputEventPtr nextEventPtr)
  43. {
  44. if (currentEventPtr.type != StateEvent.Type || nextEventPtr.type != StateEvent.Type)
  45. return false;
  46. var currentEvent = StateEvent.FromUnchecked(currentEventPtr);
  47. var nextEvent = StateEvent.FromUnchecked(nextEventPtr);
  48. if (currentEvent->stateFormat != MouseState.Format || nextEvent->stateFormat != MouseState.Format)
  49. return false;
  50. var currentState = (MouseState*)currentEvent->state;
  51. var nextState = (MouseState*)nextEvent->state;
  52. // if buttons or clickCount changed we need to process it, so don't merge events together
  53. if (currentState->buttons != nextState->buttons || currentState->clickCount != nextState->clickCount)
  54. return false;
  55. nextState->delta += currentState->delta;
  56. nextState->scroll += currentState->scroll;
  57. return true;
  58. }
  59. bool IEventMerger.MergeForward(InputEventPtr currentEventPtr, InputEventPtr nextEventPtr)
  60. {
  61. return MergeForward(currentEventPtr, nextEventPtr);
  62. }
  63. }
  64. }