using UnityEngine.InputSystem.Layouts; using UnityEngine.InputSystem.LowLevel; using UnityEngine.InputSystem.Utilities; namespace UnityEngine.InputSystem.Controls { /// /// A floating-point 3D vector control composed of three AxisControls. /// public class Vector3Control : InputControl { [InputControl(offset = 0, displayName = "X")] public AxisControl x { get; set; } [InputControl(offset = 4, displayName = "Y")] public AxisControl y { get; set; } [InputControl(offset = 8, displayName = "Z")] public AxisControl z { get; set; } public Vector3Control() { m_StateBlock.format = InputStateBlock.FormatVector3; } protected override void FinishSetup() { x = GetChildControl("x"); y = GetChildControl("y"); z = GetChildControl("z"); base.FinishSetup(); } public override unsafe Vector3 ReadUnprocessedValueFromState(void* statePtr) { switch (m_OptimizedControlDataType) { case InputStateBlock.kFormatVector3: return *(Vector3*)((byte*)statePtr + (int)m_StateBlock.byteOffset); default: return new Vector3( x.ReadUnprocessedValueFromStateWithCaching(statePtr), y.ReadUnprocessedValueFromStateWithCaching(statePtr), z.ReadUnprocessedValueFromStateWithCaching(statePtr)); } } public override unsafe void WriteValueIntoState(Vector3 value, void* statePtr) { switch (m_OptimizedControlDataType) { case InputStateBlock.kFormatVector3: *(Vector3*)((byte*)statePtr + (int)m_StateBlock.byteOffset) = value; break; default: x.WriteValueIntoState(value.x, statePtr); y.WriteValueIntoState(value.y, statePtr); z.WriteValueIntoState(value.z, 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) * 3 * 8 && m_StateBlock.bitOffset == 0 && x.optimizedControlDataType == InputStateBlock.FormatFloat && y.optimizedControlDataType == InputStateBlock.FormatFloat && z.optimizedControlDataType == InputStateBlock.FormatFloat && y.m_StateBlock.byteOffset == x.m_StateBlock.byteOffset + 4 && z.m_StateBlock.byteOffset == x.m_StateBlock.byteOffset + 8 ) return InputStateBlock.FormatVector3; return InputStateBlock.FormatInvalid; } } }