public void ResetOrigins(CVRInput vrInput) { if (CurrentHandle == OpenVR.k_ulInvalidActionHandle) { m_originIterator = -1; return; } m_originIterator = 0; var error = vrInput.GetActionOrigins(s_actionSetHandle, CurrentHandle, s_actionOrigins); if (error != EVRInputError.None) { Debug.LogError("GetActionOrigins failed! action=" + CurrentPath + " error=" + error); } }
//ActionセットとActionを指定すると、それが取得できる元のパスのListを返す public List <OriginSource> GetActionOriginsList(string ActionSetPath, string ActionPath) { ReadyCheck(); //実行可能な状態かチェック EVRInputError inputError = EVRInputError.None; ulong sethandle = GetActionSetHandle(ActionSetPath); //無効なハンドルならthrowされる ulong handle = GetActionHandle(ActionPath); //無効なハンドルならthrowされる //取得処理 ulong[] origins = new ulong[1024]; inputError = vrinput.GetActionOrigins(sethandle, handle, origins); if (inputError == EVRInputError.WrongType) { //姿勢ではない throw new ArgumentException(inputError.ToString()); } if (inputError != EVRInputError.None) { //致命的エラー throw new IOException(inputError.ToString()); } List <OriginSource> list = new List <OriginSource>(); for (int i = 0; i < 1024; i++) { if (origins[i] == OpenVR.k_ulInvalidInputValueHandle) { break; } OriginSource origin = GetOriginSourceFromInternalHandle(origins[i]); if (origin != null) { list.Add(origin); } } return(list); }
private IEnumerator <ActionCollection <T> .EnumData> AllActionDevicePathEnumerator <T>(CVRInput vrInput, ActionCollection <T> actionCollection) #if CSHARP_7_OR_LATER where T : Enum #endif { IVRModuleDeviceState prevState; IVRModuleDeviceStateRW currState; EVRInputError error; var current = default(ActionCollection <T> .EnumData); foreach (var p in actionCollection.ActionHandles.EnumValues) { current.inputKey = p.Key; current.actionHandle = p.Value; if (current.actionHandle == OpenVR.k_ulInvalidActionHandle) { continue; } Array.Clear(outActionOrigins, 0, outActionOrigins.Length); error = vrInput.GetActionOrigins(s_actionSetHandle, current.actionHandle, outActionOrigins); while (error == EVRInputError.BufferTooSmall && outActionOrigins.Length <= 4096) { Array.Resize(ref outActionOrigins, outActionOrigins.Length * 2); Debug.LogWarning("Expanding outActionOrigins size to " + outActionOrigins.Length); error = vrInput.GetActionOrigins(s_actionSetHandle, current.actionHandle, outActionOrigins); } if (error != EVRInputError.None) { Debug.LogError("[SteamVRv2Module] CVRInput.GetActionOrigins fail. input=" + p.Key + " action=" + actionCollection.ActionPaths[p.Key] + " error=" + error); continue; } foreach (var originHandle in outActionOrigins) { if (originHandle == 0ul) { break; } OriginData data; error = m_originDataCache.TryGetOriginData(vrInput, originHandle, out data); if (error != EVRInputError.None) { Debug.LogError("[SteamVRv2Module] CVRInput.GetOriginTrackedDeviceInfo fail. input=" + p.Key + " action=" + actionCollection.ActionPaths[p.Key] + " originHandle=" + originHandle + " error=" + error); continue; } current.devicePathHandle = data.devicePathHandle; uint moduleIndex; if (!m_indexMap.TryGetModuleIndex(data.deviceIndex, out moduleIndex)) { continue; } if (!TryGetValidDeviceState(moduleIndex, out prevState, out currState)) { continue; } current.currState = currState; yield return(current); } } }