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(); } } } }