Esempio n. 1
0
	public uint GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass,uint [] punTrackedDeviceIndexArray,uint unRelativeToTrackedDeviceIndex)
	{
		uint result = FnTable.GetSortedTrackedDeviceIndicesOfClass(eTrackedDeviceClass,punTrackedDeviceIndexArray,(uint) punTrackedDeviceIndexArray.Length,unRelativeToTrackedDeviceIndex);
		return result;
	}
Esempio n. 2
0
	internal static extern uint VR_IVRSystem_GetSortedTrackedDeviceIndicesOfClass(IntPtr instancePtr, ETrackedDeviceClass eTrackedDeviceClass,  [In, Out] uint[] punTrackedDeviceIndexArray, uint unTrackedDeviceIndexArrayCount, uint unRelativeToTrackedDeviceIndex);
Esempio n. 3
0
 public static IEnumerable<int> DevicesInClass(this CVRSystem hmd, ETrackedDeviceClass devClass)
 {
     if (hmd == null) throw new ArgumentNullException(nameof(hmd));
     return DeviceIndexes.Where(i => hmd.GetTrackedDeviceClass((uint)i) == devClass);
 }
Esempio n. 4
0
	public static int GetDeviceIndex(DeviceRelation relation,
		ETrackedDeviceClass deviceClass = ETrackedDeviceClass.Controller,
		int relativeTo = (int)OpenVR.k_unTrackedDeviceIndex_Hmd) // use -1 for absolute tracking space
	{
		var invXform = ((uint)relativeTo < OpenVR.k_unMaxTrackedDeviceCount) ?
			Input(relativeTo).transform.GetInverse() : SteamVR_Utils.RigidTransform.identity;

		var vr = SteamVR.instance;
		var result = -1;
		var best = -float.MaxValue;
		for (int i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
		{
			if (i == relativeTo || vr.hmd.GetTrackedDeviceClass((uint)i) != deviceClass)
				continue;

			var device = Input(i);
			if (!device.connected)
				continue;

			if (relation == DeviceRelation.First)
				return i;

			float score;

			var pos = invXform * device.transform.pos;
			if (relation == DeviceRelation.FarthestRight)
			{
				score = pos.x;
			}
			else if (relation == DeviceRelation.FarthestLeft)
			{
				score = -pos.x;
			}
			else
			{
				var dir = new Vector3(pos.x, 0.0f, pos.z).normalized;
				var dot = Vector3.Dot(dir, Vector3.forward);
				var cross = Vector3.Cross(dir, Vector3.forward);
				if (relation == DeviceRelation.Leftmost)
				{
					score = (cross.y > 0.0f) ? 2.0f - dot : dot;
				}
				else
				{
					score = (cross.y < 0.0f) ? 2.0f - dot : dot;
				}
			}
			
			if (score > best)
			{
				result = i;
				best = score;
			}
		}

		return result;
	}
Esempio n. 5
0
 // Token: 0x06001EE5 RID: 7909 RVA: 0x0009C9B6 File Offset: 0x0009ABB6
 public uint GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass, uint[] punTrackedDeviceIndexArray, uint unRelativeToTrackedDeviceIndex)
 {
     return(this.FnTable.GetSortedTrackedDeviceIndicesOfClass(eTrackedDeviceClass, punTrackedDeviceIndexArray, (uint)punTrackedDeviceIndexArray.Length, unRelativeToTrackedDeviceIndex));
 }
    /// <summary>
    /// Sets the chosen device as the anchor object, and enables/disables scene objects appropriately.
    /// Called by ChooseTrackedObjectMenu when the user clicks it.
    /// </summary>
    /// <param name="deviceindex">Index of the tracked object.</param>
    private void OnTrackedObjectSelected(int deviceindex)
    {
        //Make sure it's valid.
        ZEDControllerTracker.Devices trackeddevice = ZEDControllerTracker.Devices.Hmd; //Can't be HMD at end - will catch.

#if ZED_STEAM_VR
        ETrackedDeviceClass dclass = OpenVR.System.GetTrackedDeviceClass((uint)deviceindex);
        if (dclass == ETrackedDeviceClass.GenericTracker)
        {
            trackeddevice = ZEDControllerTracker.Devices.ViveTracker;
        }
        else if (dclass == ETrackedDeviceClass.Controller)
        {
            ETrackedControllerRole role = OpenVR.System.GetControllerRoleForTrackedDeviceIndex((uint)deviceindex);
            if (role == ETrackedControllerRole.LeftHand)
            {
                trackeddevice = ZEDControllerTracker.Devices.LeftController;
            }
            else if (role == ETrackedControllerRole.RightHand)
            {
                trackeddevice = ZEDControllerTracker.Devices.RightController;
            }
            else
            {
                Debug.Log("Couldn't assign to device of index " + deviceindex + " as it's a controller with an unknown role.");
            }
            //TODO: Make sure this works for a third controller.
        }
#endif

#if ZED_OCULUS
        if (deviceindex == TOUCH_INDEX_LEFT)
        {
            trackeddevice = ZEDControllerTracker.Devices.LeftController;
        }
        else if (deviceindex == TOUCH_INDEX_RIGHT)
        {
            trackeddevice = ZEDControllerTracker.Devices.RightController;
        }
#endif
        //Set up the anchor object, and readjust controllers if needed.
        zedAnchor.gameObject.SetActive(true);

        zedAnchor.controllerTracker.deviceToTrack = trackeddevice;

#if ZED_STEAM_VR
        leftController.index = tempLeftController.index;
#endif

        switch (trackeddevice)
        {
#if ZED_STEAM_VR
        case ZEDControllerTracker.Devices.ViveTracker:
            leftController.index = tempLeftController.index;
            leftController.gameObject.SetActive(true);
            break;
#endif
        case ZEDControllerTracker.Devices.LeftController:
            bellyMenu.gameObject.SetActive(true);
            break;

        case ZEDControllerTracker.Devices.RightController:
            PrimaryHandSwitcher switcher = leftController.GetComponentInChildren <PrimaryHandSwitcher>(true);
            if (!switcher)
            {
                break;
            }
            ToggleGroup3D handtoggle = switcher.transform.GetComponentInChildren <ToggleGroup3D>(true);
            handtoggle.toggleAtStart = false;
            leftController.gameObject.SetActive(true);
            switcher.SetPrimaryHand(false);     //Switch to being left-handed.
            Destroy(rightController.gameObject);
            rightController = null;
            bellyMenu.gameObject.SetActive(true);
            break;

        case ZEDControllerTracker.Devices.Hmd:
        default:
            Debug.LogError("trackeddevice value somehow not set to valid value - must be a controller or tracker. ");
            break;
        }

        if (viewScreen)
        {
            viewScreen.SetActive(true);
        }

        Destroy(tempLeftController.gameObject);
        tempLeftController = null;

        //We're all done with this menu, so destroy it all.
        Destroy(gameObject);
    }
        // Update is called once per frame
        void Update()
        {
            Dictionary <ETrackedDeviceClass, List <DeviceInfo> > positions;

            if (IsOVRConnected)
            {
                OpenVRWrapper.Instance.ConvertControllerToTracker = ControlWPFWindow.CurrentSettings.HandleControllerAsTracker;
                OpenVRWrapper.Instance.PollingVREvents();
                positions = OpenVRWrapper.Instance.GetTrackerPositions();
            }
            else
            {
                positions = new Dictionary <ETrackedDeviceClass, List <DeviceInfo> >();
                positions.Add(ETrackedDeviceClass.HMD, new List <DeviceInfo>());
                positions.Add(ETrackedDeviceClass.Controller, new List <DeviceInfo>());
                positions.Add(ETrackedDeviceClass.GenericTracker, new List <DeviceInfo>());
                positions.Add(ETrackedDeviceClass.TrackingReference, new List <DeviceInfo>());
            }
            //externalcamera.cfg用のコントローラー設定
            if (CameraControllerName != null && positions.SelectMany(d => d.Value).Any(d => d.serialNumber == CameraControllerName))
            {
                var cameracontroller = positions.SelectMany(d => d.Value).Where(d => d.serialNumber == CameraControllerName).First();
                CameraControllerObject.transform.SetPositionAndRotationLocal(cameracontroller);
                foreach (var l in positions)
                {
                    if (l.Value.Contains(cameracontroller))
                    {
                        CameraControllerType = l.Key;
                        l.Value.Remove(cameracontroller);
                    }
                }
            }

            var hmdPositions = positions[ETrackedDeviceClass.HMD];

            if (hmdPositions.Any())
            {
                HMDObject.transform.SetPositionAndRotationLocal(hmdPositions.FirstOrDefault());
            }

            var controllerPositions = positions[ETrackedDeviceClass.Controller];

            //add from ExternalReceiverForVMC
            if (externalReceiver != null)
            {
                foreach (var c in externalReceiver.virtualControllerFiltered)
                {
                    controllerPositions.Add(new DeviceInfo(c.Value, c.Key));
                }
            }

            if (controllerPositions.Any())
            {
                if (Controllers.Count != controllerPositions.Count)
                {
                    Controllers.Clear();
                }
                for (int i = 0; i < controllerPositions.Count && i < ControllersObject.Count; i++)
                {
                    ControllersObject[i].transform.SetPositionAndRotationLocal(controllerPositions[i]);
                    if (Controllers.Contains(ControllersObject[i]) == false)
                    {
                        Controllers.Add(ControllersObject[i]);
                    }
                }
            }
            else
            {
                Controllers.Clear(); //残ってしまったものを削除
            }

            var trackerPositions = positions[ETrackedDeviceClass.GenericTracker];

            //add from ExternalReceiverForVMC
            if (externalReceiver != null)
            {
                foreach (var t in externalReceiver.virtualTrackerFiltered)
                {
                    trackerPositions.Add(new DeviceInfo(t.Value, t.Key));
                }
            }

            if (trackerPositions.Any())
            {
                if (Trackers.Count != trackerPositions.Count)
                {
                    Trackers.Clear();
                }
                for (int i = 0; i < trackerPositions.Count && i < TrackersObject.Count; i++)
                {
                    TrackersObject[i].transform.SetPositionAndRotationLocal(trackerPositions[i]);
                    if (Trackers.Contains(TrackersObject[i]) == false)
                    {
                        Trackers.Add(TrackersObject[i]);
                    }
                }
            }
            else
            {
                Trackers.Clear(); //残ってしまったものを削除
            }

            var baseStationPositions = positions[ETrackedDeviceClass.TrackingReference];

            if (baseStationPositions.Any())
            {
                if (BaseStations.Count != baseStationPositions.Count)
                {
                    BaseStations.Clear();
                }
                for (int i = 0; i < baseStationPositions.Count && i < BaseStationsObject.Count; i++)
                {
                    BaseStationsObject[i].transform.SetPositionAndRotationLocal(baseStationPositions[i]);
                    if (DisableBaseStationRotation)
                    {
                        BaseStationsObject[i].transform.rotation = Quaternion.Euler(0, BaseStationsObject[i].transform.eulerAngles.y, 0);
                    }
                    if (BaseStations.Contains(BaseStationsObject[i]) == false)
                    {
                        BaseStations.Add(BaseStationsObject[i]);
                    }
                }
            }
            else
            {
                BaseStations.Clear(); //残ってしまったものを削除
            }
        }
