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); } }
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; } }
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(); }