A game about forced loneliness, made by TACStudios
1using UnityEngine.InputSystem.Layouts; 2using UnityEngine.InputSystem.LowLevel; 3using UnityEngine.InputSystem.Utilities; 4 5namespace UnityEngine.InputSystem.Controls 6{ 7 /// <summary> 8 /// A floating-point 3D vector control composed of three <see cref="AxisControl">AxisControls</see>. 9 /// </summary> 10 public class Vector3Control : InputControl<Vector3> 11 { 12 [InputControl(offset = 0, displayName = "X")] 13 public AxisControl x { get; set; } 14 [InputControl(offset = 4, displayName = "Y")] 15 public AxisControl y { get; set; } 16 [InputControl(offset = 8, displayName = "Z")] 17 public AxisControl z { get; set; } 18 19 public Vector3Control() 20 { 21 m_StateBlock.format = InputStateBlock.FormatVector3; 22 } 23 24 protected override void FinishSetup() 25 { 26 x = GetChildControl<AxisControl>("x"); 27 y = GetChildControl<AxisControl>("y"); 28 z = GetChildControl<AxisControl>("z"); 29 30 base.FinishSetup(); 31 } 32 33 public override unsafe Vector3 ReadUnprocessedValueFromState(void* statePtr) 34 { 35 switch (m_OptimizedControlDataType) 36 { 37 case InputStateBlock.kFormatVector3: 38 return *(Vector3*)((byte*)statePtr + (int)m_StateBlock.byteOffset); 39 default: 40 return new Vector3( 41 x.ReadUnprocessedValueFromStateWithCaching(statePtr), 42 y.ReadUnprocessedValueFromStateWithCaching(statePtr), 43 z.ReadUnprocessedValueFromStateWithCaching(statePtr)); 44 } 45 } 46 47 public override unsafe void WriteValueIntoState(Vector3 value, void* statePtr) 48 { 49 switch (m_OptimizedControlDataType) 50 { 51 case InputStateBlock.kFormatVector3: 52 *(Vector3*)((byte*)statePtr + (int)m_StateBlock.byteOffset) = value; 53 break; 54 default: 55 x.WriteValueIntoState(value.x, statePtr); 56 y.WriteValueIntoState(value.y, statePtr); 57 z.WriteValueIntoState(value.z, statePtr); 58 break; 59 } 60 } 61 62 public override unsafe float EvaluateMagnitude(void* statePtr) 63 { 64 ////REVIEW: this can go beyond 1; that okay? 65 return ReadValueFromStateWithCaching(statePtr).magnitude; 66 } 67 68 protected override FourCC CalculateOptimizedControlDataType() 69 { 70 if ( 71 m_StateBlock.sizeInBits == sizeof(float) * 3 * 8 && 72 m_StateBlock.bitOffset == 0 && 73 x.optimizedControlDataType == InputStateBlock.FormatFloat && 74 y.optimizedControlDataType == InputStateBlock.FormatFloat && 75 z.optimizedControlDataType == InputStateBlock.FormatFloat && 76 y.m_StateBlock.byteOffset == x.m_StateBlock.byteOffset + 4 && 77 z.m_StateBlock.byteOffset == x.m_StateBlock.byteOffset + 8 78 ) 79 return InputStateBlock.FormatVector3; 80 81 return InputStateBlock.FormatInvalid; 82 } 83 } 84}