Esempio n. 8
0
        public int GetDeviceIndex(DeviceRelation relation,
                                  ETrackedDeviceClass deviceClass = ETrackedDeviceClass.Controller,
                                  int relativeTo = (int)OpenVR.k_unTrackedDeviceIndex_Hmd) // use -1 for absolute tracking space
        {
            var result = -1;

            var invXform = ((uint)relativeTo < OpenVR.k_unMaxTrackedDeviceCount)
                ? Matrix.Invert(Input(relativeTo).WorldTransform) : Matrix.Identity;

            var system = OpenVR.System;

            if (system == null)
            {
                return(result);
            }

            var best = -float.MaxValue;

            for (int i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
            {
                if (i == relativeTo || system.GetTrackedDeviceClass((uint)i) != deviceClass)
                {
                    continue;
                }

                var device = Input(i);
                if (!device.Connected)
                {
                    continue;
                }

                if (relation == DeviceRelation.First)
                {
                    return(i);
                }

                float score;

                var pos = Vector3.Transform(device.WorldTransform.Translation, invXform);

                if (relation == DeviceRelation.FarthestRight)
                {
                    score = pos.X;
                }
                else if (relation == DeviceRelation.FarthestLeft)
                {
                    score = -pos.X;
                }
                else
                {
                    var dir = new Vector3(pos.X, 0.0f, pos.Z);
                    dir.Normalize();
                    var dot   = Vector3.Dot(dir, Vector3.Forward);
                    var cross = Vector3.Cross(dir, Vector3.Forward);
                    if (relation == DeviceRelation.Leftmost)
                    {
                        score = (cross.Y > 0.0f) ? 2.0f - dot : dot;
                    }
                    else
                    {
                        score = (cross.Y < 0.0f) ? 2.0f - dot : dot;
                    }
                }

                if (score > best)
                {
                    result = i;
                    best   = score;
                }
            }

            return(result);
        }
        /// <summary>
        /// Scan for available Vive Tracker devices and creates ViveTracker objects accordingly.
        /// Init OpenVR if not already done.
        /// </summary>
        public override void RefreshTrackers()
        {
            // Delete existing ViveTrackers
            foreach (ViveTracker tracker in _trackers)
            {
                Destroy(tracker.gameObject);
            }
            _trackers.Clear();

            // OVR check
            if (!_ovrInit)
            {
                _ovrInit = _InitOpenVR();
                if (!_ovrInit)
                {
                    return;
                }
            }

            Debug.Log("[ViveTrackersManager] Scanning for Tracker devices...");
            for (uint i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; ++i)
            {
                ETrackedDeviceClass deviceClass = _cvrSystem.GetTrackedDeviceClass(i);
                if (deviceClass == ETrackedDeviceClass.GenericTracker)
                {
                    string sn = _GetTrackerSerialNumber(i);
                    if (logTrackersDetection)
                    {
                        Debug.Log("[ViveTrackersManager] Tracker detected : " + sn);
                    }

                    if (sn != "")
                    {
                        string trackerName = "";
                        bool   declared    = _declaredTrackers.TryGetValue(sn, out trackerName);
                        // Creates only trackers declared in config file or all (if !createDeclaredTrackersOnly).
                        if (declared || !createDeclaredTrackersOnly)
                        {
                            ViveTracker vt = GameObject.Instantiate <ViveTracker>(prefab, origin.transform.position, origin.transform.rotation, origin.transform);
                            vt.Init(new ViveTrackerID(i, sn), declared ? trackerName : sn);
                            _trackers.Add(vt);
                        }
                    }
                }
            }

            // Check
            if (_trackers.Count == 0)
            {
                Debug.LogWarning("[ViveTrackersManager] No trackers available !");
                return;
            }

            // Sort Trackers by name.
            _trackers.Sort((ViveTracker x, ViveTracker y) => { return(string.Compare(x.name, y.name)); });

            Debug.Log(string.Format("[ViveTrackersManager] {0} trackers declared and {1} trackers available:", _declaredTrackers.Count, _trackers.Count));
            foreach (ViveTracker tracker in _trackers)
            {
                Debug.Log(string.Format("[ViveTrackersManager] -> Tracker : Name = {0} ; SN = {1} ; Index = {2}", tracker.name, tracker.ID.TrackedDevice_SerialNumber, tracker.ID.TrackedDevice_Index));
            }

            // Fire Action.
            if (TrackersFound != null)
            {
                TrackersFound(_trackers);
            }
        }
Esempio n. 10
0
 /*
  * This should be up and running.
  */
 private static void SaveDeviceClass(ETrackedDeviceClass deviceClass, uint index)
 {
     deviceToIndex[deviceClass].Add(index);
 }
Esempio n. 11
0
    // Token: 0x06005EA4 RID: 24228 RVA: 0x002124B4 File Offset: 0x002108B4
    public static int GetDeviceIndex(SteamVR_Controller.DeviceRelation relation, ETrackedDeviceClass deviceClass = ETrackedDeviceClass.Controller, int relativeTo = 0)
    {
        int result = -1;

        SteamVR_Utils.RigidTransform t = (relativeTo >= 16) ? SteamVR_Utils.RigidTransform.identity : SteamVR_Controller.Input(relativeTo).transform.GetInverse();
        CVRSystem system = OpenVR.System;

        if (system == null)
        {
            return(result);
        }
        float num  = float.MinValue;
        int   num2 = 0;

        while ((long)num2 < 16L)
        {
            if (num2 != relativeTo && system.GetTrackedDeviceClass((uint)num2) == deviceClass)
            {
                SteamVR_Controller.Device device = SteamVR_Controller.Input(num2);
                if (device.connected)
                {
                    if (relation == SteamVR_Controller.DeviceRelation.First)
                    {
                        return(num2);
                    }
                    Vector3 vector = t * device.transform.pos;
                    float   num3;
                    if (relation == SteamVR_Controller.DeviceRelation.FarthestRight)
                    {
                        num3 = vector.x;
                    }
                    else if (relation == SteamVR_Controller.DeviceRelation.FarthestLeft)
                    {
                        num3 = -vector.x;
                    }
                    else
                    {
                        Vector3 vector2    = new Vector3(vector.x, 0f, vector.z);
                        Vector3 normalized = vector2.normalized;
                        float   num4       = Vector3.Dot(normalized, Vector3.forward);
                        Vector3 vector3    = Vector3.Cross(normalized, Vector3.forward);
                        if (relation == SteamVR_Controller.DeviceRelation.Leftmost)
                        {
                            num3 = ((vector3.y <= 0f) ? num4 : (2f - num4));
                        }
                        else
                        {
                            num3 = ((vector3.y >= 0f) ? num4 : (2f - num4));
                        }
                    }
                    if (num3 > num)
                    {
                        result = num2;
                        num    = num3;
                    }
                }
            }
            num2++;
        }
        return(result);
    }
Esempio n. 12
0
        public void GetDevices(Dictionary <string, TrackedDevice> devices)
        {
            devices.Clear();
            bool changeDetected = false;

            _openVRFacade.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, _poses);

            for (uint i = 0; i < _poses.Length; i++)
            {
                DeviceUse use = DeviceUse.Unknown;

                bool   isConnected  = _devices[i].isConnected;
                string modelName    = _devices[i].modelName;
                string serialNumber = _devices[i].serialNumber;

                ETrackedDeviceClass    deviceClass    = _openVRFacade.GetTrackedDeviceClass(i);
                ETrackedControllerRole controllerRole = _openVRFacade.GetControllerRoleForTrackedDeviceIndex(i);
                string role = _openVRFacade.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_ControllerType_String);

                if (_poses[i].bDeviceIsConnected != isConnected)
                {
                    isConnected = _poses[i].bDeviceIsConnected;

                    if (_poses[i].bDeviceIsConnected)
                    {
                        modelName    = _openVRFacade.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_ModelNumber_String);
                        serialNumber = _openVRFacade.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_SerialNumber_String);

                        _logger.Info($"Device '{modelName}' (class '{deviceClass}', serial number '{serialNumber}') connected at index {i}");
                    }
                    else
                    {
                        _logger.Info($"Device '{modelName}' (class '{deviceClass}', serial number '{serialNumber}') disconnected from index {i}");

                        modelName    = null;
                        serialNumber = null;
                    }

                    changeDetected = true;
                }

                if (deviceClass != _devices[i].deviceClass)
                {
                    _logger.Trace($"Device '{serialNumber}' class changed from '{_devices[i].deviceClass}' to '{deviceClass}'");

                    changeDetected = true;
                }

                if (controllerRole != _devices[i].controllerRole)
                {
                    _logger.Trace($"Device '{serialNumber}' role changed from '{_devices[i].controllerRole}' to '{controllerRole}'");

                    changeDetected = true;
                }

                if (role != _devices[i].role)
                {
                    if (role == null)
                    {
                        _logger.Trace($"Device '{serialNumber}' role unset from '{_devices[i].role}'");
                    }
                    else if (_devices[i].role == null)
                    {
                        _logger.Trace($"Device '{serialNumber}' role set to '{role}'");
                    }
                    else
                    {
                        _logger.Trace($"Device '{serialNumber}' role changed from '{_devices[i].role}' to '{role}'");
                    }

                    changeDetected = true;
                }

                switch (deviceClass)
                {
                case ETrackedDeviceClass.HMD:
                    use = DeviceUse.Head;
                    break;

                case ETrackedDeviceClass.Controller:
                    switch (controllerRole)
                    {
                    case ETrackedControllerRole.LeftHand:
                        use = DeviceUse.LeftHand;
                        break;

                    case ETrackedControllerRole.RightHand:
                        use = DeviceUse.RightHand;
                        break;
                    }

                    break;

                case ETrackedDeviceClass.GenericTracker:
                    switch (role)
                    {
                    case "vive_tracker_waist":
                        use = DeviceUse.Waist;
                        break;

                    case "vive_tracker_left_foot":
                        use = DeviceUse.LeftFoot;
                        break;

                    case "vive_tracker_right_foot":
                        use = DeviceUse.RightFoot;
                        break;
                    }

                    break;
                }

                bool isTracking = _poses[i].bPoseIsValid && _validTrackingResults.Contains(_poses[i].eTrackingResult);

                if (_devices[i].isTracking != isTracking)
                {
                    if (isTracking)
                    {
                        _logger.Info($"Acquired tracking of device '{serialNumber}'");
                    }
                    else
                    {
                        _logger.Info($"Lost tracking of device '{serialNumber}'");
                    }

                    changeDetected = true;
                }

                Vector3    position = Vector3.zero;
                Quaternion rotation = Quaternion.identity;

                if (isTracking)
                {
                    position = _openVRFacade.GetPosition(_poses[i].mDeviceToAbsoluteTracking);
                    rotation = _openVRFacade.GetRotation(_poses[i].mDeviceToAbsoluteTracking);

                    // Driver4VR rotation correction
                    if (role.StartsWith("d4vr_tracker_") && (use == DeviceUse.LeftFoot || use == DeviceUse.RightFoot))
                    {
                        rotation *= Quaternion.Euler(-90, 180, 0);
                    }

                    // KinectToVR rotation correction
                    if (role == "kinect_device")
                    {
                        if (use == DeviceUse.Waist)
                        {
                            rotation *= Quaternion.Euler(-90, 180, 0);
                        }

                        if (use == DeviceUse.LeftFoot || use == DeviceUse.RightFoot)
                        {
                            rotation *= Quaternion.Euler(0, 180, 0);
                        }
                    }
                }

                _devices[i] = new OpenVRDevice(isConnected, isTracking, controllerRole, deviceClass, modelName, serialNumber, role);

                if (isConnected)
                {
                    devices.Add(serialNumber, new TrackedDevice(serialNumber, use, isTracking, position, rotation));
                }
            }

            if (changeDetected)
            {
                devicesChanged?.Invoke();
            }
        }
