コード例 #1
0
    public void UnTrack()
    {
        var Frame = new OpenvrControllerFrame();

        Frame.Attached = true;
        Frame.Tracking = false;
        SendFrame(Frame);
    }
コード例 #2
0
 //	calculate the Pressed/Released values
 public void CalculateDiff(OpenvrControllerFrame LastFrame)
 {
     SetDiff(ref TriggerPressed, ref TriggerReleased, TriggerIsDown, LastFrame != null && LastFrame.TriggerIsDown);
     SetDiff(ref TouchpadPressed, ref TouchpadReleased, TouchpadIsDown, LastFrame != null && LastFrame.TouchpadIsDown);
     SetDiff(ref TouchpadClickPressed, ref TouchpadClickReleased, TouchpadClickIsDown, LastFrame != null && LastFrame.TouchpadClickIsDown);
     SetDiff(ref AppButtonPressed, ref AppButtonReleased, AppButtonIsDown, LastFrame != null && LastFrame.AppButtonIsDown);
     SetDiff(ref GripButtonPressed, ref GripButtonReleased, GripButtonIsDown, LastFrame != null && LastFrame.GripButtonIsDown);
 }
コード例 #3
0
    void SendFrame(OpenvrControllerFrame Frame)
    {
        var Frames = new List <OpenvrControllerFrame> ();

        for (int i = 0; i < FakeControllerIndex; i++)
        {
            Frames.Add(null);
        }
        Frames.Add(Frame);
        OpenvrManager.OnUpdateAll.Invoke(Frames);
    }
コード例 #4
0
    void UpdateController(GameObject Controller, OpenvrControllerFrame Frame)
    {
        Controller.SetActive(Frame.Attached);
        Controller.transform.localPosition = Frame.Position;
        Controller.transform.localRotation = Frame.Rotation * TemplateInitialRotation;

        if (Frame.AppButtonPressed)
        {
            var NewDot = GameObject.Instantiate(DotTemplate, this.transform);
            NewDot.transform.localPosition = Frame.Position;
            NewDot.transform.localRotation = Frame.Rotation;
            NewDot.SetActive(true);
        }
    }
コード例 #5
0
    public void TrackPosition(Vector2 uv)
    {
        uv.x /= DisplayWidth / 2.0f;
        uv.y /= DisplayHeight / 2.0f;

        var Frame = new OpenvrControllerFrame();

        Frame.Position.x = uv.x;
        Frame.Position.y = FakeY;
        Frame.Position.z = uv.y;
        Frame.Attached   = true;
        Frame.Tracking   = true;
        SendFrame(Frame);
    }
コード例 #6
0
    void Update()
    {
        if (!UpdateInEditor && Application.isEditor && !Application.isPlaying)
        {
            return;
        }

        if (system == null)
        {
            //	delayed re-init
            if (!CanTryReinit)
            {
                return;
            }

            EVRInitError Error = EVRInitError.None;
            system       = OpenVR.Init(ref Error, EVRApplicationType.VRApplication_Other);
            LastInitTime = Time.time;
            if (system == null)
            {
                Debug.LogError("No vr system: " + Error);
                return;
            }
        }
        var sys = system;

        var MaxDevices = 16;            //	find const in API

        var ControllerFrames = new List <OpenvrControllerFrame>();
        var LighthouseFrames = new List <OpenvrLighthouseFrame>();
        var ValidCount       = 0;

        var PredictedPoses = new TrackedDevicePose_t[MaxDevices];

        sys.GetDeviceToAbsoluteTrackingPose(TrackingOrigin, PredictedPosePhotoDelay, PredictedPoses);

        var ControllerDeviceIndexes = new List <uint>();
        var LighthouseDeviceIndexes = new List <uint>();

        for (uint i = 0; i < MaxDevices; i++)
        {
            var Type = (sys != null) ? sys.GetTrackedDeviceClass(i) : ETrackedDeviceClass.Invalid;
            if (Type == ETrackedDeviceClass.Controller || Type == ETrackedDeviceClass.GenericTracker)
            {
                ControllerDeviceIndexes.Add(i);
            }
            else if (Type == ETrackedDeviceClass.TrackingReference)
            {
                LighthouseDeviceIndexes.Add(i);
            }
        }

        if (DebugState)
        {
            Debug.Log("Found " + ControllerDeviceIndexes.Count + " controllers and " + LighthouseDeviceIndexes.Count + " lighthouses");
        }

        foreach (var i in ControllerDeviceIndexes)
        {
            var State     = new VRControllerState_t();
            var StateSize = (uint)Marshal.SizeOf(State);
            var Pose      = new TrackedDevicePose_t();
            OpenvrControllerFrame LastFrame = null;
            try
            {
                LastFrame = LastControllerFrames[ControllerFrames.Count];
            }
            catch { }

            var Attached = sys.GetControllerStateWithPose(TrackingOrigin, i, ref State, StateSize, ref Pose);
            var DevType  = sys.GetTrackedDeviceClass(i);

            if (UsePredictedPoses)
            {
                Pose = PredictedPoses [i];
            }

            var Frame = Attached ? GetFrame(State, Pose, DevType, LastFrame) : GetFrame(null, null, null, LastFrame);
            ControllerFrames.Add(Frame);

            if (Attached || LastFrame != null)
            {
                ValidCount = (int)i + 1;
            }
        }

        foreach (var i in LighthouseDeviceIndexes)
        {
            //var State = new VRControllerState_t();
            //var StateSize = (uint)Marshal.SizeOf (State);
            TrackedDevicePose_t Pose = new TrackedDevicePose_t();
            Pose.bPoseIsValid = false;

            if (UsePredictedPoses)
            {
                Pose = PredictedPoses [i];
            }

            var Frame = GetLighthouseFrame(Pose);
            LighthouseFrames.Add(Frame);
        }

        OnPreUpdateAll.Invoke(ControllerFrames);
        OnUpdateAll.Invoke(ControllerFrames);
        OnUpdateLighthouses.Invoke(LighthouseFrames);
        LastControllerFrames = ControllerFrames;
    }
