public EVRInputError TryGetOriginData(CVRInput vrInput, ulong originHandle, out OriginData originData) { if (cache.TryGetValue(originHandle, out originData)) { return(EVRInputError.None); } var info = default(InputOriginInfo_t); var error = vrInput.GetOriginTrackedDeviceInfo(originHandle, ref info, originInfoSize); if (error == EVRInputError.None) { cache.Add(originHandle, originData = new OriginData() { devicePathHandle = info.devicePath, deviceIndex = info.trackedDeviceIndex, }); index2PathHandle[originData.deviceIndex] = originData.devicePathHandle; } else { originData = default(OriginData); } return(error); }
private bool TryGetDeviceIndexFromOrigin(CVRInput vrInput, ulong origin, out OriginData originData, out EVRInputError error) { if (!m_originDataCache.TryGetValue(origin, out originData)) { var originInfo = default(InputOriginInfo_t); error = vrInput.GetOriginTrackedDeviceInfo(origin, ref originInfo, m_originInfoSize); if (error != EVRInputError.None) { originData = new OriginData() { devicePath = OpenVR.k_ulInvalidInputValueHandle, deviceIndex = OpenVR.k_unTrackedDeviceIndexInvalid, }; return(false); } else { originData = new OriginData() { devicePath = originInfo.devicePath, deviceIndex = originInfo.trackedDeviceIndex, }; s_devicePathHandles[originInfo.trackedDeviceIndex] = originInfo.devicePath; //Debug.Log("Set device path " + originInfo.trackedDeviceIndex + " to " + originInfo.devicePath); m_originDataCache.Add(origin, originData); return(true); } } else { error = EVRInputError.None; return(true); } }
//---------------アクション情報取得系------------------- //ハンドルから入力元デバイスの情報を取得する //また入力ソースハンドルを逆引きしてpathにまで戻す。 public OriginSource GetOriginSourceFromInternalHandle(ulong Handle) { ReadyCheck(); //実行可能な状態かチェック EVRInputError inputError = EVRInputError.None; //デバイス情報を取得 InputOriginInfo_t originInfo = new InputOriginInfo_t(); var size = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(InputOriginInfo_t)); inputError = vrinput.GetOriginTrackedDeviceInfo(Handle, ref originInfo, size); if (inputError != EVRInputError.None) { return(null); //情報なし } //デバイス情報を作成 OriginSource origin = new OriginSource(originInfo, Handle); //デバイスハンドルから探索して見つかれば格納 foreach (KeyValuePair <string, ulong> p in InputSourceHandles) { if (p.Value == originInfo.devicePath) { origin.DevicePath = p.Key; } } return(origin); }