37 public vr::IVRDriverContext,
38 public vr::IVRServerDriverHost,
39 public vr::IVRDriverInput,
40 public vr::IVRProperties,
41 public vr::IVRDriverLog,
42 public std::enable_shared_from_this<Context>
56 uint64_t current_frame{0};
58 std::vector<vr::VRInputComponentHandle_t> handles;
59 std::unordered_map<vr::VRInputComponentHandle_t, xrt_input *> handle_to_input;
62 vr::VRInputComponentHandle_t x;
63 vr::VRInputComponentHandle_t y;
65 std::unordered_map<vr::VRInputComponentHandle_t, Vec2Components *> vec2_inputs;
66 std::unordered_map<xrt_input *, std::unique_ptr<Vec2Components>> vec2_input_to_components;
67 std::unordered_map<vr::VRInputComponentHandle_t, ControllerDevice *> skeleton_to_controller;
71 std::chrono::steady_clock::time_point insert_time;
74 std::deque<Event> events;
75 size_t events_tail{0};
76 std::mutex event_queue_mut;
77 std::condition_variable event_popped;
80 prop_container_to_device(vr::PropertyContainerHandle_t handle);
83 create_component_common(vr::PropertyContainerHandle_t container,
85 vr::VRInputComponentHandle_t *handle);
88 update_component_common(vr::VRInputComponentHandle_t handle,
90 std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now());
93 setup_hmd(
const char *serial, vr::ITrackedDeviceServerDriver *driver);
96 setup_controller(
const char *serial, vr::ITrackedDeviceServerDriver *driver);
97 std::vector<vr::IServerTrackedDeviceProvider *> providers;
99 inline vr::VRInputComponentHandle_t
102 vr::VRInputComponentHandle_t h = handles.size() + 1;
103 handles.push_back(h);
111 std::mutex devices_mut;
124 std::condition_variable discover_cv;
125 std::chrono::steady_clock::time_point discover_end_time;
126 std::atomic<bool> frame_thread_run;
127 std::binary_semaphore frame_thread_event{0};
128 std::thread frame_thread;
131 add_event_locked(vr::VREvent_t event);
136 [[nodiscard]]
static std::shared_ptr<Context>
137 create(
const std::string &steam_install,
138 const std::string &steamvr_install,
139 std::vector<vr::IServerTrackedDeviceProvider *> providers);
142 add_haptic_event(vr::VREvent_HapticVibration_t event,
size_t old_event_index);
145 add_vendor_event(vr::EVREventType
type,
const vr::VREvent_Data_t &data = {})
147 VendorSpecificEvent(0,
type, data, 0);
151 Log(
const char *pchLogMessage)
override;
156 GetGenericInterface(
const char *pchInterfaceVersion, vr::EVRInitError *peError)
override;
159 GetDriverHandle()
override;
163 TrackedDeviceAdded(
const char *pchDeviceSerialNumber,
164 vr::ETrackedDeviceClass eDeviceClass,
165 vr::ITrackedDeviceServerDriver *pDriver)
override;
168 TrackedDevicePoseUpdated(uint32_t unWhichDevice,
169 const vr::DriverPose_t &newPose,
170 uint32_t unPoseStructSize)
override;
173 VsyncEvent(
double vsyncTimeOffsetSeconds)
override;
176 VendorSpecificEvent(uint32_t unWhichDevice,
177 vr::EVREventType eventType,
178 const vr::VREvent_Data_t &eventData,
179 double eventTimeOffset)
override;
182 IsExiting()
override;
185 PollNextEvent(vr::VREvent_t *pEvent, uint32_t uncbVREvent)
override;
188 GetRawTrackedDevicePoses(
float fPredictedSecondsFromNow,
189 vr::TrackedDevicePose_t *pTrackedDevicePoseArray,
190 uint32_t unTrackedDevicePoseArrayCount)
override;
193 RequestRestart(
const char *pchLocalizedReason,
194 const char *pchExecutableToStart,
195 const char *pchArguments,
196 const char *pchWorkingDirectory)
override;
199 GetFrameTimings(vr::Compositor_FrameTiming *pTiming, uint32_t nFrames)
override;
202 SetDisplayEyeToHead(uint32_t unWhichDevice,
203 const vr::HmdMatrix34_t &eyeToHeadLeft,
204 const vr::HmdMatrix34_t &eyeToHeadRight)
override;
207 SetDisplayProjectionRaw(uint32_t unWhichDevice,
208 const vr::HmdRect2_t &eyeLeft,
209 const vr::HmdRect2_t &eyeRight)
override;
212 SetRecommendedRenderTargetSize(uint32_t unWhichDevice, uint32_t nWidth, uint32_t nHeight)
override;
217 CreateBooleanComponent(vr::PropertyContainerHandle_t ulContainer,
219 vr::VRInputComponentHandle_t *pHandle)
override;
222 UpdateBooleanComponent(vr::VRInputComponentHandle_t ulComponent,
bool bNewValue,
double fTimeOffset)
override;
225 CreateScalarComponent(vr::PropertyContainerHandle_t ulContainer,
227 vr::VRInputComponentHandle_t *pHandle,
228 vr::EVRScalarType eType,
229 vr::EVRScalarUnits eUnits)
override;
232 UpdateScalarComponent(vr::VRInputComponentHandle_t ulComponent,
float fNewValue,
double fTimeOffset)
override;
235 CreateHapticComponent(vr::PropertyContainerHandle_t ulContainer,
237 vr::VRInputComponentHandle_t *pHandle)
override;
240 CreateSkeletonComponent(vr::PropertyContainerHandle_t ulContainer,
242 const char *pchSkeletonPath,
243 const char *pchBasePosePath,
244 vr::EVRSkeletalTrackingLevel eSkeletalTrackingLevel,
245 const vr::VRBoneTransform_t *pGripLimitTransforms,
246 uint32_t unGripLimitTransformCount,
247 vr::VRInputComponentHandle_t *pHandle)
override;
250 UpdateSkeletonComponent(vr::VRInputComponentHandle_t ulComponent,
251 vr::EVRSkeletalMotionRange eMotionRange,
252 const vr::VRBoneTransform_t *pTransforms,
253 uint32_t unTransformCount)
override;
256 CreatePoseComponent(vr::PropertyContainerHandle_t ulContainer,
258 vr::VRInputComponentHandle_t *pHandle)
override;
261 UpdatePoseComponent(vr::VRInputComponentHandle_t ulComponent,
262 const vr::HmdMatrix34_t *pMatPoseOffset,
263 double fTimeOffset)
override;
266 CreateEyeTrackingComponent(vr::PropertyContainerHandle_t ulContainer,
268 vr::VRInputComponentHandle_t *pHandle)
override;
271 UpdateEyeTrackingComponent(vr::VRInputComponentHandle_t ulComponent,
272 const vr::VREyeTrackingData_t *pEyeTrackingData,
273 double fTimeOffset)
override;
277 vr::ETrackedPropertyError
278 ReadPropertyBatch(vr::PropertyContainerHandle_t ulContainerHandle,
279 vr::PropertyRead_t *pBatch,
280 uint32_t unBatchEntryCount)
override;
282 vr::ETrackedPropertyError
283 WritePropertyBatch(vr::PropertyContainerHandle_t ulContainerHandle,
284 vr::PropertyWrite_t *pBatch,
285 uint32_t unBatchEntryCount)
override;
288 GetPropErrorNameFromEnum(vr::ETrackedPropertyError error)
override;
290 vr::PropertyContainerHandle_t
291 TrackedDeviceToPropertyContainer(vr::TrackedDeviceIndex_t nDevice)
override;
static std::shared_ptr< Context > create(const std::string &steam_install, const std::string &steamvr_install, std::vector< vr::IServerTrackedDeviceProvider * > providers)
Since only the devices will live after our get_devices function is called, we make our Context a shar...
Definition steamvr_lh.cpp:162