private void RaiseTeleportInput(Vector2 teleportInput, MixedRealityInputAction teleportAction, bool isReadyForTeleport) { switch (MRTKOculusConfig.Instance.ActiveTeleportPointerMode) { case MRTKOculusConfig.TeleportPointerMode.Custom: if (TeleportPointer == null) { return; } TeleportPointer.gameObject.SetActive(IsPositionAvailable); TeleportPointer.transform.position = currentPointerPose.Position; TeleportPointer.transform.rotation = currentPointerPose.Rotation; TeleportPointer.UpdatePointer(isReadyForTeleport, teleportInput); break; case MRTKOculusConfig.TeleportPointerMode.Official: if (teleportAction.Equals(MixedRealityInputAction.None)) { return; } CoreServices.InputSystem?.RaisePositionInputChanged(InputSource, ControllerHandedness, teleportAction, teleportInput); break; default: return; } }
public IEnumerator TestTeleportStrafe() { var iss = PlayModeTestUtilities.GetInputSimulationService(); // Create a floor and make sure it's below the camera var floor = GameObject.CreatePrimitive(PrimitiveType.Cube); floor.transform.position = -0.5f * Vector3.up; // Bring out the right hand and set it to the teleport gesture TestUtilities.PlayspaceToOriginLookingForward(); Vector3 initialPosition = MixedRealityPlayspace.Position; TestHand rightHand = new TestHand(Handedness.Right); // Make sure the hand is in front of the camera yield return(rightHand.Show(Vector3.forward * 0.6f)); rightHand.SetRotation(Quaternion.identity); TeleportPointer teleportPointer = rightHand.GetPointer <TeleportPointer>(); teleportPointer.PerformStrafe(); TestUtilities.AssertAboutEqual(MixedRealityPlayspace.Position, initialPosition - Vector3.forward * teleportPointer.strafeAmount, "Did not strafe to the expected position"); teleportPointer.checkForFloorOnStrafe = true; teleportPointer.adjustHeightOnStrafe = true; teleportPointer.strafeAmount = 1.0f; teleportPointer.maxHeightChangeOnStrafe = 0.5f; TestUtilities.PlayspaceToOriginLookingForward(); teleportPointer.PerformStrafe(); TestUtilities.AssertAboutEqual(MixedRealityPlayspace.Position, initialPosition, "Performed an invalid strafe"); var floor2 = GameObject.CreatePrimitive(PrimitiveType.Cube); floor2.transform.position = new Vector3(0, -0.25f, -1.0f); yield return(PlayModeTestUtilities.WaitForInputSystemUpdate()); TestUtilities.PlayspaceToOriginLookingForward(); teleportPointer.PerformStrafe(); TestUtilities.AssertAboutEqual(MixedRealityPlayspace.Position, initialPosition + new Vector3(0, 0.25f, -teleportPointer.strafeAmount), "Height did not change on strafe"); floor2.transform.position = new Vector3(0, -0.75f, -1.0f); yield return(PlayModeTestUtilities.WaitForInputSystemUpdate()); TestUtilities.PlayspaceToOriginLookingForward(); teleportPointer.PerformStrafe(); TestUtilities.AssertAboutEqual(MixedRealityPlayspace.Position, initialPosition + new Vector3(0, -0.25f, -teleportPointer.strafeAmount), "Height did not change on strafe"); }
public IEnumerator TestTeleportLayers() { var iss = PlayModeTestUtilities.GetInputSimulationService(); // Create a floor and make sure it's below the camera var floor = GameObject.CreatePrimitive(PrimitiveType.Plane); floor.transform.position = -0.5f * Vector3.up; // Bring out the right hand and set it to the teleport gesture TestUtilities.PlayspaceToOriginLookingForward(); float initialForwardPosition = MixedRealityPlayspace.Position.z; TestHand rightHand = new TestHand(Handedness.Right); // Make sure the hand is in front of the camera yield return(rightHand.Show(Vector3.forward * 0.6f)); rightHand.SetRotation(Quaternion.identity); yield return(rightHand.SetGesture(ArticulatedHandPose.GestureId.TeleportStart)); // Wait for the hand to animate yield return(PlayModeTestUtilities.WaitForInputSystemUpdate()); yield return(new WaitForSeconds(1.0f / iss.InputSimulationProfile.HandGestureAnimationSpeed + 0.1f)); TeleportPointer teleportPointer = rightHand.GetPointer <TeleportPointer>(); teleportPointer.PrioritizedLayerMasksOverride = new LayerMask[1] { UnityEngine.Physics.AllLayers ^ (1 << LayerMask.NameToLayer("UI")) }; floor.layer = LayerMask.NameToLayer("Default"); yield return(PlayModeTestUtilities.WaitForInputSystemUpdate()); Assert.AreEqual(Physics.TeleportSurfaceResult.Valid, teleportPointer.TeleportSurfaceResult); floor.layer = LayerMask.NameToLayer("Ignore Raycast"); yield return(PlayModeTestUtilities.WaitForInputSystemUpdate()); Assert.AreEqual(Physics.TeleportSurfaceResult.Invalid, teleportPointer.TeleportSurfaceResult); floor.layer = LayerMask.NameToLayer("UI"); yield return(PlayModeTestUtilities.WaitForInputSystemUpdate()); Assert.AreEqual(Physics.TeleportSurfaceResult.None, teleportPointer.TeleportSurfaceResult); }
private void UpdateCustomTeleportPointer(Vector3 worldPosition, Quaternion worldRotation) { if (TeleportPointer == null) { return; } // Check if we're focus locked or near something interactive to avoid teleporting unintentionally. bool anyPointersLockedWithHand = false; for (int i = 0; i < InputSource?.Pointers?.Length; i++) { if (InputSource.Pointers[i] == null) { continue; } if (InputSource.Pointers[i] is IMixedRealityNearPointer) { var nearPointer = (IMixedRealityNearPointer)InputSource.Pointers[i]; anyPointersLockedWithHand |= nearPointer.IsNearObject; } anyPointersLockedWithHand |= InputSource.Pointers[i].IsFocusLocked; } // We close middle finger to signal spider-man gesture, and as being ready for teleport bool isReadyForTeleport = !anyPointersLockedWithHand && IsPositionAvailable && !IsInPointingPose && isMiddleGrabbing; Vector2 stickInput = isReadyForTeleport ? Vector2.up : Vector2.zero; TeleportPointer.gameObject.SetActive(isReadyForTeleport); TeleportPointer.transform.position = worldPosition; TeleportPointer.transform.rotation = worldRotation; TeleportPointer.UpdatePointer(isReadyForTeleport, isIndexGrabbing ? Vector2.zero : stickInput); }