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}