/// <summary> /// Update the controller data from the provided platform state /// </summary> /// <param name="interactionSourceState">The InteractionSourceState retrieved from the platform</param> public void UpdateController(OVRInput.Controller ovrController, Transform trackingRoot) { if (!Enabled || trackingRoot == null) { return; } IsPositionAvailable = OVRInput.GetControllerPositionValid(ovrController); IsRotationAvailable = OVRInput.GetControllerOrientationValid(ovrController); // Update transform Vector3 localPosition = OVRInput.GetLocalControllerPosition(ovrController); Vector3 worldPosition = trackingRoot.TransformPoint(localPosition); // Debug.Log("Controller " + Handedness + " - local: " + localPosition + " - world: " + worldPosition); Quaternion localRotation = OVRInput.GetLocalControllerRotation(ovrController); Quaternion worldRotation = trackingRoot.rotation * localRotation; // Update velocity Vector3 localVelocity = OVRInput.GetLocalControllerVelocity(ovrController); Velocity = trackingRoot.TransformDirection(localVelocity); Vector3 localAngularVelocity = OVRInput.GetLocalControllerAngularVelocity(ovrController); AngularVelocity = trackingRoot.TransformDirection(localAngularVelocity); UpdateJointPoses(); // If not rendering avatar hands, pointer pose is not available, so we approximate it if (IsPositionAvailable) { currentPointerPose.Position = currentGripPose.Position = worldPosition; } if (IsRotationAvailable) { currentPointerPose.Rotation = currentGripPose.Rotation = worldRotation; } // Todo: Complete touch controller mapping bool isTriggerPressed; float triggerValue; bool isGripPressed; float gripValue; Vector2 stickInput; if (ControllerHandedness == Handedness.Left) { triggerValue = OVRInput.Get(OVRInput.RawAxis1D.LIndexTrigger); isTriggerPressed = triggerValue > cTriggerDeadZone; gripValue = OVRInput.Get(OVRInput.RawAxis1D.LHandTrigger); isGripPressed = gripValue > cTriggerDeadZone; stickInput = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick); } else { triggerValue = OVRInput.Get(OVRInput.RawAxis1D.RIndexTrigger); isTriggerPressed = triggerValue > cTriggerDeadZone; gripValue = OVRInput.Get(OVRInput.RawAxis1D.RHandTrigger); isGripPressed = gripValue > cTriggerDeadZone; stickInput = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick); } UpdateHandPinchStrength(Mathf.Max(triggerValue, gripValue)); bool isSelecting = isTriggerPressed || isGripPressed; UpdateTeleport(stickInput); for (int i = 0; i < Interactions?.Length; i++) { switch (Interactions[i].InputType) { case DeviceInputType.SpatialPointer: Interactions[i].PoseData = currentPointerPose; if (Interactions[i].Changed) { CoreServices.InputSystem?.RaisePoseInputChanged(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction, currentPointerPose); } break; case DeviceInputType.SpatialGrip: Interactions[i].PoseData = currentGripPose; if (Interactions[i].Changed) { CoreServices.InputSystem?.RaisePoseInputChanged(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction, currentGripPose); } break; case DeviceInputType.Select: Interactions[i].BoolData = isSelecting; if (Interactions[i].Changed) { if (Interactions[i].BoolData) { CoreServices.InputSystem?.RaiseOnInputDown(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction); } else { CoreServices.InputSystem?.RaiseOnInputUp(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction); } } break; case DeviceInputType.TriggerPress: Interactions[i].BoolData = isSelecting; if (Interactions[i].Changed) { if (Interactions[i].BoolData) { CoreServices.InputSystem?.RaiseOnInputDown(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction); } else { CoreServices.InputSystem?.RaiseOnInputUp(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction); } } break; case DeviceInputType.IndexFinger: UpdateIndexFingerData(Interactions[i]); break; } } }
/// <summary> /// Update the controller data from the provided platform state /// </summary> /// <param name="interactionSourceState">The InteractionSourceState retrieved from the platform</param> public void UpdateController(OVRCameraRig ovrRigRoot, OVRInput.Controller ovrController) { if (!Enabled || ovrRigRoot == null) { return; } IsPositionAvailable = OVRInput.GetControllerPositionValid(ovrController); IsRotationAvailable = OVRInput.GetControllerOrientationValid(ovrController); Transform playSpaceTransform = ovrRigRoot.transform; // Update transform Vector3 localPosition = OVRInput.GetLocalControllerPosition(ovrController); Vector3 worldPosition = playSpaceTransform.TransformPoint(localPosition); // Debug.Log("Controller " + Handedness + " - local: " + localPosition + " - world: " + worldPosition); Quaternion localRotation = OVRInput.GetLocalControllerRotation(ovrController); Quaternion worldRotation = playSpaceTransform.rotation * localRotation; // Update velocity Vector3 localVelocity = OVRInput.GetLocalControllerVelocity(ovrController); Velocity = playSpaceTransform.TransformDirection(localVelocity); Vector3 localAngularVelocity = OVRInput.GetLocalControllerAngularVelocity(ovrController); AngularVelocity = playSpaceTransform.TransformDirection(localAngularVelocity); if (IsPositionAvailable) { currentPointerPose.Position = currentGripPose.Position = worldPosition; } if (IsRotationAvailable) { currentPointerPose.Rotation = currentGripPose.Rotation = worldRotation; } // Todo: Complete touch controller mapping bool isTriggerPressed = false; if (ControllerHandedness == Handedness.Left) { isTriggerPressed = OVRInput.Get(OVRInput.Axis1D.PrimaryIndexTrigger) > cTriggerDeadZone; } else { isTriggerPressed = OVRInput.Get(OVRInput.Axis1D.SecondaryIndexTrigger) > cTriggerDeadZone; } UpdateJointPoses(); for (int i = 0; i < Interactions?.Length; i++) { switch (Interactions[i].InputType) { case DeviceInputType.SpatialPointer: Interactions[i].PoseData = currentPointerPose; if (Interactions[i].Changed) { CoreServices.InputSystem?.RaisePoseInputChanged(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction, currentPointerPose); } break; case DeviceInputType.SpatialGrip: Interactions[i].PoseData = currentGripPose; if (Interactions[i].Changed) { CoreServices.InputSystem?.RaisePoseInputChanged(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction, currentGripPose); } break; case DeviceInputType.Select: Interactions[i].BoolData = isTriggerPressed; if (Interactions[i].Changed) { if (Interactions[i].BoolData) { CoreServices.InputSystem?.RaiseOnInputDown(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction); } else { CoreServices.InputSystem?.RaiseOnInputUp(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction); } } break; case DeviceInputType.TriggerPress: Interactions[i].BoolData = isTriggerPressed; if (Interactions[i].Changed) { if (Interactions[i].BoolData) { CoreServices.InputSystem?.RaiseOnInputDown(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction); } else { CoreServices.InputSystem?.RaiseOnInputUp(InputSource, ControllerHandedness, Interactions[i].MixedRealityInputAction); } } break; case DeviceInputType.IndexFinger: UpdateIndexFingerData(Interactions[i]); break; } } }