public void UnTrack() { var Frame = new OpenvrControllerFrame(); Frame.Attached = true; Frame.Tracking = false; SendFrame(Frame); }
// 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); }
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); }
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); } }
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); }
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; }
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); }