You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			112 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			112 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
//======= Copyright (c) Valve Corporation, All rights reserved. ===============
 | 
						|
//
 | 
						|
// Purpose: For controlling in-game objects with tracked devices.
 | 
						|
//
 | 
						|
//=============================================================================
 | 
						|
 | 
						|
using UnityEngine;
 | 
						|
using Valve.VR;
 | 
						|
 | 
						|
namespace Valve.VR
 | 
						|
{
 | 
						|
    public class SteamVR_TrackedObject : MonoBehaviour
 | 
						|
    {
 | 
						|
        public enum EIndex
 | 
						|
        {
 | 
						|
            None = -1,
 | 
						|
            Hmd = (int)OpenVR.k_unTrackedDeviceIndex_Hmd,
 | 
						|
            Device1,
 | 
						|
            Device2,
 | 
						|
            Device3,
 | 
						|
            Device4,
 | 
						|
            Device5,
 | 
						|
            Device6,
 | 
						|
            Device7,
 | 
						|
            Device8,
 | 
						|
            Device9,
 | 
						|
            Device10,
 | 
						|
            Device11,
 | 
						|
            Device12,
 | 
						|
            Device13,
 | 
						|
            Device14,
 | 
						|
            Device15,
 | 
						|
            Device16
 | 
						|
        }
 | 
						|
 | 
						|
        public EIndex index;
 | 
						|
 | 
						|
        [Tooltip("If not set, relative to parent")]
 | 
						|
        public Transform origin;
 | 
						|
 | 
						|
        public bool isValid { get; private set; }
 | 
						|
 | 
						|
        private void OnNewPoses(TrackedDevicePose_t[] poses)
 | 
						|
        {
 | 
						|
            if (index == EIndex.None)
 | 
						|
                return;
 | 
						|
 | 
						|
            var i = (int)index;
 | 
						|
 | 
						|
            isValid = false;
 | 
						|
            if (poses.Length <= i)
 | 
						|
                return;
 | 
						|
 | 
						|
            if (!poses[i].bDeviceIsConnected)
 | 
						|
                return;
 | 
						|
 | 
						|
            if (!poses[i].bPoseIsValid)
 | 
						|
                return;
 | 
						|
 | 
						|
            isValid = true;
 | 
						|
 | 
						|
            var pose = new SteamVR_Utils.RigidTransform(poses[i].mDeviceToAbsoluteTracking);
 | 
						|
 | 
						|
            if (origin != null)
 | 
						|
            {
 | 
						|
                transform.position = origin.transform.TransformPoint(pose.pos);
 | 
						|
                transform.rotation = origin.rotation * pose.rot;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                transform.localPosition = pose.pos;
 | 
						|
                transform.localRotation = pose.rot;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        SteamVR_Events.Action newPosesAction;
 | 
						|
 | 
						|
        SteamVR_TrackedObject()
 | 
						|
        {
 | 
						|
            newPosesAction = SteamVR_Events.NewPosesAction(OnNewPoses);
 | 
						|
        }
 | 
						|
 | 
						|
        private void Awake()
 | 
						|
        {
 | 
						|
            OnEnable();
 | 
						|
        }
 | 
						|
 | 
						|
        void OnEnable()
 | 
						|
        {
 | 
						|
            var render = SteamVR_Render.instance;
 | 
						|
            if (render == null)
 | 
						|
            {
 | 
						|
                enabled = false;
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            newPosesAction.enabled = true;
 | 
						|
        }
 | 
						|
 | 
						|
        void OnDisable()
 | 
						|
        {
 | 
						|
            newPosesAction.enabled = false;
 | 
						|
            isValid = false;
 | 
						|
        }
 | 
						|
 | 
						|
        public void SetDeviceIndex(int index)
 | 
						|
        {
 | 
						|
            if (System.Enum.IsDefined(typeof(EIndex), index))
 | 
						|
                this.index = (EIndex)index;
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |