using UnityEngine.InputSystem.Layouts; using UnityEngine.InputSystem.LowLevel; using UnityEngine.InputSystem.Utilities; namespace UnityEngine.InputSystem.Controls { /// /// A floating-point 2D vector control composed of two s. /// /// /// An example is . /// /// /// /// Debug.Log(string.Format("Mouse position x={0} y={1}", /// Mouse.current.position.x.ReadValue(), /// Mouse.current.position.y.ReadValue())); /// /// /// /// Normalization is not implied. The X and Y coordinates can be in any range or units. /// public class Vector2Control : InputControl { /// /// Horizontal position of the control. /// /// Control representing horizontal motion input. [InputControl(offset = 0, displayName = "X")] public AxisControl x { get; set; } /// /// Vertical position of the control. /// /// Control representing vertical motion input. [InputControl(offset = 4, displayName = "Y")] public AxisControl y { get; set; } /// /// Default-initialize the control. /// public Vector2Control() { m_StateBlock.format = InputStateBlock.FormatVector2; } /// protected override void FinishSetup() { x = GetChildControl("x"); y = GetChildControl("y"); base.FinishSetup(); } /// public override unsafe Vector2 ReadUnprocessedValueFromState(void* statePtr) { switch (m_OptimizedControlDataType) { case InputStateBlock.kFormatVector2: return *(Vector2*)((byte*)statePtr + (int)m_StateBlock.byteOffset); default: return new Vector2( x.ReadUnprocessedValueFromStateWithCaching(statePtr), y.ReadUnprocessedValueFromStateWithCaching(statePtr)); } } /// public override unsafe void WriteValueIntoState(Vector2 value, void* statePtr) { switch (m_OptimizedControlDataType) { case InputStateBlock.kFormatVector2: *(Vector2*)((byte*)statePtr + (int)m_StateBlock.byteOffset) = value; break; default: x.WriteValueIntoState(value.x, statePtr); y.WriteValueIntoState(value.y, statePtr); break; } } /// public override unsafe float EvaluateMagnitude(void* statePtr) { ////REVIEW: this can go beyond 1; that okay? return ReadValueFromStateWithCaching(statePtr).magnitude; } protected override FourCC CalculateOptimizedControlDataType() { if ( m_StateBlock.sizeInBits == sizeof(float) * 2 * 8 && m_StateBlock.bitOffset == 0 && x.optimizedControlDataType == InputStateBlock.FormatFloat && y.optimizedControlDataType == InputStateBlock.FormatFloat && y.m_StateBlock.byteOffset == x.m_StateBlock.byteOffset + 4 ) return InputStateBlock.FormatVector2; return InputStateBlock.FormatInvalid; } } }