/// <summary>Play a haptic impulse on the controller if one is available</summary>
        /// <param name="amplitude">Amplitude (from 0.0 to 1.0) to play impulse at.</param>
        /// <param name="duration">Duration (in seconds) to play haptic impulse.</param>
        public bool SendHapticImpulse(float amplitude, float duration)
        {
            HapticCapabilities capabilities;

            if (InputDevices.GetDeviceAtXRNode(controllerNode).TryGetHapticCapabilities(out capabilities) &&
                capabilities.supportsImpulse)
            {
                return(InputDevices.GetDeviceAtXRNode(controllerNode).SendHapticImpulse(0, amplitude, duration));
            }
            return(false);
        }
        private bool TryResolveDevice(XRNode role, out InputDevice device)
        {
            var inputDevice = InputDevices.GetDeviceAtXRNode(role);

            if (inputDevice.isValid)
            {
                device = inputDevice;
                return(true);
            }
            device = new InputDevice();
            return(false);
        }
        void UpdateTrackingInput()
        {
            Vector3 devicePosition = new Vector3();

            if (InputDevices.GetDeviceAtXRNode(controllerNode).TryGetFeatureValue(CommonUsages.devicePosition, out devicePosition))
            {
                transform.localPosition = devicePosition;
            }

            Quaternion deviceRotation = new Quaternion();

            if (InputDevices.GetDeviceAtXRNode(controllerNode).TryGetFeatureValue(CommonUsages.deviceRotation, out deviceRotation))
            {
                transform.localRotation = deviceRotation;
            }
        }
        void HandleInteractionAction(XRNode node, string usage, ref InteractionState interactionState)
        {
            float value       = 0.0f;
            var   inputDevice = InputDevices.GetDeviceAtXRNode(node);

            if (inputDevice.isValid && inputDevice.TryGetFeatureValue(new InputFeatureUsage <float>(usage), out value) &&
                value >= m_AxisToPressThreshold)
            {
                if (!interactionState.active)
                {
                    interactionState.activatedThisFrame = true;
                    interactionState.active             = true;
                }
            }
            else
            {
                if (interactionState.active)
                {
                    interactionState.deActivatedThisFrame = true;
                    interactionState.active = false;
                }
            }
        }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="deviceNode">Device from which take the input</param>
 internal InputDeviceWrapper(XRNode deviceNode)
 {
     m_inputDevice     = InputDevices.GetDeviceAtXRNode(deviceNode);
     this.m_deviceNode = deviceNode;
     this.m_isSteamVR  = m_inputDevice.subsystem != null && m_inputDevice.subsystem.SubsystemDescriptor.id == "OpenVR Input";
 }