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}