コード例 #7
0
    OpenvrControllerFrame GetFrame(VRControllerState_t?pState, TrackedDevicePose_t?pPose, ETrackedDeviceClass?DevType, OpenvrControllerFrame LastFrame)
    {
        var Frame = new OpenvrControllerFrame();

        if (!pState.HasValue || !pPose.HasValue)
        {
            //	if last frame is valid, get a "all-released" frame diff before we return null
            Frame.Attached = false;
            return(Frame);
        }

        var State = pState.Value;
        var Pose  = pPose.Value;

        if (DevType.HasValue)
        {
            Frame.ControllerType = GetDeviceType(DevType.Value);
        }
        else if (LastFrame != null)
        {
            Frame.ControllerType = LastFrame.ControllerType;
        }
        else
        {
            Frame.ControllerType = OpenvrControllerFrame.DeviceType.Unknown;
        }

        Frame.Attached = true;
        Frame.Tracking = Pose.bPoseIsValid;
        RigidTransform(Pose.mDeviceToAbsoluteTracking, ref Frame.Position, ref Frame.Rotation);

        //	apply vertical offset
        if (Frame.Tracking)
        {
            Frame.Position.y += VerticalOffset;
        }

        //	if we're not tracking, use position & rotation from last frame
        if (!Frame.Tracking && LastFrame != null)
        {
            Frame.Position = LastFrame.Position;
            Frame.Rotation = LastFrame.Rotation;
        }

        SetButton(State.ulButtonPressed, EVRButtonId.k_EButton_ApplicationMenu, ref Frame.AppButtonIsDown);
        SetButton(State.ulButtonPressed, EVRButtonId.k_EButton_Grip, ref Frame.GripButtonIsDown);
        SetButton(State.ulButtonPressed, EVRButtonId.k_EButton_SteamVR_Touchpad, ref Frame.TouchpadClickIsDown);
        SetButton(State.ulButtonPressed, EVRButtonId.k_EButton_SteamVR_Trigger, ref Frame.TriggerIsDown);

        SetButton(State.ulButtonTouched, EVRButtonId.k_EButton_ApplicationMenu, ref Frame.TouchpadIsDown);

        //	gr: this is what the docs say, but... touchpad seems to be 0
        //		I guess it's k_eControllerAxis_ -1
        //	EVRControllerAxisType	{
        //k_eControllerAxis_None = 0,
        //k_eControllerAxis_TrackPad = 1,
        //k_eControllerAxis_Joystick = 2,
        //k_eControllerAxis_Trigger = 3,

        Frame.TouchpadAxis = new Vector2(State.rAxis0.x, -State.rAxis0.y);
        Frame.TriggerAxis  = State.rAxis1.x;

        Frame.CalculateDiff(LastFrame);

        return(Frame);
    }