// In retrospect, allowing Touchscreen to do what it does the way it does it was a mistake. It came out of thinking that // we need Touchscreen to have a large pool of TouchStates from which to dynamically allocate -- as this was what the old // input system does. This made it unfeasible/unwise to put the burden of touch allocation on platform backends and thus // led to the current setup where backends are sending TouchState events which Touchscreen dynamically incorporates. // // This shouldn't have happened. // // Ultimately, this led to IInputStateCallbackReceiver in its current form. While quite flexible in what it allows you to // do, it introduces a lot of additional complication and deviation from an otherwise very simple model based on trivially // understood chunks of input state. namespace UnityEngine.InputSystem.LowLevel { /// /// Interface for devices that implement their own state update handling. /// /// /// The input system has built-in logic to automatically handle the state buffers that store input values for devices. This /// means that if an input event containing input state is processed, its data will be copied automatically into the state /// memory for the device. /// /// However, some devices need to apply custom logic whenever new input is received. An example of this is /// which needs to accumulate deltas as they are received within a frame and then reset the delta at the beginning of a new frame. /// /// Also, devices like extensively customize event handling in order to implement features such as /// tap detection and primary touch handling. This is what allows the device to receive state events in /// format even though that is not the format of the device itself (which is mainly a composite of several TouchStates). /// /// This interface allows to bypass the built-in logic and instead intercept and manually handle state updates. /// /// /// /// public interface IInputStateCallbackReceiver { /// /// A new input update begins. This means that the current state of the device is being carried over into the next /// frame. /// /// /// This is called without the front and back buffer for the device having been flipped. You can use /// to write values into the device's state (e.g. to reset a given control to its default state) which will implicitly perform /// the buffer flip. /// void OnNextUpdate(); /// /// A new state event has been received and is being processed. /// /// The state event. This will be either a or a . /// /// Use to write state updates into the device state buffers. While nothing will prevent a device /// from writing directly into the memory buffers retrieved with , doing so will bypass /// the buffer flipping logic as well as change detection from change monitors (; this will /// cause to not work with the device) and thus lead to incorrect behavior. /// /// /// void OnStateEvent(InputEventPtr eventPtr); /// /// Compute an offset that correlates with the state in . /// /// Control the state of which we want to access within . /// An input event. Must be a or /// /// False if the correlation failed or true if has been set and should be used /// as the offset for the state of . /// /// This method will only be called if the given state event has a state format different than that of the device. In that case, /// the memory of the input state captured in the given state event cannot be trivially correlated with the control. /// /// The input system calls the method to know which offset (if any) in the device's state block to consider the state /// in relative to when accessing the state for as found in /// the event. /// /// An example of when this is called is for touch events. These are normally sent in format /// which, however, is not the state format of (which uses a composite of several TouchStates). /// When trying to access the state in to, for example, read out the touch position, /// /// bool GetStateOffsetForEvent(InputControl control, InputEventPtr eventPtr, ref uint offset); } }