Esempio n. 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);
            }
        }
        private bool TryGetPose(TrackedDeviceState device, out Pose pose)
        {
            if (!device.found || !device.tracked)
            {
                pose = Pose.identity;
                return(false);
            }

            pose = new Pose(device.position, device.rotation);
            return(true);
        }
        private bool TryGetTrackerPose(TrackedDeviceState device, Pose previousPose, Pose correction, Settings.TrackedPointSmoothing smoothing, out Pose pose)
        {
            if (!_shouldTrackFullBody || !TryGetPose(device, out Pose currentPose))
            {
                pose = Pose.identity;
                return(false);
            }

            Quaternion correctedRotation = currentPose.rotation * correction.rotation;
            Vector3    correctedPosition = currentPose.position + correctedRotation * correction.position; // correction is forward-facing by definition

            pose = new Pose(Vector3.Lerp(previousPose.position, correctedPosition, smoothing.position), Quaternion.Slerp(previousPose.rotation, correctedRotation, smoothing.rotation));
            return(true);
        }
        private void UpdateTrackedDevice(TrackedDeviceState deviceState, XRNodeState?possibleNodeState, string use)
        {
            if (possibleNodeState == null)
            {
                if (deviceState.Found)
                {
                    deviceState.Position  = default;
                    deviceState.Rotation  = default;
                    deviceState.Found     = false;
                    deviceState.NodeState = default;
                    Plugin.logger.Info($"Lost device with ID {deviceState.NodeState.uniqueID} that was used as {use}");
                    deviceRemoved?.Invoke(deviceState);
                }

                return;
            }

            var   nodeState  = (XRNodeState)possibleNodeState;
            ulong previousId = deviceState.NodeState.uniqueID;

            Vector3    origin         = BeatSaberUtil.GetRoomCenter();
            Quaternion originRotation = BeatSaberUtil.GetRoomRotation();

            if (nodeState.TryGetPosition(out Vector3 position))
            {
                deviceState.Position = origin + originRotation * position;
            }

            if (nodeState.TryGetRotation(out Quaternion rotation))
            {
                deviceState.Rotation = originRotation * rotation;
            }

            deviceState.Found     = true;
            deviceState.NodeState = nodeState;

            if (nodeState.uniqueID != previousId)
            {
                Plugin.logger.Info($"Using device \"{InputTracking.GetNodeName(nodeState.uniqueID)}\" ({nodeState.uniqueID}) as {use}");
                deviceAdded?.Invoke(deviceState);
            }
        }
Esempio n. 6
0
        private void UpdateTrackedDevice(TrackedDeviceState deviceState, XRNodeState?possibleNodeState, string use)
        {
            if (!possibleNodeState.HasValue)
            {
                return;
            }

            var nodeState = possibleNodeState.Value;

            if (!nodeState.tracked)
            {
                if (deviceState.tracked)
                {
                    Plugin.logger.Info($"Lost tracking of device with ID {deviceState.uniqueID}");
                    deviceState.tracked = false;
                    deviceTrackingLost?.Invoke(deviceState);
                }

                return;
            }

            if (!deviceState.tracked)
            {
                Plugin.logger.Info($"Acquired tracking of device with ID {deviceState.uniqueID}");
                deviceState.tracked = true;
                deviceTrackingAcquired?.Invoke(deviceState);
            }

            Vector3    origin         = BeatSaberUtil.GetRoomCenter();
            Quaternion originRotation = BeatSaberUtil.GetRoomRotation();

            if (nodeState.TryGetPosition(out Vector3 position))
            {
                deviceState.position = origin + originRotation * position;
            }

            if (nodeState.TryGetRotation(out Quaternion rotation))
            {
                deviceState.rotation = originRotation * rotation;
            }
        }
Esempio n. 7
0
        private void AssignTrackedDevice(TrackedDeviceState deviceState, XRNodeState?possibleNodeState, string use)
        {
            if (possibleNodeState.HasValue && !deviceState.found)
            {
                XRNodeState nodeState = possibleNodeState.Value;

                Plugin.logger.Info($"Using device \"{InputTracking.GetNodeName(nodeState.uniqueID)}\" ({nodeState.uniqueID}) as {use}");

                deviceState.uniqueID = nodeState.uniqueID;
                deviceState.found    = true;

                deviceAdded?.Invoke(deviceState);
            }

            if (!possibleNodeState.HasValue && deviceState.found)
            {
                Plugin.logger.Info($"Lost device with ID {deviceState.uniqueID} that was used as {use}");

                deviceState.uniqueID = default;
                deviceState.found    = false;

                deviceRemoved?.Invoke(deviceState);
            }
        }
        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);
                    }
                }
            }
        }
 private void OnDevicesUpdated(TrackedDeviceState state, DeviceUse use)
 {
     inputChanged?.Invoke();
 }