/// <summary> /// Updates the source information. /// </summary> /// <param name="interactionSourceState">Interaction source to use to update the source information.</param> /// <param name="sourceData">SourceData structure to update.</param> private void UpdateSourceData(InteractionSourceState interactionSourceState, SourceData sourceData) { Debug.Assert(interactionSourceState.source.id == sourceData.SourceId, "An UpdateSourceState call happened with mismatched source ID."); Debug.Assert(interactionSourceState.source.kind == sourceData.SourceKind, "An UpdateSourceState call happened with mismatched source kind."); Vector3 newPointerPosition = Vector3.zero; sourceData.PointerPosition.IsAvailable = #if UNITY_2017_2_OR_NEWER interactionSourceState.sourcePose.TryGetPosition(out newPointerPosition, InteractionSourceNode.Pointer); #else interactionSourceState.properties.location.TryGetPosition(out newPointerPosition); #endif // Using a heuristic for IsSupported, since the APIs don't yet support querying this capability directly. sourceData.PointerPosition.IsSupported |= sourceData.PointerPosition.IsAvailable; Vector3 newGripPosition = Vector3.zero; sourceData.GripPosition.IsAvailable = #if UNITY_2017_2_OR_NEWER interactionSourceState.sourcePose.TryGetPosition(out newGripPosition, InteractionSourceNode.Grip); #else false; #endif // Using a heuristic for IsSupported, since the APIs don't yet support querying this capability directly. sourceData.GripPosition.IsSupported |= sourceData.GripPosition.IsAvailable; if (CameraCache.Main.transform.parent != null) { newPointerPosition = CameraCache.Main.transform.parent.TransformPoint(newPointerPosition); newGripPosition = CameraCache.Main.transform.parent.TransformPoint(newGripPosition); } if (sourceData.PointerPosition.IsAvailable || sourceData.GripPosition.IsAvailable) { sourceData.PositionUpdated = !(sourceData.PointerPosition.CurrentReading.Equals(newPointerPosition) && sourceData.GripPosition.CurrentReading.Equals(newGripPosition)); } sourceData.PointerPosition.CurrentReading = newPointerPosition; sourceData.GripPosition.CurrentReading = newGripPosition; Quaternion newPointerRotation = Quaternion.identity; sourceData.PointerRotation.IsAvailable = #if UNITY_2017_2_OR_NEWER interactionSourceState.sourcePose.TryGetRotation(out newPointerRotation, InteractionSourceNode.Pointer); #else false; #endif // Using a heuristic for IsSupported, since the APIs don't yet support querying this capability directly. sourceData.PointerRotation.IsSupported |= sourceData.PointerRotation.IsAvailable; Quaternion newGripRotation = Quaternion.identity; sourceData.GripRotation.IsAvailable = #if UNITY_2017_2_OR_NEWER interactionSourceState.sourcePose.TryGetRotation(out newGripRotation, InteractionSourceNode.Grip); #else false; #endif // Using a heuristic for IsSupported, since the APIs don't yet support querying this capability directly. sourceData.GripRotation.IsSupported |= sourceData.GripRotation.IsAvailable; if (CameraCache.Main.transform.parent != null) { newPointerRotation.eulerAngles = CameraCache.Main.transform.parent.TransformDirection(newPointerRotation.eulerAngles); newGripRotation.eulerAngles = CameraCache.Main.transform.parent.TransformDirection(newGripRotation.eulerAngles); } if (sourceData.PointerRotation.IsAvailable || sourceData.GripRotation.IsAvailable) { sourceData.RotationUpdated = !(sourceData.PointerRotation.CurrentReading.Equals(newPointerRotation) && sourceData.GripRotation.CurrentReading.Equals(newGripRotation)); } sourceData.PointerRotation.CurrentReading = newPointerRotation; sourceData.GripRotation.CurrentReading = newGripRotation; Vector3 pointerForward = Vector3.zero; sourceData.PointingRay.IsSupported = #if UNITY_2017_2_OR_NEWER interactionSourceState.source.supportsPointing; #else false; #endif sourceData.PointingRay.IsAvailable = #if UNITY_2017_2_OR_NEWER sourceData.PointerPosition.IsAvailable&& interactionSourceState.sourcePose.TryGetForward(out pointerForward, InteractionSourceNode.Pointer); #else false; #endif if (CameraCache.Main.transform.parent != null) { pointerForward = CameraCache.Main.transform.parent.TransformDirection(pointerForward); } sourceData.PointingRay.CurrentReading = new Ray(sourceData.PointerPosition.CurrentReading, pointerForward); sourceData.Thumbstick.IsSupported = #if UNITY_2017_2_OR_NEWER interactionSourceState.source.supportsThumbstick; #else false; #endif sourceData.Thumbstick.IsAvailable = sourceData.Thumbstick.IsSupported; if (sourceData.Thumbstick.IsAvailable) { AxisButton2D newThumbstick = AxisButton2D.GetThumbstick(interactionSourceState); sourceData.ThumbstickPositionUpdated = sourceData.Thumbstick.CurrentReading.Position != newThumbstick.Position; sourceData.Thumbstick.CurrentReading = newThumbstick; } else { sourceData.Thumbstick.CurrentReading = default(AxisButton2D); } sourceData.Touchpad.IsSupported = #if UNITY_2017_2_OR_NEWER interactionSourceState.source.supportsTouchpad; #else false; #endif sourceData.Touchpad.IsAvailable = sourceData.Touchpad.IsSupported; if (sourceData.Touchpad.IsAvailable) { TouchpadData newTouchpad = TouchpadData.GetTouchpad(interactionSourceState); sourceData.TouchpadPositionUpdated = !sourceData.Touchpad.CurrentReading.AxisButton.Position.Equals(newTouchpad.AxisButton.Position); sourceData.TouchpadTouchedUpdated = !sourceData.Touchpad.CurrentReading.Touched.Equals(newTouchpad.Touched); sourceData.Touchpad.CurrentReading = newTouchpad; } else { sourceData.Touchpad.CurrentReading = default(TouchpadData); } sourceData.Select.IsSupported = true; // All input mechanisms support "select". sourceData.Select.IsAvailable = sourceData.Select.IsSupported; AxisButton1D newSelect = AxisButton1D.GetSelect(interactionSourceState); sourceData.SelectPressedAmountUpdated = !sourceData.Select.CurrentReading.PressedAmount.Equals(newSelect.PressedAmount); sourceData.Select.CurrentReading = newSelect; sourceData.Grasp.IsSupported = #if UNITY_2017_2_OR_NEWER interactionSourceState.source.supportsGrasp; #else false; #endif sourceData.Grasp.IsAvailable = sourceData.Grasp.IsSupported; sourceData.Grasp.CurrentReading = #if UNITY_2017_2_OR_NEWER (sourceData.Grasp.IsAvailable && interactionSourceState.grasped); #else false; #endif sourceData.Menu.IsSupported = #if UNITY_2017_2_OR_NEWER interactionSourceState.source.supportsMenu; #else false; #endif sourceData.Menu.IsAvailable = sourceData.Menu.IsSupported; sourceData.Menu.CurrentReading = #if UNITY_2017_2_OR_NEWER (sourceData.Menu.IsAvailable && interactionSourceState.menuPressed); #else false; #endif }
/// <summary> /// Updates the source information. /// </summary> /// <param name="interactionSourceState">Interaction source to use to update the source information.</param> /// <param name="sourceData">SourceData structure to update.</param> private void UpdateSourceData(InteractionSourceState interactionSourceState, SourceData sourceData) { Debug.Assert(interactionSourceState.source.id == sourceData.SourceId, "An UpdateSourceState call happened with mismatched source ID."); Debug.Assert(interactionSourceState.source.kind == sourceData.SourceKind, "An UpdateSourceState call happened with mismatched source kind."); Vector3 newPointerPosition; sourceData.PointerPosition.IsAvailable = interactionSourceState.sourcePose.TryGetPosition(out newPointerPosition, InteractionSourceNode.Pointer); // Using a heuristic for IsSupported, since the APIs don't yet support querying this capability directly. sourceData.PointerPosition.IsSupported |= sourceData.PointerPosition.IsAvailable; Vector3 newGripPosition; sourceData.GripPosition.IsAvailable = interactionSourceState.sourcePose.TryGetPosition(out newGripPosition, InteractionSourceNode.Grip); // Using a heuristic for IsSupported, since the APIs don't yet support querying this capability directly. sourceData.GripPosition.IsSupported |= sourceData.GripPosition.IsAvailable; if (sourceData.PointerPosition.IsAvailable || sourceData.GripPosition.IsAvailable) { sourceData.PositionUpdated = !(sourceData.PointerPosition.CurrentReading.Equals(newPointerPosition) && sourceData.GripPosition.CurrentReading.Equals(newGripPosition)); } sourceData.PointerPosition.CurrentReading = newPointerPosition; sourceData.GripPosition.CurrentReading = newGripPosition; Quaternion newPointerRotation; sourceData.PointerRotation.IsAvailable = interactionSourceState.sourcePose.TryGetRotation(out newPointerRotation, InteractionSourceNode.Pointer); // Using a heuristic for IsSupported, since the APIs don't yet support querying this capability directly. sourceData.PointerRotation.IsSupported |= sourceData.PointerRotation.IsAvailable; Quaternion newGripRotation; sourceData.GripRotation.IsAvailable = interactionSourceState.sourcePose.TryGetRotation(out newGripRotation, InteractionSourceNode.Grip); // Using a heuristic for IsSupported, since the APIs don't yet support querying this capability directly. sourceData.GripRotation.IsSupported |= sourceData.GripRotation.IsAvailable; if (sourceData.PointerRotation.IsAvailable || sourceData.GripRotation.IsAvailable) { sourceData.RotationUpdated = !(sourceData.PointerRotation.CurrentReading.Equals(newPointerRotation) && sourceData.GripRotation.CurrentReading.Equals(newGripRotation)); } sourceData.PointerRotation.CurrentReading = newPointerRotation; sourceData.GripRotation.CurrentReading = newGripRotation; Vector3 pointerForward = Vector3.zero; sourceData.PointingRay.IsSupported = interactionSourceState.source.supportsPointing; sourceData.PointingRay.IsAvailable = sourceData.PointerPosition.IsAvailable && interactionSourceState.sourcePose.TryGetForward(out pointerForward, InteractionSourceNode.Pointer); sourceData.PointingRay.CurrentReading = new Ray(sourceData.PointerPosition.CurrentReading, pointerForward); sourceData.Thumbstick.IsSupported = interactionSourceState.source.supportsThumbstick; sourceData.Thumbstick.IsAvailable = sourceData.Thumbstick.IsSupported; if (sourceData.Thumbstick.IsAvailable) { AxisButton2D newThumbstick = AxisButton2D.GetThumbstick(interactionSourceState); sourceData.ThumbstickPositionUpdated = sourceData.Thumbstick.CurrentReading.Position != newThumbstick.Position; sourceData.Thumbstick.CurrentReading = newThumbstick; } else { sourceData.Thumbstick.CurrentReading = default(AxisButton2D); } sourceData.Touchpad.IsSupported = interactionSourceState.source.supportsTouchpad; sourceData.Touchpad.IsAvailable = sourceData.Touchpad.IsSupported; if (sourceData.Touchpad.IsAvailable) { TouchpadData newTouchpad = TouchpadData.GetTouchpad(interactionSourceState); sourceData.TouchpadPositionUpdated = !sourceData.Touchpad.CurrentReading.AxisButton.Position.Equals(newTouchpad.AxisButton.Position); sourceData.TouchpadTouchedUpdated = !sourceData.Touchpad.CurrentReading.Touched.Equals(newTouchpad.Touched); sourceData.Touchpad.CurrentReading = newTouchpad; } else { sourceData.Touchpad.CurrentReading = default(TouchpadData); } sourceData.Select.IsSupported = true; // All input mechanisms support "select". sourceData.Select.IsAvailable = sourceData.Select.IsSupported; AxisButton1D newSelect = AxisButton1D.GetSelect(interactionSourceState); sourceData.SelectPressedAmountUpdated = !sourceData.Select.CurrentReading.PressedAmount.Equals(newSelect.PressedAmount); sourceData.Select.CurrentReading = newSelect; sourceData.Grasp.IsSupported = interactionSourceState.source.supportsGrasp; sourceData.Grasp.IsAvailable = sourceData.Grasp.IsSupported; sourceData.Grasp.CurrentReading = (sourceData.Grasp.IsAvailable && interactionSourceState.grasped); sourceData.Menu.IsSupported = interactionSourceState.source.supportsMenu; sourceData.Menu.IsAvailable = sourceData.Menu.IsSupported; sourceData.Menu.CurrentReading = (sourceData.Menu.IsAvailable && interactionSourceState.menuPressed); }