// use -1 for absolute tracking space
    public static int GetDeviceIndex(DeviceRelation relation,
		TrackedDeviceClass deviceClass = TrackedDeviceClass.Controller,
		int relativeTo = (int)OpenVR.k_unTrackedDeviceIndex_Hmd)
    {
        var invXform = ((uint)relativeTo < OpenVR.k_unTrackedDeviceIndex_Hmd) ?
            Input(relativeTo).transform.GetInverse() : SteamVR_Utils.RigidTransform.identity;

        var vr = SteamVR.instance;
        var result = -1;
        var best = -float.MaxValue;
        var dir = (relation == DeviceRelation.Leftmost) ? Vector3.left : Vector3.right;
        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;

            var score = Vector3.Dot(dir, invXform * device.transform.pos);
            if (score > best)
            {
                result = i;
                best = score;
            }
        }

        return result;
    }
    // use -1 for absolute tracking space
    public static int GetDeviceIndex(DeviceRelation relation,
		TrackedDeviceClass deviceClass = TrackedDeviceClass.Controller,
		int relativeTo = (int)OpenVR.k_unTrackedDeviceIndex_Hmd)
    {
        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. 3
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 result = -1;

            var invXform = ((uint)relativeTo < OpenVR.k_unMaxTrackedDeviceCount) ?
                           Matrix.Invert(Input(relativeTo).transform) : 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.transform.Pos(), invXform);
                if (relation == DeviceRelation.FarthestRight)
                {
                    score = pos.X;
                }
                else if (relation == DeviceRelation.FarthestLeft)
                {
                    score = -pos.X;
                }
                else
                {
                    var dir   = Vector3.Normalize(new Vector3(pos.X, 0.0f, pos.Z));
                    var dot   = Vector3.Dot(dir, Vector3.UnitZ);
                    var cross = Vector3.Cross(dir, Vector3.UnitZ);
                    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. 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 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);
    }