void OnRayEntered(GameObject gameObject, TrackedDeviceEventData eventData) { var dropReceiver = ComponentUtils <IDropReceiver> .GetComponent(gameObject); if (dropReceiver != null) { var rayOrigin = eventData.interactor; if (dropReceiver.CanDrop(GetCurrentDropObject(rayOrigin))) { dropReceiver.OnDropHoverStarted(); m_HoverObjects[rayOrigin] = gameObject; SetCurrentDropReceiver(rayOrigin, dropReceiver); } } }
void OnDragEnded(GameObject gameObject, TrackedDeviceEventData eventData) { var droppable = ComponentUtils <IDroppable> .GetComponent(gameObject); if (droppable != null) { var rayOrigin = eventData.interactor; m_Droppables.Remove(rayOrigin); var dropReceiver = GetCurrentDropReceiver(rayOrigin); var dropObject = droppable.GetDropObject(); if (dropReceiver != null && dropReceiver.CanDrop(dropObject)) { dropReceiver.ReceiveDrop(droppable.GetDropObject()); } } }
void OnRayExited(GameObject gameObject, TrackedDeviceEventData eventData) { if (!gameObject) { return; } var dropReceiver = ComponentUtils <IDropReceiver> .GetComponent(gameObject); if (dropReceiver != null) { var rayOrigin = eventData.interactor; if (m_HoverObjects.Remove(rayOrigin)) { dropReceiver.OnDropHoverEnded(); SetCurrentDropReceiver(rayOrigin, null); } } }
IEnumerator CheckEvents(TestObjects testObjects) { UICallbackReceiver leftUIReceiver = testObjects.leftUIReceiver; UICallbackReceiver rightUIReceiver = testObjects.rightUIReceiver; XRControllerRecorder recorder = testObjects.controllerRecorder; // Reset to Defaults recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -90.0f, 0.0f), false, false, false); yield return(new WaitForSeconds(0.1f)); leftUIReceiver.Reset(); rightUIReceiver.Reset(); // Move over left child. recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -30.0f, 0.0f), false, false, false); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(1)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Enter)); Assert.That(leftUIReceiver.events[0].data, Is.TypeOf <TrackedDeviceEventData>()); TrackedDeviceEventData eventData = (TrackedDeviceEventData)leftUIReceiver.events[0].data; Assert.That(eventData.interactor, Is.EqualTo(testObjects.interactor)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(0)); // Check basic down/up recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -30.0f, 0.0f), false, false, true); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Down)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.PotentialDrag)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(0)); recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -30.0f, 0.0f), false, false, false); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Up)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.Click)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(0)); // Check down and drag recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -30.0f, 0.0f), false, false, true); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Down)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.PotentialDrag)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(0)); // Move to new location on left child recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -10.0f, 0.0f), false, false, true); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.BeginDrag)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.Dragging)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(0)); // Move children recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, 30.0f, 0.0f), false, false, true); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Exit)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.Dragging)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(1)); Assert.That(rightUIReceiver.events[0].type, Is.EqualTo(EventType.Enter)); rightUIReceiver.Reset(); //Deselect recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, 30.0f, 0.0f), false, false, false); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Up)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.EndDrag)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(1)); Assert.That(rightUIReceiver.events[0].type, Is.EqualTo(EventType.Drop)); rightUIReceiver.Reset(); }
public IEnumerator TrackedDevicesCanDriveUI() { TestObjects testObjects = SetupUIScene(); UICallbackReceiver leftUIReceiver = testObjects.leftUIReceiver; UICallbackReceiver rightUIReceiver = testObjects.rightUIReceiver; XRControllerRecorder recorder = testObjects.controllerRecorder; // Reset to Defaults recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -90.0f, 0.0f), false, false, false); yield return(new WaitForSeconds(0.1f)); leftUIReceiver.Reset(); rightUIReceiver.Reset(); // Move over left child. recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -30.0f, 0.0f), false, false, false); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(1)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Enter)); Assert.That(leftUIReceiver.events[0].data, Is.TypeOf <TrackedDeviceEventData>()); TrackedDeviceEventData eventData = (TrackedDeviceEventData)leftUIReceiver.events[0].data; Assert.That(eventData.interactor, Is.EqualTo(testObjects.interactor)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(0)); // Check basic down/up recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -30.0f, 0.0f), false, false, true); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Down)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.PotentialDrag)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(0)); recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -30.0f, 0.0f), false, false, false); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Up)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.Click)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(0)); // Check down and drag recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -30.0f, 0.0f), false, false, true); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Down)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.PotentialDrag)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(0)); // Move to new location on left child recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, -10.0f, 0.0f), false, false, true); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.BeginDrag)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.Dragging)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(0)); // Move children recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, 30.0f, 0.0f), false, false, true); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Exit)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.Dragging)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(1)); Assert.That(rightUIReceiver.events[0].type, Is.EqualTo(EventType.Enter)); rightUIReceiver.Reset(); //Deselect recorder.SetNextPose(Vector3.zero, Quaternion.Euler(0.0f, 30.0f, 0.0f), false, false, false); yield return(new WaitForSeconds(0.1f)); Assert.That(leftUIReceiver.events, Has.Count.EqualTo(2)); Assert.That(leftUIReceiver.events[0].type, Is.EqualTo(EventType.Up)); Assert.That(leftUIReceiver.events[1].type, Is.EqualTo(EventType.EndDrag)); leftUIReceiver.Reset(); Assert.That(rightUIReceiver.events, Has.Count.EqualTo(1)); Assert.That(rightUIReceiver.events[0].type, Is.EqualTo(EventType.Drop)); rightUIReceiver.Reset(); // This suppresses a warning that would be logged by TrackedDeviceGraphicRaycaster if the Camera is destroyed first Object.Destroy(testObjects.eventSystem.gameObject); }