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