public void Update()
    {
        for (uint deviceIdx = 0; deviceIdx < OpenVR.k_unMaxTrackedDeviceCount; ++deviceIdx)
        {
            ControllerStateTracker controllerStateTracker = controllerManager.StateTrackers[deviceIdx];

            if (!controllerStateTracker.MenuActive)
            {
                continue;
            }

            uint        primaryAxisIdx      = 0;
            EVRButtonId primaryAxisButtonId = EVRButtonId.k_EButton_Axis0 + (int)primaryAxisIdx;

            if (controllerStateTracker.WasClicked(primaryAxisButtonId) ||
                controllerStateTracker.WasClicked(EVRButtonId.k_EButton_A))                   //k_EButton_A is the A/X button on touch
            {
                model.Press();
            }

            if (controllerStateTracker.WasClicked(EVRButtonId.k_EButton_Grip))
            {
                model.PressSecondary();
            }

            EVRControllerAxisType axisType = (EVRControllerAxisType)OpenVR.System.GetInt32TrackedDeviceProperty(deviceIdx,
                                                                                                                ETrackedDeviceProperty.Prop_Axis0Type_Int32 + (int)primaryAxisIdx);

            if (axisType == EVRControllerAxisType.k_eControllerAxis_TrackPad)
            {
                //use interial scrolling
                if (controllerStateTracker.HasTouchDelta(primaryAxisIdx))
                {
                    Vector2 delta = controllerStateTracker.GetTouchDelta(primaryAxisIdx);
                    velocities[deviceIdx] = delta / controllerStateTracker.GetUpdateRate();
                    ApplyDelta(delta, deviceIdx, primaryAxisIdx);
                }
                else if (!controllerStateTracker.IsTouched(primaryAxisButtonId))
                {
                    Vector2 velocity = velocities[deviceIdx];
                    if (velocity != Vector2.Zero)
                    {
                        if (velocity.LengthSquared() < 1e-5f)
                        {
                            velocity = Vector2.Zero;
                            model.DoneMove();
                        }
                        else
                        {
                            velocity *= 0.99f;
                            ApplyDelta(velocity, deviceIdx, primaryAxisIdx);
                        }
                        velocities[deviceIdx] = velocity;
                    }
                }
            }
            else
            {
                //use velocity scrolling
                if (controllerStateTracker.IsTouched(primaryAxisButtonId))
                {
                    Vector2 position = controllerStateTracker.GetAxisPosition(primaryAxisIdx);
                    Vector2 velocity = PowerCurve(position, 2) * 0.2f;
                    Vector2 delta    = velocity;
                    ApplyDelta(delta, deviceIdx, primaryAxisIdx);
                }
                else if (controllerStateTracker.BecameUntouched(primaryAxisButtonId))
                {
                    model.DoneMove();
                }
            }
        }
    }