public void Update()
 {
     for (uint deviceIdx = 0; deviceIdx < OpenVR.k_unMaxTrackedDeviceCount; ++deviceIdx)
     {
         ControllerStateTracker controllerStateTracker = controllerStateTrackers[deviceIdx];
         controllerStateTracker.Update();
     }
 }
Esempio n. 2
0
    public void Update(FrameUpdateParameters updateParameters)
    {
        if (trackedDeviceIdx == UnattachedSentinel)
        {
            for (uint deviceIdx = 0; deviceIdx < OpenVR.k_unMaxTrackedDeviceCount; ++deviceIdx)
            {
                ControllerStateTracker stateTracker = controllerManager.StateTrackers[deviceIdx];
                if (!stateTracker.NonMenuActive)
                {
                    continue;
                }

                if (!stateTracker.IsPressed(EVRButtonId.k_EButton_Grip))
                {
                    continue;
                }

                trackedDeviceIdx = deviceIdx;

                TrackedDevicePose_t gamePose      = updateParameters.GamePoses[deviceIdx];
                Matrix controllerToWorldTransform = gamePose.mDeviceToAbsoluteTracking.Convert();

                Matrix worldToControllerTransform = Matrix.Invert(controllerToWorldTransform);

                objectToControllerTransform = objectToWorldTransform * worldToControllerTransform;
            }
        }

        if (trackedDeviceIdx != UnattachedSentinel)
        {
            ControllerStateTracker stateTracker = controllerManager.StateTrackers[trackedDeviceIdx];

            if (!stateTracker.NonMenuActive || !stateTracker.IsPressed(EVRButtonId.k_EButton_Grip))
            {
                trackedDeviceIdx = UnattachedSentinel;
                return;
            }

            TrackedDevicePose_t gamePose      = updateParameters.GamePoses[trackedDeviceIdx];
            Matrix controllerToWorldTransform = gamePose.mDeviceToAbsoluteTracking.Convert();

            objectToWorldTransform = objectToControllerTransform * controllerToWorldTransform;
        }
    }
Esempio n. 3
0
 public DeviceTracker(InverseKinematicsUserInterface parentInstance, ControllerStateTracker stateTracker)
 {
     this.parentInstance = parentInstance;
     this.stateTracker   = stateTracker;
 }
    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();
                }
            }
        }
    }