Esempio n. 13
0
 public OpenVRDevice(bool isConnected, bool isTracking, ETrackedControllerRole controllerRole, ETrackedDeviceClass deviceClass, string modelName, string serialNumber, string role)
 {
     this.isConnected    = isConnected;
     this.isTracking     = isTracking;
     this.controllerRole = controllerRole;
     this.deviceClass    = deviceClass;
     this.modelName      = modelName;
     this.serialNumber   = serialNumber;
     this.role           = role;
 }
Esempio n. 14
0
	public abstract uint GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass,uint [] punTrackedDeviceIndexArray,uint unRelativeToTrackedDeviceIndex);
    public static int GetDeviceIndex(DeviceRelation relation,
                                     ETrackedDeviceClass deviceClass = ETrackedDeviceClass.Controller,
                                     int relativeTo = (int)OpenVR.k_unTrackedDeviceIndex_Hmd) // use -1 for absolute tracking space
    {
        var result = -1;

        var invXform = ((uint)relativeTo < OpenVR.k_unMaxTrackedDeviceCount) ?
                       Input(relativeTo).transform.GetInverse() : SteamVR_Utils.RigidTransform.identity;

        var system = OpenVR.System;

        if (system == null)
        {
            return(result);
        }

        var best = -float.MaxValue;

        for (int i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
        {
            if (i == relativeTo || system.GetTrackedDeviceClass((uint)i) != deviceClass)
            {
                continue;
            }

            var device = Input(i);
            if (!device.connected)
            {
                continue;
            }

            if (relation == DeviceRelation.First)
            {
                return(i);
            }

            float score;

            var pos = invXform * device.transform.pos;
            if (relation == DeviceRelation.FarthestRight)
            {
                score = pos.x;
            }
            else if (relation == DeviceRelation.FarthestLeft)
            {
                score = -pos.x;
            }
            else
            {
                var dir   = new Vector3(pos.x, 0.0f, pos.z).normalized;
                var dot   = Vector3.Dot(dir, Vector3.forward);
                var cross = Vector3.Cross(dir, Vector3.forward);
                if (relation == DeviceRelation.Leftmost)
                {
                    score = (cross.y > 0.0f) ? 2.0f - dot : dot;
                }
                else
                {
                    score = (cross.y < 0.0f) ? 2.0f - dot : dot;
                }
            }

            if (score > best)
            {
                result = i;
                best   = score;
            }
        }

        return(result);
    }
Esempio n. 16
0
	public override uint GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass eTrackedDeviceClass,uint [] punTrackedDeviceIndexArray,uint unRelativeToTrackedDeviceIndex)
	{
		CheckIfUsable();
		uint result = VRNativeEntrypoints.VR_IVRSystem_GetSortedTrackedDeviceIndicesOfClass(m_pVRSystem,eTrackedDeviceClass,punTrackedDeviceIndexArray,(uint) punTrackedDeviceIndexArray.Length,unRelativeToTrackedDeviceIndex);
		return result;
	}
Esempio n. 17
0
 public abstract void OnConnectedDeviceChanged(uint deviceIndex, ETrackedDeviceClass deviceClass, string deviceSN, bool connected);