private void AssignTrackedDevice(TrackedDeviceState deviceState, InputDevice?possibleInputDevice, DeviceUse use, TrackedDeviceRole deviceRole) { if ((!possibleInputDevice.HasValue && deviceState.found) || (possibleInputDevice.HasValue && deviceState.found && possibleInputDevice.Value.name != deviceState.name)) { _logger.Info($"Removing device '{deviceState.name}' that was used as {use}"); deviceState.name = null; deviceState.serialNumber = null; deviceState.found = false; deviceState.tracked = false; deviceState.role = TrackedDeviceRole.Unknown; deviceRemoved?.Invoke(deviceState, use); } if (possibleInputDevice.HasValue && (!deviceState.found || possibleInputDevice.Value.name != deviceState.name)) { InputDevice inputDevice = possibleInputDevice.Value; _logger.Info($"Using device '{inputDevice.name}' as {use}"); deviceState.name = inputDevice.name; deviceState.serialNumber = inputDevice.serialNumber; deviceState.found = true; deviceState.role = deviceRole; deviceAdded?.Invoke(deviceState, use); } }
private void AssignTrackedDevice(TrackedDeviceState deviceState, InputDevice?possibleInputDevice, DeviceUse use, TrackedDeviceRole deviceRole) { if (possibleInputDevice.HasValue && !deviceState.found) { InputDevice inputDevice = possibleInputDevice.Value; Plugin.logger.Info($"Using device \"{inputDevice.name}\" as {use}"); deviceState.name = inputDevice.name; deviceState.serialNumber = inputDevice.serialNumber; deviceState.found = true; deviceState.role = deviceRole; deviceAdded?.Invoke(deviceState, use); } if (!possibleInputDevice.HasValue && deviceState.found) { Plugin.logger.Info($"Lost device \"{deviceState.name}\" that was used as {use}"); deviceState.name = null; deviceState.serialNumber = null; deviceState.found = false; deviceState.role = TrackedDeviceRole.Unknown; deviceRemoved?.Invoke(deviceState, use); } }
void SetupLeftController() { // Search left hand controller // https://docs.unity3d.com/ja/2019.4/Manual/xr_input.html var devices = new List <InputDevice>(); InputDevices.GetDevicesWithCharacteristics( InputDeviceCharacteristics.Controller | InputDeviceCharacteristics.Left, devices ); if (devices.Count >= 1) { leftController = devices[0]; } else { return; // fail } // button setting // trigger leftTriggerDetector = new ButtonDetector(leftController.Value, CommonUsages.triggerButton); leftTriggerDetector.ButtonDown += (bd) => StartClickingByHand(leftHandGameObj); leftTriggerDetector.ButtonUp += (bd) => EndClicking(leftHandObj); // grab leftGripDetector = new ButtonDetector(leftController.Value, CommonUsages.gripButton); leftGripDetector.ButtonDown += (bd) => StartClickingByHand(leftHandGameObj, "grab", leftGrabbedObjects); leftGripDetector.ButtonUp += (bd) => EndClicking(leftHandObj, "ungrab", leftGrabbedObjects); }
void CheckConnectedDevice(InputDevice device, bool displayWarning = true) { var positionSuccess = false; var rotationSuccess = false; if (!(positionSuccess = device.TryGetFeatureValue(CommonUsages.centerEyePosition, out Vector3 position))) { positionSuccess = device.TryGetFeatureValue(CommonUsages.colorCameraPosition, out position); } if (!(rotationSuccess = device.TryGetFeatureValue(CommonUsages.centerEyeRotation, out Quaternion rotation))) { rotationSuccess = device.TryGetFeatureValue(CommonUsages.colorCameraRotation, out rotation); } if (positionSuccess && rotationSuccess) { if (s_InputTrackingDevice == null) { s_InputTrackingDevice = device; } else { Debug.LogWarning($"An input device {device.name} with the TrackedDevice characteristic was registered but the ARPoseDriver is already consuming data from {s_InputTrackingDevice.Value.name}."); if (s_CardboardHMDInputTrackingDevice == null && device.name == "Cardboard HMD") { s_CardboardHMDInputTrackingDevice = device; //arCameraManager.frameReceived += ArCameraManager_frameReceived; } } } }
private void HandleInputDevicesDisconnected(InputDevice device) { if (inputDevice != null && inputDevice.Value == device) { inputDevice = null; hapticCapabilities = null; SetVisible(false); } }
private void OnXRDeviceDisconnected(DeviceType deviceType) { if (deviceType != type) { return; } device = null; }
private void OnXRDeviceConnected(DeviceType deviceType, InputDevice inputDevice) { if (deviceType != type) { return; } device = inputDevice; }
void OnDisabled() { WebXRManager.OnControllerUpdate -= OnControllerUpdate; WebXRManager.OnHandUpdate -= OnHandUpdate; WebXRManager.OnHeadsetUpdate -= onHeadsetUpdate; SetVisible(false); #if UNITY_EDITOR InputDevices.deviceConnected -= HandleInputDevicesConnected; InputDevices.deviceDisconnected -= HandleInputDevicesDisconnected; inputDevice = null; #endif }
void OnDisable() { WebXRManager.OnControllerUpdate -= OnControllerUpdate; WebXRManager.OnHandUpdate -= OnHandUpdateInternal; SetControllerActive(false); SetHandActive(false); #if UNITY_EDITOR || !UNITY_WEBGL InputDevices.deviceConnected -= HandleInputDevicesConnected; InputDevices.deviceDisconnected -= HandleInputDevicesDisconnected; inputDevice = null; #endif }
public void Update() { // Set camera of canvas when camera is changed (for FirstPerson-ThirdPerson change) Camera camera = Camera.main; if (lastCamera != camera) { lastCamera = camera; MenuCanvas.worldCamera = camera; MoveMenu(); } // For VR if (!controller.HasValue) { // FIXME: currently, cannot find controller during Start(). // Search right controller // See https://docs.unity3d.com/ja/2019.4/Manual/xr_input.html var devices = new List <InputDevice>(); InputDevices.GetDevicesWithCharacteristics( InputDeviceCharacteristics.Right | InputDeviceCharacteristics.Controller, devices ); if (devices.Count != 0) { controller = devices[0]; } } else { // Check button down if (controller.Value.TryGetFeatureValue(CommonUsages.primaryButton, out bool buttonValue)) { if ((!lastButtonValue && buttonValue) && canToggle) { Toggle(); } lastButtonValue = buttonValue; } } // For desktop (non-VR) // If object specification YAML is being typed in, space key does not close the menu. if (Input.GetKeyDown(DesktopKey) && canToggle && !ObjectCreationInput.isFocused) { Toggle(); } // Show microphone state var micCap = GetComponent <MicrophoneCapture>(); MicrophoneToggle.isOn = micCap.MicrophoneEnabled; }
private void HandleInputDevicesConnected(InputDevice device) { if (device.characteristics.HasFlag(xrHand)) { inputDevice = device; HapticCapabilities capabilities; if (device.TryGetHapticCapabilities(out capabilities)) { hapticCapabilities = capabilities; } profiles = null; // TODO: Find a better way to get device profile if (device.manufacturer == "Oculus") { profiles = new string[] { "oculus-touch-v2" }; } else { string profileName = "generic"; bool addedFeatures = false; float tempFloat = 0; Vector2 tempVec2 = Vector2.zero; if (device.TryGetFeatureValue(CommonUsages.trigger, out tempFloat)) { profileName += "-trigger"; addedFeatures = true; } if (device.TryGetFeatureValue(CommonUsages.grip, out tempFloat)) { profileName += "-squeeze"; addedFeatures = true; } if (device.TryGetFeatureValue(CommonUsages.secondary2DAxis, out tempVec2)) { profileName += "-touchpad"; addedFeatures = true; } if (device.TryGetFeatureValue(CommonUsages.primary2DAxis, out tempVec2)) { profileName += "-thumbstick"; addedFeatures = true; } if (!addedFeatures) { profileName += "-button"; } profiles = new string[] { profileName }; } TryUpdateButtons(); SetControllerActive(true); } }
private void HandleInputDevicesConnected(InputDevice device) { if (device.characteristics.HasFlag(xrHand)) { inputDevice = device; HapticCapabilities capabilities; if (device.TryGetHapticCapabilities(out capabilities)) { hapticCapabilities = capabilities; } SetVisible(true); } }
private void Update() { var inputDevices = new List <InputDevice>(); InputDevices.GetDevices(inputDevices); InputDevice?headInputDevice = null; InputDevice?leftHandInputDevice = null; InputDevice?rightHandInputDevice = null; InputDevice?waistInputDevice = null; InputDevice?leftFootInputDevice = null; InputDevice?rightFootInputDevice = null; foreach (InputDevice inputDevice in inputDevices) { if (inputDevice.name == head.name) { headInputDevice = inputDevice; } if (inputDevice.name == leftHand.name) { leftHandInputDevice = inputDevice; } if (inputDevice.name == rightHand.name) { rightHandInputDevice = inputDevice; } if (inputDevice.name == waist.name) { waistInputDevice = inputDevice; } if (inputDevice.name == leftFoot.name) { leftFootInputDevice = inputDevice; } if (inputDevice.name == rightFoot.name) { rightFootInputDevice = inputDevice; } } UpdateTrackedDevice(head, headInputDevice, DeviceUse.Head); UpdateTrackedDevice(leftHand, leftHandInputDevice, DeviceUse.LeftHand); UpdateTrackedDevice(rightHand, rightHandInputDevice, DeviceUse.RightHand); UpdateTrackedDevice(waist, waistInputDevice, DeviceUse.Waist); UpdateTrackedDevice(leftFoot, leftFootInputDevice, DeviceUse.LeftFoot); UpdateTrackedDevice(rightFoot, rightFootInputDevice, DeviceUse.RightFoot); }
// Update is called once per frame void Update() { if (!inputDevice.HasValue) { // FIXME: currently, cannot find controller during Start(). // Search left controller // See https://docs.unity3d.com/ja/2019.4/Manual/xr_input.html var devices = new List <InputDevice>(); InputDevices.GetDevicesWithCharacteristics( InputDeviceCharacteristics.Left | InputDeviceCharacteristics.Controller, devices ); if (devices.Count != 0) { inputDevice = devices[0]; } } if (inputDevice.HasValue && inputDevice.Value.TryGetFeatureValue(CommonUsages.primaryButton, out bool buttonValue)) { if (!lastButtonValue && buttonValue) { ButtonDown(); } else if (lastButtonValue && !buttonValue) { ButtonUp(); } lastButtonValue = buttonValue; } if (state == TeleportState.Aiming) { CastParabola(Controller.forward); } else if (state == TeleportState.Moving) { // CharacterController must be temporally disabled for teleporting // (See https://forum.unity.com/threads/does-transform-position-work-on-a-charactercontroller.36149/#post-4132021 ) GetComponent <CharacterController>().enabled = false; transform.position = target; GetComponent <CharacterController>().enabled = true; state = TeleportState.Idle; } }
// ReSharper restore UnusedMember.Local #pragma warning restore IDE0051 #endregion private void UpdateInputDevices() { var inputDevices = new List <InputDevice>(); var unassignedDevices = new Queue <InputDevice>(); var openVRDevicesBySerialNumber = new Dictionary <string, uint>(); InputDevices.GetDevices(inputDevices); var deviceRoles = new Dictionary <string, TrackedDeviceRole>(inputDevices.Count); if (_isOpenVRRunning) { string[] serialNumbers = OpenVRWrapper.GetTrackedDeviceSerialNumbers(); for (uint i = 0; i < serialNumbers.Length; i++) { if (string.IsNullOrEmpty(serialNumbers[i])) { continue; } Plugin.logger.Debug($"Got serial number \"{serialNumbers[i]}\" for device at index {i}"); openVRDevicesBySerialNumber.Add(serialNumbers[i], i); } } InputDevice?headInputDevice = null; InputDevice?leftHandInputDevice = null; InputDevice?rightHandInputDevice = null; InputDevice?waistInputDevice = null; InputDevice?leftFootInputDevice = null; InputDevice?rightFootInputDevice = null; int trackerCount = 0; foreach (InputDevice device in inputDevices) { if (!device.isValid) { continue; } deviceRoles.Add(device.name, TrackedDeviceRole.Unknown); if (!_foundDevices.Contains(device.name)) { Plugin.logger.Info($"Found new input device \"{device.name}\" with serial number \"{device.serialNumber}\""); _foundDevices.Add(device.name); } if (device.HasCharacteristics(InputDeviceCharacteristics.HeadMounted)) { headInputDevice = device; } else if (device.HasCharacteristics(InputDeviceCharacteristics.HeldInHand | InputDeviceCharacteristics.Left)) { leftHandInputDevice = device; } else if (device.HasCharacteristics(InputDeviceCharacteristics.HeldInHand | InputDeviceCharacteristics.Right)) { rightHandInputDevice = device; } else if (device.HasCharacteristics(InputDeviceCharacteristics.TrackedDevice) && !device.HasCharacteristics(InputDeviceCharacteristics.TrackingReference)) { if (_isOpenVRRunning && !string.IsNullOrEmpty(device.serialNumber) && openVRDevicesBySerialNumber.TryGetValue(device.serialNumber, out uint openVRDeviceId)) { // try to figure out tracker role using OpenVR var role = OpenVRWrapper.GetTrackedDeviceRole(openVRDeviceId); deviceRoles[device.name] = role; Plugin.logger.Info($"Tracker \"{device.name}\" has role {role}"); switch (role) { case TrackedDeviceRole.Waist: waistInputDevice = device; break; case TrackedDeviceRole.LeftFoot: leftFootInputDevice = device; break; case TrackedDeviceRole.RightFoot: rightFootInputDevice = device; break; default: unassignedDevices.Enqueue(device); break; } } else { unassignedDevices.Enqueue(device); } trackerCount++; } } // fallback if OpenVR tracker roles aren't set/supported if (leftFootInputDevice == null && trackerCount >= 2 && unassignedDevices.Count > 0) { leftFootInputDevice = unassignedDevices.Dequeue(); } if (rightFootInputDevice == null && trackerCount >= 2 && unassignedDevices.Count > 0) { rightFootInputDevice = unassignedDevices.Dequeue(); } if (waistInputDevice == null && unassignedDevices.Count > 0) { waistInputDevice = unassignedDevices.Dequeue(); } AssignTrackedDevice(head, headInputDevice, DeviceUse.Head, headInputDevice.HasValue ? deviceRoles[headInputDevice.Value.name] : TrackedDeviceRole.Unknown); AssignTrackedDevice(leftHand, leftHandInputDevice, DeviceUse.LeftHand, leftHandInputDevice.HasValue ? deviceRoles[leftHandInputDevice.Value.name] : TrackedDeviceRole.Unknown); AssignTrackedDevice(rightHand, rightHandInputDevice, DeviceUse.RightHand, rightHandInputDevice.HasValue ? deviceRoles[rightHandInputDevice.Value.name] : TrackedDeviceRole.Unknown); AssignTrackedDevice(waist, waistInputDevice, DeviceUse.Waist, waistInputDevice.HasValue ? deviceRoles[waistInputDevice.Value.name] : TrackedDeviceRole.Unknown); AssignTrackedDevice(leftFoot, leftFootInputDevice, DeviceUse.LeftFoot, leftFootInputDevice.HasValue ? deviceRoles[leftFootInputDevice.Value.name] : TrackedDeviceRole.Unknown); AssignTrackedDevice(rightFoot, rightFootInputDevice, DeviceUse.RightFoot, rightFootInputDevice.HasValue ? deviceRoles[rightFootInputDevice.Value.name] : TrackedDeviceRole.Unknown); foreach (string deviceName in _foundDevices.ToList()) { if (!inputDevices.Exists(d => d.name == deviceName)) { Plugin.logger.Info($"Lost device \"{deviceName}\""); _foundDevices.Remove(deviceName); } } }
public void Update() { Device = _devices.GetDeviceByCharacteristics(_characteristics); }
static internal NullablePose GetPoseData() { NullablePose resultPose = new NullablePose(); #if UNITY_2020_1_OR_NEWER if (!SixDoFCardboardStartup.isStarted && s_CardboardHMDInputTrackingDevice != null) { s_CardboardHMDInputTrackingDevice = null; } if (s_CardboardHMDInputTrackingDevice != null) { var pose = Pose.identity; var positionSuccess = false; var rotationSuccess = false; if (!(positionSuccess = s_CardboardHMDInputTrackingDevice.Value.TryGetFeatureValue(CommonUsages.centerEyePosition, out pose.position))) { positionSuccess = s_CardboardHMDInputTrackingDevice.Value.TryGetFeatureValue(CommonUsages.colorCameraPosition, out pose.position); } if (!(rotationSuccess = s_CardboardHMDInputTrackingDevice.Value.TryGetFeatureValue(CommonUsages.centerEyeRotation, out pose.rotation))) { rotationSuccess = s_CardboardHMDInputTrackingDevice.Value.TryGetFeatureValue(CommonUsages.colorCameraRotation, out pose.rotation); } if (positionSuccess) { resultPose.position = pose.position; } if (rotationSuccess) { resultPose.rotation = pose.rotation; } Debug.Log("x: " + pose.position.x + " y: " + pose.position.y + " z: " + pose.position.z); if (positionSuccess || rotationSuccess) { return(resultPose); } } else if (s_InputTrackingDevice != null) { var pose = Pose.identity; var positionSuccess = false; var rotationSuccess = false; if (!(positionSuccess = s_InputTrackingDevice.Value.TryGetFeatureValue(CommonUsages.centerEyePosition, out pose.position))) { positionSuccess = s_InputTrackingDevice.Value.TryGetFeatureValue(CommonUsages.colorCameraPosition, out pose.position); } if (!(rotationSuccess = s_InputTrackingDevice.Value.TryGetFeatureValue(CommonUsages.centerEyeRotation, out pose.rotation))) { rotationSuccess = s_InputTrackingDevice.Value.TryGetFeatureValue(CommonUsages.colorCameraRotation, out pose.rotation); } if (positionSuccess) { resultPose.position = pose.position; } if (rotationSuccess) { resultPose.rotation = pose.rotation; } if (positionSuccess || rotationSuccess) { return(resultPose); } } #else UnityEngine.XR.InputTracking.GetNodeStates(nodeStates); List <UnityEngine.XR.XRNodeState> states = new List <UnityEngine.XR.XRNodeState>(); if (!SixDoFCardboardStartup.isStarted) { foreach (UnityEngine.XR.XRNodeState nodeState in nodeStates) { if (nodeState.nodeType == UnityEngine.XR.XRNode.CenterEye) { var pose = Pose.identity; var positionSuccess = nodeState.TryGetPosition(out pose.position); var rotationSuccess = nodeState.TryGetRotation(out pose.rotation); if (positionSuccess) { resultPose.position = pose.position; } if (rotationSuccess) { resultPose.rotation = pose.rotation; } break; } } } else { foreach (UnityEngine.XR.XRNodeState nodeState in nodeStates) { if (nodeState.nodeType == UnityEngine.XR.XRNode.CenterEye) { states.Add(nodeState); } } if (nodeStates.Count > 0) { UnityEngine.XR.XRNodeState nodeState = nodeStates[nodeStates.Count - 1]; var pose = Pose.identity; var positionSuccess = nodeState.TryGetPosition(out pose.position); var rotationSuccess = nodeState.TryGetRotation(out pose.rotation); if (positionSuccess) { resultPose.position = pose.position; } if (rotationSuccess) { resultPose.rotation = pose.rotation; } return(resultPose); } } #endif // UNITY_2020_1_OR_NEWER return(resultPose); }
private void UpdateTrackedDevice(TrackedDeviceState deviceState, InputDevice?possibleInputDevice, DeviceUse use) { if (!possibleInputDevice.HasValue) { return; } var inputDevice = possibleInputDevice.Value; if (!inputDevice.TryGetFeatureValue(CommonUsages.isTracked, out bool isTracked) || !isTracked) { if (deviceState.tracked) { Plugin.logger.Info($"Lost tracking of device \"{deviceState.name}\""); deviceState.tracked = false; deviceTrackingLost?.Invoke(deviceState, use); } return; } if (!deviceState.tracked) { Plugin.logger.Info($"Acquired tracking of device \"{deviceState.name}\""); deviceState.tracked = true; deviceTrackingAcquired?.Invoke(deviceState, use); } Vector3 origin = BeatSaberUtil.GetRoomCenter(); Quaternion originRotation = BeatSaberUtil.GetRoomRotation(); if (inputDevice.TryGetFeatureValue(CommonUsages.devicePosition, out Vector3 position)) { deviceState.position = origin + originRotation * position; } if (inputDevice.TryGetFeatureValue(CommonUsages.deviceRotation, out Quaternion rotation)) { deviceState.rotation = originRotation * rotation; // Driver4VR rotation correction if (deviceState.name?.StartsWith("d4vr_tracker_") == true && (use == DeviceUse.LeftFoot || �use == DeviceUse.RightFoot)) { deviceState.rotation *= Quaternion.Euler(-90, 180, 0); } // KinectToVR rotation correction if (deviceState.role == TrackedDeviceRole.KinectToVrTracker) { if (use == DeviceUse.Waist) { deviceState.rotation *= Quaternion.Euler(-90, 180, 0); } if (use == DeviceUse.LeftFoot || use == DeviceUse.RightFoot) { deviceState.rotation *= Quaternion.Euler(0, 180, 0); } } } }