示例#1
0
        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);
            }
        }
示例#3
0
    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;
                    }
                }
            }
        }
示例#5
0
 private void HandleInputDevicesDisconnected(InputDevice device)
 {
     if (inputDevice != null && inputDevice.Value == device)
     {
         inputDevice        = null;
         hapticCapabilities = null;
         SetVisible(false);
     }
 }
示例#6
0
        private void OnXRDeviceDisconnected(DeviceType deviceType)
        {
            if (deviceType != type)
            {
                return;
            }

            device = null;
        }
示例#7
0
        private void OnXRDeviceConnected(DeviceType deviceType, InputDevice inputDevice)
        {
            if (deviceType != type)
            {
                return;
            }

            device = inputDevice;
        }
示例#8
0
        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
        }
示例#10
0
    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;
    }
示例#11
0
 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);
     }
 }
示例#12
0
 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);
        }
示例#14
0
    // 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);
                    }
                }
            }
        }