The open source OpenXR runtime
1#pragma once
2
3// openvr.h
4//========= Copyright Valve Corporation ============//
5// Dynamically generated file. Do not modify this file directly.
6
7#ifndef _OPENVR_API
8#define _OPENVR_API
9
10#include <stdint.h>
11
12
13
14// version.h
15
16namespace vr
17{
18 static const uint32_t k_nSteamVRVersionMajor = 1;
19 static const uint32_t k_nSteamVRVersionMinor = 16;
20 static const uint32_t k_nSteamVRVersionBuild = 8;
21} // namespace vr
22
23// public_vrtypes.h
24
25#ifndef _INCLUDE_CORE_VRTYPES_PUBLIC_H
26#define _INCLUDE_CORE_VRTYPES_PUBLIC_H
27
28namespace vr
29{
30#pragma pack( push, 8 )
31
32// right-handed system
33// +y is up
34// +x is to the right
35// -z is forward
36// Distance unit is meters
37struct HmdMatrix34_t
38{
39 float m[3][4];
40};
41
42struct HmdMatrix33_t
43{
44 float m[3][3];
45};
46
47struct HmdMatrix44_t
48{
49 float m[4][4];
50};
51
52struct HmdVector3_t
53{
54 float v[3];
55};
56
57struct HmdVector4_t
58{
59 float v[4];
60};
61
62struct HmdVector3d_t
63{
64 double v[3];
65};
66
67struct HmdVector2_t
68{
69 float v[2];
70};
71
72struct HmdQuaternion_t
73{
74 double w, x, y, z;
75};
76
77struct HmdQuaternionf_t
78{
79 float w, x, y, z;
80};
81
82struct HmdColor_t
83{
84 float r, g, b, a;
85};
86
87struct HmdQuad_t
88{
89 HmdVector3_t vCorners[ 4 ];
90};
91
92struct HmdRect2_t
93{
94 HmdVector2_t vTopLeft;
95 HmdVector2_t vBottomRight;
96};
97
98/** Holds the transform for a single bone */
99struct VRBoneTransform_t
100{
101 HmdVector4_t position;
102 HmdQuaternionf_t orientation;
103};
104
105#pragma pack( pop )
106
107} // namespace vr
108
109#endif
110
111// vrtypes.h
112
113#ifndef _INCLUDE_VRTYPES_H
114#define _INCLUDE_VRTYPES_H
115
116// Forward declarations to avoid requiring vulkan.h
117struct VkDevice_T;
118struct VkPhysicalDevice_T;
119struct VkInstance_T;
120struct VkQueue_T;
121
122// Forward declarations to avoid requiring d3d12.h
123struct ID3D12Resource;
124struct ID3D12CommandQueue;
125
126namespace vr
127{
128#pragma pack( push, 8 )
129
130/** A handle for a spatial anchor. This handle is only valid during the session it was created in.
131* Anchors that live beyond one session should be saved by their string descriptors. */
132typedef uint32_t SpatialAnchorHandle_t;
133
134typedef void* glSharedTextureHandle_t;
135typedef int32_t glInt_t;
136typedef uint32_t glUInt_t;
137
138
139/** Used to return the post-distortion UVs for each color channel.
140* UVs range from 0 to 1 with 0,0 in the upper left corner of the
141* source render target. The 0,0 to 1,1 range covers a single eye. */
142struct DistortionCoordinates_t
143{
144 float rfRed[2];
145 float rfGreen[2];
146 float rfBlue[2];
147};
148
149enum EVREye
150{
151 Eye_Left = 0,
152 Eye_Right = 1
153};
154
155enum ETextureType
156{
157 TextureType_Invalid = -1, // Handle has been invalidated
158 TextureType_DirectX = 0, // Handle is an ID3D11Texture
159 TextureType_OpenGL = 1, // Handle is an OpenGL texture name or an OpenGL render buffer name, depending on submit flags
160 TextureType_Vulkan = 2, // Handle is a pointer to a VRVulkanTextureData_t structure
161 TextureType_IOSurface = 3, // Handle is a macOS cross-process-sharable IOSurfaceRef, deprecated in favor of TextureType_Metal on supported platforms
162 TextureType_DirectX12 = 4, // Handle is a pointer to a D3D12TextureData_t structure
163 TextureType_DXGISharedHandle = 5, // Handle is a HANDLE DXGI share handle, only supported for Overlay render targets.
164 // this texture is used directly by our renderer, so only perform atomic (copyresource or resolve) on it
165 TextureType_Metal = 6, // Handle is a MTLTexture conforming to the MTLSharedTexture protocol. Textures submitted to IVRCompositor::Submit which
166 // are of type MTLTextureType2DArray assume layer 0 is the left eye texture (vr::EVREye::Eye_left), layer 1 is the right
167 // eye texture (vr::EVREye::Eye_Right)
168};
169
170enum EColorSpace
171{
172 ColorSpace_Auto = 0, // Assumes 'gamma' for 8-bit per component formats, otherwise 'linear'. This mirrors the DXGI formats which have _SRGB variants.
173 ColorSpace_Gamma = 1, // Texture data can be displayed directly on the display without any conversion (a.k.a. display native format).
174 ColorSpace_Linear = 2, // Same as gamma but has been converted to a linear representation using DXGI's sRGB conversion algorithm.
175};
176
177struct Texture_t
178{
179 void* handle; // See ETextureType definition above
180 ETextureType eType;
181 EColorSpace eColorSpace;
182};
183
184// Handle to a shared texture (HANDLE on Windows obtained using OpenSharedResource).
185typedef uint64_t SharedTextureHandle_t;
186#define INVALID_SHARED_TEXTURE_HANDLE ((vr::SharedTextureHandle_t)0)
187
188enum ETrackingResult
189{
190 TrackingResult_Uninitialized = 1,
191
192 TrackingResult_Calibrating_InProgress = 100,
193 TrackingResult_Calibrating_OutOfRange = 101,
194
195 TrackingResult_Running_OK = 200,
196 TrackingResult_Running_OutOfRange = 201,
197
198 TrackingResult_Fallback_RotationOnly = 300,
199};
200
201typedef uint32_t DriverId_t;
202static const uint32_t k_nDriverNone = 0xFFFFFFFF;
203
204static const uint32_t k_unMaxDriverDebugResponseSize = 32768;
205
206/** Used to pass device IDs to API calls */
207typedef uint32_t TrackedDeviceIndex_t;
208static const uint32_t k_unTrackedDeviceIndex_Hmd = 0;
209static const uint32_t k_unMaxTrackedDeviceCount = 64;
210static const uint32_t k_unTrackedDeviceIndexOther = 0xFFFFFFFE;
211static const uint32_t k_unTrackedDeviceIndexInvalid = 0xFFFFFFFF;
212
213/** Describes what kind of object is being tracked at a given ID */
214enum ETrackedDeviceClass
215{
216 TrackedDeviceClass_Invalid = 0, // the ID was not valid.
217 TrackedDeviceClass_HMD = 1, // Head-Mounted Displays
218 TrackedDeviceClass_Controller = 2, // Tracked controllers
219 TrackedDeviceClass_GenericTracker = 3, // Generic trackers, similar to controllers
220 TrackedDeviceClass_TrackingReference = 4, // Camera and base stations that serve as tracking reference points
221 TrackedDeviceClass_DisplayRedirect = 5, // Accessories that aren't necessarily tracked themselves, but may redirect video output from other tracked devices
222
223 TrackedDeviceClass_Max
224};
225
226
227/** Describes what specific role associated with a tracked device */
228enum ETrackedControllerRole
229{
230 TrackedControllerRole_Invalid = 0, // Invalid value for controller type
231 TrackedControllerRole_LeftHand = 1, // Tracked device associated with the left hand
232 TrackedControllerRole_RightHand = 2, // Tracked device associated with the right hand
233 TrackedControllerRole_OptOut = 3, // Tracked device is opting out of left/right hand selection
234 TrackedControllerRole_Treadmill = 4, // Tracked device is a treadmill or other locomotion device
235 TrackedControllerRole_Stylus = 5, // Tracked device is a stylus
236 TrackedControllerRole_Max = 5
237};
238
239
240/** Returns true if the tracked controller role is allowed to be a hand */
241inline bool IsRoleAllowedAsHand( ETrackedControllerRole eRole )
242{
243 switch ( eRole )
244 {
245 case TrackedControllerRole_Invalid:
246 case TrackedControllerRole_LeftHand:
247 case TrackedControllerRole_RightHand:
248 return true;
249 default:
250 return false;
251 }
252}
253
254
255/** describes a single pose for a tracked object */
256struct TrackedDevicePose_t
257{
258 HmdMatrix34_t mDeviceToAbsoluteTracking;
259 HmdVector3_t vVelocity; // velocity in tracker space in m/s
260 HmdVector3_t vAngularVelocity; // angular velocity in radians/s (?)
261 ETrackingResult eTrackingResult;
262 bool bPoseIsValid;
263
264 // This indicates that there is a device connected for this spot in the pose array.
265 // It could go from true to false if the user unplugs the device.
266 bool bDeviceIsConnected;
267};
268
269/** Identifies which style of tracking origin the application wants to use
270* for the poses it is requesting */
271enum ETrackingUniverseOrigin
272{
273 TrackingUniverseSeated = 0, // Poses are provided relative to the seated zero pose
274 TrackingUniverseStanding = 1, // Poses are provided relative to the safe bounds configured by the user
275 TrackingUniverseRawAndUncalibrated = 2, // Poses are provided in the coordinate system defined by the driver. It has Y up and is unified for devices of the same driver. You usually don't want this one.
276};
277
278enum EAdditionalRadioFeatures
279{
280 AdditionalRadioFeatures_None = 0x00000000,
281 AdditionalRadioFeatures_HTCLinkBox = 0x00000001,
282 AdditionalRadioFeatures_InternalDongle = 0x00000002,
283 AdditionalRadioFeatures_ExternalDongle = 0x00000004,
284};
285
286typedef uint64_t WebConsoleHandle_t;
287#define INVALID_WEB_CONSOLE_HANDLE ((vr::WebConsoleHandle_t)0)
288
289// Refers to a single container of properties
290typedef uint64_t PropertyContainerHandle_t;
291typedef uint32_t PropertyTypeTag_t;
292
293static const PropertyContainerHandle_t k_ulInvalidPropertyContainer = 0;
294static const PropertyTypeTag_t k_unInvalidPropertyTag = 0;
295
296typedef PropertyContainerHandle_t DriverHandle_t;
297static const PropertyContainerHandle_t k_ulInvalidDriverHandle = 0;
298
299// Use these tags to set/get common types as struct properties
300static const PropertyTypeTag_t k_unFloatPropertyTag = 1;
301static const PropertyTypeTag_t k_unInt32PropertyTag = 2;
302static const PropertyTypeTag_t k_unUint64PropertyTag = 3;
303static const PropertyTypeTag_t k_unBoolPropertyTag = 4;
304static const PropertyTypeTag_t k_unStringPropertyTag = 5;
305static const PropertyTypeTag_t k_unErrorPropertyTag = 6;
306static const PropertyTypeTag_t k_unDoublePropertyTag = 7;
307
308static const PropertyTypeTag_t k_unHmdMatrix34PropertyTag = 20;
309static const PropertyTypeTag_t k_unHmdMatrix44PropertyTag = 21;
310static const PropertyTypeTag_t k_unHmdVector3PropertyTag = 22;
311static const PropertyTypeTag_t k_unHmdVector4PropertyTag = 23;
312static const PropertyTypeTag_t k_unHmdVector2PropertyTag = 24;
313static const PropertyTypeTag_t k_unHmdQuadPropertyTag = 25;
314
315static const PropertyTypeTag_t k_unHiddenAreaPropertyTag = 30;
316static const PropertyTypeTag_t k_unPathHandleInfoTag = 31;
317static const PropertyTypeTag_t k_unActionPropertyTag = 32;
318static const PropertyTypeTag_t k_unInputValuePropertyTag = 33;
319static const PropertyTypeTag_t k_unWildcardPropertyTag = 34;
320static const PropertyTypeTag_t k_unHapticVibrationPropertyTag = 35;
321static const PropertyTypeTag_t k_unSkeletonPropertyTag = 36;
322
323static const PropertyTypeTag_t k_unSpatialAnchorPosePropertyTag = 40;
324static const PropertyTypeTag_t k_unJsonPropertyTag = 41;
325static const PropertyTypeTag_t k_unActiveActionSetPropertyTag = 42;
326
327static const PropertyTypeTag_t k_unOpenVRInternalReserved_Start = 1000;
328static const PropertyTypeTag_t k_unOpenVRInternalReserved_End = 10000;
329
330
331/** Each entry in this enum represents a property that can be retrieved about a
332* tracked device. Many fields are only valid for one ETrackedDeviceClass. */
333enum ETrackedDeviceProperty
334{
335 Prop_Invalid = 0,
336
337 // general properties that apply to all device classes
338 Prop_TrackingSystemName_String = 1000,
339 Prop_ModelNumber_String = 1001,
340 Prop_SerialNumber_String = 1002,
341 Prop_RenderModelName_String = 1003,
342 Prop_WillDriftInYaw_Bool = 1004,
343 Prop_ManufacturerName_String = 1005,
344 Prop_TrackingFirmwareVersion_String = 1006,
345 Prop_HardwareRevision_String = 1007,
346 Prop_AllWirelessDongleDescriptions_String = 1008,
347 Prop_ConnectedWirelessDongle_String = 1009,
348 Prop_DeviceIsWireless_Bool = 1010,
349 Prop_DeviceIsCharging_Bool = 1011,
350 Prop_DeviceBatteryPercentage_Float = 1012, // 0 is empty, 1 is full
351 Prop_StatusDisplayTransform_Matrix34 = 1013,
352 Prop_Firmware_UpdateAvailable_Bool = 1014,
353 Prop_Firmware_ManualUpdate_Bool = 1015,
354 Prop_Firmware_ManualUpdateURL_String = 1016,
355 Prop_HardwareRevision_Uint64 = 1017,
356 Prop_FirmwareVersion_Uint64 = 1018,
357 Prop_FPGAVersion_Uint64 = 1019,
358 Prop_VRCVersion_Uint64 = 1020,
359 Prop_RadioVersion_Uint64 = 1021,
360 Prop_DongleVersion_Uint64 = 1022,
361 Prop_BlockServerShutdown_Bool = 1023,
362 Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024,
363 Prop_ContainsProximitySensor_Bool = 1025,
364 Prop_DeviceProvidesBatteryStatus_Bool = 1026,
365 Prop_DeviceCanPowerOff_Bool = 1027,
366 Prop_Firmware_ProgrammingTarget_String = 1028,
367 Prop_DeviceClass_Int32 = 1029,
368 Prop_HasCamera_Bool = 1030,
369 Prop_DriverVersion_String = 1031,
370 Prop_Firmware_ForceUpdateRequired_Bool = 1032,
371 Prop_ViveSystemButtonFixRequired_Bool = 1033,
372 Prop_ParentDriver_Uint64 = 1034,
373 Prop_ResourceRoot_String = 1035,
374 Prop_RegisteredDeviceType_String = 1036,
375 Prop_InputProfilePath_String = 1037, // input profile to use for this device in the input system. Will default to tracking system name if this isn't provided
376 Prop_NeverTracked_Bool = 1038, // Used for devices that will never have a valid pose by design
377 Prop_NumCameras_Int32 = 1039,
378 Prop_CameraFrameLayout_Int32 = 1040, // EVRTrackedCameraFrameLayout value
379 Prop_CameraStreamFormat_Int32 = 1041, // ECameraVideoStreamFormat value
380 Prop_AdditionalDeviceSettingsPath_String = 1042, // driver-relative path to additional device and global configuration settings
381 Prop_Identifiable_Bool = 1043, // Whether device supports being identified from vrmonitor (e.g. blink LED, vibrate haptics, etc)
382 Prop_BootloaderVersion_Uint64 = 1044,
383 Prop_AdditionalSystemReportData_String = 1045, // additional string to include in system reports about a tracked device
384 Prop_CompositeFirmwareVersion_String = 1046, // additional FW components from a device that gets propagated into reports
385 Prop_Firmware_RemindUpdate_Bool = 1047,
386 Prop_PeripheralApplicationVersion_Uint64 = 1048,
387 Prop_ManufacturerSerialNumber_String = 1049,
388 Prop_ComputedSerialNumber_String = 1050,
389 Prop_EstimatedDeviceFirstUseTime_Int32 = 1051,
390
391 // Properties that are unique to TrackedDeviceClass_HMD
392 Prop_ReportsTimeSinceVSync_Bool = 2000,
393 Prop_SecondsFromVsyncToPhotons_Float = 2001,
394 Prop_DisplayFrequency_Float = 2002,
395 Prop_UserIpdMeters_Float = 2003,
396 Prop_CurrentUniverseId_Uint64 = 2004,
397 Prop_PreviousUniverseId_Uint64 = 2005,
398 Prop_DisplayFirmwareVersion_Uint64 = 2006,
399 Prop_IsOnDesktop_Bool = 2007,
400 Prop_DisplayMCType_Int32 = 2008,
401 Prop_DisplayMCOffset_Float = 2009,
402 Prop_DisplayMCScale_Float = 2010,
403 Prop_EdidVendorID_Int32 = 2011,
404 Prop_DisplayMCImageLeft_String = 2012,
405 Prop_DisplayMCImageRight_String = 2013,
406 Prop_DisplayGCBlackClamp_Float = 2014,
407 Prop_EdidProductID_Int32 = 2015,
408 Prop_CameraToHeadTransform_Matrix34 = 2016,
409 Prop_DisplayGCType_Int32 = 2017,
410 Prop_DisplayGCOffset_Float = 2018,
411 Prop_DisplayGCScale_Float = 2019,
412 Prop_DisplayGCPrescale_Float = 2020,
413 Prop_DisplayGCImage_String = 2021,
414 Prop_LensCenterLeftU_Float = 2022,
415 Prop_LensCenterLeftV_Float = 2023,
416 Prop_LensCenterRightU_Float = 2024,
417 Prop_LensCenterRightV_Float = 2025,
418 Prop_UserHeadToEyeDepthMeters_Float = 2026,
419 Prop_CameraFirmwareVersion_Uint64 = 2027,
420 Prop_CameraFirmwareDescription_String = 2028,
421 Prop_DisplayFPGAVersion_Uint64 = 2029,
422 Prop_DisplayBootloaderVersion_Uint64 = 2030,
423 Prop_DisplayHardwareVersion_Uint64 = 2031,
424 Prop_AudioFirmwareVersion_Uint64 = 2032,
425 Prop_CameraCompatibilityMode_Int32 = 2033,
426 Prop_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034,
427 Prop_ScreenshotVerticalFieldOfViewDegrees_Float = 2035,
428 Prop_DisplaySuppressed_Bool = 2036,
429 Prop_DisplayAllowNightMode_Bool = 2037,
430 Prop_DisplayMCImageWidth_Int32 = 2038,
431 Prop_DisplayMCImageHeight_Int32 = 2039,
432 Prop_DisplayMCImageNumChannels_Int32 = 2040,
433 Prop_DisplayMCImageData_Binary = 2041,
434 Prop_SecondsFromPhotonsToVblank_Float = 2042,
435 Prop_DriverDirectModeSendsVsyncEvents_Bool = 2043,
436 Prop_DisplayDebugMode_Bool = 2044,
437 Prop_GraphicsAdapterLuid_Uint64 = 2045,
438 Prop_DriverProvidedChaperonePath_String = 2048,
439 Prop_ExpectedTrackingReferenceCount_Int32 = 2049, // expected number of sensors or basestations to reserve UI space for
440 Prop_ExpectedControllerCount_Int32 = 2050, // expected number of tracked controllers to reserve UI space for
441 Prop_NamedIconPathControllerLeftDeviceOff_String = 2051, // placeholder icon for "left" controller if not yet detected/loaded
442 Prop_NamedIconPathControllerRightDeviceOff_String = 2052, // placeholder icon for "right" controller if not yet detected/loaded
443 Prop_NamedIconPathTrackingReferenceDeviceOff_String = 2053, // placeholder icon for sensor/base if not yet detected/loaded
444 Prop_DoNotApplyPrediction_Bool = 2054, // currently no effect. was used to disable HMD pose prediction on MR, which is now done by MR driver setting velocity=0
445 Prop_CameraToHeadTransforms_Matrix34_Array = 2055,
446 Prop_DistortionMeshResolution_Int32 = 2056, // custom resolution of compositor calls to IVRSystem::ComputeDistortion
447 Prop_DriverIsDrawingControllers_Bool = 2057,
448 Prop_DriverRequestsApplicationPause_Bool = 2058,
449 Prop_DriverRequestsReducedRendering_Bool = 2059,
450 Prop_MinimumIpdStepMeters_Float = 2060,
451 Prop_AudioBridgeFirmwareVersion_Uint64 = 2061,
452 Prop_ImageBridgeFirmwareVersion_Uint64 = 2062,
453 Prop_ImuToHeadTransform_Matrix34 = 2063,
454 Prop_ImuFactoryGyroBias_Vector3 = 2064,
455 Prop_ImuFactoryGyroScale_Vector3 = 2065,
456 Prop_ImuFactoryAccelerometerBias_Vector3 = 2066,
457 Prop_ImuFactoryAccelerometerScale_Vector3 = 2067,
458 // reserved 2068
459 Prop_ConfigurationIncludesLighthouse20Features_Bool = 2069,
460 Prop_AdditionalRadioFeatures_Uint64 = 2070,
461 Prop_CameraWhiteBalance_Vector4_Array = 2071, // Prop_NumCameras_Int32-sized array of float[4] RGBG white balance calibration data (max size is vr::k_unMaxCameras)
462 Prop_CameraDistortionFunction_Int32_Array = 2072, // Prop_NumCameras_Int32-sized array of vr::EVRDistortionFunctionType values (max size is vr::k_unMaxCameras)
463 Prop_CameraDistortionCoefficients_Float_Array = 2073, // Prop_NumCameras_Int32-sized array of double[vr::k_unMaxDistortionFunctionParameters] (max size is vr::k_unMaxCameras)
464 Prop_ExpectedControllerType_String = 2074,
465 Prop_HmdTrackingStyle_Int32 = 2075, // one of EHmdTrackingStyle
466 Prop_DriverProvidedChaperoneVisibility_Bool = 2076,
467 Prop_HmdColumnCorrectionSettingPrefix_String = 2077,
468 Prop_CameraSupportsCompatibilityModes_Bool = 2078,
469 Prop_SupportsRoomViewDepthProjection_Bool = 2079,
470 Prop_DisplayAvailableFrameRates_Float_Array = 2080, // populated by compositor from actual EDID list when available from GPU driver
471 Prop_DisplaySupportsMultipleFramerates_Bool = 2081, // if this is true but Prop_DisplayAvailableFrameRates_Float_Array is empty, explain to user
472 Prop_DisplayColorMultLeft_Vector3 = 2082,
473 Prop_DisplayColorMultRight_Vector3 = 2083,
474 Prop_DisplaySupportsRuntimeFramerateChange_Bool = 2084,
475 Prop_DisplaySupportsAnalogGain_Bool = 2085,
476 Prop_DisplayMinAnalogGain_Float = 2086,
477 Prop_DisplayMaxAnalogGain_Float = 2087,
478 Prop_CameraExposureTime_Float = 2088,
479 Prop_CameraGlobalGain_Float = 2089,
480 // Prop_DashboardLayoutPathName_String = 2090, // DELETED
481 Prop_DashboardScale_Float = 2091,
482 Prop_IpdUIRangeMinMeters_Float = 2100,
483 Prop_IpdUIRangeMaxMeters_Float = 2101,
484 Prop_Hmd_SupportsHDCP14LegacyCompat_Bool = 2102,
485 Prop_Hmd_SupportsMicMonitoring_Bool = 2103,
486
487 // Driver requested mura correction properties
488 Prop_DriverRequestedMuraCorrectionMode_Int32 = 2200,
489 Prop_DriverRequestedMuraFeather_InnerLeft_Int32 = 2201,
490 Prop_DriverRequestedMuraFeather_InnerRight_Int32 = 2202,
491 Prop_DriverRequestedMuraFeather_InnerTop_Int32 = 2203,
492 Prop_DriverRequestedMuraFeather_InnerBottom_Int32 = 2204,
493 Prop_DriverRequestedMuraFeather_OuterLeft_Int32 = 2205,
494 Prop_DriverRequestedMuraFeather_OuterRight_Int32 = 2206,
495 Prop_DriverRequestedMuraFeather_OuterTop_Int32 = 2207,
496 Prop_DriverRequestedMuraFeather_OuterBottom_Int32 = 2208,
497
498 Prop_Audio_DefaultPlaybackDeviceId_String = 2300,
499 Prop_Audio_DefaultRecordingDeviceId_String = 2301,
500 Prop_Audio_DefaultPlaybackDeviceVolume_Float = 2302,
501 Prop_Audio_SupportsDualSpeakerAndJackOutput_Bool = 2303,
502
503 // Properties that are unique to TrackedDeviceClass_Controller
504 Prop_AttachedDeviceId_String = 3000,
505 Prop_SupportedButtons_Uint64 = 3001,
506 Prop_Axis0Type_Int32 = 3002, // Return value is of type EVRControllerAxisType
507 Prop_Axis1Type_Int32 = 3003, // Return value is of type EVRControllerAxisType
508 Prop_Axis2Type_Int32 = 3004, // Return value is of type EVRControllerAxisType
509 Prop_Axis3Type_Int32 = 3005, // Return value is of type EVRControllerAxisType
510 Prop_Axis4Type_Int32 = 3006, // Return value is of type EVRControllerAxisType
511 Prop_ControllerRoleHint_Int32 = 3007, // Return value is of type ETrackedControllerRole
512
513 // Properties that are unique to TrackedDeviceClass_TrackingReference
514 Prop_FieldOfViewLeftDegrees_Float = 4000,
515 Prop_FieldOfViewRightDegrees_Float = 4001,
516 Prop_FieldOfViewTopDegrees_Float = 4002,
517 Prop_FieldOfViewBottomDegrees_Float = 4003,
518 Prop_TrackingRangeMinimumMeters_Float = 4004,
519 Prop_TrackingRangeMaximumMeters_Float = 4005,
520 Prop_ModeLabel_String = 4006,
521 Prop_CanWirelessIdentify_Bool = 4007, // volatile, based on radio presence and fw discovery
522 Prop_Nonce_Int32 = 4008,
523
524 // Properties that are used for user interface like icons names
525 Prop_IconPathName_String = 5000, // DEPRECATED. Value not referenced. Now expected to be part of icon path properties.
526 Prop_NamedIconPathDeviceOff_String = 5001, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
527 Prop_NamedIconPathDeviceSearching_String = 5002, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
528 Prop_NamedIconPathDeviceSearchingAlert_String = 5003, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
529 Prop_NamedIconPathDeviceReady_String = 5004, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
530 Prop_NamedIconPathDeviceReadyAlert_String = 5005, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
531 Prop_NamedIconPathDeviceNotReady_String = 5006, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
532 Prop_NamedIconPathDeviceStandby_String = 5007, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
533 Prop_NamedIconPathDeviceAlertLow_String = 5008, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
534 Prop_NamedIconPathDeviceStandbyAlert_String = 5009, // {driver}/icons/icon_filename - PNG for static icon, or GIF for animation, 50x32 for headsets and 32x32 for others
535
536 // Properties that are used by helpers, but are opaque to applications
537 Prop_DisplayHiddenArea_Binary_Start = 5100,
538 Prop_DisplayHiddenArea_Binary_End = 5150,
539 Prop_ParentContainer = 5151,
540 Prop_OverrideContainer_Uint64 = 5152,
541
542 // Properties that are unique to drivers
543 Prop_UserConfigPath_String = 6000,
544 Prop_InstallPath_String = 6001,
545 Prop_HasDisplayComponent_Bool = 6002,
546 Prop_HasControllerComponent_Bool = 6003,
547 Prop_HasCameraComponent_Bool = 6004,
548 Prop_HasDriverDirectModeComponent_Bool = 6005,
549 Prop_HasVirtualDisplayComponent_Bool = 6006,
550 Prop_HasSpatialAnchorsSupport_Bool = 6007,
551
552 // Properties that are set internally based on other information provided by drivers
553 Prop_ControllerType_String = 7000,
554 //Prop_LegacyInputProfile_String = 7001, // This is no longer used. See "legacy_binding" in the input profile instead.
555 Prop_ControllerHandSelectionPriority_Int32 = 7002, // Allows hand assignments to prefer some controllers over others. High numbers are selected over low numbers
556
557 // Vendors are free to expose private debug data in this reserved region
558 Prop_VendorSpecific_Reserved_Start = 10000,
559 Prop_VendorSpecific_Reserved_End = 10999,
560
561 Prop_TrackedDeviceProperty_Max = 1000000,
562};
563
564/** No string property will ever be longer than this length */
565static const uint32_t k_unMaxPropertyStringSize = 32 * 1024;
566
567/** Used to return errors that occur when reading properties. */
568enum ETrackedPropertyError
569{
570 TrackedProp_Success = 0,
571 TrackedProp_WrongDataType = 1,
572 TrackedProp_WrongDeviceClass = 2,
573 TrackedProp_BufferTooSmall = 3,
574 TrackedProp_UnknownProperty = 4, // Driver has not set the property (and may not ever).
575 TrackedProp_InvalidDevice = 5,
576 TrackedProp_CouldNotContactServer = 6,
577 TrackedProp_ValueNotProvidedByDevice = 7,
578 TrackedProp_StringExceedsMaximumLength = 8,
579 TrackedProp_NotYetAvailable = 9, // The property value isn't known yet, but is expected soon. Call again later.
580 TrackedProp_PermissionDenied = 10,
581 TrackedProp_InvalidOperation = 11,
582 TrackedProp_CannotWriteToWildcards = 12,
583 TrackedProp_IPCReadFailure = 13,
584 TrackedProp_OutOfMemory = 14,
585 TrackedProp_InvalidContainer = 15,
586};
587
588/** Used to drive certain text in the UI when talking about the tracking system for the HMD */
589enum EHmdTrackingStyle
590{
591 HmdTrackingStyle_Unknown = 0,
592
593 HmdTrackingStyle_Lighthouse = 1, // base stations and lasers
594 HmdTrackingStyle_OutsideInCameras = 2, // Cameras and LED, Rift 1 style
595 HmdTrackingStyle_InsideOutCameras = 3, // Cameras on HMD looking at the world
596};
597
598typedef uint64_t VRActionHandle_t;
599typedef uint64_t VRActionSetHandle_t;
600typedef uint64_t VRInputValueHandle_t;
601
602static const VRActionHandle_t k_ulInvalidActionHandle = 0;
603static const VRActionSetHandle_t k_ulInvalidActionSetHandle = 0;
604static const VRInputValueHandle_t k_ulInvalidInputValueHandle = 0;
605
606
607/** Allows the application to control what part of the provided texture will be used in the
608* frame buffer. */
609struct VRTextureBounds_t
610{
611 float uMin, vMin;
612 float uMax, vMax;
613};
614
615/** Allows specifying pose used to render provided scene texture (if different from value returned by WaitGetPoses). */
616struct VRTextureWithPose_t : public Texture_t
617{
618 HmdMatrix34_t mDeviceToAbsoluteTracking; // Actual pose used to render scene textures.
619};
620
621struct VRTextureDepthInfo_t
622{
623 void* handle; // See ETextureType definition above
624 HmdMatrix44_t mProjection;
625 HmdVector2_t vRange; // 0..1
626};
627
628struct VRTextureWithDepth_t : public Texture_t
629{
630 VRTextureDepthInfo_t depth;
631};
632
633struct VRTextureWithPoseAndDepth_t : public VRTextureWithPose_t
634{
635 VRTextureDepthInfo_t depth;
636};
637
638/** Allows the application to control how scene textures are used by the compositor when calling Submit. */
639enum EVRSubmitFlags
640{
641 // Simple render path. App submits rendered left and right eye images with no lens distortion correction applied.
642 Submit_Default = 0x00,
643
644 // App submits final left and right eye images with lens distortion already applied (lens distortion makes the images appear
645 // barrel distorted with chromatic aberration correction applied). The app would have used the data returned by
646 // vr::IVRSystem::ComputeDistortion() to apply the correct distortion to the rendered images before calling Submit().
647 Submit_LensDistortionAlreadyApplied = 0x01,
648
649 // If the texture pointer passed in is actually a renderbuffer (e.g. for MSAA in OpenGL) then set this flag.
650 Submit_GlRenderBuffer = 0x02,
651
652 // Do not use
653 Submit_Reserved = 0x04,
654
655 // Set to indicate that pTexture is a pointer to a VRTextureWithPose_t.
656 // This flag can be combined with Submit_TextureWithDepth to pass a VRTextureWithPoseAndDepth_t.
657 Submit_TextureWithPose = 0x08,
658
659 // Set to indicate that pTexture is a pointer to a VRTextureWithDepth_t.
660 // This flag can be combined with Submit_TextureWithPose to pass a VRTextureWithPoseAndDepth_t.
661 Submit_TextureWithDepth = 0x10,
662
663 // Set to indicate a discontinuity between this and the last frame.
664 // This will prevent motion smoothing from attempting to extrapolate using the pair.
665 Submit_FrameDiscontinuty = 0x20,
666
667 // Set to indicate that pTexture->handle is a contains VRVulkanTextureArrayData_t
668 Submit_VulkanTextureWithArrayData = 0x40,
669
670 // If the texture pointer passed in is an OpenGL Array texture, set this flag
671 Submit_GlArrayTexture = 0x80,
672
673 // Do not use
674 Submit_Reserved2 = 0x8000,
675
676
677};
678
679/** Data required for passing Vulkan textures to IVRCompositor::Submit.
680* Be sure to call OpenVR_Shutdown before destroying these resources.
681* Please see https://github.com/ValveSoftware/openvr/wiki/Vulkan for Vulkan-specific documentation */
682struct VRVulkanTextureData_t
683{
684 uint64_t m_nImage; // VkImage
685 VkDevice_T *m_pDevice;
686 VkPhysicalDevice_T *m_pPhysicalDevice;
687 VkInstance_T *m_pInstance;
688 VkQueue_T *m_pQueue;
689 uint32_t m_nQueueFamilyIndex;
690 uint32_t m_nWidth, m_nHeight, m_nFormat, m_nSampleCount;
691};
692
693/** Data required for passing Vulkan texture arrays to IVRCompositor::Submit.
694* Be sure to call OpenVR_Shutdown before destroying these resources.
695* Please see https://github.com/ValveSoftware/openvr/wiki/Vulkan for Vulkan-specific documentation */
696struct VRVulkanTextureArrayData_t : public VRVulkanTextureData_t
697{
698 uint32_t m_unArrayIndex;
699 uint32_t m_unArraySize;
700};
701
702/** Data required for passing D3D12 textures to IVRCompositor::Submit.
703* Be sure to call OpenVR_Shutdown before destroying these resources. */
704struct D3D12TextureData_t
705{
706 ID3D12Resource *m_pResource;
707 ID3D12CommandQueue *m_pCommandQueue;
708 uint32_t m_nNodeMask;
709};
710
711/** Status of the overall system or tracked objects */
712enum EVRState
713{
714 VRState_Undefined = -1,
715 VRState_Off = 0,
716 VRState_Searching = 1,
717 VRState_Searching_Alert = 2,
718 VRState_Ready = 3,
719 VRState_Ready_Alert = 4,
720 VRState_NotReady = 5,
721 VRState_Standby = 6,
722 VRState_Ready_Alert_Low = 7,
723};
724
725/** The types of events that could be posted (and what the parameters mean for each event type) */
726enum EVREventType
727{
728 VREvent_None = 0,
729
730 VREvent_TrackedDeviceActivated = 100,
731 VREvent_TrackedDeviceDeactivated = 101,
732 VREvent_TrackedDeviceUpdated = 102,
733 VREvent_TrackedDeviceUserInteractionStarted = 103,
734 VREvent_TrackedDeviceUserInteractionEnded = 104,
735 VREvent_IpdChanged = 105,
736 VREvent_EnterStandbyMode = 106,
737 VREvent_LeaveStandbyMode = 107,
738 VREvent_TrackedDeviceRoleChanged = 108,
739 VREvent_WatchdogWakeUpRequested = 109,
740 VREvent_LensDistortionChanged = 110,
741 VREvent_PropertyChanged = 111,
742 VREvent_WirelessDisconnect = 112,
743 VREvent_WirelessReconnect = 113,
744
745 VREvent_ButtonPress = 200, // data is controller
746 VREvent_ButtonUnpress = 201, // data is controller
747 VREvent_ButtonTouch = 202, // data is controller
748 VREvent_ButtonUntouch = 203, // data is controller
749
750 // VREvent_DualAnalog_Press = 250, // No longer sent
751 // VREvent_DualAnalog_Unpress = 251, // No longer sent
752 // VREvent_DualAnalog_Touch = 252, // No longer sent
753 // VREvent_DualAnalog_Untouch = 253, // No longer sent
754 // VREvent_DualAnalog_Move = 254, // No longer sent
755 // VREvent_DualAnalog_ModeSwitch1 = 255, // No longer sent
756 // VREvent_DualAnalog_ModeSwitch2 = 256, // No longer sent
757 VREvent_Modal_Cancel = 257, // Sent to overlays with the
758
759 VREvent_MouseMove = 300, // data is mouse
760 VREvent_MouseButtonDown = 301, // data is mouse
761 VREvent_MouseButtonUp = 302, // data is mouse
762 VREvent_FocusEnter = 303, // data is overlay
763 VREvent_FocusLeave = 304, // data is overlay
764 VREvent_ScrollDiscrete = 305, // data is scroll
765 VREvent_TouchPadMove = 306, // data is mouse
766 VREvent_OverlayFocusChanged = 307, // data is overlay, global event
767 VREvent_ReloadOverlays = 308,
768 VREvent_ScrollSmooth = 309, // data is scroll
769 VREvent_LockMousePosition = 310,
770 VREvent_UnlockMousePosition = 311,
771
772 VREvent_InputFocusCaptured = 400, // data is process DEPRECATED
773 VREvent_InputFocusReleased = 401, // data is process DEPRECATED
774 // VREvent_SceneFocusLost = 402, // data is process
775 // VREvent_SceneFocusGained = 403, // data is process
776 VREvent_SceneApplicationChanged = 404, // data is process - The App actually drawing the scene changed (usually to or from the compositor)
777 VREvent_SceneFocusChanged = 405, // data is process - New app got access to draw the scene
778 VREvent_InputFocusChanged = 406, // data is process
779 // VREvent_SceneApplicationSecondaryRenderingStarted = 407,
780 VREvent_SceneApplicationUsingWrongGraphicsAdapter = 408, // data is process
781 VREvent_ActionBindingReloaded = 409, // data is process - The App that action binds reloaded for
782
783 VREvent_HideRenderModels = 410, // Sent to the scene application to request hiding render models temporarily
784 VREvent_ShowRenderModels = 411, // Sent to the scene application to request restoring render model visibility
785
786 VREvent_SceneApplicationStateChanged = 412, // No data; but query VRApplications()->GetSceneApplicationState();
787
788 VREvent_ConsoleOpened = 420,
789 VREvent_ConsoleClosed = 421,
790
791 VREvent_OverlayShown = 500,
792 VREvent_OverlayHidden = 501,
793 VREvent_DashboardActivated = 502,
794 VREvent_DashboardDeactivated = 503,
795 //VREvent_DashboardThumbSelected = 504, // Sent to the overlay manager - data is overlay - No longer sent
796 VREvent_DashboardRequested = 505, // Sent to the overlay manager - data is overlay
797 VREvent_ResetDashboard = 506, // Send to the overlay manager
798 //VREvent_RenderToast = 507, // Send to the dashboard to render a toast - data is the notification ID -- no longer sent
799 VREvent_ImageLoaded = 508, // Sent to overlays when a SetOverlayRaw or SetOverlayFromFile call finishes loading
800 VREvent_ShowKeyboard = 509, // Sent to keyboard renderer in the dashboard to invoke it
801 VREvent_HideKeyboard = 510, // Sent to keyboard renderer in the dashboard to hide it
802 VREvent_OverlayGamepadFocusGained = 511, // Sent to an overlay when IVROverlay::SetFocusOverlay is called on it
803 VREvent_OverlayGamepadFocusLost = 512, // Send to an overlay when it previously had focus and IVROverlay::SetFocusOverlay is called on something else
804 VREvent_OverlaySharedTextureChanged = 513,
805 //VREvent_DashboardGuideButtonDown = 514, // These are no longer sent
806 //VREvent_DashboardGuideButtonUp = 515,
807 VREvent_ScreenshotTriggered = 516, // Screenshot button combo was pressed, Dashboard should request a screenshot
808 VREvent_ImageFailed = 517, // Sent to overlays when a SetOverlayRaw or SetOverlayfromFail fails to load
809 VREvent_DashboardOverlayCreated = 518,
810 VREvent_SwitchGamepadFocus = 519,
811
812 // Screenshot API
813 VREvent_RequestScreenshot = 520, // Sent by vrclient application to compositor to take a screenshot
814 VREvent_ScreenshotTaken = 521, // Sent by compositor to the application that the screenshot has been taken
815 VREvent_ScreenshotFailed = 522, // Sent by compositor to the application that the screenshot failed to be taken
816 VREvent_SubmitScreenshotToDashboard = 523, // Sent by compositor to the dashboard that a completed screenshot was submitted
817 VREvent_ScreenshotProgressToDashboard = 524, // Sent by compositor to the dashboard that a completed screenshot was submitted
818
819 VREvent_PrimaryDashboardDeviceChanged = 525,
820 VREvent_RoomViewShown = 526, // Sent by compositor whenever room-view is enabled
821 VREvent_RoomViewHidden = 527, // Sent by compositor whenever room-view is disabled
822 VREvent_ShowUI = 528, // data is showUi
823 VREvent_ShowDevTools = 529, // data is showDevTools
824 VREvent_DesktopViewUpdating = 530,
825 VREvent_DesktopViewReady = 531,
826
827 VREvent_Notification_Shown = 600,
828 VREvent_Notification_Hidden = 601,
829 VREvent_Notification_BeginInteraction = 602,
830 VREvent_Notification_Destroyed = 603,
831
832 VREvent_Quit = 700, // data is process
833 VREvent_ProcessQuit = 701, // data is process
834 //VREvent_QuitAborted_UserPrompt = 702, // data is process
835 VREvent_QuitAcknowledged = 703, // data is process
836 VREvent_DriverRequestedQuit = 704, // The driver has requested that SteamVR shut down
837 VREvent_RestartRequested = 705, // A driver or other component wants the user to restart SteamVR
838
839 VREvent_ChaperoneDataHasChanged = 800, // this will never happen with the new chaperone system
840 VREvent_ChaperoneUniverseHasChanged = 801,
841 VREvent_ChaperoneTempDataHasChanged = 802, // this will never happen with the new chaperone system
842 VREvent_ChaperoneSettingsHaveChanged = 803,
843 VREvent_SeatedZeroPoseReset = 804,
844 VREvent_ChaperoneFlushCache = 805, // Sent when the process needs to reload any cached data it retrieved from VRChaperone()
845 VREvent_ChaperoneRoomSetupStarting = 806, // Triggered by CVRChaperoneClient::RoomSetupStarting
846 VREvent_ChaperoneRoomSetupFinished = 807, // Triggered by CVRChaperoneClient::CommitWorkingCopy
847 VREvent_StandingZeroPoseReset = 808,
848
849 VREvent_AudioSettingsHaveChanged = 820,
850
851 VREvent_BackgroundSettingHasChanged = 850,
852 VREvent_CameraSettingsHaveChanged = 851,
853 VREvent_ReprojectionSettingHasChanged = 852,
854 VREvent_ModelSkinSettingsHaveChanged = 853,
855 VREvent_EnvironmentSettingsHaveChanged = 854,
856 VREvent_PowerSettingsHaveChanged = 855,
857 VREvent_EnableHomeAppSettingsHaveChanged = 856,
858 VREvent_SteamVRSectionSettingChanged = 857,
859 VREvent_LighthouseSectionSettingChanged = 858,
860 VREvent_NullSectionSettingChanged = 859,
861 VREvent_UserInterfaceSectionSettingChanged = 860,
862 VREvent_NotificationsSectionSettingChanged = 861,
863 VREvent_KeyboardSectionSettingChanged = 862,
864 VREvent_PerfSectionSettingChanged = 863,
865 VREvent_DashboardSectionSettingChanged = 864,
866 VREvent_WebInterfaceSectionSettingChanged = 865,
867 VREvent_TrackersSectionSettingChanged = 866,
868 VREvent_LastKnownSectionSettingChanged = 867,
869 VREvent_DismissedWarningsSectionSettingChanged = 868,
870 VREvent_GpuSpeedSectionSettingChanged = 869,
871 VREvent_WindowsMRSectionSettingChanged = 870,
872 VREvent_OtherSectionSettingChanged = 871,
873
874 VREvent_StatusUpdate = 900,
875
876 VREvent_WebInterface_InstallDriverCompleted = 950,
877
878 VREvent_MCImageUpdated = 1000,
879
880 VREvent_FirmwareUpdateStarted = 1100,
881 VREvent_FirmwareUpdateFinished = 1101,
882
883 VREvent_KeyboardClosed = 1200,
884 VREvent_KeyboardCharInput = 1201,
885 VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard
886
887 //VREvent_ApplicationTransitionStarted = 1300,
888 //VREvent_ApplicationTransitionAborted = 1301,
889 //VREvent_ApplicationTransitionNewAppStarted = 1302,
890 VREvent_ApplicationListUpdated = 1303,
891 VREvent_ApplicationMimeTypeLoad = 1304,
892 // VREvent_ApplicationTransitionNewAppLaunchComplete = 1305,
893 VREvent_ProcessConnected = 1306,
894 VREvent_ProcessDisconnected = 1307,
895
896 //VREvent_Compositor_MirrorWindowShown = 1400, // DEPRECATED
897 //VREvent_Compositor_MirrorWindowHidden = 1401, // DEPRECATED
898 VREvent_Compositor_ChaperoneBoundsShown = 1410,
899 VREvent_Compositor_ChaperoneBoundsHidden = 1411,
900 VREvent_Compositor_DisplayDisconnected = 1412,
901 VREvent_Compositor_DisplayReconnected = 1413,
902 VREvent_Compositor_HDCPError = 1414, // data is hdcpError
903 VREvent_Compositor_ApplicationNotResponding = 1415,
904 VREvent_Compositor_ApplicationResumed = 1416,
905 VREvent_Compositor_OutOfVideoMemory = 1417,
906 VREvent_Compositor_DisplayModeNotSupported = 1418, // k_pch_SteamVR_PreferredRefreshRate
907 VREvent_Compositor_StageOverrideReady = 1419,
908
909 VREvent_TrackedCamera_StartVideoStream = 1500,
910 VREvent_TrackedCamera_StopVideoStream = 1501,
911 VREvent_TrackedCamera_PauseVideoStream = 1502,
912 VREvent_TrackedCamera_ResumeVideoStream = 1503,
913 VREvent_TrackedCamera_EditingSurface = 1550,
914
915 VREvent_PerformanceTest_EnableCapture = 1600,
916 VREvent_PerformanceTest_DisableCapture = 1601,
917 VREvent_PerformanceTest_FidelityLevel = 1602,
918
919 VREvent_MessageOverlay_Closed = 1650,
920 VREvent_MessageOverlayCloseRequested = 1651,
921
922 VREvent_Input_HapticVibration = 1700, // data is hapticVibration
923 VREvent_Input_BindingLoadFailed = 1701, // data is inputBinding
924 VREvent_Input_BindingLoadSuccessful = 1702, // data is inputBinding
925 VREvent_Input_ActionManifestReloaded = 1703, // no data
926 VREvent_Input_ActionManifestLoadFailed = 1704, // data is actionManifest
927 VREvent_Input_ProgressUpdate = 1705, // data is progressUpdate
928 VREvent_Input_TrackerActivated = 1706,
929 VREvent_Input_BindingsUpdated = 1707,
930 VREvent_Input_BindingSubscriptionChanged = 1708,
931
932 VREvent_SpatialAnchors_PoseUpdated = 1800, // data is spatialAnchor. broadcast
933 VREvent_SpatialAnchors_DescriptorUpdated = 1801, // data is spatialAnchor. broadcast
934 VREvent_SpatialAnchors_RequestPoseUpdate = 1802, // data is spatialAnchor. sent to specific driver
935 VREvent_SpatialAnchors_RequestDescriptorUpdate = 1803, // data is spatialAnchor. sent to specific driver
936
937 VREvent_SystemReport_Started = 1900, // user or system initiated generation of a system report. broadcast
938
939 VREvent_Monitor_ShowHeadsetView = 2000, // data is process
940 VREvent_Monitor_HideHeadsetView = 2001, // data is process
941
942 // Vendors are free to expose private events in this reserved region
943 VREvent_VendorSpecific_Reserved_Start = 10000,
944 VREvent_VendorSpecific_Reserved_End = 19999,
945};
946
947
948/** Level of Hmd activity */
949// UserInteraction_Timeout means the device is in the process of timing out.
950// InUse = ( k_EDeviceActivityLevel_UserInteraction || k_EDeviceActivityLevel_UserInteraction_Timeout )
951// VREvent_TrackedDeviceUserInteractionStarted fires when the devices transitions from Standby -> UserInteraction or Idle -> UserInteraction.
952// VREvent_TrackedDeviceUserInteractionEnded fires when the devices transitions from UserInteraction_Timeout -> Idle
953enum EDeviceActivityLevel
954{
955 k_EDeviceActivityLevel_Unknown = -1,
956 k_EDeviceActivityLevel_Idle = 0, // No activity for the last 10 seconds
957 k_EDeviceActivityLevel_UserInteraction = 1, // Activity (movement or prox sensor) is happening now
958 k_EDeviceActivityLevel_UserInteraction_Timeout = 2, // No activity for the last 0.5 seconds
959 k_EDeviceActivityLevel_Standby = 3, // Idle for at least 5 seconds (configurable in Settings -> Power Management)
960 k_EDeviceActivityLevel_Idle_Timeout = 4,
961};
962
963
964/** VR controller button and axis IDs */
965enum EVRButtonId
966{
967 k_EButton_System = 0,
968 k_EButton_ApplicationMenu = 1,
969 k_EButton_Grip = 2,
970 k_EButton_DPad_Left = 3,
971 k_EButton_DPad_Up = 4,
972 k_EButton_DPad_Right = 5,
973 k_EButton_DPad_Down = 6,
974 k_EButton_A = 7,
975
976 k_EButton_ProximitySensor = 31,
977
978 k_EButton_Axis0 = 32,
979 k_EButton_Axis1 = 33,
980 k_EButton_Axis2 = 34,
981 k_EButton_Axis3 = 35,
982 k_EButton_Axis4 = 36,
983
984 // aliases for well known controllers
985 k_EButton_SteamVR_Touchpad = k_EButton_Axis0,
986 k_EButton_SteamVR_Trigger = k_EButton_Axis1,
987
988 k_EButton_Dashboard_Back = k_EButton_Grip,
989
990 k_EButton_IndexController_A = k_EButton_Grip,
991 k_EButton_IndexController_B = k_EButton_ApplicationMenu,
992 k_EButton_IndexController_JoyStick = k_EButton_Axis3,
993
994 k_EButton_Max = 64
995};
996
997inline uint64_t ButtonMaskFromId( EVRButtonId id ) { return 1ull << id; }
998
999/** used for controller button events */
1000struct VREvent_Controller_t
1001{
1002 uint32_t button; // EVRButtonId enum
1003};
1004
1005
1006/** used for simulated mouse events in overlay space */
1007enum EVRMouseButton
1008{
1009 VRMouseButton_Left = 0x0001,
1010 VRMouseButton_Right = 0x0002,
1011 VRMouseButton_Middle = 0x0004,
1012};
1013
1014
1015/** used for simulated mouse events in overlay space */
1016struct VREvent_Mouse_t
1017{
1018 float x, y; // co-ords are in GL space, bottom left of the texture is 0,0
1019 uint32_t button; // EVRMouseButton enum
1020};
1021
1022/** used for simulated mouse wheel scroll */
1023struct VREvent_Scroll_t
1024{
1025 float xdelta, ydelta;
1026 uint32_t unused;
1027 float viewportscale; // For scrolling on an overlay with laser mouse, this is the overlay's vertical size relative to the overlay height. Range: [0,1]
1028};
1029
1030/** when in mouse input mode you can receive data from the touchpad, these events are only sent if the users finger
1031 is on the touchpad (or just released from it). These events are sent to overlays with the VROverlayFlags_SendVRTouchpadEvents
1032 flag set.
1033**/
1034struct VREvent_TouchPadMove_t
1035{
1036 // true if the users finger is detected on the touch pad
1037 bool bFingerDown;
1038
1039 // How long the finger has been down in seconds
1040 float flSecondsFingerDown;
1041
1042 // These values indicate the starting finger position (so you can do some basic swipe stuff)
1043 float fValueXFirst;
1044 float fValueYFirst;
1045
1046 // This is the raw sampled coordinate without deadzoning
1047 float fValueXRaw;
1048 float fValueYRaw;
1049};
1050
1051/** notification related events. Details will still change at this point */
1052struct VREvent_Notification_t
1053{
1054 uint64_t ulUserValue;
1055 uint32_t notificationId;
1056};
1057
1058/** Used for events about processes */
1059struct VREvent_Process_t
1060{
1061 uint32_t pid;
1062 uint32_t oldPid;
1063 bool bForced;
1064 // If the associated event was triggered by a connection loss
1065 bool bConnectionLost;
1066};
1067
1068
1069/** Used for a few events about overlays */
1070struct VREvent_Overlay_t
1071{
1072 uint64_t overlayHandle;
1073 uint64_t devicePath;
1074 uint64_t memoryBlockId;
1075};
1076
1077
1078/** Used for a few events about overlays */
1079struct VREvent_Status_t
1080{
1081 uint32_t statusState; // EVRState enum
1082};
1083
1084/** Used for keyboard events **/
1085struct VREvent_Keyboard_t
1086{
1087 char cNewInput[8]; // Up to 11 bytes of new input
1088 uint64_t uUserValue; // Possible flags about the new input
1089};
1090
1091struct VREvent_Ipd_t
1092{
1093 float ipdMeters;
1094};
1095
1096struct VREvent_Chaperone_t
1097{
1098 uint64_t m_nPreviousUniverse;
1099 uint64_t m_nCurrentUniverse;
1100};
1101
1102/** Not actually used for any events */
1103struct VREvent_Reserved_t
1104{
1105 uint64_t reserved0;
1106 uint64_t reserved1;
1107 uint64_t reserved2;
1108 uint64_t reserved3;
1109 uint64_t reserved4;
1110 uint64_t reserved5;
1111};
1112
1113struct VREvent_PerformanceTest_t
1114{
1115 uint32_t m_nFidelityLevel;
1116};
1117
1118struct VREvent_SeatedZeroPoseReset_t
1119{
1120 bool bResetBySystemMenu;
1121};
1122
1123struct VREvent_Screenshot_t
1124{
1125 uint32_t handle;
1126 uint32_t type;
1127};
1128
1129struct VREvent_ScreenshotProgress_t
1130{
1131 float progress;
1132};
1133
1134struct VREvent_ApplicationLaunch_t
1135{
1136 uint32_t pid;
1137 uint32_t unArgsHandle;
1138};
1139
1140struct VREvent_EditingCameraSurface_t
1141{
1142 uint64_t overlayHandle;
1143 uint32_t nVisualMode;
1144};
1145
1146struct VREvent_MessageOverlay_t
1147{
1148 uint32_t unVRMessageOverlayResponse; // vr::VRMessageOverlayResponse enum
1149};
1150
1151struct VREvent_Property_t
1152{
1153 PropertyContainerHandle_t container;
1154 ETrackedDeviceProperty prop;
1155};
1156
1157struct VREvent_HapticVibration_t
1158{
1159 uint64_t containerHandle; // property container handle of the device with the haptic component
1160 uint64_t componentHandle; // Which haptic component needs to vibrate
1161 float fDurationSeconds;
1162 float fFrequency;
1163 float fAmplitude;
1164};
1165
1166struct VREvent_WebConsole_t
1167{
1168 WebConsoleHandle_t webConsoleHandle;
1169};
1170
1171struct VREvent_InputBindingLoad_t
1172{
1173 vr::PropertyContainerHandle_t ulAppContainer;
1174 uint64_t pathMessage;
1175 uint64_t pathUrl;
1176 uint64_t pathControllerType;
1177};
1178
1179struct VREvent_InputActionManifestLoad_t
1180{
1181 uint64_t pathAppKey;
1182 uint64_t pathMessage;
1183 uint64_t pathMessageParam;
1184 uint64_t pathManifestPath;
1185};
1186
1187struct VREvent_SpatialAnchor_t
1188{
1189 SpatialAnchorHandle_t unHandle;
1190};
1191
1192struct VREvent_ProgressUpdate_t
1193{
1194 uint64_t ulApplicationPropertyContainer;
1195 uint64_t pathDevice;
1196 uint64_t pathInputSource;
1197 uint64_t pathProgressAction;
1198 uint64_t pathIcon;
1199 float fProgress;
1200};
1201
1202enum EShowUIType
1203{
1204 ShowUI_ControllerBinding = 0,
1205 ShowUI_ManageTrackers = 1,
1206 // ShowUI_QuickStart = 2, // Deprecated
1207 ShowUI_Pairing = 3,
1208 ShowUI_Settings = 4,
1209 ShowUI_DebugCommands = 5,
1210 ShowUI_FullControllerBinding = 6,
1211 ShowUI_ManageDrivers = 7,
1212};
1213
1214struct VREvent_ShowUI_t
1215{
1216 EShowUIType eType;
1217};
1218
1219struct VREvent_ShowDevTools_t
1220{
1221 int32_t nBrowserIdentifier;
1222};
1223
1224enum EHDCPError
1225{
1226 HDCPError_None = 0,
1227 HDCPError_LinkLost = 1,
1228 HDCPError_Tampered = 2,
1229 HDCPError_DeviceRevoked = 3,
1230 HDCPError_Unknown = 4
1231};
1232
1233struct VREvent_HDCPError_t
1234{
1235 EHDCPError eCode;
1236};
1237
1238typedef union
1239{
1240 VREvent_Reserved_t reserved;
1241 VREvent_Controller_t controller;
1242 VREvent_Mouse_t mouse;
1243 VREvent_Scroll_t scroll;
1244 VREvent_Process_t process;
1245 VREvent_Notification_t notification;
1246 VREvent_Overlay_t overlay;
1247 VREvent_Status_t status;
1248 VREvent_Keyboard_t keyboard;
1249 VREvent_Ipd_t ipd;
1250 VREvent_Chaperone_t chaperone;
1251 VREvent_PerformanceTest_t performanceTest;
1252 VREvent_TouchPadMove_t touchPadMove;
1253 VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset;
1254 VREvent_Screenshot_t screenshot;
1255 VREvent_ScreenshotProgress_t screenshotProgress;
1256 VREvent_ApplicationLaunch_t applicationLaunch;
1257 VREvent_EditingCameraSurface_t cameraSurface;
1258 VREvent_MessageOverlay_t messageOverlay;
1259 VREvent_Property_t property;
1260 VREvent_HapticVibration_t hapticVibration;
1261 VREvent_WebConsole_t webConsole;
1262 VREvent_InputBindingLoad_t inputBinding;
1263 VREvent_InputActionManifestLoad_t actionManifest;
1264 VREvent_SpatialAnchor_t spatialAnchor;
1265 VREvent_ProgressUpdate_t progressUpdate;
1266 VREvent_ShowUI_t showUi;
1267 VREvent_ShowDevTools_t showDevTools;
1268 VREvent_HDCPError_t hdcpError;
1269 /** NOTE!!! If you change this you MUST manually update openvr_interop.cs.py */
1270} VREvent_Data_t;
1271
1272
1273#if defined(__linux__) || defined(__APPLE__)
1274// This structure was originally defined mis-packed on Linux, preserved for
1275// compatibility.
1276#pragma pack( push, 4 )
1277#endif
1278
1279/** An event posted by the server to all running applications */
1280struct VREvent_t
1281{
1282 uint32_t eventType; // EVREventType enum
1283 TrackedDeviceIndex_t trackedDeviceIndex;
1284 float eventAgeSeconds;
1285 // event data must be the end of the struct as its size is variable
1286 VREvent_Data_t data;
1287};
1288
1289#if defined(__linux__) || defined(__APPLE__)
1290#pragma pack( pop )
1291#endif
1292
1293typedef uint32_t VRComponentProperties;
1294
1295enum EVRComponentProperty
1296{
1297 VRComponentProperty_IsStatic = (1 << 0),
1298 VRComponentProperty_IsVisible = (1 << 1),
1299 VRComponentProperty_IsTouched = (1 << 2),
1300 VRComponentProperty_IsPressed = (1 << 3),
1301 VRComponentProperty_IsScrolled = (1 << 4),
1302 VRComponentProperty_IsHighlighted = (1 << 5),
1303};
1304
1305
1306/** Describes state information about a render-model component, including transforms and other dynamic properties */
1307struct RenderModel_ComponentState_t
1308{
1309 HmdMatrix34_t mTrackingToComponentRenderModel; // Transform required when drawing the component render model
1310 HmdMatrix34_t mTrackingToComponentLocal; // Transform available for attaching to a local component coordinate system (-Z out from surface )
1311 VRComponentProperties uProperties;
1312};
1313
1314
1315enum EVRInputError
1316{
1317 VRInputError_None = 0,
1318 VRInputError_NameNotFound = 1,
1319 VRInputError_WrongType = 2,
1320 VRInputError_InvalidHandle = 3,
1321 VRInputError_InvalidParam = 4,
1322 VRInputError_NoSteam = 5,
1323 VRInputError_MaxCapacityReached = 6,
1324 VRInputError_IPCError = 7,
1325 VRInputError_NoActiveActionSet = 8,
1326 VRInputError_InvalidDevice = 9,
1327 VRInputError_InvalidSkeleton = 10,
1328 VRInputError_InvalidBoneCount = 11,
1329 VRInputError_InvalidCompressedData = 12,
1330 VRInputError_NoData = 13,
1331 VRInputError_BufferTooSmall = 14,
1332 VRInputError_MismatchedActionManifest = 15,
1333 VRInputError_MissingSkeletonData = 16,
1334 VRInputError_InvalidBoneIndex = 17,
1335 VRInputError_InvalidPriority = 18,
1336 VRInputError_PermissionDenied = 19,
1337 VRInputError_InvalidRenderModel = 20,
1338};
1339
1340enum EVRSpatialAnchorError
1341{
1342 VRSpatialAnchorError_Success = 0,
1343 VRSpatialAnchorError_Internal = 1,
1344 VRSpatialAnchorError_UnknownHandle = 2,
1345 VRSpatialAnchorError_ArrayTooSmall = 3,
1346 VRSpatialAnchorError_InvalidDescriptorChar = 4,
1347 VRSpatialAnchorError_NotYetAvailable = 5,
1348 VRSpatialAnchorError_NotAvailableInThisUniverse = 6,
1349 VRSpatialAnchorError_PermanentlyUnavailable = 7,
1350 VRSpatialAnchorError_WrongDriver = 8,
1351 VRSpatialAnchorError_DescriptorTooLong = 9,
1352 VRSpatialAnchorError_Unknown = 10,
1353 VRSpatialAnchorError_NoRoomCalibration = 11,
1354 VRSpatialAnchorError_InvalidArgument = 12,
1355 VRSpatialAnchorError_UnknownDriver = 13,
1356};
1357
1358/** The mesh to draw into the stencil (or depth) buffer to perform
1359* early stencil (or depth) kills of pixels that will never appear on the HMD.
1360* This mesh draws on all the pixels that will be hidden after distortion.
1361*
1362* If the HMD does not provide a visible area mesh pVertexData will be
1363* NULL and unTriangleCount will be 0. */
1364struct HiddenAreaMesh_t
1365{
1366 const HmdVector2_t *pVertexData;
1367 uint32_t unTriangleCount;
1368};
1369
1370
1371enum EHiddenAreaMeshType
1372{
1373 k_eHiddenAreaMesh_Standard = 0,
1374 k_eHiddenAreaMesh_Inverse = 1,
1375 k_eHiddenAreaMesh_LineLoop = 2,
1376
1377 k_eHiddenAreaMesh_Max = 3,
1378};
1379
1380
1381/** Identifies what kind of axis is on the controller at index n. Read this type
1382* with pVRSystem->Get( nControllerDeviceIndex, Prop_Axis0Type_Int32 + n );
1383*/
1384enum EVRControllerAxisType
1385{
1386 k_eControllerAxis_None = 0,
1387 k_eControllerAxis_TrackPad = 1,
1388 k_eControllerAxis_Joystick = 2,
1389 k_eControllerAxis_Trigger = 3, // Analog trigger data is in the X axis
1390};
1391
1392
1393/** contains information about one axis on the controller */
1394struct VRControllerAxis_t
1395{
1396 float x; // Ranges from -1.0 to 1.0 for joysticks and track pads. Ranges from 0.0 to 1.0 for triggers were 0 is fully released.
1397 float y; // Ranges from -1.0 to 1.0 for joysticks and track pads. Is always 0.0 for triggers.
1398};
1399
1400
1401/** the number of axes in the controller state */
1402static const uint32_t k_unControllerStateAxisCount = 5;
1403
1404
1405#if defined(__linux__) || defined(__APPLE__)
1406// This structure was originally defined mis-packed on Linux, preserved for
1407// compatibility.
1408#pragma pack( push, 4 )
1409#endif
1410
1411/** Holds all the state of a controller at one moment in time. */
1412struct VRControllerState001_t
1413{
1414 // If packet num matches that on your prior call, then the controller state hasn't been changed since
1415 // your last call and there is no need to process it
1416 uint32_t unPacketNum;
1417
1418 // bit flags for each of the buttons. Use ButtonMaskFromId to turn an ID into a mask
1419 uint64_t ulButtonPressed;
1420 uint64_t ulButtonTouched;
1421
1422 // Axis data for the controller's analog inputs
1423 VRControllerAxis_t rAxis[ k_unControllerStateAxisCount ];
1424};
1425#if defined(__linux__) || defined(__APPLE__)
1426#pragma pack( pop )
1427#endif
1428
1429
1430typedef VRControllerState001_t VRControllerState_t;
1431
1432
1433/** determines how to provide output to the application of various event processing functions. */
1434enum EVRControllerEventOutputType
1435{
1436 ControllerEventOutput_OSEvents = 0,
1437 ControllerEventOutput_VREvents = 1,
1438};
1439
1440
1441
1442/** Collision Bounds Style */
1443enum ECollisionBoundsStyle
1444{
1445 COLLISION_BOUNDS_STYLE_BEGINNER = 0,
1446 COLLISION_BOUNDS_STYLE_INTERMEDIATE,
1447 COLLISION_BOUNDS_STYLE_SQUARES,
1448 COLLISION_BOUNDS_STYLE_ADVANCED,
1449 COLLISION_BOUNDS_STYLE_NONE,
1450
1451 COLLISION_BOUNDS_STYLE_COUNT
1452};
1453
1454/** used to refer to a single VR overlay */
1455typedef uint64_t VROverlayHandle_t;
1456
1457static const VROverlayHandle_t k_ulOverlayHandleInvalid = 0;
1458
1459/** Errors that can occur around VR overlays */
1460enum EVROverlayError
1461{
1462 VROverlayError_None = 0,
1463
1464 VROverlayError_UnknownOverlay = 10,
1465 VROverlayError_InvalidHandle = 11,
1466 VROverlayError_PermissionDenied = 12,
1467 VROverlayError_OverlayLimitExceeded = 13, // No more overlays could be created because the maximum number already exist
1468 VROverlayError_WrongVisibilityType = 14,
1469 VROverlayError_KeyTooLong = 15,
1470 VROverlayError_NameTooLong = 16,
1471 VROverlayError_KeyInUse = 17,
1472 VROverlayError_WrongTransformType = 18,
1473 VROverlayError_InvalidTrackedDevice = 19,
1474 VROverlayError_InvalidParameter = 20,
1475 VROverlayError_ThumbnailCantBeDestroyed = 21,
1476 VROverlayError_ArrayTooSmall = 22,
1477 VROverlayError_RequestFailed = 23,
1478 VROverlayError_InvalidTexture = 24,
1479 VROverlayError_UnableToLoadFile = 25,
1480 VROverlayError_KeyboardAlreadyInUse = 26,
1481 VROverlayError_NoNeighbor = 27,
1482 VROverlayError_TooManyMaskPrimitives = 29,
1483 VROverlayError_BadMaskPrimitive = 30,
1484 VROverlayError_TextureAlreadyLocked = 31,
1485 VROverlayError_TextureLockCapacityReached = 32,
1486 VROverlayError_TextureNotLocked = 33,
1487};
1488
1489/** enum values to pass in to VR_Init to identify whether the application will
1490* draw a 3D scene. */
1491enum EVRApplicationType
1492{
1493 VRApplication_Other = 0, // Some other kind of application that isn't covered by the other entries
1494 VRApplication_Scene = 1, // Application will submit 3D frames
1495 VRApplication_Overlay = 2, // Application only interacts with overlays
1496 VRApplication_Background = 3, // Application should not start SteamVR if it's not already running, and should not
1497 // keep it running if everything else quits.
1498 VRApplication_Utility = 4, // Init should not try to load any drivers. The application needs access to utility
1499 // interfaces (like IVRSettings and IVRApplications) but not hardware.
1500 VRApplication_VRMonitor = 5, // Reserved for vrmonitor
1501 VRApplication_SteamWatchdog = 6,// Reserved for Steam
1502 VRApplication_Bootstrapper = 7, // reserved for vrstartup
1503 VRApplication_WebHelper = 8, // reserved for vrwebhelper
1504 VRApplication_OpenXRInstance = 9, // reserved for openxr (created instance, but not session yet)
1505 VRApplication_OpenXRScene = 10, // reserved for openxr (started session)
1506 VRApplication_OpenXROverlay = 11, // reserved for openxr (started overlay session)
1507 VRApplication_Prism = 12, // reserved for the vrprismhost process
1508
1509 VRApplication_Max
1510};
1511
1512
1513/** returns true if the specified application type is one of the
1514* OpenXR types */
1515inline bool IsOpenXRAppType( EVRApplicationType eType )
1516{
1517 return eType == VRApplication_OpenXRInstance
1518 || eType == VRApplication_OpenXRScene
1519 || eType == VRApplication_OpenXROverlay;
1520}
1521
1522
1523/** error codes for firmware */
1524enum EVRFirmwareError
1525{
1526 VRFirmwareError_None = 0,
1527 VRFirmwareError_Success = 1,
1528 VRFirmwareError_Fail = 2,
1529};
1530
1531
1532/** error codes for notifications */
1533enum EVRNotificationError
1534{
1535 VRNotificationError_OK = 0,
1536 VRNotificationError_InvalidNotificationId = 100,
1537 VRNotificationError_NotificationQueueFull = 101,
1538 VRNotificationError_InvalidOverlayHandle = 102,
1539 VRNotificationError_SystemWithUserValueAlreadyExists = 103,
1540};
1541
1542
1543enum EVRSkeletalMotionRange
1544{
1545 // The range of motion of the skeleton takes into account any physical limits imposed by
1546 // the controller itself. This will tend to be the most accurate pose compared to the user's
1547 // actual hand pose, but might not allow a closed fist for example
1548 VRSkeletalMotionRange_WithController = 0,
1549
1550 // Retarget the range of motion provided by the input device to make the hand appear to move
1551 // as if it was not holding a controller. eg: map "hand grasping controller" to "closed fist"
1552 VRSkeletalMotionRange_WithoutController = 1,
1553};
1554
1555enum EVRSkeletalTrackingLevel
1556{
1557 // body part location can't be directly determined by the device. Any skeletal pose provided by
1558 // the device is estimated by assuming the position required to active buttons, triggers, joysticks,
1559 // or other input sensors.
1560 // E.g. Vive Controller, Gamepad
1561 VRSkeletalTracking_Estimated = 0,
1562
1563 // body part location can be measured directly but with fewer degrees of freedom than the actual body
1564 // part. Certain body part positions may be unmeasured by the device and estimated from other input data.
1565 // E.g. Index Controllers, gloves that only measure finger curl
1566 VRSkeletalTracking_Partial = 1,
1567
1568 // Body part location can be measured directly throughout the entire range of motion of the body part.
1569 // E.g. Mocap suit for the full body, gloves that measure rotation of each finger segment
1570 VRSkeletalTracking_Full = 2,
1571
1572 VRSkeletalTrackingLevel_Count,
1573 VRSkeletalTrackingLevel_Max = VRSkeletalTrackingLevel_Count - 1
1574};
1575
1576
1577/** Type used for referring to bones by their index */
1578typedef int32_t BoneIndex_t;
1579const BoneIndex_t k_unInvalidBoneIndex = -1;
1580
1581
1582/** error codes returned by Vr_Init */
1583
1584// Please add adequate error description to https://developer.valvesoftware.com/w/index.php?title=Category:SteamVRHelp
1585enum EVRInitError
1586{
1587 VRInitError_None = 0,
1588 VRInitError_Unknown = 1,
1589
1590 VRInitError_Init_InstallationNotFound = 100,
1591 VRInitError_Init_InstallationCorrupt = 101,
1592 VRInitError_Init_VRClientDLLNotFound = 102,
1593 VRInitError_Init_FileNotFound = 103,
1594 VRInitError_Init_FactoryNotFound = 104,
1595 VRInitError_Init_InterfaceNotFound = 105,
1596 VRInitError_Init_InvalidInterface = 106,
1597 VRInitError_Init_UserConfigDirectoryInvalid = 107,
1598 VRInitError_Init_HmdNotFound = 108,
1599 VRInitError_Init_NotInitialized = 109,
1600 VRInitError_Init_PathRegistryNotFound = 110,
1601 VRInitError_Init_NoConfigPath = 111,
1602 VRInitError_Init_NoLogPath = 112,
1603 VRInitError_Init_PathRegistryNotWritable = 113,
1604 VRInitError_Init_AppInfoInitFailed = 114,
1605 VRInitError_Init_Retry = 115, // Used internally to cause retries to vrserver
1606 VRInitError_Init_InitCanceledByUser = 116, // The calling application should silently exit. The user canceled app startup
1607 VRInitError_Init_AnotherAppLaunching = 117,
1608 VRInitError_Init_SettingsInitFailed = 118,
1609 VRInitError_Init_ShuttingDown = 119,
1610 VRInitError_Init_TooManyObjects = 120,
1611 VRInitError_Init_NoServerForBackgroundApp = 121,
1612 VRInitError_Init_NotSupportedWithCompositor = 122,
1613 VRInitError_Init_NotAvailableToUtilityApps = 123,
1614 VRInitError_Init_Internal = 124,
1615 VRInitError_Init_HmdDriverIdIsNone = 125,
1616 VRInitError_Init_HmdNotFoundPresenceFailed = 126,
1617 VRInitError_Init_VRMonitorNotFound = 127,
1618 VRInitError_Init_VRMonitorStartupFailed = 128,
1619 VRInitError_Init_LowPowerWatchdogNotSupported = 129,
1620 VRInitError_Init_InvalidApplicationType = 130,
1621 VRInitError_Init_NotAvailableToWatchdogApps = 131,
1622 VRInitError_Init_WatchdogDisabledInSettings = 132,
1623 VRInitError_Init_VRDashboardNotFound = 133,
1624 VRInitError_Init_VRDashboardStartupFailed = 134,
1625 VRInitError_Init_VRHomeNotFound = 135,
1626 VRInitError_Init_VRHomeStartupFailed = 136,
1627 VRInitError_Init_RebootingBusy = 137,
1628 VRInitError_Init_FirmwareUpdateBusy = 138,
1629 VRInitError_Init_FirmwareRecoveryBusy = 139,
1630 VRInitError_Init_USBServiceBusy = 140,
1631 VRInitError_Init_VRWebHelperStartupFailed = 141,
1632 VRInitError_Init_TrackerManagerInitFailed = 142,
1633 VRInitError_Init_AlreadyRunning = 143,
1634 VRInitError_Init_FailedForVrMonitor = 144,
1635 VRInitError_Init_PropertyManagerInitFailed = 145,
1636 VRInitError_Init_WebServerFailed = 146,
1637 VRInitError_Init_IllegalTypeTransition = 147,
1638 VRInitError_Init_MismatchedRuntimes = 148,
1639 VRInitError_Init_InvalidProcessId = 149,
1640 VRInitError_Init_VRServiceStartupFailed = 150,
1641 VRInitError_Init_PrismNeedsNewDrivers = 151,
1642 VRInitError_Init_PrismStartupTimedOut = 152,
1643 VRInitError_Init_CouldNotStartPrism = 153,
1644 VRInitError_Init_CreateDriverDirectDeviceFailed = 154,
1645 VRInitError_Init_PrismExitedUnexpectedly = 155,
1646
1647 VRInitError_Driver_Failed = 200,
1648 VRInitError_Driver_Unknown = 201,
1649 VRInitError_Driver_HmdUnknown = 202,
1650 VRInitError_Driver_NotLoaded = 203,
1651 VRInitError_Driver_RuntimeOutOfDate = 204,
1652 VRInitError_Driver_HmdInUse = 205,
1653 VRInitError_Driver_NotCalibrated = 206,
1654 VRInitError_Driver_CalibrationInvalid = 207,
1655 VRInitError_Driver_HmdDisplayNotFound = 208,
1656 VRInitError_Driver_TrackedDeviceInterfaceUnknown = 209,
1657 // VRInitError_Driver_HmdDisplayNotFoundAfterFix = 210, // not needed: here for historic reasons
1658 VRInitError_Driver_HmdDriverIdOutOfBounds = 211,
1659 VRInitError_Driver_HmdDisplayMirrored = 212,
1660 VRInitError_Driver_HmdDisplayNotFoundLaptop = 213,
1661 // Never make error 259 because we return it from main and it would conflict with STILL_ACTIVE
1662
1663 VRInitError_IPC_ServerInitFailed = 300,
1664 VRInitError_IPC_ConnectFailed = 301,
1665 VRInitError_IPC_SharedStateInitFailed = 302,
1666 VRInitError_IPC_CompositorInitFailed = 303,
1667 VRInitError_IPC_MutexInitFailed = 304,
1668 VRInitError_IPC_Failed = 305,
1669 VRInitError_IPC_CompositorConnectFailed = 306,
1670 VRInitError_IPC_CompositorInvalidConnectResponse = 307,
1671 VRInitError_IPC_ConnectFailedAfterMultipleAttempts = 308,
1672 VRInitError_IPC_ConnectFailedAfterTargetExited = 309,
1673 VRInitError_IPC_NamespaceUnavailable = 310,
1674
1675 VRInitError_Compositor_Failed = 400,
1676 VRInitError_Compositor_D3D11HardwareRequired = 401,
1677 VRInitError_Compositor_FirmwareRequiresUpdate = 402,
1678 VRInitError_Compositor_OverlayInitFailed = 403,
1679 VRInitError_Compositor_ScreenshotsInitFailed = 404,
1680 VRInitError_Compositor_UnableToCreateDevice = 405,
1681 VRInitError_Compositor_SharedStateIsNull = 406,
1682 VRInitError_Compositor_NotificationManagerIsNull = 407,
1683 VRInitError_Compositor_ResourceManagerClientIsNull = 408,
1684 VRInitError_Compositor_MessageOverlaySharedStateInitFailure = 409,
1685 VRInitError_Compositor_PropertiesInterfaceIsNull = 410,
1686 VRInitError_Compositor_CreateFullscreenWindowFailed = 411,
1687 VRInitError_Compositor_SettingsInterfaceIsNull = 412,
1688 VRInitError_Compositor_FailedToShowWindow = 413,
1689 VRInitError_Compositor_DistortInterfaceIsNull = 414,
1690 VRInitError_Compositor_DisplayFrequencyFailure = 415,
1691 VRInitError_Compositor_RendererInitializationFailed = 416,
1692 VRInitError_Compositor_DXGIFactoryInterfaceIsNull = 417,
1693 VRInitError_Compositor_DXGIFactoryCreateFailed = 418,
1694 VRInitError_Compositor_DXGIFactoryQueryFailed = 419,
1695 VRInitError_Compositor_InvalidAdapterDesktop = 420,
1696 VRInitError_Compositor_InvalidHmdAttachment = 421,
1697 VRInitError_Compositor_InvalidOutputDesktop = 422,
1698 VRInitError_Compositor_InvalidDeviceProvided = 423,
1699 VRInitError_Compositor_D3D11RendererInitializationFailed = 424,
1700 VRInitError_Compositor_FailedToFindDisplayMode = 425,
1701 VRInitError_Compositor_FailedToCreateSwapChain = 426,
1702 VRInitError_Compositor_FailedToGetBackBuffer = 427,
1703 VRInitError_Compositor_FailedToCreateRenderTarget = 428,
1704 VRInitError_Compositor_FailedToCreateDXGI2SwapChain = 429,
1705 VRInitError_Compositor_FailedtoGetDXGI2BackBuffer = 430,
1706 VRInitError_Compositor_FailedToCreateDXGI2RenderTarget = 431,
1707 VRInitError_Compositor_FailedToGetDXGIDeviceInterface = 432,
1708 VRInitError_Compositor_SelectDisplayMode = 433,
1709 VRInitError_Compositor_FailedToCreateNvAPIRenderTargets = 434,
1710 VRInitError_Compositor_NvAPISetDisplayMode = 435,
1711 VRInitError_Compositor_FailedToCreateDirectModeDisplay = 436,
1712 VRInitError_Compositor_InvalidHmdPropertyContainer = 437,
1713 VRInitError_Compositor_UpdateDisplayFrequency = 438,
1714 VRInitError_Compositor_CreateRasterizerState = 439,
1715 VRInitError_Compositor_CreateWireframeRasterizerState = 440,
1716 VRInitError_Compositor_CreateSamplerState = 441,
1717 VRInitError_Compositor_CreateClampToBorderSamplerState = 442,
1718 VRInitError_Compositor_CreateAnisoSamplerState = 443,
1719 VRInitError_Compositor_CreateOverlaySamplerState = 444,
1720 VRInitError_Compositor_CreatePanoramaSamplerState = 445,
1721 VRInitError_Compositor_CreateFontSamplerState = 446,
1722 VRInitError_Compositor_CreateNoBlendState = 447,
1723 VRInitError_Compositor_CreateBlendState = 448,
1724 VRInitError_Compositor_CreateAlphaBlendState = 449,
1725 VRInitError_Compositor_CreateBlendStateMaskR = 450,
1726 VRInitError_Compositor_CreateBlendStateMaskG = 451,
1727 VRInitError_Compositor_CreateBlendStateMaskB = 452,
1728 VRInitError_Compositor_CreateDepthStencilState = 453,
1729 VRInitError_Compositor_CreateDepthStencilStateNoWrite = 454,
1730 VRInitError_Compositor_CreateDepthStencilStateNoDepth = 455,
1731 VRInitError_Compositor_CreateFlushTexture = 456,
1732 VRInitError_Compositor_CreateDistortionSurfaces = 457,
1733 VRInitError_Compositor_CreateConstantBuffer = 458,
1734 VRInitError_Compositor_CreateHmdPoseConstantBuffer = 459,
1735 VRInitError_Compositor_CreateHmdPoseStagingConstantBuffer = 460,
1736 VRInitError_Compositor_CreateSharedFrameInfoConstantBuffer = 461,
1737 VRInitError_Compositor_CreateOverlayConstantBuffer = 462,
1738 VRInitError_Compositor_CreateSceneTextureIndexConstantBuffer = 463,
1739 VRInitError_Compositor_CreateReadableSceneTextureIndexConstantBuffer = 464,
1740 VRInitError_Compositor_CreateLayerGraphicsTextureIndexConstantBuffer = 465,
1741 VRInitError_Compositor_CreateLayerComputeTextureIndexConstantBuffer = 466,
1742 VRInitError_Compositor_CreateLayerComputeSceneTextureIndexConstantBuffer = 467,
1743 VRInitError_Compositor_CreateComputeHmdPoseConstantBuffer = 468,
1744 VRInitError_Compositor_CreateGeomConstantBuffer = 469,
1745 VRInitError_Compositor_CreatePanelMaskConstantBuffer = 470,
1746 VRInitError_Compositor_CreatePixelSimUBO = 471,
1747 VRInitError_Compositor_CreateMSAARenderTextures = 472,
1748 VRInitError_Compositor_CreateResolveRenderTextures = 473,
1749 VRInitError_Compositor_CreateComputeResolveRenderTextures = 474,
1750 VRInitError_Compositor_CreateDriverDirectModeResolveTextures = 475,
1751 VRInitError_Compositor_OpenDriverDirectModeResolveTextures = 476,
1752 VRInitError_Compositor_CreateFallbackSyncTexture = 477,
1753 VRInitError_Compositor_ShareFallbackSyncTexture = 478,
1754 VRInitError_Compositor_CreateOverlayIndexBuffer = 479,
1755 VRInitError_Compositor_CreateOverlayVertexBuffer = 480,
1756 VRInitError_Compositor_CreateTextVertexBuffer = 481,
1757 VRInitError_Compositor_CreateTextIndexBuffer = 482,
1758 VRInitError_Compositor_CreateMirrorTextures = 483,
1759 VRInitError_Compositor_CreateLastFrameRenderTexture = 484,
1760 VRInitError_Compositor_CreateMirrorOverlay = 485,
1761 VRInitError_Compositor_FailedToCreateVirtualDisplayBackbuffer = 486,
1762 VRInitError_Compositor_DisplayModeNotSupported = 487,
1763 VRInitError_Compositor_CreateOverlayInvalidCall = 488,
1764 VRInitError_Compositor_CreateOverlayAlreadyInitialized = 489,
1765 VRInitError_Compositor_FailedToCreateMailbox = 490,
1766 VRInitError_Compositor_WindowInterfaceIsNull = 491,
1767 VRInitError_Compositor_SystemLayerCreateInstance = 492,
1768 VRInitError_Compositor_SystemLayerCreateSession = 493,
1769
1770 VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000,
1771 VRInitError_VendorSpecific_WindowsNotInDevMode = 1001,
1772
1773 VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101,
1774 VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102,
1775 VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103,
1776 VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104,
1777 VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105,
1778 VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106,
1779 VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107,
1780 VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108,
1781 VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109,
1782 VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110,
1783 VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111,
1784 VRInitError_VendorSpecific_HmdFound_UserDataError = 1112,
1785 VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113,
1786 VRInitError_VendorSpecific_OculusRuntimeBadInstall = 1114,
1787
1788 VRInitError_Steam_SteamInstallationNotFound = 2000,
1789
1790 // Strictly a placeholder
1791 VRInitError_LastError
1792};
1793
1794enum EVRScreenshotType
1795{
1796 VRScreenshotType_None = 0,
1797 VRScreenshotType_Mono = 1, // left eye only
1798 VRScreenshotType_Stereo = 2,
1799 VRScreenshotType_Cubemap = 3,
1800 VRScreenshotType_MonoPanorama = 4,
1801 VRScreenshotType_StereoPanorama = 5
1802};
1803
1804enum EVRScreenshotPropertyFilenames
1805{
1806 VRScreenshotPropertyFilenames_Preview = 0,
1807 VRScreenshotPropertyFilenames_VR = 1,
1808};
1809
1810enum EVRTrackedCameraError
1811{
1812 VRTrackedCameraError_None = 0,
1813 VRTrackedCameraError_OperationFailed = 100,
1814 VRTrackedCameraError_InvalidHandle = 101,
1815 VRTrackedCameraError_InvalidFrameHeaderVersion = 102,
1816 VRTrackedCameraError_OutOfHandles = 103,
1817 VRTrackedCameraError_IPCFailure = 104,
1818 VRTrackedCameraError_NotSupportedForThisDevice = 105,
1819 VRTrackedCameraError_SharedMemoryFailure = 106,
1820 VRTrackedCameraError_FrameBufferingFailure = 107,
1821 VRTrackedCameraError_StreamSetupFailure = 108,
1822 VRTrackedCameraError_InvalidGLTextureId = 109,
1823 VRTrackedCameraError_InvalidSharedTextureHandle = 110,
1824 VRTrackedCameraError_FailedToGetGLTextureId = 111,
1825 VRTrackedCameraError_SharedTextureFailure = 112,
1826 VRTrackedCameraError_NoFrameAvailable = 113,
1827 VRTrackedCameraError_InvalidArgument = 114,
1828 VRTrackedCameraError_InvalidFrameBufferSize = 115,
1829};
1830
1831enum EVRTrackedCameraFrameLayout
1832{
1833 EVRTrackedCameraFrameLayout_Mono = 0x0001,
1834 EVRTrackedCameraFrameLayout_Stereo = 0x0002,
1835 EVRTrackedCameraFrameLayout_VerticalLayout = 0x0010, // Stereo frames are Top/Bottom (left/right)
1836 EVRTrackedCameraFrameLayout_HorizontalLayout = 0x0020, // Stereo frames are Left/Right
1837};
1838
1839enum EVRTrackedCameraFrameType
1840{
1841 VRTrackedCameraFrameType_Distorted = 0, // This is the camera video frame size in pixels, still distorted.
1842 VRTrackedCameraFrameType_Undistorted, // In pixels, an undistorted inscribed rectangle region without invalid regions. This size is subject to changes shortly.
1843 VRTrackedCameraFrameType_MaximumUndistorted, // In pixels, maximum undistorted with invalid regions. Non zero alpha component identifies valid regions.
1844 MAX_CAMERA_FRAME_TYPES
1845};
1846
1847enum EVRDistortionFunctionType
1848{
1849 VRDistortionFunctionType_None,
1850 VRDistortionFunctionType_FTheta,
1851 VRDistortionFunctionType_Extended_FTheta,
1852 MAX_DISTORTION_FUNCTION_TYPES,
1853};
1854
1855static const uint32_t k_unMaxDistortionFunctionParameters = 8;
1856
1857typedef uint64_t TrackedCameraHandle_t;
1858#define INVALID_TRACKED_CAMERA_HANDLE ((vr::TrackedCameraHandle_t)0)
1859
1860struct CameraVideoStreamFrameHeader_t
1861{
1862 EVRTrackedCameraFrameType eFrameType;
1863
1864 uint32_t nWidth;
1865 uint32_t nHeight;
1866 uint32_t nBytesPerPixel;
1867
1868 uint32_t nFrameSequence;
1869
1870 TrackedDevicePose_t trackedDevicePose;
1871
1872 uint64_t ulFrameExposureTime; // mid-point of the exposure of the image in host system ticks
1873};
1874
1875// Screenshot types
1876typedef uint32_t ScreenshotHandle_t;
1877
1878static const uint32_t k_unScreenshotHandleInvalid = 0;
1879
1880/** Compositor frame timing reprojection flags. */
1881const uint32_t VRCompositor_ReprojectionReason_Cpu = 0x01;
1882const uint32_t VRCompositor_ReprojectionReason_Gpu = 0x02;
1883const uint32_t VRCompositor_ReprojectionAsync = 0x04; // This flag indicates the async reprojection mode is active,
1884 // but does not indicate if reprojection actually happened or not.
1885 // Use the ReprojectionReason flags above to check if reprojection
1886 // was actually applied (i.e. scene texture was reused).
1887 // NumFramePresents > 1 also indicates the scene texture was reused,
1888 // and also the number of times that it was presented in total.
1889
1890const uint32_t VRCompositor_ReprojectionMotion = 0x08; // This flag indicates whether or not motion smoothing was triggered for this frame
1891
1892const uint32_t VRCompositor_PredictionMask = 0xF0; // The runtime may predict more than one frame (up to four) ahead if
1893 // it detects the application is taking too long to render. These two
1894 // bits will contain the count of additional frames (normally zero).
1895 // Use the VR_COMPOSITOR_ADDITIONAL_PREDICTED_FRAMES macro to read from
1896 // the latest frame timing entry.
1897
1898const uint32_t VRCompositor_ThrottleMask = 0xF00; // Number of frames the compositor is throttling the application.
1899 // Use the VR_COMPOSITOR_NUMBER_OF_THROTTLED_FRAMES macro to read from
1900 // the latest frame timing entry.
1901
1902#define VR_COMPOSITOR_ADDITIONAL_PREDICTED_FRAMES( timing ) ( ( ( timing ).m_nReprojectionFlags & vr::VRCompositor_PredictionMask ) >> 4 )
1903#define VR_COMPOSITOR_NUMBER_OF_THROTTLED_FRAMES( timing ) ( ( ( timing ).m_nReprojectionFlags & vr::VRCompositor_ThrottleMask ) >> 8 )
1904
1905/** Provides a single frame's timing information to the app */
1906struct Compositor_FrameTiming
1907{
1908 uint32_t m_nSize; // Set to sizeof( Compositor_FrameTiming )
1909 uint32_t m_nFrameIndex;
1910 uint32_t m_nNumFramePresents; // number of times this frame was presented
1911 uint32_t m_nNumMisPresented; // number of times this frame was presented on a vsync other than it was originally predicted to
1912 uint32_t m_nNumDroppedFrames; // number of additional times previous frame was scanned out
1913 uint32_t m_nReprojectionFlags;
1914
1915 /** Absolute time reference for comparing frames. This aligns with the vsync that running start is relative to. */
1916 double m_flSystemTimeInSeconds;
1917
1918 /** These times may include work from other processes due to OS scheduling.
1919 * The fewer packets of work these are broken up into, the less likely this will happen.
1920 * GPU work can be broken up by calling Flush. This can sometimes be useful to get the GPU started
1921 * processing that work earlier in the frame. */
1922 float m_flPreSubmitGpuMs; // time spent rendering the scene (gpu work submitted between WaitGetPoses and second Submit)
1923 float m_flPostSubmitGpuMs; // additional time spent rendering by application (e.g. companion window)
1924 float m_flTotalRenderGpuMs; // time between work submitted immediately after present (ideally vsync) until the end of compositor submitted work
1925 float m_flCompositorRenderGpuMs; // time spend performing distortion correction, rendering chaperone, overlays, etc.
1926 float m_flCompositorRenderCpuMs; // time spent on cpu submitting the above work for this frame
1927 float m_flCompositorIdleCpuMs; // time spent waiting for running start (application could have used this much more time)
1928
1929 /** Miscellaneous measured intervals. */
1930 float m_flClientFrameIntervalMs; // time between calls to WaitGetPoses
1931 float m_flPresentCallCpuMs; // time blocked on call to present (usually 0.0, but can go long)
1932 float m_flWaitForPresentCpuMs; // time spent spin-waiting for frame index to change (not near-zero indicates wait object failure)
1933 float m_flSubmitFrameMs; // time spent in IVRCompositor::Submit (not near-zero indicates driver issue)
1934
1935 /** The following are all relative to this frame's SystemTimeInSeconds */
1936 float m_flWaitGetPosesCalledMs;
1937 float m_flNewPosesReadyMs;
1938 float m_flNewFrameReadyMs; // second call to IVRCompositor::Submit
1939 float m_flCompositorUpdateStartMs;
1940 float m_flCompositorUpdateEndMs;
1941 float m_flCompositorRenderStartMs;
1942
1943 vr::TrackedDevicePose_t m_HmdPose; // pose used by app to render this frame
1944
1945 uint32_t m_nNumVSyncsReadyForUse;
1946 uint32_t m_nNumVSyncsToFirstView;
1947};
1948
1949/** Provides compositor benchmark results to the app */
1950struct Compositor_BenchmarkResults
1951{
1952 float m_flMegaPixelsPerSecond; // Measurement of GPU MP/s performed by compositor benchmark
1953 float m_flHmdRecommendedMegaPixelsPerSecond; // Recommended default MP/s given the HMD resolution, refresh, and panel mask.
1954};
1955
1956/** Frame timing data provided by direct mode drivers. */
1957struct DriverDirectMode_FrameTiming
1958{
1959 uint32_t m_nSize; // Set to sizeof( DriverDirectMode_FrameTiming )
1960 uint32_t m_nNumFramePresents; // number of times frame was presented
1961 uint32_t m_nNumMisPresented; // number of times frame was presented on a vsync other than it was originally predicted to
1962 uint32_t m_nNumDroppedFrames; // number of additional times previous frame was scanned out (i.e. compositor missed vsync)
1963 uint32_t m_nReprojectionFlags;
1964};
1965
1966/** These flags will be set on DriverDirectMode_FrameTiming::m_nReprojectionFlags when IVRDriverDirectModeComponent::GetFrameTiming is called for drivers to optionally respond to. */
1967const uint32_t VRCompositor_ReprojectionMotion_Enabled = 0x100; // Motion Smoothing is enabled in the UI for the currently running application
1968const uint32_t VRCompositor_ReprojectionMotion_ForcedOn = 0x200; // Motion Smoothing is forced on in the UI for the currently running application
1969const uint32_t VRCompositor_ReprojectionMotion_AppThrottled = 0x400; // Application is requesting throttling via ForceInterleavedReprojectionOn
1970
1971
1972enum EVSync
1973{
1974 VSync_None,
1975 VSync_WaitRender, // block following render work until vsync
1976 VSync_NoWaitRender, // do not block following render work (allow to get started early)
1977};
1978
1979enum EVRMuraCorrectionMode
1980{
1981 EVRMuraCorrectionMode_Default = 0,
1982 EVRMuraCorrectionMode_NoCorrection
1983};
1984
1985/** raw IMU data provided by IVRIOBuffer from paths to tracked devices with IMUs */
1986enum Imu_OffScaleFlags
1987{
1988 OffScale_AccelX = 0x01,
1989 OffScale_AccelY = 0x02,
1990 OffScale_AccelZ = 0x04,
1991 OffScale_GyroX = 0x08,
1992 OffScale_GyroY = 0x10,
1993 OffScale_GyroZ = 0x20,
1994};
1995
1996struct ImuSample_t
1997{
1998 double fSampleTime;
1999 HmdVector3d_t vAccel;
2000 HmdVector3d_t vGyro;
2001 uint32_t unOffScaleFlags;
2002};
2003
2004#pragma pack( pop )
2005
2006// figure out how to import from the VR API dll
2007#if defined(_WIN32)
2008
2009 #if !defined(OPENVR_BUILD_STATIC)
2010 #ifdef VR_API_EXPORT
2011 #define VR_INTERFACE extern "C" __declspec( dllexport )
2012 #else
2013 #define VR_INTERFACE extern "C" __declspec( dllimport )
2014 #endif
2015 #else
2016 #define VR_INTERFACE extern "C"
2017 #endif
2018
2019#elif defined(__GNUC__) || defined(COMPILER_GCC) || defined(__APPLE__)
2020
2021#ifdef VR_API_EXPORT
2022 #define VR_INTERFACE extern "C" __attribute__((visibility("default")))
2023#else
2024 #define VR_INTERFACE extern "C"
2025#endif
2026
2027#else
2028 #error "Unsupported Platform."
2029#endif
2030
2031
2032#if defined( _WIN32 )
2033 #define VR_CALLTYPE __cdecl
2034#else
2035 #define VR_CALLTYPE
2036#endif
2037
2038} // namespace vr
2039#endif // _INCLUDE_VRTYPES_H
2040
2041// vrannotation.h
2042
2043#ifdef API_GEN
2044# define VR_CLANG_ATTR(ATTR) __attribute__((annotate( ATTR )))
2045#else
2046# define VR_CLANG_ATTR(ATTR)
2047#endif
2048
2049#define VR_METHOD_DESC(DESC) VR_CLANG_ATTR( "desc:" #DESC ";" )
2050#define VR_IGNOREATTR() VR_CLANG_ATTR( "ignore" )
2051#define VR_OUT_STRUCT() VR_CLANG_ATTR( "out_struct: ;" )
2052#define VR_OUT_STRING() VR_CLANG_ATTR( "out_string: ;" )
2053#define VR_OUT_ARRAY_CALL(COUNTER,FUNCTION,PARAMS) VR_CLANG_ATTR( "out_array_call:" #COUNTER "," #FUNCTION "," #PARAMS ";" )
2054#define VR_OUT_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "out_array_count:" #COUNTER ";" )
2055#define VR_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "array_count:" #COUNTER ";" )
2056#define VR_ARRAY_COUNT_D(COUNTER, DESC) VR_CLANG_ATTR( "array_count:" #COUNTER ";desc:" #DESC )
2057#define VR_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "buffer_count:" #COUNTER ";" )
2058#define VR_OUT_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "out_buffer_count:" #COUNTER ";" )
2059#define VR_OUT_STRING_COUNT(COUNTER) VR_CLANG_ATTR( "out_string_count:" #COUNTER ";" )
2060
2061// ivrsystem.h
2062
2063namespace vr
2064{
2065
2066class IVRSystem
2067{
2068public:
2069
2070
2071 // ------------------------------------
2072 // Display Methods
2073 // ------------------------------------
2074
2075 /** Suggested size for the intermediate render target that the distortion pulls from. */
2076 virtual void GetRecommendedRenderTargetSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
2077
2078 /** The projection matrix for the specified eye */
2079 virtual HmdMatrix44_t GetProjectionMatrix( EVREye eEye, float fNearZ, float fFarZ ) = 0;
2080
2081 /** The components necessary to build your own projection matrix in case your
2082 * application is doing something fancy like infinite Z */
2083 virtual void GetProjectionRaw( EVREye eEye, float *pfLeft, float *pfRight, float *pfTop, float *pfBottom ) = 0;
2084
2085 /** Gets the result of the distortion function for the specified eye and input UVs. UVs go from 0,0 in
2086 * the upper left of that eye's viewport and 1,1 in the lower right of that eye's viewport.
2087 * Returns true for success. Otherwise, returns false, and distortion coordinates are not suitable. */
2088 virtual bool ComputeDistortion( EVREye eEye, float fU, float fV, DistortionCoordinates_t *pDistortionCoordinates ) = 0;
2089
2090 /** Returns the transform from eye space to the head space. Eye space is the per-eye flavor of head
2091 * space that provides stereo disparity. Instead of Model * View * Projection the sequence is Model * View * Eye^-1 * Projection.
2092 * Normally View and Eye^-1 will be multiplied together and treated as View in your application.
2093 */
2094 virtual HmdMatrix34_t GetEyeToHeadTransform( EVREye eEye ) = 0;
2095
2096 /** Returns the number of elapsed seconds since the last recorded vsync event. This
2097 * will come from a vsync timer event in the timer if possible or from the application-reported
2098 * time if that is not available. If no vsync times are available the function will
2099 * return zero for vsync time and frame counter and return false from the method. */
2100 virtual bool GetTimeSinceLastVsync( float *pfSecondsSinceLastVsync, uint64_t *pulFrameCounter ) = 0;
2101
2102 /** [D3D9 Only]
2103 * Returns the adapter index that the user should pass into CreateDevice to set up D3D9 in such
2104 * a way that it can go full screen exclusive on the HMD. Returns -1 if there was an error.
2105 */
2106 virtual int32_t GetD3D9AdapterIndex() = 0;
2107
2108 /** [D3D10/11 Only]
2109 * Returns the adapter index that the user should pass into EnumAdapters to create the device
2110 * and swap chain in DX10 and DX11. If an error occurs the index will be set to -1.
2111 */
2112 virtual void GetDXGIOutputInfo( int32_t *pnAdapterIndex ) = 0;
2113
2114 /**
2115 * Returns platform- and texture-type specific adapter identification so that applications and the
2116 * compositor are creating textures and swap chains on the same GPU. If an error occurs the device
2117 * will be set to 0.
2118 * pInstance is an optional parameter that is required only when textureType is TextureType_Vulkan.
2119 * [D3D10/11/12 Only (D3D9 Not Supported)]
2120 * Returns the adapter LUID that identifies the GPU attached to the HMD. The user should
2121 * enumerate all adapters using IDXGIFactory::EnumAdapters and IDXGIAdapter::GetDesc to find
2122 * the adapter with the matching LUID, or use IDXGIFactory4::EnumAdapterByLuid.
2123 * The discovered IDXGIAdapter should be used to create the device and swap chain.
2124 * [Vulkan Only]
2125 * Returns the VkPhysicalDevice that should be used by the application.
2126 * pInstance must be the instance the application will use to query for the VkPhysicalDevice. The application
2127 * must create the VkInstance with extensions returned by IVRCompositor::GetVulkanInstanceExtensionsRequired enabled.
2128 * [macOS Only]
2129 * For TextureType_IOSurface returns the id<MTLDevice> that should be used by the application.
2130 * On 10.13+ for TextureType_OpenGL returns the 'registryId' of the renderer which should be used
2131 * by the application. See Apple Technical Q&A QA1168 for information on enumerating GL Renderers, and the
2132 * new kCGLRPRegistryIDLow and kCGLRPRegistryIDHigh CGLRendererProperty values in the 10.13 SDK.
2133 * Pre 10.13 for TextureType_OpenGL returns 0, as there is no dependable way to correlate the HMDs MTLDevice
2134 * with a GL Renderer.
2135 */
2136 virtual void GetOutputDevice( uint64_t *pnDevice, ETextureType textureType, VkInstance_T *pInstance = nullptr ) = 0;
2137
2138 // ------------------------------------
2139 // Display Mode methods
2140 // ------------------------------------
2141
2142 /** Use to determine if the headset display is part of the desktop (i.e. extended) or hidden (i.e. direct mode). */
2143 virtual bool IsDisplayOnDesktop() = 0;
2144
2145 /** Set the display visibility (true = extended, false = direct mode). Return value of true indicates that the change was successful. */
2146 virtual bool SetDisplayVisibility( bool bIsVisibleOnDesktop ) = 0;
2147
2148 // ------------------------------------
2149 // Tracking Methods
2150 // ------------------------------------
2151
2152 /** The pose that the tracker thinks that the HMD will be in at the specified number of seconds into the
2153 * future. Pass 0 to get the state at the instant the method is called. Most of the time the application should
2154 * calculate the time until the photons will be emitted from the display and pass that time into the method.
2155 *
2156 * This is roughly analogous to the inverse of the view matrix in most applications, though
2157 * many games will need to do some additional rotation or translation on top of the rotation
2158 * and translation provided by the head pose.
2159 *
2160 * For devices where bPoseIsValid is true the application can use the pose to position the device
2161 * in question. The provided array can be any size up to k_unMaxTrackedDeviceCount.
2162 *
2163 * Seated experiences should call this method with TrackingUniverseSeated and receive poses relative
2164 * to the seated zero pose. Standing experiences should call this method with TrackingUniverseStanding
2165 * and receive poses relative to the Chaperone Play Area. TrackingUniverseRawAndUncalibrated should
2166 * probably not be used unless the application is the Chaperone calibration tool itself, but will provide
2167 * poses relative to the hardware-specific coordinate system in the driver.
2168 */
2169 virtual void GetDeviceToAbsoluteTrackingPose( ETrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, VR_ARRAY_COUNT(unTrackedDevicePoseArrayCount) TrackedDevicePose_t *pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount ) = 0;
2170
2171 /** Returns the transform from the seated zero pose to the standing absolute tracking system. This allows
2172 * applications to represent the seated origin to used or transform object positions from one coordinate
2173 * system to the other.
2174 *
2175 * The seated origin may or may not be inside the Play Area or Collision Bounds returned by IVRChaperone. Its position
2176 * depends on what the user has set from the Dashboard settings and previous calls to ResetSeatedZeroPose. */
2177 virtual HmdMatrix34_t GetSeatedZeroPoseToStandingAbsoluteTrackingPose() = 0;
2178
2179 /** Returns the transform from the tracking origin to the standing absolute tracking system. This allows
2180 * applications to convert from raw tracking space to the calibrated standing coordinate system. */
2181 virtual HmdMatrix34_t GetRawZeroPoseToStandingAbsoluteTrackingPose() = 0;
2182
2183 /** Get a sorted array of device indices of a given class of tracked devices (e.g. controllers). Devices are sorted right to left
2184 * relative to the specified tracked device (default: hmd -- pass in -1 for absolute tracking space). Returns the number of devices
2185 * in the list, or the size of the array needed if not large enough. */
2186 virtual uint32_t GetSortedTrackedDeviceIndicesOfClass( ETrackedDeviceClass eTrackedDeviceClass, VR_ARRAY_COUNT(unTrackedDeviceIndexArrayCount) vr::TrackedDeviceIndex_t *punTrackedDeviceIndexArray, uint32_t unTrackedDeviceIndexArrayCount, vr::TrackedDeviceIndex_t unRelativeToTrackedDeviceIndex = k_unTrackedDeviceIndex_Hmd ) = 0;
2187
2188 /** Returns the level of activity on the device. */
2189 virtual EDeviceActivityLevel GetTrackedDeviceActivityLevel( vr::TrackedDeviceIndex_t unDeviceId ) = 0;
2190
2191 /** Convenience utility to apply the specified transform to the specified pose.
2192 * This properly transforms all pose components, including velocity and angular velocity
2193 */
2194 virtual void ApplyTransform( TrackedDevicePose_t *pOutputPose, const TrackedDevicePose_t *pTrackedDevicePose, const HmdMatrix34_t *pTransform ) = 0;
2195
2196 /** Returns the device index associated with a specific role, for example the left hand or the right hand. This function is deprecated in favor of the new IVRInput system. */
2197 virtual vr::TrackedDeviceIndex_t GetTrackedDeviceIndexForControllerRole( vr::ETrackedControllerRole unDeviceType ) = 0;
2198
2199 /** Returns the controller type associated with a device index. This function is deprecated in favor of the new IVRInput system. */
2200 virtual vr::ETrackedControllerRole GetControllerRoleForTrackedDeviceIndex( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
2201
2202 // ------------------------------------
2203 // Property methods
2204 // ------------------------------------
2205
2206 /** Returns the device class of a tracked device. If there has not been a device connected in this slot
2207 * since the application started this function will return TrackedDevice_Invalid. For previous detected
2208 * devices the function will return the previously observed device class.
2209 *
2210 * To determine which devices exist on the system, just loop from 0 to k_unMaxTrackedDeviceCount and check
2211 * the device class. Every device with something other than TrackedDevice_Invalid is associated with an
2212 * actual tracked device. */
2213 virtual ETrackedDeviceClass GetTrackedDeviceClass( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
2214
2215 /** Returns true if there is a device connected in this slot. */
2216 virtual bool IsTrackedDeviceConnected( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
2217
2218 /** Returns a bool property. If the device index is not valid or the property is not a bool type this function will return false. */
2219 virtual bool GetBoolTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
2220
2221 /** Returns a float property. If the device index is not valid or the property is not a float type this function will return 0. */
2222 virtual float GetFloatTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
2223
2224 /** Returns an int property. If the device index is not valid or the property is not a int type this function will return 0. */
2225 virtual int32_t GetInt32TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
2226
2227 /** Returns a uint64 property. If the device index is not valid or the property is not a uint64 type this function will return 0. */
2228 virtual uint64_t GetUint64TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
2229
2230 /** Returns a matrix property. If the device index is not valid or the property is not a matrix type, this function will return identity. */
2231 virtual HmdMatrix34_t GetMatrix34TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
2232
2233 /** Returns an array of one type of property. If the device index is not valid or the property is not a single value or an array of the specified type,
2234 * this function will return 0. Otherwise it returns the number of bytes necessary to hold the array of properties. If unBufferSize is
2235 * greater than the returned size and pBuffer is non-NULL, pBuffer is filled with the contents of array of properties. */
2236 virtual uint32_t GetArrayTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, PropertyTypeTag_t propType, void *pBuffer, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ) = 0;
2237
2238 /** Returns a string property. If the device index is not valid or the property is not a string type this function will
2239 * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing
2240 * null. Strings will always fit in buffers of k_unMaxPropertyStringSize characters. */
2241 virtual uint32_t GetStringTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ) = 0;
2242
2243 /** returns a string that corresponds with the specified property error. The string will be the name
2244 * of the error enum value for all valid error codes */
2245 virtual const char *GetPropErrorNameFromEnum( ETrackedPropertyError error ) = 0;
2246
2247 // ------------------------------------
2248 // Event methods
2249 // ------------------------------------
2250
2251 /** Returns true and fills the event with the next event on the queue if there is one. If there are no events
2252 * this method returns false. uncbVREvent should be the size in bytes of the VREvent_t struct */
2253 virtual bool PollNextEvent( VREvent_t *pEvent, uint32_t uncbVREvent ) = 0;
2254
2255 /** Returns true and fills the event with the next event on the queue if there is one. If there are no events
2256 * this method returns false. Fills in the pose of the associated tracked device in the provided pose struct.
2257 * This pose will always be older than the call to this function and should not be used to render the device.
2258 uncbVREvent should be the size in bytes of the VREvent_t struct */
2259 virtual bool PollNextEventWithPose( ETrackingUniverseOrigin eOrigin, VREvent_t *pEvent, uint32_t uncbVREvent, vr::TrackedDevicePose_t *pTrackedDevicePose ) = 0;
2260
2261 /** returns the name of an EVREvent enum value */
2262 virtual const char *GetEventTypeNameFromEnum( EVREventType eType ) = 0;
2263
2264 // ------------------------------------
2265 // Rendering helper methods
2266 // ------------------------------------
2267
2268 /** Returns the hidden area mesh for the current HMD. The pixels covered by this mesh will never be seen by the user after the lens distortion is
2269 * applied based on visibility to the panels. If this HMD does not have a hidden area mesh, the vertex data and count will be NULL and 0 respectively.
2270 * This mesh is meant to be rendered into the stencil buffer (or into the depth buffer setting nearz) before rendering each eye's view.
2271 * This will improve performance by letting the GPU early-reject pixels the user will never see before running the pixel shader.
2272 * NOTE: Render this mesh with backface culling disabled since the winding order of the vertices can be different per-HMD or per-eye.
2273 * Setting the bInverse argument to true will produce the visible area mesh that is commonly used in place of full-screen quads. The visible area mesh covers all of the pixels the hidden area mesh does not cover.
2274 * Setting the bLineLoop argument will return a line loop of vertices in HiddenAreaMesh_t->pVertexData with HiddenAreaMesh_t->unTriangleCount set to the number of vertices.
2275 */
2276 virtual HiddenAreaMesh_t GetHiddenAreaMesh( EVREye eEye, EHiddenAreaMeshType type = k_eHiddenAreaMesh_Standard ) = 0;
2277
2278 // ------------------------------------
2279 // Controller methods
2280 // ------------------------------------
2281
2282 /** Fills the supplied struct with the current state of the controller. Returns false if the controller index
2283 * is invalid. This function is deprecated in favor of the new IVRInput system. */
2284 virtual bool GetControllerState( vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t *pControllerState, uint32_t unControllerStateSize ) = 0;
2285
2286 /** fills the supplied struct with the current state of the controller and the provided pose with the pose of
2287 * the controller when the controller state was updated most recently. Use this form if you need a precise controller
2288 * pose as input to your application when the user presses or releases a button. This function is deprecated in favor of the new IVRInput system. */
2289 virtual bool GetControllerStateWithPose( ETrackingUniverseOrigin eOrigin, vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t *pControllerState, uint32_t unControllerStateSize, TrackedDevicePose_t *pTrackedDevicePose ) = 0;
2290
2291 /** Trigger a single haptic pulse on a controller. After this call the application may not trigger another haptic pulse on this controller
2292 * and axis combination for 5ms. This function is deprecated in favor of the new IVRInput system. */
2293 virtual void TriggerHapticPulse( vr::TrackedDeviceIndex_t unControllerDeviceIndex, uint32_t unAxisId, unsigned short usDurationMicroSec ) = 0;
2294
2295 /** returns the name of an EVRButtonId enum value. This function is deprecated in favor of the new IVRInput system. */
2296 virtual const char *GetButtonIdNameFromEnum( EVRButtonId eButtonId ) = 0;
2297
2298 /** returns the name of an EVRControllerAxisType enum value. This function is deprecated in favor of the new IVRInput system. */
2299 virtual const char *GetControllerAxisTypeNameFromEnum( EVRControllerAxisType eAxisType ) = 0;
2300
2301 /** Returns true if this application is receiving input from the system. This would return false if
2302 * system-related functionality is consuming the input stream. */
2303 virtual bool IsInputAvailable() = 0;
2304
2305 /** Returns true SteamVR is drawing controllers on top of the application. Applications should consider
2306 * not drawing anything attached to the user's hands in this case. */
2307 virtual bool IsSteamVRDrawingControllers() = 0;
2308
2309 /** Returns true if the user has put SteamVR into a mode that is distracting them from the application.
2310 * For applications where this is appropriate, the application should pause ongoing activity. */
2311 virtual bool ShouldApplicationPause() = 0;
2312
2313 /** Returns true if SteamVR is doing significant rendering work and the game should do what it can to reduce
2314 * its own workload. One common way to do this is to reduce the size of the render target provided for each eye. */
2315 virtual bool ShouldApplicationReduceRenderingWork() = 0;
2316
2317 // ------------------------------------
2318 // Firmware methods
2319 // ------------------------------------
2320
2321 /** Performs the actual firmware update if applicable.
2322 * The following events will be sent, if VRFirmwareError_None was returned: VREvent_FirmwareUpdateStarted, VREvent_FirmwareUpdateFinished
2323 * Use the properties Prop_Firmware_UpdateAvailable_Bool, Prop_Firmware_ManualUpdate_Bool, and Prop_Firmware_ManualUpdateURL_String
2324 * to figure our whether a firmware update is available, and to figure out whether its a manual update
2325 * Prop_Firmware_ManualUpdateURL_String should point to an URL describing the manual update process */
2326 virtual vr::EVRFirmwareError PerformFirmwareUpdate( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
2327
2328 // ------------------------------------
2329 // Application life cycle methods
2330 // ------------------------------------
2331
2332 /** Call this to acknowledge to the system that VREvent_Quit has been received and that the process is exiting.
2333 * This extends the timeout until the process is killed. */
2334 virtual void AcknowledgeQuit_Exiting() = 0;
2335
2336 // -------------------------------------
2337 // App container sandbox methods
2338 // -------------------------------------
2339
2340 /** Retrieves a null-terminated, semicolon-delimited list of UTF8 file paths that an application
2341 * must have read access to when running inside of an app container. Returns the number of bytes
2342 * needed to hold the list. */
2343 virtual uint32_t GetAppContainerFilePaths( VR_OUT_STRING() char *pchBuffer, uint32_t unBufferSize ) = 0;
2344
2345 // -------------------------------------
2346 // System methods
2347 // -------------------------------------
2348
2349 /** Returns the current version of the SteamVR runtime. The returned string will remain valid until VR_Shutdown is called.
2350 *
2351 * NOTE: Is it not appropriate to use this version to test for the presence of any SteamVR feature. Only use this version
2352 * number for logging or showing to a user, and not to try to detect anything at runtime. When appropriate, feature-specific
2353 * presence information is provided by other APIs. */
2354 virtual const char *GetRuntimeVersion() = 0;
2355
2356};
2357
2358static const char * const IVRSystem_Version = "IVRSystem_022";
2359
2360}
2361
2362
2363// ivrapplications.h
2364
2365namespace vr
2366{
2367
2368 /** Used for all errors reported by the IVRApplications interface */
2369 enum EVRApplicationError
2370 {
2371 VRApplicationError_None = 0,
2372
2373 VRApplicationError_AppKeyAlreadyExists = 100, // Only one application can use any given key
2374 VRApplicationError_NoManifest = 101, // the running application does not have a manifest
2375 VRApplicationError_NoApplication = 102, // No application is running
2376 VRApplicationError_InvalidIndex = 103,
2377 VRApplicationError_UnknownApplication = 104, // the application could not be found
2378 VRApplicationError_IPCFailed = 105, // An IPC failure caused the request to fail
2379 VRApplicationError_ApplicationAlreadyRunning = 106,
2380 VRApplicationError_InvalidManifest = 107,
2381 VRApplicationError_InvalidApplication = 108,
2382 VRApplicationError_LaunchFailed = 109, // the process didn't start
2383 VRApplicationError_ApplicationAlreadyStarting = 110, // the system was already starting the same application
2384 VRApplicationError_LaunchInProgress = 111, // The system was already starting a different application
2385 VRApplicationError_OldApplicationQuitting = 112,
2386 VRApplicationError_TransitionAborted = 113,
2387 VRApplicationError_IsTemplate = 114, // error when you try to call LaunchApplication() on a template type app (use LaunchTemplateApplication)
2388 VRApplicationError_SteamVRIsExiting = 115,
2389
2390 VRApplicationError_BufferTooSmall = 200, // The provided buffer was too small to fit the requested data
2391 VRApplicationError_PropertyNotSet = 201, // The requested property was not set
2392 VRApplicationError_UnknownProperty = 202,
2393 VRApplicationError_InvalidParameter = 203,
2394
2395 VRApplicationError_NotImplemented = 300, // Fcn is not implemented in current interface
2396 };
2397
2398 /** The maximum length of an application key */
2399 static const uint32_t k_unMaxApplicationKeyLength = 128;
2400
2401 /** these are the properties available on applications. */
2402 enum EVRApplicationProperty
2403 {
2404 VRApplicationProperty_Name_String = 0,
2405
2406 VRApplicationProperty_LaunchType_String = 11,
2407 VRApplicationProperty_WorkingDirectory_String = 12,
2408 VRApplicationProperty_BinaryPath_String = 13,
2409 VRApplicationProperty_Arguments_String = 14,
2410 VRApplicationProperty_URL_String = 15,
2411
2412 VRApplicationProperty_Description_String = 50,
2413 VRApplicationProperty_NewsURL_String = 51,
2414 VRApplicationProperty_ImagePath_String = 52,
2415 VRApplicationProperty_Source_String = 53,
2416 VRApplicationProperty_ActionManifestURL_String = 54,
2417
2418 VRApplicationProperty_IsDashboardOverlay_Bool = 60,
2419 VRApplicationProperty_IsTemplate_Bool = 61,
2420 VRApplicationProperty_IsInstanced_Bool = 62,
2421 VRApplicationProperty_IsInternal_Bool = 63,
2422 VRApplicationProperty_WantsCompositorPauseInStandby_Bool = 64,
2423 VRApplicationProperty_IsHidden_Bool = 65,
2424
2425 VRApplicationProperty_LastLaunchTime_Uint64 = 70,
2426 };
2427
2428 enum EVRSceneApplicationState
2429 {
2430 EVRSceneApplicationState_None = 0, // Scene Application is not running
2431 EVRSceneApplicationState_Starting = 1, // Scene Application is starting
2432 EVRSceneApplicationState_Quitting = 2, // Scene Application is quitting
2433 EVRSceneApplicationState_Running = 3, // Scene Application is running, and submitting frames, a custom skybox, or a visible overlay
2434 EVRSceneApplicationState_Waiting = 4, // Scene Application is running, but not drawing anything
2435 };
2436
2437 struct AppOverrideKeys_t
2438 {
2439 const char *pchKey;
2440 const char *pchValue;
2441 };
2442
2443 /** Currently recognized mime types */
2444 static const char * const k_pch_MimeType_HomeApp = "vr/home";
2445 static const char * const k_pch_MimeType_GameTheater = "vr/game_theater";
2446
2447 class IVRApplications
2448 {
2449 public:
2450
2451 // --------------- Application management --------------- //
2452
2453 /** Adds an application manifest to the list to load when building the list of installed applications.
2454 * Temporary manifests are not automatically loaded */
2455 virtual EVRApplicationError AddApplicationManifest( const char *pchApplicationManifestFullPath, bool bTemporary = false ) = 0;
2456
2457 /** Removes an application manifest from the list to load when building the list of installed applications. */
2458 virtual EVRApplicationError RemoveApplicationManifest( const char *pchApplicationManifestFullPath ) = 0;
2459
2460 /** Returns true if an application is installed */
2461 virtual bool IsApplicationInstalled( const char *pchAppKey ) = 0;
2462
2463 /** Returns the number of applications available in the list */
2464 virtual uint32_t GetApplicationCount() = 0;
2465
2466 /** Returns the key of the specified application. The index is at least 0 and is less than the return
2467 * value of GetApplicationCount(). The buffer should be at least k_unMaxApplicationKeyLength in order to
2468 * fit the key. */
2469 virtual EVRApplicationError GetApplicationKeyByIndex( uint32_t unApplicationIndex, VR_OUT_STRING() char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0;
2470
2471 /** Returns the key of the application for the specified Process Id. The buffer should be at least
2472 * k_unMaxApplicationKeyLength in order to fit the key. */
2473 virtual EVRApplicationError GetApplicationKeyByProcessId( uint32_t unProcessId, VR_OUT_STRING() char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0;
2474
2475 /** Launches the application. The existing scene application will exit and then the new application will start.
2476 * This call is not valid for dashboard overlay applications. */
2477 virtual EVRApplicationError LaunchApplication( const char *pchAppKey ) = 0;
2478
2479 /** Launches an instance of an application of type template, with its app key being pchNewAppKey (which must be unique) and optionally override sections
2480 * from the manifest file via AppOverrideKeys_t
2481 */
2482 virtual EVRApplicationError LaunchTemplateApplication( const char *pchTemplateAppKey, const char *pchNewAppKey, VR_ARRAY_COUNT( unKeys ) const AppOverrideKeys_t *pKeys, uint32_t unKeys ) = 0;
2483
2484 /** launches the application currently associated with this mime type and passes it the option args, typically the filename or object name of the item being launched */
2485 virtual vr::EVRApplicationError LaunchApplicationFromMimeType( const char *pchMimeType, const char *pchArgs ) = 0;
2486
2487 /** Launches the dashboard overlay application if it is not already running. This call is only valid for
2488 * dashboard overlay applications. */
2489 virtual EVRApplicationError LaunchDashboardOverlay( const char *pchAppKey ) = 0;
2490
2491 /** Cancel a pending launch for an application */
2492 virtual bool CancelApplicationLaunch( const char *pchAppKey ) = 0;
2493
2494 /** Identifies a running application. OpenVR can't always tell which process started in response
2495 * to a URL. This function allows a URL handler (or the process itself) to identify the app key
2496 * for the now running application. Passing a process ID of 0 identifies the calling process.
2497 * The application must be one that's known to the system via a call to AddApplicationManifest. */
2498 virtual EVRApplicationError IdentifyApplication( uint32_t unProcessId, const char *pchAppKey ) = 0;
2499
2500 /** Returns the process ID for an application. Return 0 if the application was not found or is not running. */
2501 virtual uint32_t GetApplicationProcessId( const char *pchAppKey ) = 0;
2502
2503 /** Returns a string for an applications error */
2504 virtual const char *GetApplicationsErrorNameFromEnum( EVRApplicationError error ) = 0;
2505
2506 // --------------- Application properties --------------- //
2507
2508 /** Returns a value for an application property. The required buffer size to fit this value will be returned. */
2509 virtual uint32_t GetApplicationPropertyString( const char *pchAppKey, EVRApplicationProperty eProperty, VR_OUT_STRING() char *pchPropertyValueBuffer, uint32_t unPropertyValueBufferLen, EVRApplicationError *peError = nullptr ) = 0;
2510
2511 /** Returns a bool value for an application property. Returns false in all error cases. */
2512 virtual bool GetApplicationPropertyBool( const char *pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError *peError = nullptr ) = 0;
2513
2514 /** Returns a uint64 value for an application property. Returns 0 in all error cases. */
2515 virtual uint64_t GetApplicationPropertyUint64( const char *pchAppKey, EVRApplicationProperty eProperty, EVRApplicationError *peError = nullptr ) = 0;
2516
2517 /** Sets the application auto-launch flag. This is only valid for applications which return true for VRApplicationProperty_IsDashboardOverlay_Bool. */
2518 virtual EVRApplicationError SetApplicationAutoLaunch( const char *pchAppKey, bool bAutoLaunch ) = 0;
2519
2520 /** Gets the application auto-launch flag. This is only valid for applications which return true for VRApplicationProperty_IsDashboardOverlay_Bool. */
2521 virtual bool GetApplicationAutoLaunch( const char *pchAppKey ) = 0;
2522
2523 /** Adds this mime-type to the list of supported mime types for this application*/
2524 virtual EVRApplicationError SetDefaultApplicationForMimeType( const char *pchAppKey, const char *pchMimeType ) = 0;
2525
2526 /** return the app key that will open this mime type */
2527 virtual bool GetDefaultApplicationForMimeType( const char *pchMimeType, VR_OUT_STRING() char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0;
2528
2529 /** Get the list of supported mime types for this application, comma-delimited */
2530 virtual bool GetApplicationSupportedMimeTypes( const char *pchAppKey, VR_OUT_STRING() char *pchMimeTypesBuffer, uint32_t unMimeTypesBuffer ) = 0;
2531
2532 /** Get the list of app-keys that support this mime type, comma-delimited, the return value is number of bytes you need to return the full string */
2533 virtual uint32_t GetApplicationsThatSupportMimeType( const char *pchMimeType, VR_OUT_STRING() char *pchAppKeysThatSupportBuffer, uint32_t unAppKeysThatSupportBuffer ) = 0;
2534
2535 /** Get the args list from an app launch that had the process already running, you call this when you get a VREvent_ApplicationMimeTypeLoad */
2536 virtual uint32_t GetApplicationLaunchArguments( uint32_t unHandle, VR_OUT_STRING() char *pchArgs, uint32_t unArgs ) = 0;
2537
2538 // --------------- Transition methods --------------- //
2539
2540 /** Returns the app key for the application that is starting up */
2541 virtual EVRApplicationError GetStartingApplication( VR_OUT_STRING() char *pchAppKeyBuffer, uint32_t unAppKeyBufferLen ) = 0;
2542
2543 /** Returns the application transition state */
2544 virtual EVRSceneApplicationState GetSceneApplicationState() = 0;
2545
2546 /** Returns errors that would prevent the specified application from launching immediately. Calling this function will
2547 * cause the current scene application to quit, so only call it when you are actually about to launch something else.
2548 * What the caller should do about these failures depends on the failure:
2549 * VRApplicationError_OldApplicationQuitting - An existing application has been told to quit. Wait for a VREvent_ProcessQuit
2550 * and try again.
2551 * VRApplicationError_ApplicationAlreadyStarting - This application is already starting. This is a permanent failure.
2552 * VRApplicationError_LaunchInProgress - A different application is already starting. This is a permanent failure.
2553 * VRApplicationError_None - Go ahead and launch. Everything is clear.
2554 */
2555 virtual EVRApplicationError PerformApplicationPrelaunchCheck( const char *pchAppKey ) = 0;
2556
2557 /** Returns a string for an application transition state */
2558 virtual const char *GetSceneApplicationStateNameFromEnum( EVRSceneApplicationState state ) = 0;
2559
2560 /** Starts a subprocess within the calling application. This
2561 * suppresses all application transition UI and automatically identifies the new executable
2562 * as part of the same application. On success the calling process should exit immediately.
2563 * If working directory is NULL or "" the directory portion of the binary path will be
2564 * the working directory. */
2565 virtual EVRApplicationError LaunchInternalProcess( const char *pchBinaryPath, const char *pchArguments, const char *pchWorkingDirectory ) = 0;
2566
2567 /** Returns the current scene process ID according to the application system. A scene process will get scene
2568 * focus once it starts rendering, but it will appear here once it calls VR_Init with the Scene application
2569 * type. */
2570 virtual uint32_t GetCurrentSceneProcessId() = 0;
2571 };
2572
2573 static const char * const IVRApplications_Version = "IVRApplications_007";
2574
2575} // namespace vr
2576
2577// ivrsettings.h
2578
2579#include <string>
2580
2581namespace vr
2582{
2583 enum EVRSettingsError
2584 {
2585 VRSettingsError_None = 0,
2586 VRSettingsError_IPCFailed = 1,
2587 VRSettingsError_WriteFailed = 2,
2588 VRSettingsError_ReadFailed = 3,
2589 VRSettingsError_JsonParseFailed = 4,
2590 VRSettingsError_UnsetSettingHasNoDefault = 5, // This will be returned if the setting does not appear in the appropriate default file and has not been set
2591 };
2592
2593 // The maximum length of a settings key
2594 static const uint32_t k_unMaxSettingsKeyLength = 128;
2595
2596 class IVRSettings
2597 {
2598 public:
2599 virtual const char *GetSettingsErrorNameFromEnum( EVRSettingsError eError ) = 0;
2600
2601 virtual void SetBool( const char *pchSection, const char *pchSettingsKey, bool bValue, EVRSettingsError *peError = nullptr ) = 0;
2602 virtual void SetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nValue, EVRSettingsError *peError = nullptr ) = 0;
2603 virtual void SetFloat( const char *pchSection, const char *pchSettingsKey, float flValue, EVRSettingsError *peError = nullptr ) = 0;
2604 virtual void SetString( const char *pchSection, const char *pchSettingsKey, const char *pchValue, EVRSettingsError *peError = nullptr ) = 0;
2605
2606 // Users of the system need to provide a proper default in default.vrsettings in the resources/settings/ directory
2607 // of either the runtime or the driver_xxx directory. Otherwise the default will be false, 0, 0.0 or ""
2608 virtual bool GetBool( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0;
2609 virtual int32_t GetInt32( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0;
2610 virtual float GetFloat( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0;
2611 virtual void GetString( const char *pchSection, const char *pchSettingsKey, VR_OUT_STRING() char *pchValue, uint32_t unValueLen, EVRSettingsError *peError = nullptr ) = 0;
2612
2613 virtual void RemoveSection( const char *pchSection, EVRSettingsError *peError = nullptr ) = 0;
2614 virtual void RemoveKeyInSection( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0;
2615 };
2616
2617 //-----------------------------------------------------------------------------
2618 static const char * const IVRSettings_Version = "IVRSettings_003";
2619
2620 class CVRSettingHelper
2621 {
2622 IVRSettings *m_pSettings;
2623 public:
2624 CVRSettingHelper( IVRSettings *pSettings )
2625 {
2626 m_pSettings = pSettings;
2627 }
2628
2629 const char *GetSettingsErrorNameFromEnum( EVRSettingsError eError )
2630 {
2631 return m_pSettings->GetSettingsErrorNameFromEnum( eError );
2632 }
2633
2634 void SetBool( const char *pchSection, const char *pchSettingsKey, bool bValue, EVRSettingsError *peError = nullptr )
2635 {
2636 m_pSettings->SetBool( pchSection, pchSettingsKey, bValue, peError );
2637 }
2638
2639 void SetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nValue, EVRSettingsError *peError = nullptr )
2640 {
2641 m_pSettings->SetInt32( pchSection, pchSettingsKey, nValue, peError );
2642 }
2643 void SetFloat( const char *pchSection, const char *pchSettingsKey, float flValue, EVRSettingsError *peError = nullptr )
2644 {
2645 m_pSettings->SetFloat( pchSection, pchSettingsKey, flValue, peError );
2646 }
2647 void SetString( const char *pchSection, const char *pchSettingsKey, const char *pchValue, EVRSettingsError *peError = nullptr )
2648 {
2649 m_pSettings->SetString( pchSection, pchSettingsKey, pchValue, peError );
2650 }
2651 void SetString( const std::string & sSection, const std::string & sSettingsKey, const std::string & sValue, EVRSettingsError *peError = nullptr )
2652 {
2653 m_pSettings->SetString( sSection.c_str(), sSettingsKey.c_str(), sValue.c_str(), peError );
2654 }
2655
2656 bool GetBool( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr )
2657 {
2658 return m_pSettings->GetBool( pchSection, pchSettingsKey, peError );
2659 }
2660 int32_t GetInt32( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr )
2661 {
2662 return m_pSettings->GetInt32( pchSection, pchSettingsKey, peError );
2663 }
2664 float GetFloat( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr )
2665 {
2666 return m_pSettings->GetFloat( pchSection, pchSettingsKey, peError );
2667 }
2668 void GetString( const char *pchSection, const char *pchSettingsKey, VR_OUT_STRING() char *pchValue, uint32_t unValueLen, EVRSettingsError *peError = nullptr )
2669 {
2670 m_pSettings->GetString( pchSection, pchSettingsKey, pchValue, unValueLen, peError );
2671 }
2672 std::string GetString( const std::string & sSection, const std::string & sSettingsKey, EVRSettingsError *peError = nullptr )
2673 {
2674 char buf[4096];
2675 vr::EVRSettingsError eError;
2676 m_pSettings->GetString( sSection.c_str(), sSettingsKey.c_str(), buf, sizeof( buf ), &eError );
2677 if ( peError )
2678 *peError = eError;
2679 if ( eError == vr::VRSettingsError_None )
2680 return buf;
2681 else
2682 return "";
2683 }
2684
2685 void RemoveSection( const char *pchSection, EVRSettingsError *peError = nullptr )
2686 {
2687 m_pSettings->RemoveSection( pchSection, peError );
2688 }
2689 void RemoveKeyInSection( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr )
2690 {
2691 m_pSettings->RemoveKeyInSection( pchSection, pchSettingsKey, peError );
2692 }
2693 };
2694
2695
2696 //-----------------------------------------------------------------------------
2697 // steamvr keys
2698 static const char * const k_pch_SteamVR_Section = "steamvr";
2699 static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd";
2700 static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver";
2701 static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd";
2702 static const char * const k_pch_SteamVR_DisplayDebug_Bool = "displayDebug";
2703 static const char * const k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe";
2704 static const char * const k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX";
2705 static const char * const k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY";
2706 static const char * const k_pch_SteamVR_SendSystemButtonToAllApps_Bool= "sendSystemButtonToAllApps";
2707 static const char * const k_pch_SteamVR_LogLevel_Int32 = "loglevel";
2708 static const char * const k_pch_SteamVR_IPD_Float = "ipd";
2709 static const char * const k_pch_SteamVR_Background_String = "background";
2710 static const char * const k_pch_SteamVR_BackgroundUseDomeProjection_Bool = "backgroundUseDomeProjection";
2711 static const char * const k_pch_SteamVR_BackgroundCameraHeight_Float = "backgroundCameraHeight";
2712 static const char * const k_pch_SteamVR_BackgroundDomeRadius_Float = "backgroundDomeRadius";
2713 static const char * const k_pch_SteamVR_GridColor_String = "gridColor";
2714 static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor";
2715 static const char * const k_pch_SteamVR_TrackingLossColor_String = "trackingLossColor";
2716 static const char * const k_pch_SteamVR_ShowStage_Bool = "showStage";
2717 static const char * const k_pch_SteamVR_DrawTrackingReferences_Bool = "drawTrackingReferences";
2718 static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers";
2719 static const char * const k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers";
2720 static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees";
2721 static const char * const k_pch_SteamVR_BaseStationPowerManagement_Int32 = "basestationPowerManagement";
2722 static const char * const k_pch_SteamVR_ShowBaseStationPowerManagementTip_Int32 = "ShowBaseStationPowerManagementTip";
2723 static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses";
2724 static const char * const k_pch_SteamVR_SupersampleScale_Float = "supersampleScale";
2725 static const char * const k_pch_SteamVR_MaxRecommendedResolution_Int32 = "maxRecommendedResolution";
2726 static const char * const k_pch_SteamVR_MotionSmoothing_Bool = "motionSmoothing";
2727 static const char * const k_pch_SteamVR_MotionSmoothingOverride_Int32 = "motionSmoothingOverride";
2728 static const char * const k_pch_SteamVR_FramesToThrottle_Int32 = "framesToThrottle";
2729 static const char * const k_pch_SteamVR_AdditionalFramesToPredict_Int32 = "additionalFramesToPredict";
2730 static const char * const k_pch_SteamVR_DisableAsyncReprojection_Bool = "disableAsync";
2731 static const char * const k_pch_SteamVR_ForceFadeOnBadTracking_Bool = "forceFadeOnBadTracking";
2732 static const char * const k_pch_SteamVR_DefaultMirrorView_Int32 = "mirrorView";
2733 static const char * const k_pch_SteamVR_ShowLegacyMirrorView_Bool = "showLegacyMirrorView";
2734 static const char * const k_pch_SteamVR_MirrorViewVisibility_Bool = "showMirrorView";
2735 static const char * const k_pch_SteamVR_MirrorViewDisplayMode_Int32 = "mirrorViewDisplayMode";
2736 static const char * const k_pch_SteamVR_MirrorViewEye_Int32 = "mirrorViewEye";
2737 static const char * const k_pch_SteamVR_MirrorViewGeometry_String = "mirrorViewGeometry";
2738 static const char * const k_pch_SteamVR_MirrorViewGeometryMaximized_String = "mirrorViewGeometryMaximized";
2739 static const char * const k_pch_SteamVR_PerfGraphVisibility_Bool = "showPerfGraph";
2740 static const char * const k_pch_SteamVR_StartMonitorFromAppLaunch = "startMonitorFromAppLaunch";
2741 static const char * const k_pch_SteamVR_StartCompositorFromAppLaunch_Bool = "startCompositorFromAppLaunch";
2742 static const char * const k_pch_SteamVR_StartDashboardFromAppLaunch_Bool = "startDashboardFromAppLaunch";
2743 static const char * const k_pch_SteamVR_StartOverlayAppsFromDashboard_Bool = "startOverlayAppsFromDashboard";
2744 static const char * const k_pch_SteamVR_EnableHomeApp = "enableHomeApp";
2745 static const char * const k_pch_SteamVR_CycleBackgroundImageTimeSec_Int32 = "CycleBackgroundImageTimeSec";
2746 static const char * const k_pch_SteamVR_RetailDemo_Bool = "retailDemo";
2747 static const char * const k_pch_SteamVR_IpdOffset_Float = "ipdOffset";
2748 static const char * const k_pch_SteamVR_AllowSupersampleFiltering_Bool = "allowSupersampleFiltering";
2749 static const char * const k_pch_SteamVR_SupersampleManualOverride_Bool = "supersampleManualOverride";
2750 static const char * const k_pch_SteamVR_EnableLinuxVulkanAsync_Bool = "enableLinuxVulkanAsync";
2751 static const char * const k_pch_SteamVR_AllowDisplayLockedMode_Bool = "allowDisplayLockedMode";
2752 static const char * const k_pch_SteamVR_HaveStartedTutorialForNativeChaperoneDriver_Bool = "haveStartedTutorialForNativeChaperoneDriver";
2753 static const char * const k_pch_SteamVR_ForceWindows32bitVRMonitor = "forceWindows32BitVRMonitor";
2754 static const char * const k_pch_SteamVR_DebugInputBinding = "debugInputBinding";
2755 static const char * const k_pch_SteamVR_DoNotFadeToGrid = "doNotFadeToGrid";
2756 static const char * const k_pch_SteamVR_RenderCameraMode = "renderCameraMode";
2757 static const char * const k_pch_SteamVR_EnableSharedResourceJournaling = "enableSharedResourceJournaling";
2758 static const char * const k_pch_SteamVR_EnableSafeMode = "enableSafeMode";
2759 static const char * const k_pch_SteamVR_PreferredRefreshRate = "preferredRefreshRate";
2760 static const char * const k_pch_SteamVR_LastVersionNotice = "lastVersionNotice";
2761 static const char * const k_pch_SteamVR_LastVersionNoticeDate = "lastVersionNoticeDate";
2762 static const char * const k_pch_SteamVR_HmdDisplayColorGainR_Float = "hmdDisplayColorGainR";
2763 static const char * const k_pch_SteamVR_HmdDisplayColorGainG_Float = "hmdDisplayColorGainG";
2764 static const char * const k_pch_SteamVR_HmdDisplayColorGainB_Float = "hmdDisplayColorGainB";
2765 static const char * const k_pch_SteamVR_CustomIconStyle_String = "customIconStyle";
2766 static const char * const k_pch_SteamVR_CustomOffIconStyle_String = "customOffIconStyle";
2767 static const char * const k_pch_SteamVR_CustomIconForceUpdate_String = "customIconForceUpdate";
2768 static const char * const k_pch_SteamVR_AllowGlobalActionSetPriority = "globalActionSetPriority";
2769 static const char * const k_pch_SteamVR_OverlayRenderQuality = "overlayRenderQuality_2";
2770 static const char * const k_pch_SteamVR_BlockOculusSDKOnOpenVRLaunchOption_Bool = "blockOculusSDKOnOpenVRLaunchOption";
2771 static const char * const k_pch_SteamVR_BlockOculusSDKOnAllLaunches_Bool = "blockOculusSDKOnAllLaunches";
2772 static const char * const k_pch_SteamVR_HDCPLegacyCompatibility_Bool = "hdcp14legacyCompatibility";
2773 static const char * const k_pch_SteamVR_UsePrism_Bool = "usePrism";
2774
2775 //-----------------------------------------------------------------------------
2776 // direct mode keys
2777 static const char * const k_pch_DirectMode_Section = "direct_mode";
2778 static const char * const k_pch_DirectMode_Enable_Bool = "enable";
2779 static const char * const k_pch_DirectMode_Count_Int32 = "count";
2780 static const char * const k_pch_DirectMode_EdidVid_Int32 = "edidVid";
2781 static const char * const k_pch_DirectMode_EdidPid_Int32 = "edidPid";
2782
2783 //-----------------------------------------------------------------------------
2784 // lighthouse keys
2785 static const char * const k_pch_Lighthouse_Section = "driver_lighthouse";
2786 static const char * const k_pch_Lighthouse_DisableIMU_Bool = "disableimu";
2787 static const char * const k_pch_Lighthouse_DisableIMUExceptHMD_Bool = "disableimuexcepthmd";
2788 static const char * const k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation";
2789 static const char * const k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug";
2790 static const char * const k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation";
2791 static const char * const k_pch_Lighthouse_DBHistory_Bool = "dbhistory";
2792 static const char * const k_pch_Lighthouse_EnableBluetooth_Bool = "enableBluetooth";
2793 static const char * const k_pch_Lighthouse_PowerManagedBaseStations_String = "PowerManagedBaseStations";
2794 static const char * const k_pch_Lighthouse_PowerManagedBaseStations2_String = "PowerManagedBaseStations2";
2795 static const char * const k_pch_Lighthouse_InactivityTimeoutForBaseStations_Int32 = "InactivityTimeoutForBaseStations";
2796 static const char * const k_pch_Lighthouse_EnableImuFallback_Bool = "enableImuFallback";
2797
2798 //-----------------------------------------------------------------------------
2799 // null keys
2800 static const char * const k_pch_Null_Section = "driver_null";
2801 static const char * const k_pch_Null_SerialNumber_String = "serialNumber";
2802 static const char * const k_pch_Null_ModelNumber_String = "modelNumber";
2803 static const char * const k_pch_Null_WindowX_Int32 = "windowX";
2804 static const char * const k_pch_Null_WindowY_Int32 = "windowY";
2805 static const char * const k_pch_Null_WindowWidth_Int32 = "windowWidth";
2806 static const char * const k_pch_Null_WindowHeight_Int32 = "windowHeight";
2807 static const char * const k_pch_Null_RenderWidth_Int32 = "renderWidth";
2808 static const char * const k_pch_Null_RenderHeight_Int32 = "renderHeight";
2809 static const char * const k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons";
2810 static const char * const k_pch_Null_DisplayFrequency_Float = "displayFrequency";
2811
2812 //-----------------------------------------------------------------------------
2813 // Windows MR keys
2814 static const char * const k_pch_WindowsMR_Section = "driver_holographic";
2815
2816 //-----------------------------------------------------------------------------
2817 // user interface keys
2818 static const char * const k_pch_UserInterface_Section = "userinterface";
2819 static const char * const k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop";
2820 static const char * const k_pch_UserInterface_MinimizeToTray_Bool = "MinimizeToTray";
2821 static const char * const k_pch_UserInterface_HidePopupsWhenStatusMinimized_Bool = "HidePopupsWhenStatusMinimized";
2822 static const char * const k_pch_UserInterface_Screenshots_Bool = "screenshots";
2823 static const char * const k_pch_UserInterface_ScreenshotType_Int = "screenshotType";
2824
2825 //-----------------------------------------------------------------------------
2826 // notification keys
2827 static const char * const k_pch_Notifications_Section = "notifications";
2828 static const char * const k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb";
2829
2830 //-----------------------------------------------------------------------------
2831 // keyboard keys
2832 static const char * const k_pch_Keyboard_Section = "keyboard";
2833 static const char * const k_pch_Keyboard_TutorialCompletions = "TutorialCompletions";
2834 static const char * const k_pch_Keyboard_ScaleX = "ScaleX";
2835 static const char * const k_pch_Keyboard_ScaleY = "ScaleY";
2836 static const char * const k_pch_Keyboard_OffsetLeftX = "OffsetLeftX";
2837 static const char * const k_pch_Keyboard_OffsetRightX = "OffsetRightX";
2838 static const char * const k_pch_Keyboard_OffsetY = "OffsetY";
2839 static const char * const k_pch_Keyboard_Smoothing = "Smoothing";
2840
2841 //-----------------------------------------------------------------------------
2842 // perf keys
2843 static const char * const k_pch_Perf_Section = "perfcheck";
2844 static const char * const k_pch_Perf_PerfGraphInHMD_Bool = "perfGraphInHMD";
2845 static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore";
2846 static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit";
2847 static const char * const k_pch_Perf_TestData_Float = "perfTestData";
2848 static const char * const k_pch_Perf_GPUProfiling_Bool = "GPUProfiling";
2849
2850 //-----------------------------------------------------------------------------
2851 // collision bounds keys
2852 static const char * const k_pch_CollisionBounds_Section = "collisionBounds";
2853 static const char * const k_pch_CollisionBounds_Style_Int32 = "CollisionBoundsStyle";
2854 static const char * const k_pch_CollisionBounds_GroundPerimeterOn_Bool = "CollisionBoundsGroundPerimeterOn";
2855 static const char * const k_pch_CollisionBounds_CenterMarkerOn_Bool = "CollisionBoundsCenterMarkerOn";
2856 static const char * const k_pch_CollisionBounds_PlaySpaceOn_Bool = "CollisionBoundsPlaySpaceOn";
2857 static const char * const k_pch_CollisionBounds_FadeDistance_Float = "CollisionBoundsFadeDistance";
2858 static const char * const k_pch_CollisionBounds_WallHeight_Float = "CollisionBoundsWallHeight";
2859 static const char * const k_pch_CollisionBounds_ColorGammaR_Int32 = "CollisionBoundsColorGammaR";
2860 static const char * const k_pch_CollisionBounds_ColorGammaG_Int32 = "CollisionBoundsColorGammaG";
2861 static const char * const k_pch_CollisionBounds_ColorGammaB_Int32 = "CollisionBoundsColorGammaB";
2862 static const char * const k_pch_CollisionBounds_ColorGammaA_Int32 = "CollisionBoundsColorGammaA";
2863 static const char * const k_pch_CollisionBounds_EnableDriverImport = "enableDriverBoundsImport";
2864
2865 //-----------------------------------------------------------------------------
2866 // camera keys
2867 static const char * const k_pch_Camera_Section = "camera";
2868 static const char * const k_pch_Camera_EnableCamera_Bool = "enableCamera";
2869 static const char * const k_pch_Camera_ShowOnController_Bool = "showOnController";
2870 static const char * const k_pch_Camera_EnableCameraForCollisionBounds_Bool = "enableCameraForCollisionBounds";
2871 static const char * const k_pch_Camera_RoomView_Int32 = "roomView";
2872 static const char * const k_pch_Camera_BoundsColorGammaR_Int32 = "cameraBoundsColorGammaR";
2873 static const char * const k_pch_Camera_BoundsColorGammaG_Int32 = "cameraBoundsColorGammaG";
2874 static const char * const k_pch_Camera_BoundsColorGammaB_Int32 = "cameraBoundsColorGammaB";
2875 static const char * const k_pch_Camera_BoundsColorGammaA_Int32 = "cameraBoundsColorGammaA";
2876 static const char * const k_pch_Camera_BoundsStrength_Int32 = "cameraBoundsStrength";
2877 static const char * const k_pch_Camera_RoomViewStyle_Int32 = "roomViewStyle";
2878
2879 //-----------------------------------------------------------------------------
2880 // audio keys
2881 static const char * const k_pch_audio_Section = "audio";
2882 static const char * const k_pch_audio_SetOsDefaultPlaybackDevice_Bool = "setOsDefaultPlaybackDevice";
2883 static const char * const k_pch_audio_EnablePlaybackDeviceOverride_Bool = "enablePlaybackDeviceOverride";
2884 static const char * const k_pch_audio_PlaybackDeviceOverride_String = "playbackDeviceOverride";
2885 static const char * const k_pch_audio_PlaybackDeviceOverrideName_String = "playbackDeviceOverrideName";
2886 static const char * const k_pch_audio_SetOsDefaultRecordingDevice_Bool = "setOsDefaultRecordingDevice";
2887 static const char * const k_pch_audio_EnableRecordingDeviceOverride_Bool = "enableRecordingDeviceOverride";
2888 static const char * const k_pch_audio_RecordingDeviceOverride_String = "recordingDeviceOverride";
2889 static const char * const k_pch_audio_RecordingDeviceOverrideName_String = "recordingDeviceOverrideName";
2890 static const char * const k_pch_audio_EnablePlaybackMirror_Bool = "enablePlaybackMirror";
2891 static const char * const k_pch_audio_PlaybackMirrorDevice_String = "playbackMirrorDevice";
2892 static const char * const k_pch_audio_PlaybackMirrorDeviceName_String = "playbackMirrorDeviceName";
2893 static const char * const k_pch_audio_OldPlaybackMirrorDevice_String = "onPlaybackMirrorDevice";
2894 static const char * const k_pch_audio_ActiveMirrorDevice_String = "activePlaybackMirrorDevice";
2895 static const char * const k_pch_audio_EnablePlaybackMirrorIndependentVolume_Bool = "enablePlaybackMirrorIndependentVolume";
2896 static const char * const k_pch_audio_LastHmdPlaybackDeviceId_String = "lastHmdPlaybackDeviceId";
2897 static const char * const k_pch_audio_VIVEHDMIGain = "viveHDMIGain";
2898 static const char * const k_pch_audio_DualSpeakerAndJackOutput_Bool = "dualSpeakerAndJackOutput";
2899 static const char * const k_pch_audio_MuteMicMonitor_Bool = "muteMicMonitor";
2900
2901 //-----------------------------------------------------------------------------
2902 // power management keys
2903 static const char * const k_pch_Power_Section = "power";
2904 static const char * const k_pch_Power_PowerOffOnExit_Bool = "powerOffOnExit";
2905 static const char * const k_pch_Power_TurnOffScreensTimeout_Float = "turnOffScreensTimeout";
2906 static const char * const k_pch_Power_TurnOffControllersTimeout_Float = "turnOffControllersTimeout";
2907 static const char * const k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout";
2908 static const char * const k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress";
2909 static const char * const k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby";
2910
2911 //-----------------------------------------------------------------------------
2912 // dashboard keys
2913 static const char * const k_pch_Dashboard_Section = "dashboard";
2914 static const char * const k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard";
2915 static const char * const k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode";
2916 static const char * const k_pch_Dashboard_Position = "position";
2917 static const char * const k_pch_Dashboard_DesktopScale = "desktopScale";
2918 static const char * const k_pch_Dashboard_DashboardScale = "dashboardScale";
2919 static const char * const k_pch_Dashboard_UseStandaloneSystemLayer = "standaloneSystemLayer";
2920
2921 //-----------------------------------------------------------------------------
2922 // model skin keys
2923 static const char * const k_pch_modelskin_Section = "modelskins";
2924
2925 //-----------------------------------------------------------------------------
2926 // driver keys - These could be checked in any driver_<name> section
2927 static const char * const k_pch_Driver_Enable_Bool = "enable";
2928 static const char * const k_pch_Driver_BlockedBySafemode_Bool = "blocked_by_safe_mode";
2929 static const char * const k_pch_Driver_LoadPriority_Int32 = "loadPriority";
2930
2931 //-----------------------------------------------------------------------------
2932 // web interface keys
2933 static const char* const k_pch_WebInterface_Section = "WebInterface";
2934
2935 //-----------------------------------------------------------------------------
2936 // vrwebhelper keys
2937 static const char* const k_pch_VRWebHelper_Section = "VRWebHelper";
2938 static const char* const k_pch_VRWebHelper_DebuggerEnabled_Bool = "DebuggerEnabled";
2939 static const char* const k_pch_VRWebHelper_DebuggerPort_Int32 = "DebuggerPort";
2940
2941 //-----------------------------------------------------------------------------
2942 // tracking overrides - keys are device paths, values are the device paths their
2943 // tracking/pose information overrides
2944 static const char* const k_pch_TrackingOverride_Section = "TrackingOverrides";
2945
2946 //-----------------------------------------------------------------------------
2947 // per-app keys - the section name for these is the app key itself. Some of these are prefixed by the controller type
2948 static const char* const k_pch_App_BindingAutosaveURLSuffix_String = "AutosaveURL";
2949 static const char* const k_pch_App_BindingLegacyAPISuffix_String = "_legacy";
2950 static const char* const k_pch_App_BindingSteamVRInputAPISuffix_String = "_steamvrinput";
2951 static const char* const k_pch_App_BindingCurrentURLSuffix_String = "CurrentURL";
2952 static const char* const k_pch_App_BindingPreviousURLSuffix_String = "PreviousURL";
2953 static const char* const k_pch_App_NeedToUpdateAutosaveSuffix_Bool = "NeedToUpdateAutosave";
2954 static const char* const k_pch_App_DominantHand_Int32 = "DominantHand";
2955 static const char* const k_pch_App_BlockOculusSDK_Bool = "blockOculusSDK";
2956
2957 //-----------------------------------------------------------------------------
2958 // configuration for trackers
2959 static const char * const k_pch_Trackers_Section = "trackers";
2960
2961 //-----------------------------------------------------------------------------
2962 // configuration for desktop UI windows
2963 static const char * const k_pch_DesktopUI_Section = "DesktopUI";
2964
2965 //-----------------------------------------------------------------------------
2966 // Last known keys for righting recovery
2967 static const char * const k_pch_LastKnown_Section = "LastKnown";
2968 static const char* const k_pch_LastKnown_HMDManufacturer_String = "HMDManufacturer";
2969 static const char* const k_pch_LastKnown_HMDModel_String = "HMDModel";
2970
2971 //-----------------------------------------------------------------------------
2972 // Dismissed warnings
2973 static const char * const k_pch_DismissedWarnings_Section = "DismissedWarnings";
2974
2975 //-----------------------------------------------------------------------------
2976 // Input Settings
2977 static const char * const k_pch_Input_Section = "input";
2978 static const char* const k_pch_Input_LeftThumbstickRotation_Float = "leftThumbstickRotation";
2979 static const char* const k_pch_Input_RightThumbstickRotation_Float = "rightThumbstickRotation";
2980 static const char* const k_pch_Input_ThumbstickDeadzone_Float = "thumbstickDeadzone";
2981
2982 //-----------------------------------------------------------------------------
2983 // Log of GPU performance
2984 static const char * const k_pch_GpuSpeed_Section = "GpuSpeed";
2985
2986} // namespace vr
2987
2988// ivrchaperone.h
2989
2990namespace vr
2991{
2992
2993#pragma pack( push, 8 )
2994
2995enum ChaperoneCalibrationState
2996{
2997 // OK!
2998 ChaperoneCalibrationState_OK = 1, // Chaperone is fully calibrated and working correctly
2999
3000 // Warnings
3001 ChaperoneCalibrationState_Warning = 100,
3002 ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved = 101, // A base station thinks that it might have moved
3003 ChaperoneCalibrationState_Warning_BaseStationRemoved = 102, // There are less base stations than when calibrated
3004 ChaperoneCalibrationState_Warning_SeatedBoundsInvalid = 103, // Seated bounds haven't been calibrated for the current tracking center
3005
3006 // Errors
3007 ChaperoneCalibrationState_Error = 200, // The UniverseID is invalid
3008 ChaperoneCalibrationState_Error_BaseStationUninitialized = 201, // Tracking center hasn't be calibrated for at least one of the base stations
3009 ChaperoneCalibrationState_Error_BaseStationConflict = 202, // Tracking center is calibrated, but base stations disagree on the tracking space
3010 ChaperoneCalibrationState_Error_PlayAreaInvalid = 203, // Play Area hasn't been calibrated for the current tracking center
3011 ChaperoneCalibrationState_Error_CollisionBoundsInvalid = 204, // Collision Bounds haven't been calibrated for the current tracking center
3012};
3013
3014
3015/** HIGH LEVEL TRACKING SPACE ASSUMPTIONS:
3016* 0,0,0 is the preferred standing area center.
3017* 0Y is the floor height.
3018* -Z is the preferred forward facing direction. */
3019class IVRChaperone
3020{
3021public:
3022
3023 /** Get the current state of Chaperone calibration. This state can change at any time during a session due to physical base station changes. **/
3024 virtual ChaperoneCalibrationState GetCalibrationState() = 0;
3025
3026 /** Returns the width and depth of the Play Area (formerly named Soft Bounds) in X and Z.
3027 * Tracking space center (0,0,0) is the center of the Play Area. **/
3028 virtual bool GetPlayAreaSize( float *pSizeX, float *pSizeZ ) = 0;
3029
3030 /** Returns the 4 corner positions of the Play Area (formerly named Soft Bounds).
3031 * Corners are in counter-clockwise order.
3032 * Standing center (0,0,0) is the center of the Play Area.
3033 * It's a rectangle.
3034 * 2 sides are parallel to the X axis and 2 sides are parallel to the Z axis.
3035 * Height of every corner is 0Y (on the floor). **/
3036 virtual bool GetPlayAreaRect( HmdQuad_t *rect ) = 0;
3037
3038 /** Reload Chaperone data from the .vrchap file on disk. */
3039 virtual void ReloadInfo( void ) = 0;
3040
3041 /** Optionally give the chaperone system a hit about the color and brightness in the scene **/
3042 virtual void SetSceneColor( HmdColor_t color ) = 0;
3043
3044 /** Get the current chaperone bounds draw color and brightness **/
3045 virtual void GetBoundsColor( HmdColor_t *pOutputColorArray, int nNumOutputColors, float flCollisionBoundsFadeDistance, HmdColor_t *pOutputCameraColor ) = 0;
3046
3047 /** Determine whether the bounds are showing right now **/
3048 virtual bool AreBoundsVisible() = 0;
3049
3050 /** Force the bounds to show, mostly for utilities **/
3051 virtual void ForceBoundsVisible( bool bForce ) = 0;
3052
3053 /** Sets the zero pose for the given tracker coordinate system to the current position and yaw of the HMD. After
3054 * ResetZeroPose all GetDeviceToAbsoluteTrackingPose calls as the origin will be relative to this new zero pose.
3055 * The new zero coordinate system will not change the fact that the Y axis is up in the real world, so the next
3056 * pose returned from GetDeviceToAbsoluteTrackingPose after a call to ResetZeroPose may not be exactly an
3057 * identity matrix.
3058 *
3059 * NOTE: This function overrides the user's previously saved zero pose and should only be called as the result of a user action.
3060 * Users are also able to set their zero pose via the OpenVR Dashboard.
3061 **/
3062 virtual void ResetZeroPose( ETrackingUniverseOrigin eTrackingUniverseOrigin ) = 0;
3063};
3064
3065static const char * const IVRChaperone_Version = "IVRChaperone_004";
3066
3067#pragma pack( pop )
3068
3069}
3070
3071// ivrchaperonesetup.h
3072
3073namespace vr
3074{
3075
3076enum EChaperoneConfigFile
3077{
3078 EChaperoneConfigFile_Live = 1, // The live chaperone config, used by most applications and games
3079 EChaperoneConfigFile_Temp = 2, // The temporary chaperone config, used to live-preview collision bounds in room setup
3080};
3081
3082enum EChaperoneImportFlags
3083{
3084 EChaperoneImport_BoundsOnly = 0x0001,
3085};
3086
3087/** Manages the working copy of the chaperone info. By default this will be the same as the
3088* live copy. Any changes made with this interface will stay in the working copy until
3089* CommitWorkingCopy() is called, at which point the working copy and the live copy will be
3090* the same again. */
3091class IVRChaperoneSetup
3092{
3093public:
3094
3095 /** Saves the current working copy to disk */
3096 virtual bool CommitWorkingCopy( EChaperoneConfigFile configFile ) = 0;
3097
3098 /** Reverts the working copy to match the live chaperone calibration.
3099 * To modify existing data this MUST be do WHILE getting a non-error ChaperoneCalibrationStatus.
3100 * Only after this should you do gets and sets on the existing data. */
3101 virtual void RevertWorkingCopy() = 0;
3102
3103 /** Returns the width and depth of the Play Area (formerly named Soft Bounds) in X and Z from the working copy.
3104 * Tracking space center (0,0,0) is the center of the Play Area. */
3105 virtual bool GetWorkingPlayAreaSize( float *pSizeX, float *pSizeZ ) = 0;
3106
3107 /** Returns the 4 corner positions of the Play Area (formerly named Soft Bounds) from the working copy.
3108 * Corners are in clockwise order.
3109 * Tracking space center (0,0,0) is the center of the Play Area.
3110 * It's a rectangle.
3111 * 2 sides are parallel to the X axis and 2 sides are parallel to the Z axis.
3112 * Height of every corner is 0Y (on the floor). **/
3113 virtual bool GetWorkingPlayAreaRect( HmdQuad_t *rect ) = 0;
3114
3115 /** Returns the number of Quads if the buffer points to null. Otherwise it returns Quads
3116 * into the buffer up to the max specified from the working copy. */
3117 virtual bool GetWorkingCollisionBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0;
3118
3119 /** Returns the number of Quads if the buffer points to null. Otherwise it returns Quads
3120 * into the buffer up to the max specified. */
3121 virtual bool GetLiveCollisionBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0;
3122
3123 /** Returns the preferred seated position from the working copy. */
3124 virtual bool GetWorkingSeatedZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatSeatedZeroPoseToRawTrackingPose ) = 0;
3125
3126 /** Returns the standing origin from the working copy. */
3127 virtual bool GetWorkingStandingZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatStandingZeroPoseToRawTrackingPose ) = 0;
3128
3129 /** Sets the Play Area in the working copy. */
3130 virtual void SetWorkingPlayAreaSize( float sizeX, float sizeZ ) = 0;
3131
3132 /** Sets the Collision Bounds in the working copy. Note: ceiling height is ignored. */
3133 virtual void SetWorkingCollisionBoundsInfo( VR_ARRAY_COUNT(unQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t unQuadsCount ) = 0;
3134
3135 /** Sets the Collision Bounds in the working copy. */
3136 virtual void SetWorkingPerimeter( VR_ARRAY_COUNT( unPointCount ) HmdVector2_t *pPointBuffer, uint32_t unPointCount ) = 0;
3137
3138 /** Sets the preferred seated position in the working copy. */
3139 virtual void SetWorkingSeatedZeroPoseToRawTrackingPose( const HmdMatrix34_t *pMatSeatedZeroPoseToRawTrackingPose ) = 0;
3140
3141 /** Sets the preferred standing position in the working copy. */
3142 virtual void SetWorkingStandingZeroPoseToRawTrackingPose( const HmdMatrix34_t *pMatStandingZeroPoseToRawTrackingPose ) = 0;
3143
3144 /** Tear everything down and reload it from the file on disk */
3145 virtual void ReloadFromDisk( EChaperoneConfigFile configFile ) = 0;
3146
3147 /** Returns the preferred seated position. */
3148 virtual bool GetLiveSeatedZeroPoseToRawTrackingPose( HmdMatrix34_t *pmatSeatedZeroPoseToRawTrackingPose ) = 0;
3149
3150 virtual bool ExportLiveToBuffer( VR_OUT_STRING() char *pBuffer, uint32_t *pnBufferLength ) = 0;
3151 virtual bool ImportFromBufferToWorking( const char *pBuffer, uint32_t nImportFlags ) = 0;
3152
3153 /** Shows the chaperone data in the working set to preview in the compositor.*/
3154 virtual void ShowWorkingSetPreview() = 0;
3155
3156 /** Hides the chaperone data in the working set to preview in the compositor (if it was visible).*/
3157 virtual void HideWorkingSetPreview() = 0;
3158
3159 /** Fire an event that the tracking system can use to know room setup is about to begin. This lets the tracking
3160 * system make any last minute adjustments that should be incorporated into the new setup. If the user is adjusting
3161 * live in HMD using a tweak tool, keep in mind that calling this might cause the user to see the room jump. */
3162 virtual void RoomSetupStarting() = 0;
3163};
3164
3165static const char * const IVRChaperoneSetup_Version = "IVRChaperoneSetup_006";
3166
3167
3168}
3169
3170// ivrcompositor.h
3171
3172namespace vr
3173{
3174
3175#pragma pack( push, 8 )
3176
3177/** Errors that can occur with the VR compositor */
3178enum EVRCompositorError
3179{
3180 VRCompositorError_None = 0,
3181 VRCompositorError_RequestFailed = 1,
3182 VRCompositorError_IncompatibleVersion = 100,
3183 VRCompositorError_DoNotHaveFocus = 101,
3184 VRCompositorError_InvalidTexture = 102,
3185 VRCompositorError_IsNotSceneApplication = 103,
3186 VRCompositorError_TextureIsOnWrongDevice = 104,
3187 VRCompositorError_TextureUsesUnsupportedFormat = 105,
3188 VRCompositorError_SharedTexturesNotSupported = 106,
3189 VRCompositorError_IndexOutOfRange = 107,
3190 VRCompositorError_AlreadySubmitted = 108,
3191 VRCompositorError_InvalidBounds = 109,
3192 VRCompositorError_AlreadySet = 110,
3193};
3194
3195/** Timing mode passed to SetExplicitTimingMode(); see that function for documentation */
3196enum EVRCompositorTimingMode
3197{
3198 VRCompositorTimingMode_Implicit = 0,
3199 VRCompositorTimingMode_Explicit_RuntimePerformsPostPresentHandoff = 1,
3200 VRCompositorTimingMode_Explicit_ApplicationPerformsPostPresentHandoff = 2,
3201};
3202
3203/** Cumulative stats for current application. These are not cleared until a new app connects,
3204* but they do stop accumulating once the associated app disconnects. */
3205struct Compositor_CumulativeStats
3206{
3207 uint32_t m_nPid; // Process id associated with these stats (may no longer be running).
3208 uint32_t m_nNumFramePresents; // total number of times we called present (includes reprojected frames)
3209 uint32_t m_nNumDroppedFrames; // total number of times an old frame was re-scanned out (without reprojection)
3210 uint32_t m_nNumReprojectedFrames; // total number of times a frame was scanned out a second time (with reprojection)
3211
3212 /** Values recorded at startup before application has fully faded in the first time. */
3213 uint32_t m_nNumFramePresentsOnStartup;
3214 uint32_t m_nNumDroppedFramesOnStartup;
3215 uint32_t m_nNumReprojectedFramesOnStartup;
3216
3217 /** Applications may explicitly fade to the compositor. This is usually to handle level transitions, and loading often causes
3218 * system wide hitches. The following stats are collected during this period. Does not include values recorded during startup. */
3219 uint32_t m_nNumLoading;
3220 uint32_t m_nNumFramePresentsLoading;
3221 uint32_t m_nNumDroppedFramesLoading;
3222 uint32_t m_nNumReprojectedFramesLoading;
3223
3224 /** If we don't get a new frame from the app in less than 2.5 frames, then we assume the app has hung and start
3225 * fading back to the compositor. The following stats are a result of this, and are a subset of those recorded above.
3226 * Does not include values recorded during start up or loading. */
3227 uint32_t m_nNumTimedOut;
3228 uint32_t m_nNumFramePresentsTimedOut;
3229 uint32_t m_nNumDroppedFramesTimedOut;
3230 uint32_t m_nNumReprojectedFramesTimedOut;
3231};
3232
3233struct Compositor_StageRenderSettings
3234{
3235 /** Primary color is applied as a tint to (i.e. multiplied with) the model's texture */
3236 HmdColor_t m_PrimaryColor;
3237 HmdColor_t m_SecondaryColor;
3238
3239 /** Vignette radius is in meters and is used to fade to the specified secondary solid color over
3240 * that 3D distance from the origin of the playspace. */
3241 float m_flVignetteInnerRadius;
3242 float m_flVignetteOuterRadius;
3243
3244 /** Fades to the secondary color based on view incidence. This variable controls the linearity
3245 * of the effect. It is mutually exclusive with vignette. Additionally, it treats the mesh as faceted. */
3246 float m_flFresnelStrength;
3247
3248 /** Controls backface culling. */
3249 bool m_bBackfaceCulling;
3250
3251 /** Converts the render model's texture to luma and applies to rgb equally. This is useful to
3252 * combat compression artifacts that can occur on desaturated source material. */
3253 bool m_bGreyscale;
3254
3255 /** Renders mesh as a wireframe. */
3256 bool m_bWireframe;
3257};
3258
3259static inline Compositor_StageRenderSettings DefaultStageRenderSettings()
3260{
3261 Compositor_StageRenderSettings settings;
3262 settings.m_PrimaryColor.r = 1.0f;
3263 settings.m_PrimaryColor.g = 1.0f;
3264 settings.m_PrimaryColor.b = 1.0f;
3265 settings.m_PrimaryColor.a = 1.0f;
3266 settings.m_SecondaryColor.r = 1.0f;
3267 settings.m_SecondaryColor.g = 1.0f;
3268 settings.m_SecondaryColor.b = 1.0f;
3269 settings.m_SecondaryColor.a = 1.0f;
3270 settings.m_flVignetteInnerRadius = 0.0f;
3271 settings.m_flVignetteOuterRadius = 0.0f;
3272 settings.m_flFresnelStrength = 0.0f;
3273 settings.m_bBackfaceCulling = false;
3274 settings.m_bGreyscale = false;
3275 settings.m_bWireframe = false;
3276 return settings;
3277}
3278
3279#pragma pack( pop )
3280
3281/** Allows the application to interact with the compositor */
3282class IVRCompositor
3283{
3284public:
3285 /** Sets tracking space returned by WaitGetPoses */
3286 virtual void SetTrackingSpace( ETrackingUniverseOrigin eOrigin ) = 0;
3287
3288 /** Gets current tracking space returned by WaitGetPoses */
3289 virtual ETrackingUniverseOrigin GetTrackingSpace() = 0;
3290
3291 /** Scene applications should call this function to get poses to render with (and optionally poses predicted an additional frame out to use for gameplay).
3292 * This function will block until "running start" milliseconds before the start of the frame, and should be called at the last moment before needing to
3293 * start rendering.
3294 *
3295 * Return codes:
3296 * - IsNotSceneApplication (make sure to call VR_Init with VRApplicaiton_Scene)
3297 * - DoNotHaveFocus (some other app has taken focus - this will throttle the call to 10hz to reduce the impact on that app)
3298 */
3299 virtual EVRCompositorError WaitGetPoses( VR_ARRAY_COUNT( unRenderPoseArrayCount ) TrackedDevicePose_t* pRenderPoseArray, uint32_t unRenderPoseArrayCount,
3300 VR_ARRAY_COUNT( unGamePoseArrayCount ) TrackedDevicePose_t* pGamePoseArray, uint32_t unGamePoseArrayCount ) = 0;
3301
3302 /** Get the last set of poses returned by WaitGetPoses. */
3303 virtual EVRCompositorError GetLastPoses( VR_ARRAY_COUNT( unRenderPoseArrayCount ) TrackedDevicePose_t* pRenderPoseArray, uint32_t unRenderPoseArrayCount,
3304 VR_ARRAY_COUNT( unGamePoseArrayCount ) TrackedDevicePose_t* pGamePoseArray, uint32_t unGamePoseArrayCount ) = 0;
3305
3306 /** Interface for accessing last set of poses returned by WaitGetPoses one at a time.
3307 * Returns VRCompositorError_IndexOutOfRange if unDeviceIndex not less than k_unMaxTrackedDeviceCount otherwise VRCompositorError_None.
3308 * It is okay to pass NULL for either pose if you only want one of the values. */
3309 virtual EVRCompositorError GetLastPoseForTrackedDeviceIndex( TrackedDeviceIndex_t unDeviceIndex, TrackedDevicePose_t *pOutputPose, TrackedDevicePose_t *pOutputGamePose ) = 0;
3310
3311 /** Updated scene texture to display. If pBounds is NULL the entire texture will be used. If called from an OpenGL app, consider adding a glFlush after
3312 * Submitting both frames to signal the driver to start processing, otherwise it may wait until the command buffer fills up, causing the app to miss frames.
3313 *
3314 * OpenGL dirty state:
3315 * glBindTexture
3316 *
3317 * Return codes:
3318 * - IsNotSceneApplication (make sure to call VR_Init with VRApplicaiton_Scene)
3319 * - DoNotHaveFocus (some other app has taken focus)
3320 * - TextureIsOnWrongDevice (application did not use proper AdapterIndex - see IVRSystem.GetDXGIOutputInfo)
3321 * - SharedTexturesNotSupported (application needs to call CreateDXGIFactory1 or later before creating DX device)
3322 * - TextureUsesUnsupportedFormat (scene textures must be compatible with DXGI sharing rules - e.g. uncompressed, no mips, etc.)
3323 * - InvalidTexture (usually means bad arguments passed in)
3324 * - AlreadySubmitted (app has submitted two left textures or two right textures in a single frame - i.e. before calling WaitGetPoses again)
3325 */
3326 virtual EVRCompositorError Submit( EVREye eEye, const Texture_t *pTexture, const VRTextureBounds_t* pBounds = 0, EVRSubmitFlags nSubmitFlags = Submit_Default ) = 0;
3327
3328 /** Clears the frame that was sent with the last call to Submit. This will cause the
3329 * compositor to show the grid until Submit is called again. */
3330 virtual void ClearLastSubmittedFrame() = 0;
3331
3332 /** Call immediately after presenting your app's window (i.e. companion window) to unblock the compositor.
3333 * This is an optional call, which only needs to be used if you can't instead call WaitGetPoses immediately after Present.
3334 * For example, if your engine's render and game loop are not on separate threads, or blocking the render thread until 3ms before the next vsync would
3335 * introduce a deadlock of some sort. This function tells the compositor that you have finished all rendering after having Submitted buffers for both
3336 * eyes, and it is free to start its rendering work. This should only be called from the same thread you are rendering on. */
3337 virtual void PostPresentHandoff() = 0;
3338
3339 /** Returns true if timing data is filled it. Sets oldest timing info if nFramesAgo is larger than the stored history.
3340 * Be sure to set timing.size = sizeof(Compositor_FrameTiming) on struct passed in before calling this function. */
3341 virtual bool GetFrameTiming( Compositor_FrameTiming *pTiming, uint32_t unFramesAgo = 0 ) = 0;
3342
3343 /** Interface for copying a range of timing data. Frames are returned in ascending order (oldest to newest) with the last being the most recent frame.
3344 * Only the first entry's m_nSize needs to be set, as the rest will be inferred from that. Returns total number of entries filled out. */
3345 virtual uint32_t GetFrameTimings( VR_ARRAY_COUNT( nFrames ) Compositor_FrameTiming *pTiming, uint32_t nFrames ) = 0;
3346
3347 /** Returns the time in seconds left in the current (as identified by FrameTiming's frameIndex) frame.
3348 * Due to "running start", this value may roll over to the next frame before ever reaching 0.0. */
3349 virtual float GetFrameTimeRemaining() = 0;
3350
3351 /** Fills out stats accumulated for the last connected application. Pass in sizeof( Compositor_CumulativeStats ) as second parameter. */
3352 virtual void GetCumulativeStats( Compositor_CumulativeStats *pStats, uint32_t nStatsSizeInBytes ) = 0;
3353
3354 /** Fades the view on the HMD to the specified color. The fade will take fSeconds, and the color values are between
3355 * 0.0 and 1.0. This color is faded on top of the scene based on the alpha parameter. Removing the fade color instantly
3356 * would be FadeToColor( 0.0, 0.0, 0.0, 0.0, 0.0 ). Values are in un-premultiplied alpha space. */
3357 virtual void FadeToColor( float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground = false ) = 0;
3358
3359 /** Get current fade color value. */
3360 virtual HmdColor_t GetCurrentFadeColor( bool bBackground = false ) = 0;
3361
3362 /** Fading the Grid in or out in fSeconds */
3363 virtual void FadeGrid( float fSeconds, bool bFadeGridIn ) = 0;
3364
3365 /** Get current alpha value of grid. */
3366 virtual float GetCurrentGridAlpha() = 0;
3367
3368 /** Override the skybox used in the compositor (e.g. for during level loads when the app can't feed scene images fast enough)
3369 * Order is Front, Back, Left, Right, Top, Bottom. If only a single texture is passed, it is assumed in lat-long format.
3370 * If two are passed, it is assumed a lat-long stereo pair. */
3371 virtual EVRCompositorError SetSkyboxOverride( VR_ARRAY_COUNT( unTextureCount ) const Texture_t *pTextures, uint32_t unTextureCount ) = 0;
3372
3373 /** Resets compositor skybox back to defaults. */
3374 virtual void ClearSkyboxOverride() = 0;
3375
3376 /** Brings the compositor window to the front. This is useful for covering any other window that may be on the HMD
3377 * and is obscuring the compositor window. */
3378 virtual void CompositorBringToFront() = 0;
3379
3380 /** Pushes the compositor window to the back. This is useful for allowing other applications to draw directly to the HMD. */
3381 virtual void CompositorGoToBack() = 0;
3382
3383 /** DEPRECATED: Tells the compositor process to clean up and exit. You do not need to call this function at shutdown.
3384 * Under normal circumstances the compositor will manage its own life cycle based on what applications are running. */
3385 virtual void CompositorQuit() = 0;
3386
3387 /** Return whether the compositor is fullscreen */
3388 virtual bool IsFullscreen() = 0;
3389
3390 /** Returns the process ID of the process that is currently rendering the scene */
3391 virtual uint32_t GetCurrentSceneFocusProcess() = 0;
3392
3393 /** Returns the process ID of the process that rendered the last frame (or 0 if the compositor itself rendered the frame.)
3394 * Returns 0 when fading out from an app and the app's process Id when fading into an app. */
3395 virtual uint32_t GetLastFrameRenderer() = 0;
3396
3397 /** Returns true if the current process has the scene focus */
3398 virtual bool CanRenderScene() = 0;
3399
3400 /** DEPRECATED: Opens the headset view (as either a window or docked widget depending on user's preferences) that displays what the user
3401 * sees in the headset. */
3402 virtual void ShowMirrorWindow() = 0;
3403
3404 /** DEPRECATED: Closes the headset view, either as a window or docked widget. */
3405 virtual void HideMirrorWindow() = 0;
3406
3407 /** DEPRECATED: Returns true if the headset view (either as a window or docked widget) is shown. */
3408 virtual bool IsMirrorWindowVisible() = 0;
3409
3410 /** Writes back buffer and stereo left/right pair from the application to a 'screenshots' folder in the SteamVR runtime root. */
3411 virtual void CompositorDumpImages() = 0;
3412
3413 /** Let an app know it should be rendering with low resources. */
3414 virtual bool ShouldAppRenderWithLowResources() = 0;
3415
3416 /** Override interleaved reprojection logic to force on. */
3417 virtual void ForceInterleavedReprojectionOn( bool bOverride ) = 0;
3418
3419 /** Force reconnecting to the compositor process. */
3420 virtual void ForceReconnectProcess() = 0;
3421
3422 /** Temporarily suspends rendering (useful for finer control over scene transitions). */
3423 virtual void SuspendRendering( bool bSuspend ) = 0;
3424
3425 /** Opens a shared D3D11 texture with the undistorted composited image for each eye. Use ReleaseMirrorTextureD3D11 when finished
3426 * instead of calling Release on the resource itself. */
3427 virtual vr::EVRCompositorError GetMirrorTextureD3D11( vr::EVREye eEye, void *pD3D11DeviceOrResource, void **ppD3D11ShaderResourceView ) = 0;
3428 virtual void ReleaseMirrorTextureD3D11( void *pD3D11ShaderResourceView ) = 0;
3429
3430 /** Access to mirror textures from OpenGL. */
3431 virtual vr::EVRCompositorError GetMirrorTextureGL( vr::EVREye eEye, vr::glUInt_t *pglTextureId, vr::glSharedTextureHandle_t *pglSharedTextureHandle ) = 0;
3432 virtual bool ReleaseSharedGLTexture( vr::glUInt_t glTextureId, vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0;
3433 virtual void LockGLSharedTextureForAccess( vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0;
3434 virtual void UnlockGLSharedTextureForAccess( vr::glSharedTextureHandle_t glSharedTextureHandle ) = 0;
3435
3436 /** [Vulkan Only]
3437 * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing
3438 * null. The string will be a space separated list of-required instance extensions to enable in VkCreateInstance */
3439 virtual uint32_t GetVulkanInstanceExtensionsRequired( VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0;
3440
3441 /** [Vulkan only]
3442 * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing
3443 * null. The string will be a space separated list of required device extensions to enable in VkCreateDevice */
3444 virtual uint32_t GetVulkanDeviceExtensionsRequired( VkPhysicalDevice_T *pPhysicalDevice, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0;
3445
3446 /** [ Vulkan/D3D12 Only ]
3447 * There are two purposes for SetExplicitTimingMode:
3448 * 1. To get a more accurate GPU timestamp for when the frame begins in Vulkan/D3D12 applications.
3449 * 2. (Optional) To avoid having WaitGetPoses access the Vulkan queue so that the queue can be accessed from
3450 * another thread while WaitGetPoses is executing.
3451 *
3452 * More accurate GPU timestamp for the start of the frame is achieved by the application calling
3453 * SubmitExplicitTimingData immediately before its first submission to the Vulkan/D3D12 queue.
3454 * This is more accurate because normally this GPU timestamp is recorded during WaitGetPoses. In D3D11,
3455 * WaitGetPoses queues a GPU timestamp write, but it does not actually get submitted to the GPU until the
3456 * application flushes. By using SubmitExplicitTimingData, the timestamp is recorded at the same place for
3457 * Vulkan/D3D12 as it is for D3D11, resulting in a more accurate GPU time measurement for the frame.
3458 *
3459 * Avoiding WaitGetPoses accessing the Vulkan queue can be achieved using SetExplicitTimingMode as well. If this is desired,
3460 * the application should set the timing mode to Explicit_ApplicationPerformsPostPresentHandoff and *MUST* call PostPresentHandoff
3461 * itself. If these conditions are met, then WaitGetPoses is guaranteed not to access the queue. Note that PostPresentHandoff
3462 * and SubmitExplicitTimingData will access the queue, so only WaitGetPoses becomes safe for accessing the queue from another
3463 * thread. */
3464 virtual void SetExplicitTimingMode( EVRCompositorTimingMode eTimingMode ) = 0;
3465
3466 /** [ Vulkan/D3D12 Only ]
3467 * Submit explicit timing data. When SetExplicitTimingMode is true, this must be called immediately before
3468 * the application's first vkQueueSubmit (Vulkan) or ID3D12CommandQueue::ExecuteCommandLists (D3D12) of each frame.
3469 * This function will insert a GPU timestamp write just before the application starts its rendering. This function
3470 * will perform a vkQueueSubmit on Vulkan so must not be done simultaneously with VkQueue operations on another thread.
3471 * Returns VRCompositorError_RequestFailed if SetExplicitTimingMode is not enabled. */
3472 virtual EVRCompositorError SubmitExplicitTimingData() = 0;
3473
3474 /** Indicates whether or not motion smoothing is enabled by the user settings.
3475 * If you want to know if motion smoothing actually triggered due to a late frame, check Compositor_FrameTiming
3476 * m_nReprojectionFlags & VRCompositor_ReprojectionMotion instead. */
3477 virtual bool IsMotionSmoothingEnabled() = 0;
3478
3479 /** Indicates whether or not motion smoothing is supported by the current hardware. */
3480 virtual bool IsMotionSmoothingSupported() = 0;
3481
3482 /** Indicates whether or not the current scene focus app is currently loading. This is inferred from its use of FadeGrid to
3483 * explicitly fade to the compositor to cover up the fact that it cannot render at a sustained full framerate during this time. */
3484 virtual bool IsCurrentSceneFocusAppLoading() = 0;
3485
3486 /** Override the stage model used in the compositor to replace the grid. RenderModelPath is a full path the an OBJ file to load.
3487 * This file will be loaded asynchronously from disk and uploaded to the gpu by the runtime. Once ready for rendering, the
3488 * VREvent StageOverrideReady will be sent. Use FadeToGrid to reveal. Call ClearStageOverride to free the associated resources when finished. */
3489 virtual EVRCompositorError SetStageOverride_Async( const char *pchRenderModelPath, const HmdMatrix34_t *pTransform = 0,
3490 const Compositor_StageRenderSettings *pRenderSettings = 0, uint32_t nSizeOfRenderSettings = 0 ) = 0;
3491
3492 /** Resets the stage to its default user specified setting. */
3493 virtual void ClearStageOverride() = 0;
3494
3495 /** Returns true if pBenchmarkResults is filled it. Sets pBenchmarkResults with the result of the compositor benchmark.
3496 * nSizeOfBenchmarkResults should be set to sizeof(Compositor_BenchmarkResults) */
3497 virtual bool GetCompositorBenchmarkResults( Compositor_BenchmarkResults *pBenchmarkResults, uint32_t nSizeOfBenchmarkResults ) = 0;
3498
3499 /** Returns the frame id associated with the poses last returned by WaitGetPoses. Deltas between IDs correspond to number of headset vsync intervals. */
3500 virtual EVRCompositorError GetLastPosePredictionIDs( uint32_t *pRenderPosePredictionID, uint32_t *pGamePosePredictionID ) = 0;
3501
3502 /** Get the most up-to-date predicted (or recorded - up to 100ms old) set of poses for a given frame id. */
3503 virtual EVRCompositorError GetPosesForFrame( uint32_t unPosePredictionID, VR_ARRAY_COUNT( unPoseArrayCount ) TrackedDevicePose_t* pPoseArray, uint32_t unPoseArrayCount ) = 0;
3504};
3505
3506static const char * const IVRCompositor_Version = "IVRCompositor_027";
3507
3508} // namespace vr
3509
3510
3511
3512// ivrheadsetview.h
3513
3514namespace vr
3515{
3516 enum HeadsetViewMode_t
3517 {
3518 HeadsetViewMode_Left = 0,
3519 HeadsetViewMode_Right,
3520 HeadsetViewMode_Both
3521 };
3522
3523 class IVRHeadsetView
3524 {
3525 public:
3526 /** Sets the resolution in pixels to render the headset view. These values are clamped to k_unHeadsetViewMaxWidth
3527 * and k_unHeadsetViewMaxHeight respectively. For cropped views, the rendered output will be fit to aspect ratio
3528 * defined by the the specified dimensions. For uncropped views, the caller should use GetHeadsetViewAspectRation
3529 * to adjust the requested render size to avoid squashing or stretching, and then apply letterboxing to compensate
3530 * when displaying the results. */
3531 virtual void SetHeadsetViewSize( uint32_t nWidth, uint32_t nHeight ) = 0;
3532
3533 /** Gets the current resolution used to render the headset view. */
3534 virtual void GetHeadsetViewSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
3535
3536 /** Set the mode used to render the headset view. */
3537 virtual void SetHeadsetViewMode( HeadsetViewMode_t eHeadsetViewMode ) = 0;
3538
3539 /** Get the current mode used to render the headset view. */
3540 virtual HeadsetViewMode_t GetHeadsetViewMode() = 0;
3541
3542 /** Set whether or not the headset view should be rendered cropped to hide the hidden area mesh or not. */
3543 virtual void SetHeadsetViewCropped( bool bCropped ) = 0;
3544
3545 /** Get the current cropping status of the headset view. */
3546 virtual bool GetHeadsetViewCropped() = 0;
3547
3548 /** Get the aspect ratio (width:height) of the uncropped headset view (accounting for the current set mode). */
3549 virtual float GetHeadsetViewAspectRatio() = 0;
3550
3551 /** Set the range [0..1] that the headset view blends across the stereo overlapped area in cropped both mode. */
3552 virtual void SetHeadsetViewBlendRange( float flStartPct, float flEndPct ) = 0;
3553
3554 /** Get the current range [0..1] that the headset view blends across the stereo overlapped area in cropped both mode. */
3555 virtual void GetHeadsetViewBlendRange( float *pStartPct, float *pEndPct ) = 0;
3556 };
3557
3558 static const uint32_t k_unHeadsetViewMaxWidth = 3840;
3559 static const uint32_t k_unHeadsetViewMaxHeight = 2160;
3560 static const char * const k_pchHeadsetViewOverlayKey = "system.HeadsetView";
3561
3562 static const char * const IVRHeadsetView_Version = "IVRHeadsetView_001";
3563
3564 /** Returns the current IVRHeadsetView pointer or NULL the interface could not be found. */
3565 VR_INTERFACE vr::IVRHeadsetView *VR_CALLTYPE VRHeadsetView();
3566
3567} // namespace vr
3568
3569
3570// ivrnotifications.h
3571
3572namespace vr
3573{
3574
3575#pragma pack( push, 8 )
3576
3577// Used for passing graphic data
3578struct NotificationBitmap_t
3579{
3580 NotificationBitmap_t()
3581 : m_pImageData( nullptr )
3582 , m_nWidth( 0 )
3583 , m_nHeight( 0 )
3584 , m_nBytesPerPixel( 0 )
3585 {
3586 }
3587
3588 void *m_pImageData;
3589 int32_t m_nWidth;
3590 int32_t m_nHeight;
3591 int32_t m_nBytesPerPixel;
3592};
3593
3594
3595/** Be aware that the notification type is used as 'priority' to pick the next notification */
3596enum EVRNotificationType
3597{
3598 /** Transient notifications are automatically hidden after a period of time set by the user.
3599 * They are used for things like information and chat messages that do not require user interaction. */
3600 EVRNotificationType_Transient = 0,
3601
3602 /** Persistent notifications are shown to the user until they are hidden by calling RemoveNotification().
3603 * They are used for things like phone calls and alarms that require user interaction. */
3604 EVRNotificationType_Persistent = 1,
3605
3606 /** System notifications are shown no matter what. It is expected, that the ulUserValue is used as ID.
3607 * If there is already a system notification in the queue with that ID it is not accepted into the queue
3608 * to prevent spamming with system notification */
3609 EVRNotificationType_Transient_SystemWithUserValue = 2,
3610};
3611
3612enum EVRNotificationStyle
3613{
3614 /** Creates a notification with minimal external styling. */
3615 EVRNotificationStyle_None = 0,
3616
3617 /** Used for notifications about overlay-level status. In Steam this is used for events like downloads completing. */
3618 EVRNotificationStyle_Application = 100,
3619
3620 /** Used for notifications about contacts that are unknown or not available. In Steam this is used for friend invitations and offline friends. */
3621 EVRNotificationStyle_Contact_Disabled = 200,
3622
3623 /** Used for notifications about contacts that are available but inactive. In Steam this is used for friends that are online but not playing a game. */
3624 EVRNotificationStyle_Contact_Enabled = 201,
3625
3626 /** Used for notifications about contacts that are available and active. In Steam this is used for friends that are online and currently running a game. */
3627 EVRNotificationStyle_Contact_Active = 202,
3628};
3629
3630static const uint32_t k_unNotificationTextMaxSize = 256;
3631
3632typedef uint32_t VRNotificationId;
3633
3634
3635
3636#pragma pack( pop )
3637
3638/** Allows notification sources to interact with the VR system
3639 This current interface is not yet implemented. Do not use yet. */
3640class IVRNotifications
3641{
3642public:
3643 /** Create a notification and enqueue it to be shown to the user.
3644 * An overlay handle is required to create a notification, as otherwise it would be impossible for a user to act on it.
3645 * To create a two-line notification, use a line break ('\n') to split the text into two lines.
3646 * The pImage argument may be NULL, in which case the specified overlay's icon will be used instead. */
3647 virtual EVRNotificationError CreateNotification( VROverlayHandle_t ulOverlayHandle, uint64_t ulUserValue, EVRNotificationType type, const char *pchText, EVRNotificationStyle style, const NotificationBitmap_t *pImage, /* out */ VRNotificationId *pNotificationId ) = 0;
3648
3649 /** Destroy a notification, hiding it first if it currently shown to the user. */
3650 virtual EVRNotificationError RemoveNotification( VRNotificationId notificationId ) = 0;
3651
3652};
3653
3654static const char * const IVRNotifications_Version = "IVRNotifications_002";
3655
3656} // namespace vr
3657
3658
3659
3660// ivroverlay.h
3661
3662namespace vr
3663{
3664
3665 /** The maximum length of an overlay key in bytes, counting the terminating null character. */
3666 static const uint32_t k_unVROverlayMaxKeyLength = 128;
3667
3668 /** The maximum length of an overlay name in bytes, counting the terminating null character. */
3669 static const uint32_t k_unVROverlayMaxNameLength = 128;
3670
3671 /** The maximum number of overlays that can exist in the system at one time. */
3672 static const uint32_t k_unMaxOverlayCount = 128;
3673
3674 /** The maximum number of overlay intersection mask primitives per overlay */
3675 static const uint32_t k_unMaxOverlayIntersectionMaskPrimitivesCount = 32;
3676
3677 /** Types of input supported by VR Overlays */
3678 enum VROverlayInputMethod
3679 {
3680 VROverlayInputMethod_None = 0, // No input events will be generated automatically for this overlay
3681 VROverlayInputMethod_Mouse = 1, // Tracked controllers will get mouse events automatically
3682 // VROverlayInputMethod_DualAnalog = 2, // No longer supported
3683 };
3684
3685 /** Allows the caller to figure out which overlay transform getter to call. */
3686 enum VROverlayTransformType
3687 {
3688 VROverlayTransform_Invalid = -1,
3689 VROverlayTransform_Absolute = 0,
3690 VROverlayTransform_TrackedDeviceRelative = 1,
3691 VROverlayTransform_SystemOverlay = 2,
3692 VROverlayTransform_TrackedComponent = 3,
3693 VROverlayTransform_Cursor = 4,
3694 VROverlayTransform_DashboardTab = 5,
3695 VROverlayTransform_DashboardThumb = 6,
3696 VROverlayTransform_Mountable = 7,
3697 VROverlayTransform_Projection = 8,
3698 };
3699
3700 /** Overlay control settings */
3701 enum VROverlayFlags
3702 {
3703 // Set this flag on a dashboard overlay to prevent a tab from showing up for that overlay
3704 VROverlayFlags_NoDashboardTab = 1 << 3,
3705
3706 // When this is set the overlay will receive VREvent_ScrollDiscrete events like a mouse wheel.
3707 // Requires mouse input mode.
3708 VROverlayFlags_SendVRDiscreteScrollEvents = 1 << 6,
3709
3710 // Indicates that the overlay would like to receive
3711 VROverlayFlags_SendVRTouchpadEvents = 1 << 7,
3712
3713 // If set this will render a vertical scroll wheel on the primary controller,
3714 // only needed if not using VROverlayFlags_SendVRScrollEvents but you still want to represent a scroll wheel
3715 VROverlayFlags_ShowTouchPadScrollWheel = 1 << 8,
3716
3717 // If this is set ownership and render access to the overlay are transferred
3718 // to the new scene process on a call to IVRApplications::LaunchInternalProcess
3719 VROverlayFlags_TransferOwnershipToInternalProcess = 1 << 9,
3720
3721 // If set, renders 50% of the texture in each eye, side by side
3722 VROverlayFlags_SideBySide_Parallel = 1 << 10, // Texture is left/right
3723 VROverlayFlags_SideBySide_Crossed = 1 << 11, // Texture is crossed and right/left
3724
3725 VROverlayFlags_Panorama = 1 << 12, // Texture is a panorama
3726 VROverlayFlags_StereoPanorama = 1 << 13, // Texture is a stereo panorama
3727
3728 // If this is set on an overlay owned by the scene application that overlay
3729 // will be sorted with the "Other" overlays on top of all other scene overlays
3730 VROverlayFlags_SortWithNonSceneOverlays = 1 << 14,
3731
3732 // If set, the overlay will be shown in the dashboard, otherwise it will be hidden.
3733 VROverlayFlags_VisibleInDashboard = 1 << 15,
3734
3735 // If this is set and the overlay's input method is not none, the system-wide laser mouse
3736 // mode will be activated whenever this overlay is visible.
3737 VROverlayFlags_MakeOverlaysInteractiveIfVisible = 1 << 16,
3738
3739 // If this is set the overlay will receive smooth VREvent_ScrollSmooth that emulate trackpad scrolling.
3740 // Requires mouse input mode.
3741 VROverlayFlags_SendVRSmoothScrollEvents = 1 << 17,
3742
3743 // If this is set, the overlay texture will be protected content, preventing unauthorized reads.
3744 VROverlayFlags_ProtectedContent = 1 << 18,
3745
3746 // If this is set, the laser mouse splat will not be drawn over this overlay. The overlay will
3747 // be responsible for drawing its own "cursor".
3748 VROverlayFlags_HideLaserIntersection = 1 << 19,
3749
3750 // If this is set, clicking away from the overlay will cause it to receive a VREvent_Modal_Cancel event.
3751 // This is ignored for dashboard overlays.
3752 VROverlayFlags_WantsModalBehavior = 1 << 20,
3753
3754 // If this is set, alpha composition assumes the texture is pre-multiplied
3755 VROverlayFlags_IsPremultiplied = 1 << 21,
3756 };
3757
3758 enum VRMessageOverlayResponse
3759 {
3760 VRMessageOverlayResponse_ButtonPress_0 = 0,
3761 VRMessageOverlayResponse_ButtonPress_1 = 1,
3762 VRMessageOverlayResponse_ButtonPress_2 = 2,
3763 VRMessageOverlayResponse_ButtonPress_3 = 3,
3764 VRMessageOverlayResponse_CouldntFindSystemOverlay = 4,
3765 VRMessageOverlayResponse_CouldntFindOrCreateClientOverlay= 5,
3766 VRMessageOverlayResponse_ApplicationQuit = 6
3767 };
3768
3769 struct VROverlayIntersectionParams_t
3770 {
3771 HmdVector3_t vSource;
3772 HmdVector3_t vDirection;
3773 ETrackingUniverseOrigin eOrigin;
3774 };
3775
3776 struct VROverlayIntersectionResults_t
3777 {
3778 HmdVector3_t vPoint;
3779 HmdVector3_t vNormal;
3780 HmdVector2_t vUVs;
3781 float fDistance;
3782 };
3783
3784 // Input modes for the Big Picture gamepad text entry
3785 enum EGamepadTextInputMode
3786 {
3787 k_EGamepadTextInputModeNormal = 0,
3788 k_EGamepadTextInputModePassword = 1,
3789 k_EGamepadTextInputModeSubmit = 2,
3790 };
3791
3792 // Controls number of allowed lines for the Big Picture gamepad text entry
3793 enum EGamepadTextInputLineMode
3794 {
3795 k_EGamepadTextInputLineModeSingleLine = 0,
3796 k_EGamepadTextInputLineModeMultipleLines = 1
3797 };
3798
3799 enum EVROverlayIntersectionMaskPrimitiveType
3800 {
3801 OverlayIntersectionPrimitiveType_Rectangle,
3802 OverlayIntersectionPrimitiveType_Circle,
3803 };
3804
3805 struct IntersectionMaskRectangle_t
3806 {
3807 float m_flTopLeftX;
3808 float m_flTopLeftY;
3809 float m_flWidth;
3810 float m_flHeight;
3811 };
3812
3813 struct IntersectionMaskCircle_t
3814 {
3815 float m_flCenterX;
3816 float m_flCenterY;
3817 float m_flRadius;
3818 };
3819
3820 /** NOTE!!! If you change this you MUST manually update openvr_interop.cs.py and openvr_api_flat.h.py */
3821 typedef union
3822 {
3823 IntersectionMaskRectangle_t m_Rectangle;
3824 IntersectionMaskCircle_t m_Circle;
3825 } VROverlayIntersectionMaskPrimitive_Data_t;
3826
3827 struct VROverlayIntersectionMaskPrimitive_t
3828 {
3829 EVROverlayIntersectionMaskPrimitiveType m_nPrimitiveType;
3830 VROverlayIntersectionMaskPrimitive_Data_t m_Primitive;
3831 };
3832
3833 enum EKeyboardFlags
3834 {
3835 KeyboardFlag_Minimal = 1 << 0, // makes the keyboard send key events immediately instead of accumulating a buffer
3836 KeyboardFlag_Modal = 2 << 0, // makes the keyboard take all focus and dismiss when clicking off the panel
3837 };
3838
3839 /** Defines the project used in an overlay that is using SetOverlayTransformProjection */
3840 struct VROverlayProjection_t
3841 {
3842 /** Tangent of the sides of the frustum */
3843 float fLeft;
3844 float fRight;
3845 float fTop;
3846 float fBottom;
3847 };
3848
3849 class IVROverlay
3850 {
3851 public:
3852
3853 // ---------------------------------------------
3854 // Overlay management methods
3855 // ---------------------------------------------
3856
3857 /** Finds an existing overlay with the specified key. */
3858 virtual EVROverlayError FindOverlay( const char *pchOverlayKey, VROverlayHandle_t * pOverlayHandle ) = 0;
3859
3860 /** Creates a new named overlay. All overlays start hidden and with default settings. */
3861 virtual EVROverlayError CreateOverlay( const char *pchOverlayKey, const char *pchOverlayName, VROverlayHandle_t * pOverlayHandle ) = 0;
3862
3863 /** Destroys the specified overlay. When an application calls VR_Shutdown all overlays created by that app are
3864 * automatically destroyed. */
3865 virtual EVROverlayError DestroyOverlay( VROverlayHandle_t ulOverlayHandle ) = 0;
3866
3867 /** Fills the provided buffer with the string key of the overlay. Returns the size of buffer required to store the key, including
3868 * the terminating null character. k_unVROverlayMaxKeyLength will be enough bytes to fit the string. */
3869 virtual uint32_t GetOverlayKey( VROverlayHandle_t ulOverlayHandle, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, EVROverlayError *pError = 0L ) = 0;
3870
3871 /** Fills the provided buffer with the friendly name of the overlay. Returns the size of buffer required to store the key, including
3872 * the terminating null character. k_unVROverlayMaxNameLength will be enough bytes to fit the string. */
3873 virtual uint32_t GetOverlayName( VROverlayHandle_t ulOverlayHandle, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, EVROverlayError *pError = 0L ) = 0;
3874
3875 /** set the name to use for this overlay */
3876 virtual EVROverlayError SetOverlayName( VROverlayHandle_t ulOverlayHandle, const char *pchName ) = 0;
3877
3878 /** Gets the raw image data from an overlay. Overlay image data is always returned as RGBA data, 4 bytes per pixel. If the buffer is not large enough, width and height
3879 * will be set and VROverlayError_ArrayTooSmall is returned. */
3880 virtual EVROverlayError GetOverlayImageData( VROverlayHandle_t ulOverlayHandle, void *pvBuffer, uint32_t unBufferSize, uint32_t *punWidth, uint32_t *punHeight ) = 0;
3881
3882 /** returns a string that corresponds with the specified overlay error. The string will be the name
3883 * of the error enum value for all valid error codes */
3884 virtual const char *GetOverlayErrorNameFromEnum( EVROverlayError error ) = 0;
3885
3886 // ---------------------------------------------
3887 // Overlay rendering methods
3888 // ---------------------------------------------
3889
3890 /** Sets the pid that is allowed to render to this overlay (the creator pid is always allow to render),
3891 * by default this is the pid of the process that made the overlay */
3892 virtual EVROverlayError SetOverlayRenderingPid( VROverlayHandle_t ulOverlayHandle, uint32_t unPID ) = 0;
3893
3894 /** Gets the pid that is allowed to render to this overlay */
3895 virtual uint32_t GetOverlayRenderingPid( VROverlayHandle_t ulOverlayHandle ) = 0;
3896
3897 /** Specify flag setting for a given overlay */
3898 virtual EVROverlayError SetOverlayFlag( VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool bEnabled ) = 0;
3899
3900 /** Sets flag setting for a given overlay */
3901 virtual EVROverlayError GetOverlayFlag( VROverlayHandle_t ulOverlayHandle, VROverlayFlags eOverlayFlag, bool *pbEnabled ) = 0;
3902
3903 /** Gets all the flags for a given overlay */
3904 virtual EVROverlayError GetOverlayFlags( VROverlayHandle_t ulOverlayHandle, uint32_t *pFlags ) = 0;
3905
3906 /** Sets the color tint of the overlay quad. Use 0.0 to 1.0 per channel. */
3907 virtual EVROverlayError SetOverlayColor( VROverlayHandle_t ulOverlayHandle, float fRed, float fGreen, float fBlue ) = 0;
3908
3909 /** Gets the color tint of the overlay quad. */
3910 virtual EVROverlayError GetOverlayColor( VROverlayHandle_t ulOverlayHandle, float *pfRed, float *pfGreen, float *pfBlue ) = 0;
3911
3912 /** Sets the alpha of the overlay quad. Use 1.0 for 100 percent opacity to 0.0 for 0 percent opacity. */
3913 virtual EVROverlayError SetOverlayAlpha( VROverlayHandle_t ulOverlayHandle, float fAlpha ) = 0;
3914
3915 /** Gets the alpha of the overlay quad. By default overlays are rendering at 100 percent alpha (1.0). */
3916 virtual EVROverlayError GetOverlayAlpha( VROverlayHandle_t ulOverlayHandle, float *pfAlpha ) = 0;
3917
3918 /** Sets the aspect ratio of the texels in the overlay. 1.0 means the texels are square. 2.0 means the texels
3919 * are twice as wide as they are tall. Defaults to 1.0. */
3920 virtual EVROverlayError SetOverlayTexelAspect( VROverlayHandle_t ulOverlayHandle, float fTexelAspect ) = 0;
3921
3922 /** Gets the aspect ratio of the texels in the overlay. Defaults to 1.0 */
3923 virtual EVROverlayError GetOverlayTexelAspect( VROverlayHandle_t ulOverlayHandle, float *pfTexelAspect ) = 0;
3924
3925 /** Sets the rendering sort order for the overlay. Overlays are rendered this order:
3926 * Overlays owned by the scene application
3927 * Overlays owned by some other application
3928 *
3929 * Within a category overlays are rendered lowest sort order to highest sort order. Overlays with the same
3930 * sort order are rendered back to front base on distance from the HMD.
3931 *
3932 * Sort order defaults to 0. */
3933 virtual EVROverlayError SetOverlaySortOrder( VROverlayHandle_t ulOverlayHandle, uint32_t unSortOrder ) = 0;
3934
3935 /** Gets the sort order of the overlay. See SetOverlaySortOrder for how this works. */
3936 virtual EVROverlayError GetOverlaySortOrder( VROverlayHandle_t ulOverlayHandle, uint32_t *punSortOrder ) = 0;
3937
3938 /** Sets the width of the overlay quad in meters. By default overlays are rendered on a quad that is 1 meter across */
3939 virtual EVROverlayError SetOverlayWidthInMeters( VROverlayHandle_t ulOverlayHandle, float fWidthInMeters ) = 0;
3940
3941 /** Returns the width of the overlay quad in meters. By default overlays are rendered on a quad that is 1 meter across */
3942 virtual EVROverlayError GetOverlayWidthInMeters( VROverlayHandle_t ulOverlayHandle, float *pfWidthInMeters ) = 0;
3943
3944 /** Use to draw overlay as a curved surface. Curvature is a percentage from (0..1] where 1 is a fully closed cylinder.
3945 * For a specific radius, curvature can be computed as: overlay.width / (2 PI r). */
3946 virtual EVROverlayError SetOverlayCurvature( VROverlayHandle_t ulOverlayHandle, float fCurvature ) = 0;
3947
3948 /** Returns the curvature of the overlay as a percentage from (0..1] where 1 is a fully closed cylinder. */
3949 virtual EVROverlayError GetOverlayCurvature( VROverlayHandle_t ulOverlayHandle, float *pfCurvature ) = 0;
3950
3951 /** Sets the colorspace the overlay texture's data is in. Defaults to 'auto'.
3952 * If the texture needs to be resolved, you should call SetOverlayTexture with the appropriate colorspace instead. */
3953 virtual EVROverlayError SetOverlayTextureColorSpace( VROverlayHandle_t ulOverlayHandle, EColorSpace eTextureColorSpace ) = 0;
3954
3955 /** Gets the overlay's current colorspace setting. */
3956 virtual EVROverlayError GetOverlayTextureColorSpace( VROverlayHandle_t ulOverlayHandle, EColorSpace *peTextureColorSpace ) = 0;
3957
3958 /** Sets the part of the texture to use for the overlay. UV Min is the upper left corner and UV Max is the lower right corner. */
3959 virtual EVROverlayError SetOverlayTextureBounds( VROverlayHandle_t ulOverlayHandle, const VRTextureBounds_t *pOverlayTextureBounds ) = 0;
3960
3961 /** Gets the part of the texture to use for the overlay. UV Min is the upper left corner and UV Max is the lower right corner. */
3962 virtual EVROverlayError GetOverlayTextureBounds( VROverlayHandle_t ulOverlayHandle, VRTextureBounds_t *pOverlayTextureBounds ) = 0;
3963
3964 /** Returns the transform type of this overlay. */
3965 virtual EVROverlayError GetOverlayTransformType( VROverlayHandle_t ulOverlayHandle, VROverlayTransformType *peTransformType ) = 0;
3966
3967 /** Sets the transform to absolute tracking origin. */
3968 virtual EVROverlayError SetOverlayTransformAbsolute( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, const HmdMatrix34_t *pmatTrackingOriginToOverlayTransform ) = 0;
3969
3970 /** Gets the transform if it is absolute. Returns an error if the transform is some other type. */
3971 virtual EVROverlayError GetOverlayTransformAbsolute( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin *peTrackingOrigin, HmdMatrix34_t *pmatTrackingOriginToOverlayTransform ) = 0;
3972
3973 /** Sets the transform to relative to the transform of the specified tracked device. */
3974 virtual EVROverlayError SetOverlayTransformTrackedDeviceRelative( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unTrackedDevice, const HmdMatrix34_t *pmatTrackedDeviceToOverlayTransform ) = 0;
3975
3976 /** Gets the transform if it is relative to a tracked device. Returns an error if the transform is some other type. */
3977 virtual EVROverlayError GetOverlayTransformTrackedDeviceRelative( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t *punTrackedDevice, HmdMatrix34_t *pmatTrackedDeviceToOverlayTransform ) = 0;
3978
3979 /** Sets the transform to draw the overlay on a rendermodel component mesh instead of a quad. This will only draw when the system is
3980 * drawing the device. Overlays with this transform type cannot receive mouse events. */
3981 virtual EVROverlayError SetOverlayTransformTrackedDeviceComponent( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t unDeviceIndex, const char *pchComponentName ) = 0;
3982
3983 /** Gets the transform information when the overlay is rendering on a component. */
3984 virtual EVROverlayError GetOverlayTransformTrackedDeviceComponent( VROverlayHandle_t ulOverlayHandle, TrackedDeviceIndex_t *punDeviceIndex, VR_OUT_STRING() char *pchComponentName, uint32_t unComponentNameSize ) = 0;
3985
3986 /** Gets the transform if it is relative to another overlay. Returns an error if the transform is some other type. */
3987 virtual vr::EVROverlayError GetOverlayTransformOverlayRelative( VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t *ulOverlayHandleParent, HmdMatrix34_t *pmatParentOverlayToOverlayTransform ) = 0;
3988
3989 /** Sets the transform to relative to the transform of the specified overlay. This overlays visibility will also track the parents visibility */
3990 virtual vr::EVROverlayError SetOverlayTransformOverlayRelative( VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t ulOverlayHandleParent, const HmdMatrix34_t *pmatParentOverlayToOverlayTransform ) = 0;
3991
3992 /** Sets the hotspot for the specified overlay when that overlay is used as a cursor. These are in texture space with 0,0 in the upper left corner of
3993 * the texture and 1,1 in the lower right corner of the texture. */
3994 virtual EVROverlayError SetOverlayTransformCursor( VROverlayHandle_t ulCursorOverlayHandle, const HmdVector2_t *pvHotspot ) = 0;
3995
3996 /** Gets cursor hotspot/transform for the specified overlay */
3997 virtual vr::EVROverlayError GetOverlayTransformCursor( VROverlayHandle_t ulOverlayHandle, HmdVector2_t *pvHotspot ) = 0;
3998
3999 /** Sets the overlay as a projection overlay */
4000 virtual vr::EVROverlayError SetOverlayTransformProjection( VROverlayHandle_t ulOverlayHandle,
4001 ETrackingUniverseOrigin eTrackingOrigin, const HmdMatrix34_t* pmatTrackingOriginToOverlayTransform,
4002 const VROverlayProjection_t *pProjection, vr::EVREye eEye ) = 0;
4003
4004 /** Shows the VR overlay. For dashboard overlays, only the Dashboard Manager is allowed to call this. */
4005 virtual EVROverlayError ShowOverlay( VROverlayHandle_t ulOverlayHandle ) = 0;
4006
4007 /** Hides the VR overlay. For dashboard overlays, only the Dashboard Manager is allowed to call this. */
4008 virtual EVROverlayError HideOverlay( VROverlayHandle_t ulOverlayHandle ) = 0;
4009
4010 /** Returns true if the overlay is visible. */
4011 virtual bool IsOverlayVisible( VROverlayHandle_t ulOverlayHandle ) = 0;
4012
4013 /** Get the transform in 3d space associated with a specific 2d point in the overlay's coordinate space (where 0,0 is the lower left). -Z points out of the overlay */
4014 virtual EVROverlayError GetTransformForOverlayCoordinates( VROverlayHandle_t ulOverlayHandle, ETrackingUniverseOrigin eTrackingOrigin, HmdVector2_t coordinatesInOverlay, HmdMatrix34_t *pmatTransform ) = 0;
4015
4016 // ---------------------------------------------
4017 // Overlay input methods
4018 // ---------------------------------------------
4019
4020 /** Returns true and fills the event with the next event on the overlay's event queue, if there is one.
4021 * If there are no events this method returns false. uncbVREvent should be the size in bytes of the VREvent_t struct */
4022 virtual bool PollNextOverlayEvent( VROverlayHandle_t ulOverlayHandle, VREvent_t *pEvent, uint32_t uncbVREvent ) = 0;
4023
4024 /** Returns the current input settings for the specified overlay. */
4025 virtual EVROverlayError GetOverlayInputMethod( VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod *peInputMethod ) = 0;
4026
4027 /** Sets the input settings for the specified overlay. */
4028 virtual EVROverlayError SetOverlayInputMethod( VROverlayHandle_t ulOverlayHandle, VROverlayInputMethod eInputMethod ) = 0;
4029
4030 /** Gets the mouse scaling factor that is used for mouse events. The actual texture may be a different size, but this is
4031 * typically the size of the underlying UI in pixels. */
4032 virtual EVROverlayError GetOverlayMouseScale( VROverlayHandle_t ulOverlayHandle, HmdVector2_t *pvecMouseScale ) = 0;
4033
4034 /** Sets the mouse scaling factor that is used for mouse events. The actual texture may be a different size, but this is
4035 * typically the size of the underlying UI in pixels (not in world space). */
4036 virtual EVROverlayError SetOverlayMouseScale( VROverlayHandle_t ulOverlayHandle, const HmdVector2_t *pvecMouseScale ) = 0;
4037
4038 /** Computes the overlay-space pixel coordinates of where the ray intersects the overlay with the
4039 * specified settings. Returns false if there is no intersection. */
4040 virtual bool ComputeOverlayIntersection( VROverlayHandle_t ulOverlayHandle, const VROverlayIntersectionParams_t *pParams, VROverlayIntersectionResults_t *pResults ) = 0;
4041
4042 /** Returns true if the specified overlay is the hover target. An overlay is the hover target when it is the last overlay "moused over"
4043 * by the virtual mouse pointer */
4044 virtual bool IsHoverTargetOverlay( VROverlayHandle_t ulOverlayHandle ) = 0;
4045
4046 /** Sets a list of primitives to be used for controller ray intersection
4047 * typically the size of the underlying UI in pixels (not in world space). */
4048 virtual EVROverlayError SetOverlayIntersectionMask( VROverlayHandle_t ulOverlayHandle, VROverlayIntersectionMaskPrimitive_t *pMaskPrimitives, uint32_t unNumMaskPrimitives, uint32_t unPrimitiveSize = sizeof( VROverlayIntersectionMaskPrimitive_t ) ) = 0;
4049
4050 /** Triggers a haptic event on the laser mouse controller for the specified overlay */
4051 virtual EVROverlayError TriggerLaserMouseHapticVibration( VROverlayHandle_t ulOverlayHandle, float fDurationSeconds, float fFrequency, float fAmplitude ) = 0;
4052
4053 /** Sets the cursor to use for the specified overlay. This will be drawn instead of the generic blob when the laser mouse is pointed at the specified overlay */
4054 virtual EVROverlayError SetOverlayCursor( VROverlayHandle_t ulOverlayHandle, VROverlayHandle_t ulCursorHandle ) = 0;
4055
4056 /** Sets the override cursor position to use for this overlay in overlay mouse coordinates. This position will be used to draw the cursor
4057 * instead of whatever the laser mouse cursor position is. */
4058 virtual EVROverlayError SetOverlayCursorPositionOverride( VROverlayHandle_t ulOverlayHandle, const HmdVector2_t *pvCursor ) = 0;
4059
4060 /** Clears the override cursor position for this overlay */
4061 virtual EVROverlayError ClearOverlayCursorPositionOverride( VROverlayHandle_t ulOverlayHandle ) = 0;
4062
4063 // ---------------------------------------------
4064 // Overlay texture methods
4065 // ---------------------------------------------
4066
4067 /** Texture to draw for the overlay. This function can only be called by the overlay's creator or renderer process (see SetOverlayRenderingPid) .
4068 *
4069 * OpenGL dirty state:
4070 * glBindTexture
4071 */
4072 virtual EVROverlayError SetOverlayTexture( VROverlayHandle_t ulOverlayHandle, const Texture_t *pTexture ) = 0;
4073
4074 /** Use this to tell the overlay system to release the texture set for this overlay. */
4075 virtual EVROverlayError ClearOverlayTexture( VROverlayHandle_t ulOverlayHandle ) = 0;
4076
4077 /** Separate interface for providing the data as a stream of bytes, but there is an upper bound on data
4078 * that can be sent. This function can only be called by the overlay's renderer process. */
4079 virtual EVROverlayError SetOverlayRaw( VROverlayHandle_t ulOverlayHandle, void *pvBuffer, uint32_t unWidth, uint32_t unHeight, uint32_t unBytesPerPixel ) = 0;
4080
4081 /** Separate interface for providing the image through a filename: can be png or jpg, and should not be bigger than 1920x1080.
4082 * This function can only be called by the overlay's renderer process */
4083 virtual EVROverlayError SetOverlayFromFile( VROverlayHandle_t ulOverlayHandle, const char *pchFilePath ) = 0;
4084
4085 /** Get the native texture handle/device for an overlay you have created.
4086 * On windows this handle will be a ID3D11ShaderResourceView with a ID3D11Texture2D bound.
4087 *
4088 * The texture will always be sized to match the backing texture you supplied in SetOverlayTexture above.
4089 *
4090 * You MUST call ReleaseNativeOverlayHandle() with pNativeTextureHandle once you are done with this texture.
4091 *
4092 * pNativeTextureHandle is an OUTPUT, it will be a pointer to a ID3D11ShaderResourceView *.
4093 * pNativeTextureRef is an INPUT and should be a ID3D11Resource *. The device used by pNativeTextureRef will be used to bind pNativeTextureHandle.
4094 */
4095 virtual EVROverlayError GetOverlayTexture( VROverlayHandle_t ulOverlayHandle, void **pNativeTextureHandle, void *pNativeTextureRef, uint32_t *pWidth, uint32_t *pHeight, uint32_t *pNativeFormat, ETextureType *pAPIType, EColorSpace *pColorSpace, VRTextureBounds_t *pTextureBounds ) = 0;
4096
4097 /** Release the pNativeTextureHandle provided from the GetOverlayTexture call, this allows the system to free the underlying GPU resources for this object,
4098 * so only do it once you stop rendering this texture.
4099 */
4100 virtual EVROverlayError ReleaseNativeOverlayHandle( VROverlayHandle_t ulOverlayHandle, void *pNativeTextureHandle ) = 0;
4101
4102 /** Get the size of the overlay texture */
4103 virtual EVROverlayError GetOverlayTextureSize( VROverlayHandle_t ulOverlayHandle, uint32_t *pWidth, uint32_t *pHeight ) = 0;
4104
4105 // ----------------------------------------------
4106 // Dashboard Overlay Methods
4107 // ----------------------------------------------
4108
4109 /** Creates a dashboard overlay and returns its handle */
4110 virtual EVROverlayError CreateDashboardOverlay( const char *pchOverlayKey, const char *pchOverlayFriendlyName, VROverlayHandle_t * pMainHandle, VROverlayHandle_t *pThumbnailHandle ) = 0;
4111
4112 /** Returns true if the dashboard is visible */
4113 virtual bool IsDashboardVisible() = 0;
4114
4115 /** returns true if the dashboard is visible and the specified overlay is the active system Overlay */
4116 virtual bool IsActiveDashboardOverlay( VROverlayHandle_t ulOverlayHandle ) = 0;
4117
4118 /** Sets the dashboard overlay to only appear when the specified process ID has scene focus */
4119 virtual EVROverlayError SetDashboardOverlaySceneProcess( VROverlayHandle_t ulOverlayHandle, uint32_t unProcessId ) = 0;
4120
4121 /** Gets the process ID that this dashboard overlay requires to have scene focus */
4122 virtual EVROverlayError GetDashboardOverlaySceneProcess( VROverlayHandle_t ulOverlayHandle, uint32_t *punProcessId ) = 0;
4123
4124 /** Shows the dashboard. */
4125 virtual void ShowDashboard( const char *pchOverlayToShow ) = 0;
4126
4127 /** Returns the tracked device that has the laser pointer in the dashboard */
4128 virtual vr::TrackedDeviceIndex_t GetPrimaryDashboardDevice() = 0;
4129
4130 // ---------------------------------------------
4131 // Keyboard methods
4132 // ---------------------------------------------
4133
4134 /** Show the virtual keyboard to accept input. In most cases, you should pass KeyboardFlag_Modal to enable modal overlay
4135 * behavior on the keyboard itself. See EKeyboardFlags for more. */
4136 virtual EVROverlayError ShowKeyboard( EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, uint32_t unFlags,
4137 const char *pchDescription, uint32_t unCharMax, const char *pchExistingText, uint64_t uUserValue ) = 0;
4138
4139 /** Show the virtual keyboard to accept input for an overlay. In most cases, you should pass KeyboardFlag_Modal to enable modal
4140 * overlay behavior on the keyboard itself. See EKeyboardFlags for more. */
4141 virtual EVROverlayError ShowKeyboardForOverlay( VROverlayHandle_t ulOverlayHandle, EGamepadTextInputMode eInputMode,
4142 EGamepadTextInputLineMode eLineInputMode, uint32_t unFlags, const char *pchDescription, uint32_t unCharMax,
4143 const char *pchExistingText, uint64_t uUserValue ) = 0;
4144
4145 /** Get the text that was entered into the text input **/
4146 virtual uint32_t GetKeyboardText( VR_OUT_STRING() char *pchText, uint32_t cchText ) = 0;
4147
4148 /** Hide the virtual keyboard **/
4149 virtual void HideKeyboard() = 0;
4150
4151 /** Set the position of the keyboard in world space **/
4152 virtual void SetKeyboardTransformAbsolute( ETrackingUniverseOrigin eTrackingOrigin, const HmdMatrix34_t *pmatTrackingOriginToKeyboardTransform ) = 0;
4153
4154 /** Set the position of the keyboard in overlay space by telling it to avoid a rectangle in the overlay. Rectangle coords have (0,0) in the bottom left **/
4155 virtual void SetKeyboardPositionForOverlay( VROverlayHandle_t ulOverlayHandle, HmdRect2_t avoidRect ) = 0;
4156
4157 // ---------------------------------------------
4158 // Message box methods
4159 // ---------------------------------------------
4160
4161 /** Show the message overlay. This will block and return you a result. **/
4162 virtual VRMessageOverlayResponse ShowMessageOverlay( const char* pchText, const char* pchCaption, const char* pchButton0Text, const char* pchButton1Text = nullptr, const char* pchButton2Text = nullptr, const char* pchButton3Text = nullptr ) = 0;
4163
4164 /** If the calling process owns the overlay and it's open, this will close it. **/
4165 virtual void CloseMessageOverlay() = 0;
4166 };
4167
4168 static const char * const IVROverlay_Version = "IVROverlay_025";
4169
4170} // namespace vr
4171
4172// ivroverlayview.h
4173
4174namespace vr
4175{
4176 struct VROverlayView_t
4177 {
4178 VROverlayHandle_t overlayHandle;
4179 Texture_t texture;
4180 VRTextureBounds_t textureBounds;
4181 };
4182
4183 enum EDeviceType
4184 {
4185 DeviceType_Invalid = -1, // Invalid handle
4186 DeviceType_DirectX11 = 0, // Handle is an ID3D11Device
4187 DeviceType_Vulkan = 1, // Handle is a pointer to a VRVulkanDevice_t structure
4188 };
4189
4190 struct VRVulkanDevice_t
4191 {
4192 VkInstance_T *m_pInstance;
4193 VkDevice_T *m_pDevice;
4194 VkPhysicalDevice_T *m_pPhysicalDevice;
4195 VkQueue_T *m_pQueue;
4196 uint32_t m_uQueueFamilyIndex;
4197 };
4198
4199 struct VRNativeDevice_t
4200 {
4201 void *handle; // See EDeviceType definition above
4202 EDeviceType eType;
4203 };
4204
4205 class IVROverlayView
4206 {
4207 public:
4208 /** Acquire an OverlayView_t from an overlay handle
4209 *
4210 * The overlay view can be used to sample the contents directly by a native API. The
4211 * contents of the OverlayView_t will remain unchanged through the lifetime of the
4212 * OverlayView_t.
4213 *
4214 * The caller acquires read privileges over the OverlayView_t, but should not
4215 * write to it.
4216 *
4217 * AcquireOverlayView() may be called on the same ulOverlayHandle multiple times to
4218 * refresh the image contents. In this case the caller is strongly encouraged to re-use
4219 * the same pOverlayView for all re-acquisition calls.
4220 *
4221 * If the producer has not yet queued an image, AcquireOverlayView will return success,
4222 * and the Texture_t will have the expected ETextureType. However, the Texture_t->handle
4223 * will be nullptr. Once the producer generates the first overlay frame, Texture_t->handle
4224 * will become a valid handle.
4225 */
4226 virtual EVROverlayError AcquireOverlayView(VROverlayHandle_t ulOverlayHandle, VRNativeDevice_t *pNativeDevice, VROverlayView_t *pOverlayView, uint32_t unOverlayViewSize ) = 0;
4227
4228 /** Release an acquired OverlayView_t
4229 *
4230 * Denotes that pOverlayView will no longer require access to the resources it acquired in
4231 * all previous calls to AcquireOverlayView().
4232 *
4233 * All OverlayView_t*'s provided to AcquireOverlayView() as pOverlayViews must be
4234 * passed into ReleaseOverlayView() in order for the underlying GPU resources to be freed.
4235 */
4236 virtual EVROverlayError ReleaseOverlayView(VROverlayView_t *pOverlayView) = 0;
4237
4238 /** Posts an overlay event */
4239 virtual void PostOverlayEvent(VROverlayHandle_t ulOverlayHandle, const VREvent_t *pvrEvent) = 0;
4240
4241 /** Determines whether this process is permitted to view an overlay's content. */
4242 virtual bool IsViewingPermitted( VROverlayHandle_t ulOverlayHandle ) = 0;
4243
4244 };
4245
4246 static const char * const IVROverlayView_Version = "IVROverlayView_003";
4247
4248}
4249
4250// ivrrendermodels.h
4251
4252namespace vr
4253{
4254
4255static const char * const k_pch_Controller_Component_GDC2015 = "gdc2015"; // Canonical coordinate system of the gdc 2015 wired controller, provided for backwards compatibility
4256static const char * const k_pch_Controller_Component_Base = "base"; // For controllers with an unambiguous 'base'.
4257static const char * const k_pch_Controller_Component_Tip = "tip"; // For controllers with an unambiguous 'tip' (used for 'laser-pointing')
4258static const char * const k_pch_Controller_Component_HandGrip = "handgrip"; // Neutral, ambidextrous hand-pose when holding controller. On plane between neutrally posed index finger and thumb
4259static const char * const k_pch_Controller_Component_Status = "status"; // 1:1 aspect ratio status area, with canonical [0,1] uv mapping
4260
4261#pragma pack( push, 8 )
4262
4263/** Errors that can occur with the VR compositor */
4264enum EVRRenderModelError
4265{
4266 VRRenderModelError_None = 0,
4267 VRRenderModelError_Loading = 100,
4268 VRRenderModelError_NotSupported = 200,
4269 VRRenderModelError_InvalidArg = 300,
4270 VRRenderModelError_InvalidModel = 301,
4271 VRRenderModelError_NoShapes = 302,
4272 VRRenderModelError_MultipleShapes = 303,
4273 VRRenderModelError_TooManyVertices = 304,
4274 VRRenderModelError_MultipleTextures = 305,
4275 VRRenderModelError_BufferTooSmall = 306,
4276 VRRenderModelError_NotEnoughNormals = 307,
4277 VRRenderModelError_NotEnoughTexCoords = 308,
4278
4279 VRRenderModelError_InvalidTexture = 400,
4280};
4281
4282enum EVRRenderModelTextureFormat
4283{
4284 VRRenderModelTextureFormat_RGBA8_SRGB = 0, // RGBA with 8 bits per channel per pixel. Data size is width * height * 4ub
4285 VRRenderModelTextureFormat_BC2,
4286 VRRenderModelTextureFormat_BC4,
4287 VRRenderModelTextureFormat_BC7,
4288 VRRenderModelTextureFormat_BC7_SRGB
4289};
4290
4291/** A single vertex in a render model */
4292struct RenderModel_Vertex_t
4293{
4294 HmdVector3_t vPosition; // position in meters in device space
4295 HmdVector3_t vNormal;
4296 float rfTextureCoord[2];
4297};
4298
4299/** A texture map for use on a render model */
4300#if defined(__linux__) || defined(__APPLE__)
4301// This structure was originally defined mis-packed on Linux, preserved for
4302// compatibility.
4303#pragma pack( push, 4 )
4304#endif
4305
4306struct RenderModel_TextureMap_t
4307{
4308 uint16_t unWidth, unHeight; // width and height of the texture map in pixels
4309 const uint8_t *rubTextureMapData; // Map texture data.
4310 EVRRenderModelTextureFormat format; // Refer to EVRRenderModelTextureFormat
4311};
4312#if defined(__linux__) || defined(__APPLE__)
4313#pragma pack( pop )
4314#endif
4315
4316/** Session unique texture identifier. Rendermodels which share the same texture will have the same id.
4317IDs <0 denote the texture is not present */
4318
4319typedef int32_t TextureID_t;
4320
4321const TextureID_t INVALID_TEXTURE_ID = -1;
4322
4323#if defined(__linux__) || defined(__APPLE__)
4324// This structure was originally defined mis-packed on Linux, preserved for
4325// compatibility.
4326#pragma pack( push, 4 )
4327#endif
4328
4329struct RenderModel_t
4330{
4331 const RenderModel_Vertex_t *rVertexData; // Vertex data for the mesh
4332 uint32_t unVertexCount; // Number of vertices in the vertex data
4333 const uint16_t *rIndexData; // Indices into the vertex data for each triangle
4334 uint32_t unTriangleCount; // Number of triangles in the mesh. Index count is 3 * TriangleCount
4335 TextureID_t diffuseTextureId; // Session unique texture identifier. Rendermodels which share the same texture will have the same id. <0 == texture not present
4336};
4337#if defined(__linux__) || defined(__APPLE__)
4338#pragma pack( pop )
4339#endif
4340
4341
4342struct RenderModel_ControllerMode_State_t
4343{
4344 bool bScrollWheelVisible; // is this controller currently set to be in a scroll wheel mode
4345};
4346
4347#pragma pack( pop )
4348
4349class IVRRenderModels
4350{
4351public:
4352
4353 /** Loads and returns a render model for use in the application. pchRenderModelName should be a render model name
4354 * from the Prop_RenderModelName_String property or an absolute path name to a render model on disk.
4355 *
4356 * The resulting render model is valid until VR_Shutdown() is called or until FreeRenderModel() is called. When the
4357 * application is finished with the render model it should call FreeRenderModel() to free the memory associated
4358 * with the model.
4359 *
4360 * The method returns VRRenderModelError_Loading while the render model is still being loaded.
4361 * The method returns VRRenderModelError_None once loaded successfully, otherwise will return an error. */
4362 virtual EVRRenderModelError LoadRenderModel_Async( const char *pchRenderModelName, RenderModel_t **ppRenderModel ) = 0;
4363
4364 /** Frees a previously returned render model
4365 * It is safe to call this on a null ptr. */
4366 virtual void FreeRenderModel( RenderModel_t *pRenderModel ) = 0;
4367
4368 /** Loads and returns a texture for use in the application. */
4369 virtual EVRRenderModelError LoadTexture_Async( TextureID_t textureId, RenderModel_TextureMap_t **ppTexture ) = 0;
4370
4371 /** Frees a previously returned texture
4372 * It is safe to call this on a null ptr. */
4373 virtual void FreeTexture( RenderModel_TextureMap_t *pTexture ) = 0;
4374
4375 /** Creates a D3D11 texture and loads data into it. */
4376 virtual EVRRenderModelError LoadTextureD3D11_Async( TextureID_t textureId, void *pD3D11Device, void **ppD3D11Texture2D ) = 0;
4377
4378 /** Helper function to copy the bits into an existing texture. */
4379 virtual EVRRenderModelError LoadIntoTextureD3D11_Async( TextureID_t textureId, void *pDstTexture ) = 0;
4380
4381 /** Use this to free textures created with LoadTextureD3D11_Async instead of calling Release on them. */
4382 virtual void FreeTextureD3D11( void *pD3D11Texture2D ) = 0;
4383
4384 /** Use this to get the names of available render models. Index does not correlate to a tracked device index, but
4385 * is only used for iterating over all available render models. If the index is out of range, this function will return 0.
4386 * Otherwise, it will return the size of the buffer required for the name. */
4387 virtual uint32_t GetRenderModelName( uint32_t unRenderModelIndex, VR_OUT_STRING() char *pchRenderModelName, uint32_t unRenderModelNameLen ) = 0;
4388
4389 /** Returns the number of available render models. */
4390 virtual uint32_t GetRenderModelCount() = 0;
4391
4392
4393 /** Returns the number of components of the specified render model.
4394 * Components are useful when client application wish to draw, label, or otherwise interact with components of tracked objects.
4395 * Examples controller components:
4396 * renderable things such as triggers, buttons
4397 * non-renderable things which include coordinate systems such as 'tip', 'base', a neutral controller agnostic hand-pose
4398 * If all controller components are enumerated and rendered, it will be equivalent to drawing the traditional render model
4399 * Returns 0 if components not supported, >0 otherwise */
4400 virtual uint32_t GetComponentCount( const char *pchRenderModelName ) = 0;
4401
4402 /** Use this to get the names of available components. Index does not correlate to a tracked device index, but
4403 * is only used for iterating over all available components. If the index is out of range, this function will return 0.
4404 * Otherwise, it will return the size of the buffer required for the name. */
4405 virtual uint32_t GetComponentName( const char *pchRenderModelName, uint32_t unComponentIndex, VR_OUT_STRING( ) char *pchComponentName, uint32_t unComponentNameLen ) = 0;
4406
4407 /** Get the button mask for all buttons associated with this component
4408 * If no buttons (or axes) are associated with this component, return 0
4409 * Note: multiple components may be associated with the same button. Ex: two grip buttons on a single controller.
4410 * Note: A single component may be associated with multiple buttons. Ex: A trackpad which also provides "D-pad" functionality */
4411 virtual uint64_t GetComponentButtonMask( const char *pchRenderModelName, const char *pchComponentName ) = 0;
4412
4413 /** Use this to get the render model name for the specified rendermode/component combination, to be passed to LoadRenderModel.
4414 * If the component name is out of range, this function will return 0.
4415 * Otherwise, it will return the size of the buffer required for the name. */
4416 virtual uint32_t GetComponentRenderModelName( const char *pchRenderModelName, const char *pchComponentName, VR_OUT_STRING( ) char *pchComponentRenderModelName, uint32_t unComponentRenderModelNameLen ) = 0;
4417
4418 /** Use this to query information about the component, as a function of the controller state.
4419 *
4420 * For dynamic controller components (ex: trigger) values will reflect component motions
4421 * For static components this will return a consistent value independent of the VRControllerState_t
4422 *
4423 * If the pchRenderModelName or pchComponentName is invalid, this will return false (and transforms will be set to identity).
4424 * Otherwise, return true
4425 * Note: For dynamic objects, visibility may be dynamic. (I.e., true/false will be returned based on controller state and controller mode state ) */
4426 virtual bool GetComponentStateForDevicePath( const char *pchRenderModelName, const char *pchComponentName, vr::VRInputValueHandle_t devicePath, const vr::RenderModel_ControllerMode_State_t *pState, vr::RenderModel_ComponentState_t *pComponentState ) = 0;
4427
4428 /** This version of GetComponentState takes a controller state block instead of an action origin. This function is deprecated. You should use the new input system and GetComponentStateForDevicePath instead. */
4429 virtual bool GetComponentState( const char *pchRenderModelName, const char *pchComponentName, const vr::VRControllerState_t *pControllerState, const RenderModel_ControllerMode_State_t *pState, RenderModel_ComponentState_t *pComponentState ) = 0;
4430
4431 /** Returns true if the render model has a component with the specified name */
4432 virtual bool RenderModelHasComponent( const char *pchRenderModelName, const char *pchComponentName ) = 0;
4433
4434 /** Returns the URL of the thumbnail image for this rendermodel */
4435 virtual uint32_t GetRenderModelThumbnailURL( const char *pchRenderModelName, VR_OUT_STRING() char *pchThumbnailURL, uint32_t unThumbnailURLLen, vr::EVRRenderModelError *peError ) = 0;
4436
4437 /** Provides a render model path that will load the unskinned model if the model name provided has been replace by the user. If the model
4438 * hasn't been replaced the path value will still be a valid path to load the model. Pass this to LoadRenderModel_Async, etc. to load the
4439 * model. */
4440 virtual uint32_t GetRenderModelOriginalPath( const char *pchRenderModelName, VR_OUT_STRING() char *pchOriginalPath, uint32_t unOriginalPathLen, vr::EVRRenderModelError *peError ) = 0;
4441
4442 /** Returns a string for a render model error */
4443 virtual const char *GetRenderModelErrorNameFromEnum( vr::EVRRenderModelError error ) = 0;
4444};
4445
4446static const char * const IVRRenderModels_Version = "IVRRenderModels_006";
4447
4448}
4449
4450
4451// ivrextendeddisplay.h
4452
4453namespace vr
4454{
4455
4456 /** NOTE: Use of this interface is not recommended in production applications. It will not work for displays which use
4457 * direct-to-display mode. Creating our own window is also incompatible with the VR compositor and is not available when the compositor is running. */
4458 class IVRExtendedDisplay
4459 {
4460 public:
4461
4462 /** Size and position that the window needs to be on the VR display. */
4463 virtual void GetWindowBounds( int32_t *pnX, int32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
4464
4465 /** Gets the viewport in the frame buffer to draw the output of the distortion into */
4466 virtual void GetEyeOutputViewport( EVREye eEye, uint32_t *pnX, uint32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
4467
4468 /** [D3D10/11 Only]
4469 * Returns the adapter index and output index that the user should pass into EnumAdapters and EnumOutputs
4470 * to create the device and swap chain in DX10 and DX11. If an error occurs both indices will be set to -1.
4471 */
4472 virtual void GetDXGIOutputInfo( int32_t *pnAdapterIndex, int32_t *pnAdapterOutputIndex ) = 0;
4473
4474 };
4475
4476 static const char * const IVRExtendedDisplay_Version = "IVRExtendedDisplay_001";
4477
4478}
4479
4480
4481// ivrtrackedcamera.h
4482
4483namespace vr
4484{
4485
4486class IVRTrackedCamera
4487{
4488public:
4489 /** Returns a string for an error */
4490 virtual const char *GetCameraErrorNameFromEnum( vr::EVRTrackedCameraError eCameraError ) = 0;
4491
4492 /** For convenience, same as tracked property request Prop_HasCamera_Bool */
4493 virtual vr::EVRTrackedCameraError HasCamera( vr::TrackedDeviceIndex_t nDeviceIndex, bool *pHasCamera ) = 0;
4494
4495 /** Gets size of the image frame. */
4496 virtual vr::EVRTrackedCameraError GetCameraFrameSize( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, uint32_t *pnWidth, uint32_t *pnHeight, uint32_t *pnFrameBufferSize ) = 0;
4497
4498 virtual vr::EVRTrackedCameraError GetCameraIntrinsics( vr::TrackedDeviceIndex_t nDeviceIndex, uint32_t nCameraIndex, vr::EVRTrackedCameraFrameType eFrameType, vr::HmdVector2_t *pFocalLength, vr::HmdVector2_t *pCenter ) = 0;
4499
4500 virtual vr::EVRTrackedCameraError GetCameraProjection( vr::TrackedDeviceIndex_t nDeviceIndex, uint32_t nCameraIndex, vr::EVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, vr::HmdMatrix44_t *pProjection ) = 0;
4501
4502 /** Acquiring streaming service permits video streaming for the caller. Releasing hints the system that video services do not need to be maintained for this client.
4503 * If the camera has not already been activated, a one time spin up may incur some auto exposure as well as initial streaming frame delays.
4504 * The camera should be considered a global resource accessible for shared consumption but not exclusive to any caller.
4505 * The camera may go inactive due to lack of active consumers or headset idleness. */
4506 virtual vr::EVRTrackedCameraError AcquireVideoStreamingService( vr::TrackedDeviceIndex_t nDeviceIndex, vr::TrackedCameraHandle_t *pHandle ) = 0;
4507 virtual vr::EVRTrackedCameraError ReleaseVideoStreamingService( vr::TrackedCameraHandle_t hTrackedCamera ) = 0;
4508
4509 /** Copies the image frame into a caller's provided buffer. The image data is currently provided as RGBA data, 4 bytes per pixel.
4510 * A caller can provide null for the framebuffer or frameheader if not desired. Requesting the frame header first, followed by the frame buffer allows
4511 * the caller to determine if the frame as advanced per the frame header sequence.
4512 * If there is no frame available yet, due to initial camera spinup or re-activation, the error will be VRTrackedCameraError_NoFrameAvailable.
4513 * Ideally a caller should be polling at ~16ms intervals */
4514 virtual vr::EVRTrackedCameraError GetVideoStreamFrameBuffer( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, void *pFrameBuffer, uint32_t nFrameBufferSize, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0;
4515
4516 /** Gets size of the image frame. */
4517 virtual vr::EVRTrackedCameraError GetVideoStreamTextureSize( vr::TrackedDeviceIndex_t nDeviceIndex, vr::EVRTrackedCameraFrameType eFrameType, vr::VRTextureBounds_t *pTextureBounds, uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
4518
4519 /** Access a shared D3D11 texture for the specified tracked camera stream.
4520 * The camera frame type VRTrackedCameraFrameType_Undistorted is not supported directly as a shared texture. It is an interior subregion of the shared texture VRTrackedCameraFrameType_MaximumUndistorted.
4521 * Instead, use GetVideoStreamTextureSize() with VRTrackedCameraFrameType_Undistorted to determine the proper interior subregion bounds along with GetVideoStreamTextureD3D11() with
4522 * VRTrackedCameraFrameType_MaximumUndistorted to provide the texture. The VRTrackedCameraFrameType_MaximumUndistorted will yield an image where the invalid regions are decoded
4523 * by the alpha channel having a zero component. The valid regions all have a non-zero alpha component. The subregion as described by VRTrackedCameraFrameType_Undistorted
4524 * guarantees a rectangle where all pixels are valid. */
4525 virtual vr::EVRTrackedCameraError GetVideoStreamTextureD3D11( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, void *pD3D11DeviceOrResource, void **ppD3D11ShaderResourceView, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0;
4526
4527 /** Access a shared GL texture for the specified tracked camera stream */
4528 virtual vr::EVRTrackedCameraError GetVideoStreamTextureGL( vr::TrackedCameraHandle_t hTrackedCamera, vr::EVRTrackedCameraFrameType eFrameType, vr::glUInt_t *pglTextureId, vr::CameraVideoStreamFrameHeader_t *pFrameHeader, uint32_t nFrameHeaderSize ) = 0;
4529 virtual vr::EVRTrackedCameraError ReleaseVideoStreamTextureGL( vr::TrackedCameraHandle_t hTrackedCamera, vr::glUInt_t glTextureId ) = 0;
4530 virtual void SetCameraTrackingSpace( vr::ETrackingUniverseOrigin eUniverse ) = 0;
4531 virtual vr::ETrackingUniverseOrigin GetCameraTrackingSpace( ) = 0;
4532};
4533
4534static const char * const IVRTrackedCamera_Version = "IVRTrackedCamera_006";
4535
4536} // namespace vr
4537
4538
4539// ivrscreenshots.h
4540
4541namespace vr
4542{
4543
4544/** Errors that can occur with the VR compositor */
4545enum EVRScreenshotError
4546{
4547 VRScreenshotError_None = 0,
4548 VRScreenshotError_RequestFailed = 1,
4549 VRScreenshotError_IncompatibleVersion = 100,
4550 VRScreenshotError_NotFound = 101,
4551 VRScreenshotError_BufferTooSmall = 102,
4552 VRScreenshotError_ScreenshotAlreadyInProgress = 108,
4553};
4554
4555/** Allows the application to generate screenshots */
4556class IVRScreenshots
4557{
4558public:
4559 /** Request a screenshot of the requested type.
4560 * A request of the VRScreenshotType_Stereo type will always
4561 * work. Other types will depend on the underlying application
4562 * support.
4563 * The first file name is for the preview image and should be a
4564 * regular screenshot (ideally from the left eye). The second
4565 * is the VR screenshot in the correct format. They should be
4566 * in the same aspect ratio. Formats per type:
4567 * VRScreenshotType_Mono: the VR filename is ignored (can be
4568 * nullptr), this is a normal flat single shot.
4569 * VRScreenshotType_Stereo: The VR image should be a
4570 * side-by-side with the left eye image on the left.
4571 * VRScreenshotType_Cubemap: The VR image should be six square
4572 * images composited horizontally.
4573 * VRScreenshotType_StereoPanorama: above/below with left eye
4574 * panorama being the above image. Image is typically square
4575 * with the panorama being 2x horizontal.
4576 *
4577 * Note that the VR dashboard will call this function when
4578 * the user presses the screenshot binding (currently System
4579 * Button + Trigger). If Steam is running, the destination
4580 * file names will be in %TEMP% and will be copied into
4581 * Steam's screenshot library for the running application
4582 * once SubmitScreenshot() is called.
4583 * If Steam is not running, the paths will be in the user's
4584 * documents folder under Documents\SteamVR\Screenshots.
4585 * Other VR applications can call this to initiate a
4586 * screenshot outside of user control.
4587 * The destination file names do not need an extension,
4588 * will be replaced with the correct one for the format
4589 * which is currently .png. */
4590 virtual vr::EVRScreenshotError RequestScreenshot( vr::ScreenshotHandle_t *pOutScreenshotHandle, vr::EVRScreenshotType type, const char *pchPreviewFilename, const char *pchVRFilename ) = 0;
4591
4592 /** Called by the running VR application to indicate that it
4593 * wishes to be in charge of screenshots. If the
4594 * application does not call this, the Compositor will only
4595 * support VRScreenshotType_Stereo screenshots that will be
4596 * captured without notification to the running app.
4597 * Once hooked your application will receive a
4598 * VREvent_RequestScreenshot event when the user presses the
4599 * buttons to take a screenshot. */
4600 virtual vr::EVRScreenshotError HookScreenshot( VR_ARRAY_COUNT( numTypes ) const vr::EVRScreenshotType *pSupportedTypes, int numTypes ) = 0;
4601
4602 /** When your application receives a
4603 * VREvent_RequestScreenshot event, call these functions to get
4604 * the details of the screenshot request. */
4605 virtual vr::EVRScreenshotType GetScreenshotPropertyType( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotError *pError ) = 0;
4606
4607 /** Get the filename for the preview or vr image (see
4608 * vr::EScreenshotPropertyFilenames). The return value is
4609 * the size of the string. */
4610 virtual uint32_t GetScreenshotPropertyFilename( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotPropertyFilenames filenameType, VR_OUT_STRING() char *pchFilename, uint32_t cchFilename, vr::EVRScreenshotError *pError ) = 0;
4611
4612 /** Call this if the application is taking the screen shot
4613 * will take more than a few ms processing. This will result
4614 * in an overlay being presented that shows a completion
4615 * bar. */
4616 virtual vr::EVRScreenshotError UpdateScreenshotProgress( vr::ScreenshotHandle_t screenshotHandle, float flProgress ) = 0;
4617
4618 /** Tells the compositor to take an internal screenshot of
4619 * type VRScreenshotType_Stereo. It will take the current
4620 * submitted scene textures of the running application and
4621 * write them into the preview image and a side-by-side file
4622 * for the VR image.
4623 * This is similar to request screenshot, but doesn't ever
4624 * talk to the application, just takes the shot and submits. */
4625 virtual vr::EVRScreenshotError TakeStereoScreenshot( vr::ScreenshotHandle_t *pOutScreenshotHandle, const char *pchPreviewFilename, const char *pchVRFilename ) = 0;
4626
4627 /** Submit the completed screenshot. If Steam is running
4628 * this will call into the Steam client and upload the
4629 * screenshot to the screenshots section of the library for
4630 * the running application. If Steam is not running, this
4631 * function will display a notification to the user that the
4632 * screenshot was taken. The paths should be full paths with
4633 * extensions.
4634 * File paths should be absolute including extensions.
4635 * screenshotHandle can be k_unScreenshotHandleInvalid if this
4636 * was a new shot taking by the app to be saved and not
4637 * initiated by a user (achievement earned or something) */
4638 virtual vr::EVRScreenshotError SubmitScreenshot( vr::ScreenshotHandle_t screenshotHandle, vr::EVRScreenshotType type, const char *pchSourcePreviewFilename, const char *pchSourceVRFilename ) = 0;
4639};
4640
4641static const char * const IVRScreenshots_Version = "IVRScreenshots_001";
4642
4643} // namespace vr
4644
4645
4646
4647// ivrresources.h
4648
4649namespace vr
4650{
4651
4652class IVRResources
4653{
4654public:
4655
4656 // ------------------------------------
4657 // Shared Resource Methods
4658 // ------------------------------------
4659
4660 /** Loads the specified resource into the provided buffer if large enough.
4661 * Returns the size in bytes of the buffer required to hold the specified resource. */
4662 virtual uint32_t LoadSharedResource( const char *pchResourceName, char *pchBuffer, uint32_t unBufferLen ) = 0;
4663
4664 /** Provides the full path to the specified resource. Resource names can include named directories for
4665 * drivers and other things, and this resolves all of those and returns the actual physical path.
4666 * pchResourceTypeDirectory is the subdirectory of resources to look in. */
4667 virtual uint32_t GetResourceFullPath( const char *pchResourceName, const char *pchResourceTypeDirectory, VR_OUT_STRING() char *pchPathBuffer, uint32_t unBufferLen ) = 0;
4668};
4669
4670static const char * const IVRResources_Version = "IVRResources_001";
4671
4672
4673}
4674
4675// ivrdrivermanager.h
4676
4677namespace vr
4678{
4679
4680class IVRDriverManager
4681{
4682public:
4683 virtual uint32_t GetDriverCount() const = 0;
4684
4685 /** Returns the length of the number of bytes necessary to hold this string including the trailing null. */
4686 virtual uint32_t GetDriverName( vr::DriverId_t nDriver, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize ) = 0;
4687
4688 virtual DriverHandle_t GetDriverHandle( const char *pchDriverName ) = 0;
4689
4690 virtual bool IsEnabled( vr::DriverId_t nDriver ) const = 0;
4691};
4692
4693static const char * const IVRDriverManager_Version = "IVRDriverManager_001";
4694
4695} // namespace vr
4696
4697
4698
4699// ivrinput.h
4700
4701namespace vr
4702{
4703 // Maximum number of characters in an action name, including the trailing null
4704 static const uint32_t k_unMaxActionNameLength = 64;
4705
4706 // Maximum number of characters in an action set name, including the trailing null
4707 static const uint32_t k_unMaxActionSetNameLength = 64;
4708
4709 // Maximum number of origins for an action
4710 static const uint32_t k_unMaxActionOriginCount = 16;
4711
4712 // Maximum number of characters in a bone name, including the trailing null
4713 static const uint32_t k_unMaxBoneNameLength = 32;
4714
4715 enum EVRSkeletalTransformSpace
4716 {
4717 VRSkeletalTransformSpace_Model = 0,
4718 VRSkeletalTransformSpace_Parent = 1
4719 };
4720
4721 enum EVRSkeletalReferencePose
4722 {
4723 VRSkeletalReferencePose_BindPose = 0,
4724 VRSkeletalReferencePose_OpenHand,
4725 VRSkeletalReferencePose_Fist,
4726 VRSkeletalReferencePose_GripLimit
4727 };
4728
4729 enum EVRFinger
4730 {
4731 VRFinger_Thumb = 0,
4732 VRFinger_Index,
4733 VRFinger_Middle,
4734 VRFinger_Ring,
4735 VRFinger_Pinky,
4736 VRFinger_Count
4737 };
4738
4739 enum EVRFingerSplay
4740 {
4741 VRFingerSplay_Thumb_Index = 0,
4742 VRFingerSplay_Index_Middle,
4743 VRFingerSplay_Middle_Ring,
4744 VRFingerSplay_Ring_Pinky,
4745 VRFingerSplay_Count
4746 };
4747
4748 enum EVRSummaryType
4749 {
4750 // The skeletal summary data will match the animated bone transforms for the action.
4751 VRSummaryType_FromAnimation = 0,
4752
4753 // The skeletal summary data will include unprocessed data directly from the device when available.
4754 // This data is generally less latent than the data that is computed from the animations.
4755 VRSummaryType_FromDevice = 1,
4756 };
4757
4758 enum EVRInputFilterCancelType
4759 {
4760 VRInputFilterCancel_Timers = 0,
4761 VRInputFilterCancel_Momentum = 1,
4762 };
4763
4764 enum EVRInputStringBits
4765 {
4766 VRInputString_Hand = 0x01,
4767 VRInputString_ControllerType = 0x02,
4768 VRInputString_InputSource = 0x04,
4769
4770 VRInputString_All = 0xFFFFFFFF
4771 };
4772
4773 struct InputAnalogActionData_t
4774 {
4775 /** Whether or not this action is currently available to be bound in the active action set */
4776 bool bActive;
4777
4778 /** The origin that caused this action's current state */
4779 VRInputValueHandle_t activeOrigin;
4780
4781 /** The current state of this action; will be delta updates for mouse actions */
4782 float x, y, z;
4783
4784 /** Deltas since the previous call to UpdateActionState() */
4785 float deltaX, deltaY, deltaZ;
4786
4787 /** Time relative to now when this event happened. Will be negative to indicate a past time. */
4788 float fUpdateTime;
4789 };
4790
4791 struct InputDigitalActionData_t
4792 {
4793 /** Whether or not this action is currently available to be bound in the active action set */
4794 bool bActive;
4795
4796 /** The origin that caused this action's current state */
4797 VRInputValueHandle_t activeOrigin;
4798
4799 /** The current state of this action; will be true if currently pressed */
4800 bool bState;
4801
4802 /** This is true if the state has changed since the last frame */
4803 bool bChanged;
4804
4805 /** Time relative to now when this event happened. Will be negative to indicate a past time. */
4806 float fUpdateTime;
4807 };
4808
4809 struct InputPoseActionData_t
4810 {
4811 /** Whether or not this action is currently available to be bound in the active action set */
4812 bool bActive;
4813
4814 /** The origin that caused this action's current state */
4815 VRInputValueHandle_t activeOrigin;
4816
4817 /** The current state of this action */
4818 TrackedDevicePose_t pose;
4819 };
4820
4821 struct InputSkeletalActionData_t
4822 {
4823 /** Whether or not this action is currently available to be bound in the active action set */
4824 bool bActive;
4825
4826 /** The origin that caused this action's current state */
4827 VRInputValueHandle_t activeOrigin;
4828 };
4829
4830 struct InputOriginInfo_t
4831 {
4832 VRInputValueHandle_t devicePath;
4833 TrackedDeviceIndex_t trackedDeviceIndex;
4834 char rchRenderModelComponentName[128];
4835 };
4836
4837 struct InputBindingInfo_t
4838 {
4839 char rchDevicePathName[128];
4840 char rchInputPathName[128];
4841 char rchModeName[128];
4842 char rchSlotName[128];
4843 char rchInputSourceType[ 32 ];
4844 };
4845
4846 // * Experimental global action set priority *
4847 // These constants are part of the experimental support in SteamVR for overlay
4848 // apps selectively overriding input in the base scene application. This may be
4849 // useful for overlay applications that need to use part or all of a controller
4850 // without taking away all input to the game. This system must be enabled by the
4851 // "Experimental overlay input overrides" setting in the developer section of
4852 // SteamVR settings.
4853 //
4854 // To use this system, set the nPriority field of an action set to any number in
4855 // this range.
4856 static const int32_t k_nActionSetOverlayGlobalPriorityMin = 0x01000000;
4857 static const int32_t k_nActionSetOverlayGlobalPriorityMax = 0x01FFFFFF;
4858
4859 static const int32_t k_nActionSetPriorityReservedMin = 0x02000000;
4860
4861 struct VRActiveActionSet_t
4862 {
4863 /** This is the handle of the action set to activate for this frame. */
4864 VRActionSetHandle_t ulActionSet;
4865
4866 /** This is the handle of a device path that this action set should be active for. To
4867 * activate for all devices, set this to k_ulInvalidInputValueHandle. */
4868 VRInputValueHandle_t ulRestrictedToDevice;
4869
4870 /** The action set to activate for all devices other than ulRestrictedDevice. If
4871 * ulRestrictedToDevice is set to k_ulInvalidInputValueHandle, this parameter is
4872 * ignored. */
4873 VRActionSetHandle_t ulSecondaryActionSet;
4874
4875 // This field is ignored
4876 uint32_t unPadding;
4877
4878 /** The priority of this action set relative to other action sets. Any inputs
4879 * bound to a source (e.g. trackpad, joystick, trigger) will disable bindings in
4880 * other active action sets with a smaller priority.
4881 *
4882 * Overlay applications (i.e. ApplicationType_Overlay) may set their action set priority
4883 * to a value between k_nActionSetOverlayGlobalPriorityMin and k_nActionSetOverlayGlobalPriorityMax
4884 * to cause any inputs bound to a source used by that action set to be disabled in scene applications.
4885 *
4886 * No action set priority may value may be larger than k_nActionSetPriorityReservedMin
4887 */
4888 int32_t nPriority;
4889 };
4890
4891 /** Contains summary information about the current skeletal pose */
4892 struct VRSkeletalSummaryData_t
4893 {
4894 /** The amount that each finger is 'curled' inwards towards the palm. In the case of the thumb,
4895 * this represents how much the thumb is wrapped around the fist.
4896 * 0 means straight, 1 means fully curled */
4897 float flFingerCurl[ VRFinger_Count ];
4898
4899 /** The amount that each pair of adjacent fingers are separated.
4900 * 0 means the digits are touching, 1 means they are fully separated.
4901 */
4902 float flFingerSplay[ VRFingerSplay_Count ];
4903 };
4904
4905
4906 class IVRInput
4907 {
4908 public:
4909
4910 // --------------- Handle management --------------- //
4911
4912 /** Sets the path to the action manifest JSON file that is used by this application. If this information
4913 * was set on the Steam partner site, calls to this function are ignored. If the Steam partner site
4914 * setting and the path provided by this call are different, VRInputError_MismatchedActionManifest is returned.
4915 * This call must be made before the first call to UpdateActionState or IVRSystem::PollNextEvent. */
4916 virtual EVRInputError SetActionManifestPath( const char *pchActionManifestPath ) = 0;
4917
4918 /** Returns a handle for an action set. This handle is used for all performance-sensitive calls. */
4919 virtual EVRInputError GetActionSetHandle( const char *pchActionSetName, VRActionSetHandle_t *pHandle ) = 0;
4920
4921 /** Returns a handle for an action. This handle is used for all performance-sensitive calls. */
4922 virtual EVRInputError GetActionHandle( const char *pchActionName, VRActionHandle_t *pHandle ) = 0;
4923
4924 /** Returns a handle for any path in the input system. E.g. /user/hand/right */
4925 virtual EVRInputError GetInputSourceHandle( const char *pchInputSourcePath, VRInputValueHandle_t *pHandle ) = 0;
4926
4927
4928
4929 // --------------- Reading action state ------------------- //
4930
4931 /** Reads the current state into all actions. After this call, the results of Get*Action calls
4932 * will be the same until the next call to UpdateActionState. */
4933 virtual EVRInputError UpdateActionState( VR_ARRAY_COUNT( unSetCount ) VRActiveActionSet_t *pSets, uint32_t unSizeOfVRSelectedActionSet_t, uint32_t unSetCount ) = 0;
4934
4935 /** Reads the state of a digital action given its handle. This will return VRInputError_WrongType if the type of
4936 * action is something other than digital */
4937 virtual EVRInputError GetDigitalActionData( VRActionHandle_t action, InputDigitalActionData_t *pActionData, uint32_t unActionDataSize, VRInputValueHandle_t ulRestrictToDevice ) = 0;
4938
4939 /** Reads the state of an analog action given its handle. This will return VRInputError_WrongType if the type of
4940 * action is something other than analog */
4941 virtual EVRInputError GetAnalogActionData( VRActionHandle_t action, InputAnalogActionData_t *pActionData, uint32_t unActionDataSize, VRInputValueHandle_t ulRestrictToDevice ) = 0;
4942
4943 /** Reads the state of a pose action given its handle for the number of seconds relative to now. This
4944 * will generally be called with negative times from the fUpdateTime fields in other actions. */
4945 virtual EVRInputError GetPoseActionDataRelativeToNow( VRActionHandle_t action, ETrackingUniverseOrigin eOrigin, float fPredictedSecondsFromNow, InputPoseActionData_t *pActionData, uint32_t unActionDataSize, VRInputValueHandle_t ulRestrictToDevice ) = 0;
4946
4947 /** Reads the state of a pose action given its handle. The returned values will match the values returned
4948 * by the last call to IVRCompositor::WaitGetPoses(). */
4949 virtual EVRInputError GetPoseActionDataForNextFrame( VRActionHandle_t action, ETrackingUniverseOrigin eOrigin, InputPoseActionData_t *pActionData, uint32_t unActionDataSize, VRInputValueHandle_t ulRestrictToDevice ) = 0;
4950
4951 /** Reads the state of a skeletal action given its handle. */
4952 virtual EVRInputError GetSkeletalActionData( VRActionHandle_t action, InputSkeletalActionData_t *pActionData, uint32_t unActionDataSize ) = 0;
4953
4954 /** Returns the current dominant hand for the user for this application. This function will only return success for applications
4955 * which include "supports_dominant_hand_setting": true in their action manifests. The dominant hand will only change after
4956 * a call to UpdateActionState, and the action data returned after that point will use the new dominant hand. */
4957 virtual EVRInputError GetDominantHand( ETrackedControllerRole *peDominantHand ) = 0;
4958
4959 /** Sets the dominant hand for the user for this application. */
4960 virtual EVRInputError SetDominantHand( ETrackedControllerRole eDominantHand ) = 0;
4961
4962 // --------------- Static Skeletal Data ------------------- //
4963
4964 /** Reads the number of bones in skeleton associated with the given action */
4965 virtual EVRInputError GetBoneCount( VRActionHandle_t action, uint32_t* pBoneCount ) = 0;
4966
4967 /** Fills the given array with the index of each bone's parent in the skeleton associated with the given action */
4968 virtual EVRInputError GetBoneHierarchy( VRActionHandle_t action, VR_ARRAY_COUNT( unIndexArayCount ) BoneIndex_t* pParentIndices, uint32_t unIndexArayCount ) = 0;
4969
4970 /** Fills the given buffer with the name of the bone at the given index in the skeleton associated with the given action */
4971 virtual EVRInputError GetBoneName( VRActionHandle_t action, BoneIndex_t nBoneIndex, VR_OUT_STRING() char* pchBoneName, uint32_t unNameBufferSize ) = 0;
4972
4973 /** Fills the given buffer with the transforms for a specific static skeletal reference pose */
4974 virtual EVRInputError GetSkeletalReferenceTransforms( VRActionHandle_t action, EVRSkeletalTransformSpace eTransformSpace, EVRSkeletalReferencePose eReferencePose, VR_ARRAY_COUNT( unTransformArrayCount ) VRBoneTransform_t *pTransformArray, uint32_t unTransformArrayCount ) = 0;
4975
4976 /** Reads the level of accuracy to which the controller is able to track the user to recreate a skeletal pose */
4977 virtual EVRInputError GetSkeletalTrackingLevel( VRActionHandle_t action, EVRSkeletalTrackingLevel* pSkeletalTrackingLevel ) = 0;
4978
4979 // --------------- Dynamic Skeletal Data ------------------- //
4980
4981 /** Reads the state of the skeletal bone data associated with this action and copies it into the given buffer. */
4982 virtual EVRInputError GetSkeletalBoneData( VRActionHandle_t action, EVRSkeletalTransformSpace eTransformSpace, EVRSkeletalMotionRange eMotionRange, VR_ARRAY_COUNT( unTransformArrayCount ) VRBoneTransform_t *pTransformArray, uint32_t unTransformArrayCount ) = 0;
4983
4984 /** Reads summary information about the current pose of the skeleton associated with the given action. */
4985 virtual EVRInputError GetSkeletalSummaryData( VRActionHandle_t action, EVRSummaryType eSummaryType, VRSkeletalSummaryData_t * pSkeletalSummaryData ) = 0;
4986
4987 /** Reads the state of the skeletal bone data in a compressed form that is suitable for
4988 * sending over the network. The required buffer size will never exceed ( sizeof(VR_BoneTransform_t)*boneCount + 2).
4989 * Usually the size will be much smaller. */
4990 virtual EVRInputError GetSkeletalBoneDataCompressed( VRActionHandle_t action, EVRSkeletalMotionRange eMotionRange, VR_OUT_BUFFER_COUNT( unCompressedSize ) void *pvCompressedData, uint32_t unCompressedSize, uint32_t *punRequiredCompressedSize ) = 0;
4991
4992 /** Turns a compressed buffer from GetSkeletalBoneDataCompressed and turns it back into a bone transform array. */
4993 virtual EVRInputError DecompressSkeletalBoneData( const void *pvCompressedBuffer, uint32_t unCompressedBufferSize, EVRSkeletalTransformSpace eTransformSpace, VR_ARRAY_COUNT( unTransformArrayCount ) VRBoneTransform_t *pTransformArray, uint32_t unTransformArrayCount ) = 0;
4994
4995 // --------------- Haptics ------------------- //
4996
4997 /** Triggers a haptic event as described by the specified action */
4998 virtual EVRInputError TriggerHapticVibrationAction( VRActionHandle_t action, float fStartSecondsFromNow, float fDurationSeconds, float fFrequency, float fAmplitude, VRInputValueHandle_t ulRestrictToDevice ) = 0;
4999
5000 // --------------- Action Origins ---------------- //
5001
5002 /** Retrieve origin handles for an action */
5003 virtual EVRInputError GetActionOrigins( VRActionSetHandle_t actionSetHandle, VRActionHandle_t digitalActionHandle, VR_ARRAY_COUNT( originOutCount ) VRInputValueHandle_t *originsOut, uint32_t originOutCount ) = 0;
5004
5005 /** Retrieves the name of the origin in the current language. unStringSectionsToInclude is a bitfield of values in EVRInputStringBits that allows the
5006 application to specify which parts of the origin's information it wants a string for. */
5007 virtual EVRInputError GetOriginLocalizedName( VRInputValueHandle_t origin, VR_OUT_STRING() char *pchNameArray, uint32_t unNameArraySize, int32_t unStringSectionsToInclude ) = 0;
5008
5009 /** Retrieves useful information for the origin of this action */
5010 virtual EVRInputError GetOriginTrackedDeviceInfo( VRInputValueHandle_t origin, InputOriginInfo_t *pOriginInfo, uint32_t unOriginInfoSize ) = 0;
5011
5012 /** Retrieves useful information about the bindings for an action */
5013 virtual EVRInputError GetActionBindingInfo( VRActionHandle_t action, InputBindingInfo_t *pOriginInfo, uint32_t unBindingInfoSize, uint32_t unBindingInfoCount, uint32_t *punReturnedBindingInfoCount ) = 0;
5014
5015 /** Shows the current binding for the action in-headset */
5016 virtual EVRInputError ShowActionOrigins( VRActionSetHandle_t actionSetHandle, VRActionHandle_t ulActionHandle ) = 0;
5017
5018 /** Shows the current binding all the actions in the specified action sets */
5019 virtual EVRInputError ShowBindingsForActionSet( VR_ARRAY_COUNT( unSetCount ) VRActiveActionSet_t *pSets, uint32_t unSizeOfVRSelectedActionSet_t, uint32_t unSetCount, VRInputValueHandle_t originToHighlight ) = 0;
5020
5021 /** Use this to query what action on the component returned by GetOriginTrackedDeviceInfo would trigger this binding. */
5022 virtual EVRInputError GetComponentStateForBinding( const char *pchRenderModelName, const char *pchComponentName,
5023 const InputBindingInfo_t *pOriginInfo, uint32_t unBindingInfoSize, uint32_t unBindingInfoCount,
5024 vr::RenderModel_ComponentState_t *pComponentState ) = 0;
5025
5026
5027 // --------------- Legacy Input ------------------- //
5028 virtual bool IsUsingLegacyInput() = 0;
5029
5030
5031 // --------------- Utilities ------------------- //
5032
5033 /** Opens the binding user interface. If no app key is provided it will use the key from the calling process.
5034 * If no set is provided it will open to the root of the app binding page. */
5035 virtual EVRInputError OpenBindingUI( const char* pchAppKey, VRActionSetHandle_t ulActionSetHandle, VRInputValueHandle_t ulDeviceHandle, bool bShowOnDesktop ) = 0;
5036
5037 /** Returns the variant set in the current bindings. If the binding doesn't include a variant setting, this function
5038 * will return an empty string */
5039 virtual EVRInputError GetBindingVariant( vr::VRInputValueHandle_t ulDevicePath,
5040 VR_OUT_STRING() char *pchVariantArray, uint32_t unVariantArraySize ) = 0;
5041
5042 };
5043
5044 static const char * const IVRInput_Version = "IVRInput_010";
5045
5046} // namespace vr
5047
5048// ivriobuffer.h
5049
5050namespace vr
5051{
5052
5053typedef uint64_t IOBufferHandle_t;
5054static const uint64_t k_ulInvalidIOBufferHandle = 0;
5055
5056 enum EIOBufferError
5057 {
5058 IOBuffer_Success = 0,
5059 IOBuffer_OperationFailed = 100,
5060 IOBuffer_InvalidHandle = 101,
5061 IOBuffer_InvalidArgument = 102,
5062 IOBuffer_PathExists = 103,
5063 IOBuffer_PathDoesNotExist = 104,
5064 IOBuffer_Permission = 105,
5065 };
5066
5067 enum EIOBufferMode
5068 {
5069 IOBufferMode_Read = 0x0001,
5070 IOBufferMode_Write = 0x0002,
5071 IOBufferMode_Create = 0x0200,
5072 };
5073
5074 // ----------------------------------------------------------------------------------------------
5075 // Purpose:
5076 // ----------------------------------------------------------------------------------------------
5077 class IVRIOBuffer
5078 {
5079 public:
5080 /** opens an existing or creates a new IOBuffer of unSize bytes */
5081 virtual vr::EIOBufferError Open( const char *pchPath, vr::EIOBufferMode mode, uint32_t unElementSize, uint32_t unElements, vr::IOBufferHandle_t *pulBuffer ) = 0;
5082
5083 /** closes a previously opened or created buffer */
5084 virtual vr::EIOBufferError Close( vr::IOBufferHandle_t ulBuffer ) = 0;
5085
5086 /** reads up to unBytes from buffer into *pDst, returning number of bytes read in *punRead */
5087 virtual vr::EIOBufferError Read( vr::IOBufferHandle_t ulBuffer, void *pDst, uint32_t unBytes, uint32_t *punRead ) = 0;
5088
5089 /** writes unBytes of data from *pSrc into a buffer. */
5090 virtual vr::EIOBufferError Write( vr::IOBufferHandle_t ulBuffer, void *pSrc, uint32_t unBytes ) = 0;
5091
5092 /** retrieves the property container of an buffer. */
5093 virtual vr::PropertyContainerHandle_t PropertyContainer( vr::IOBufferHandle_t ulBuffer ) = 0;
5094
5095 /** inexpensively checks for readers to allow writers to fast-fail potentially expensive copies and writes. */
5096 virtual bool HasReaders( vr::IOBufferHandle_t ulBuffer ) = 0;
5097 };
5098
5099 static const char *IVRIOBuffer_Version = "IVRIOBuffer_002";
5100}
5101
5102// ivrspatialanchors.h
5103
5104namespace vr
5105{
5106 static const SpatialAnchorHandle_t k_ulInvalidSpatialAnchorHandle = 0;
5107
5108 struct SpatialAnchorPose_t
5109 {
5110 HmdMatrix34_t mAnchorToAbsoluteTracking;
5111 };
5112
5113 class IVRSpatialAnchors
5114 {
5115 public:
5116
5117 /** Returns a handle for an spatial anchor described by "descriptor". On success, pHandle
5118 * will contain a handle valid for this session. Caller can wait for an event or occasionally
5119 * poll GetSpatialAnchorPose() to find the virtual coordinate associated with this anchor. */
5120 virtual EVRSpatialAnchorError CreateSpatialAnchorFromDescriptor( const char *pchDescriptor, SpatialAnchorHandle_t *pHandleOut ) = 0;
5121
5122 /** Returns a handle for an new spatial anchor at pPose. On success, pHandle
5123 * will contain a handle valid for this session. Caller can wait for an event or occasionally
5124 * poll GetSpatialAnchorDescriptor() to find the permanent descriptor for this pose.
5125 * The result of GetSpatialAnchorPose() may evolve from this initial position if the driver chooses
5126 * to update it.
5127 * The anchor will be associated with the driver that provides unDeviceIndex, and the driver may use that specific
5128 * device as a hint for how to best create the anchor.
5129 * The eOrigin must match whatever tracking origin you are working in (seated/standing/raw).
5130 * This should be called when the user is close to (and ideally looking at/interacting with) the target physical
5131 * location. At that moment, the driver will have the most information about how to recover that physical point
5132 * in the future, and the quality of the anchor (when the descriptor is re-used) will be highest.
5133 * The caller may decide to apply offsets from this initial pose, but is advised to stay relatively close to the
5134 * original pose location for highest fidelity. */
5135 virtual EVRSpatialAnchorError CreateSpatialAnchorFromPose( TrackedDeviceIndex_t unDeviceIndex, ETrackingUniverseOrigin eOrigin, SpatialAnchorPose_t *pPose, SpatialAnchorHandle_t *pHandleOut ) = 0;
5136
5137 /** Get the pose for a given handle. This is intended to be cheap enough to call every frame (or fairly often)
5138 * so that the driver can refine this position when it has more information available. */
5139 virtual EVRSpatialAnchorError GetSpatialAnchorPose( SpatialAnchorHandle_t unHandle, ETrackingUniverseOrigin eOrigin, SpatialAnchorPose_t *pPoseOut ) = 0;
5140
5141 /** Get the descriptor for a given handle. This will be empty for handles where the driver has not
5142 * yet built a descriptor. It will be the application-supplied descriptor for previously saved anchors
5143 * that the application is requesting poses for. If the driver has called UpdateSpatialAnchorDescriptor()
5144 * already in this session, it will be the descriptor provided by the driver.
5145 * Returns true if the descriptor fits into the buffer, else false. Buffer size should be at least
5146 * k_unMaxSpatialAnchorDescriptorSize. */
5147 virtual EVRSpatialAnchorError GetSpatialAnchorDescriptor( SpatialAnchorHandle_t unHandle, VR_OUT_STRING() char *pchDescriptorOut, uint32_t *punDescriptorBufferLenInOut ) = 0;
5148
5149 };
5150
5151 static const char * const IVRSpatialAnchors_Version = "IVRSpatialAnchors_001";
5152
5153} // namespace vr
5154
5155// ivrdebug.h
5156
5157namespace vr
5158{
5159 enum EVRDebugError
5160 {
5161 VRDebugError_Success = 0,
5162 VRDebugError_BadParameter
5163 };
5164
5165 /** Handle for vr profiler events */
5166 typedef uint64_t VrProfilerEventHandle_t;
5167
5168 class IVRDebug
5169 {
5170 public:
5171
5172 /** Create a vr profiler discrete event (point)
5173 * The event will be associated with the message provided in pchMessage, and the current
5174 * time will be used as the event timestamp. */
5175 virtual EVRDebugError EmitVrProfilerEvent( const char *pchMessage ) = 0;
5176
5177 /** Create an vr profiler duration event (line)
5178 * The current time will be used as the timestamp for the start of the line.
5179 * On success, pHandleOut will contain a handle valid for terminating this event. */
5180 virtual EVRDebugError BeginVrProfilerEvent( VrProfilerEventHandle_t *pHandleOut ) = 0;
5181
5182 /** Terminate a vr profiler event
5183 * The event associated with hHandle will be considered completed when this method is called.
5184 * The current time will be used assocaited to the termination time of the event, and
5185 * pchMessage will be used as the event title. */
5186 virtual EVRDebugError FinishVrProfilerEvent( VrProfilerEventHandle_t hHandle, const char *pchMessage ) = 0;
5187
5188 /** Sends a request to the driver for the specified device and returns the response. The maximum response size is 32k,
5189 * but this method can be called with a smaller buffer. If the response exceeds the size of the buffer, it is truncated.
5190 * The size of the response including its terminating null is returned. */
5191 virtual uint32_t DriverDebugRequest( vr::TrackedDeviceIndex_t unDeviceIndex, const char *pchRequest, VR_OUT_STRING() char *pchResponseBuffer, uint32_t unResponseBufferSize ) = 0;
5192
5193 };
5194
5195 static const char * const IVRDebug_Version = "IVRDebug_001";
5196
5197} // namespace vr
5198// End
5199
5200#endif // _OPENVR_API
5201
5202
5203
5204namespace vr
5205{
5206#if !defined( OPENVR_INTERFACE_INTERNAL )
5207
5208 /** Finds the active installation of the VR API and initializes it. The provided path must be absolute
5209 * or relative to the current working directory. These are the local install versions of the equivalent
5210 * functions in steamvr.h and will work without a local Steam install.
5211 *
5212 * This path is to the "root" of the VR API install. That's the directory with
5213 * the "drivers" directory and a platform (i.e. "win32") directory in it, not the directory with the DLL itself.
5214 *
5215 * pStartupInfo is reserved for future use.
5216 */
5217 inline IVRSystem *VR_Init( EVRInitError *peError, EVRApplicationType eApplicationType, const char *pStartupInfo = nullptr );
5218
5219 /** unloads vrclient.dll. Any interface pointers from the interface are
5220 * invalid after this point */
5221 inline void VR_Shutdown();
5222
5223 /** Returns true if there is an HMD attached. This check is as lightweight as possible and
5224 * can be called outside of VR_Init/VR_Shutdown. It should be used when an application wants
5225 * to know if initializing VR is a possibility but isn't ready to take that step yet.
5226 */
5227 VR_INTERFACE bool VR_CALLTYPE VR_IsHmdPresent();
5228
5229 /** Returns true if the OpenVR runtime is installed. */
5230 VR_INTERFACE bool VR_CALLTYPE VR_IsRuntimeInstalled();
5231
5232 /** Returns where the OpenVR runtime is installed. */
5233 VR_INTERFACE bool VR_GetRuntimePath( VR_OUT_STRING() char *pchPathBuffer, uint32_t unBufferSize, uint32_t *punRequiredBufferSize );
5234
5235 /** Returns the name of the enum value for an EVRInitError. This function may be called outside of VR_Init()/VR_Shutdown(). */
5236 VR_INTERFACE const char *VR_CALLTYPE VR_GetVRInitErrorAsSymbol( EVRInitError error );
5237
5238 /** Returns an English string for an EVRInitError. Applications should call VR_GetVRInitErrorAsSymbol instead and
5239 * use that as a key to look up their own localized error message. This function may be called outside of VR_Init()/VR_Shutdown(). */
5240 VR_INTERFACE const char *VR_CALLTYPE VR_GetVRInitErrorAsEnglishDescription( EVRInitError error );
5241
5242 /** Returns the interface of the specified version. This method must be called after VR_Init. The
5243 * pointer returned is valid until VR_Shutdown is called.
5244 */
5245 VR_INTERFACE void *VR_CALLTYPE VR_GetGenericInterface( const char *pchInterfaceVersion, EVRInitError *peError );
5246
5247 /** Returns whether the interface of the specified version exists.
5248 */
5249 VR_INTERFACE bool VR_CALLTYPE VR_IsInterfaceVersionValid( const char *pchInterfaceVersion );
5250
5251 /** Returns a token that represents whether the VR interface handles need to be reloaded */
5252 VR_INTERFACE uint32_t VR_CALLTYPE VR_GetInitToken();
5253
5254 // These typedefs allow old enum names from SDK 0.9.11 to be used in applications.
5255 // They will go away in the future.
5256 typedef EVRInitError HmdError;
5257 typedef EVREye Hmd_Eye;
5258 typedef EColorSpace ColorSpace;
5259 typedef ETrackingResult HmdTrackingResult;
5260 typedef ETrackedDeviceClass TrackedDeviceClass;
5261 typedef ETrackingUniverseOrigin TrackingUniverseOrigin;
5262 typedef ETrackedDeviceProperty TrackedDeviceProperty;
5263 typedef ETrackedPropertyError TrackedPropertyError;
5264 typedef EVRSubmitFlags VRSubmitFlags_t;
5265 typedef EVRState VRState_t;
5266 typedef ECollisionBoundsStyle CollisionBoundsStyle_t;
5267 typedef EVROverlayError VROverlayError;
5268 typedef EVRFirmwareError VRFirmwareError;
5269 typedef EVRCompositorError VRCompositorError;
5270 typedef EVRScreenshotError VRScreenshotsError;
5271
5272 inline uint32_t &VRToken()
5273 {
5274 static uint32_t token;
5275 return token;
5276 }
5277
5278 class COpenVRContext
5279 {
5280 public:
5281 COpenVRContext() { Clear(); }
5282 void Clear();
5283
5284 inline void CheckClear()
5285 {
5286 if ( VRToken() != VR_GetInitToken() )
5287 {
5288 Clear();
5289 VRToken() = VR_GetInitToken();
5290 }
5291 }
5292
5293 IVRSystem *VRSystem()
5294 {
5295 CheckClear();
5296 if ( m_pVRSystem == nullptr )
5297 {
5298 EVRInitError eError;
5299 m_pVRSystem = ( IVRSystem * )VR_GetGenericInterface( IVRSystem_Version, &eError );
5300 }
5301 return m_pVRSystem;
5302 }
5303 IVRChaperone *VRChaperone()
5304 {
5305 CheckClear();
5306 if ( m_pVRChaperone == nullptr )
5307 {
5308 EVRInitError eError;
5309 m_pVRChaperone = ( IVRChaperone * )VR_GetGenericInterface( IVRChaperone_Version, &eError );
5310 }
5311 return m_pVRChaperone;
5312 }
5313
5314 IVRChaperoneSetup *VRChaperoneSetup()
5315 {
5316 CheckClear();
5317 if ( m_pVRChaperoneSetup == nullptr )
5318 {
5319 EVRInitError eError;
5320 m_pVRChaperoneSetup = ( IVRChaperoneSetup * )VR_GetGenericInterface( IVRChaperoneSetup_Version, &eError );
5321 }
5322 return m_pVRChaperoneSetup;
5323 }
5324
5325 IVRCompositor *VRCompositor()
5326 {
5327 CheckClear();
5328 if ( m_pVRCompositor == nullptr )
5329 {
5330 EVRInitError eError;
5331 m_pVRCompositor = ( IVRCompositor * )VR_GetGenericInterface( IVRCompositor_Version, &eError );
5332 }
5333 return m_pVRCompositor;
5334 }
5335
5336 IVROverlay *VROverlay()
5337 {
5338 CheckClear();
5339 if ( m_pVROverlay == nullptr )
5340 {
5341 EVRInitError eError;
5342 m_pVROverlay = ( IVROverlay * )VR_GetGenericInterface( IVROverlay_Version, &eError );
5343 }
5344 return m_pVROverlay;
5345 }
5346
5347 IVROverlayView *VROverlayView()
5348 {
5349 CheckClear();
5350 if ( m_pVROverlayView == nullptr )
5351 {
5352 EVRInitError eError;
5353 m_pVROverlayView = ( IVROverlayView * ) VR_GetGenericInterface( IVROverlayView_Version, &eError );
5354 }
5355 return m_pVROverlayView;
5356 }
5357
5358 IVRHeadsetView *VRHeadsetView()
5359 {
5360 CheckClear();
5361 if ( m_pVRHeadsetView == nullptr )
5362 {
5363 EVRInitError eError;
5364 m_pVRHeadsetView = ( IVRHeadsetView * ) VR_GetGenericInterface( IVRHeadsetView_Version, &eError );
5365 }
5366 return m_pVRHeadsetView;
5367 }
5368
5369 IVRResources *VRResources()
5370 {
5371 CheckClear();
5372 if ( m_pVRResources == nullptr )
5373 {
5374 EVRInitError eError;
5375 m_pVRResources = (IVRResources *)VR_GetGenericInterface( IVRResources_Version, &eError );
5376 }
5377 return m_pVRResources;
5378 }
5379
5380 IVRScreenshots *VRScreenshots()
5381 {
5382 CheckClear();
5383 if ( m_pVRScreenshots == nullptr )
5384 {
5385 EVRInitError eError;
5386 m_pVRScreenshots = ( IVRScreenshots * )VR_GetGenericInterface( IVRScreenshots_Version, &eError );
5387 }
5388 return m_pVRScreenshots;
5389 }
5390
5391 IVRRenderModels *VRRenderModels()
5392 {
5393 CheckClear();
5394 if ( m_pVRRenderModels == nullptr )
5395 {
5396 EVRInitError eError;
5397 m_pVRRenderModels = ( IVRRenderModels * )VR_GetGenericInterface( IVRRenderModels_Version, &eError );
5398 }
5399 return m_pVRRenderModels;
5400 }
5401
5402 IVRExtendedDisplay *VRExtendedDisplay()
5403 {
5404 CheckClear();
5405 if ( m_pVRExtendedDisplay == nullptr )
5406 {
5407 EVRInitError eError;
5408 m_pVRExtendedDisplay = ( IVRExtendedDisplay * )VR_GetGenericInterface( IVRExtendedDisplay_Version, &eError );
5409 }
5410 return m_pVRExtendedDisplay;
5411 }
5412
5413 IVRSettings *VRSettings()
5414 {
5415 CheckClear();
5416 if ( m_pVRSettings == nullptr )
5417 {
5418 EVRInitError eError;
5419 m_pVRSettings = ( IVRSettings * )VR_GetGenericInterface( IVRSettings_Version, &eError );
5420 }
5421 return m_pVRSettings;
5422 }
5423
5424 IVRApplications *VRApplications()
5425 {
5426 CheckClear();
5427 if ( m_pVRApplications == nullptr )
5428 {
5429 EVRInitError eError;
5430 m_pVRApplications = ( IVRApplications * )VR_GetGenericInterface( IVRApplications_Version, &eError );
5431 }
5432 return m_pVRApplications;
5433 }
5434
5435 IVRTrackedCamera *VRTrackedCamera()
5436 {
5437 CheckClear();
5438 if ( m_pVRTrackedCamera == nullptr )
5439 {
5440 EVRInitError eError;
5441 m_pVRTrackedCamera = ( IVRTrackedCamera * )VR_GetGenericInterface( IVRTrackedCamera_Version, &eError );
5442 }
5443 return m_pVRTrackedCamera;
5444 }
5445
5446 IVRDriverManager *VRDriverManager()
5447 {
5448 CheckClear();
5449 if ( !m_pVRDriverManager )
5450 {
5451 EVRInitError eError;
5452 m_pVRDriverManager = ( IVRDriverManager * )VR_GetGenericInterface( IVRDriverManager_Version, &eError );
5453 }
5454 return m_pVRDriverManager;
5455 }
5456
5457 IVRInput *VRInput()
5458 {
5459 CheckClear();
5460 if ( !m_pVRInput )
5461 {
5462 EVRInitError eError;
5463 m_pVRInput = (IVRInput *)VR_GetGenericInterface( IVRInput_Version, &eError );
5464 }
5465 return m_pVRInput;
5466 }
5467
5468 IVRIOBuffer *VRIOBuffer()
5469 {
5470 if ( !m_pVRIOBuffer )
5471 {
5472 EVRInitError eError;
5473 m_pVRIOBuffer = ( IVRIOBuffer * )VR_GetGenericInterface( IVRIOBuffer_Version, &eError );
5474 }
5475 return m_pVRIOBuffer;
5476 }
5477
5478 IVRSpatialAnchors *VRSpatialAnchors()
5479 {
5480 CheckClear();
5481 if ( !m_pVRSpatialAnchors )
5482 {
5483 EVRInitError eError;
5484 m_pVRSpatialAnchors = (IVRSpatialAnchors *)VR_GetGenericInterface( IVRSpatialAnchors_Version, &eError );
5485 }
5486 return m_pVRSpatialAnchors;
5487 }
5488
5489 IVRDebug *VRDebug()
5490 {
5491 CheckClear();
5492 if ( !m_pVRDebug )
5493 {
5494 EVRInitError eError;
5495 m_pVRDebug = (IVRDebug *)VR_GetGenericInterface( IVRDebug_Version, &eError );
5496 }
5497 return m_pVRDebug;
5498 }
5499
5500 IVRNotifications *VRNotifications()
5501 {
5502 CheckClear();
5503 if ( !m_pVRNotifications )
5504 {
5505 EVRInitError eError;
5506 m_pVRNotifications = ( IVRNotifications * )VR_GetGenericInterface( IVRNotifications_Version, &eError );
5507 }
5508 return m_pVRNotifications;
5509 }
5510
5511 private:
5512 IVRSystem *m_pVRSystem;
5513 IVRChaperone *m_pVRChaperone;
5514 IVRChaperoneSetup *m_pVRChaperoneSetup;
5515 IVRCompositor *m_pVRCompositor;
5516 IVRHeadsetView *m_pVRHeadsetView;
5517 IVROverlay *m_pVROverlay;
5518 IVROverlayView *m_pVROverlayView;
5519 IVRResources *m_pVRResources;
5520 IVRRenderModels *m_pVRRenderModels;
5521 IVRExtendedDisplay *m_pVRExtendedDisplay;
5522 IVRSettings *m_pVRSettings;
5523 IVRApplications *m_pVRApplications;
5524 IVRTrackedCamera *m_pVRTrackedCamera;
5525 IVRScreenshots *m_pVRScreenshots;
5526 IVRDriverManager *m_pVRDriverManager;
5527 IVRInput *m_pVRInput;
5528 IVRIOBuffer *m_pVRIOBuffer;
5529 IVRSpatialAnchors *m_pVRSpatialAnchors;
5530 IVRDebug *m_pVRDebug;
5531 IVRNotifications *m_pVRNotifications;
5532 };
5533
5534 inline COpenVRContext &OpenVRInternal_ModuleContext()
5535 {
5536 static void *ctx[ sizeof( COpenVRContext ) / sizeof( void * ) ];
5537 return *( COpenVRContext * )ctx; // bypass zero-init constructor
5538 }
5539
5540 inline IVRSystem *VR_CALLTYPE VRSystem() { return OpenVRInternal_ModuleContext().VRSystem(); }
5541 inline IVRChaperone *VR_CALLTYPE VRChaperone() { return OpenVRInternal_ModuleContext().VRChaperone(); }
5542 inline IVRChaperoneSetup *VR_CALLTYPE VRChaperoneSetup() { return OpenVRInternal_ModuleContext().VRChaperoneSetup(); }
5543 inline IVRCompositor *VR_CALLTYPE VRCompositor() { return OpenVRInternal_ModuleContext().VRCompositor(); }
5544 inline IVROverlay *VR_CALLTYPE VROverlay() { return OpenVRInternal_ModuleContext().VROverlay(); }
5545 inline IVROverlayView *VR_CALLTYPE VROverlayView() { return OpenVRInternal_ModuleContext().VROverlayView(); }
5546 inline IVRHeadsetView *VR_CALLTYPE VRHeadsetView() { return OpenVRInternal_ModuleContext().VRHeadsetView(); }
5547 inline IVRScreenshots *VR_CALLTYPE VRScreenshots() { return OpenVRInternal_ModuleContext().VRScreenshots(); }
5548 inline IVRRenderModels *VR_CALLTYPE VRRenderModels() { return OpenVRInternal_ModuleContext().VRRenderModels(); }
5549 inline IVRApplications *VR_CALLTYPE VRApplications() { return OpenVRInternal_ModuleContext().VRApplications(); }
5550 inline IVRSettings *VR_CALLTYPE VRSettings() { return OpenVRInternal_ModuleContext().VRSettings(); }
5551 inline IVRResources *VR_CALLTYPE VRResources() { return OpenVRInternal_ModuleContext().VRResources(); }
5552 inline IVRExtendedDisplay *VR_CALLTYPE VRExtendedDisplay() { return OpenVRInternal_ModuleContext().VRExtendedDisplay(); }
5553 inline IVRTrackedCamera *VR_CALLTYPE VRTrackedCamera() { return OpenVRInternal_ModuleContext().VRTrackedCamera(); }
5554 inline IVRDriverManager *VR_CALLTYPE VRDriverManager() { return OpenVRInternal_ModuleContext().VRDriverManager(); }
5555 inline IVRInput *VR_CALLTYPE VRInput() { return OpenVRInternal_ModuleContext().VRInput(); }
5556 inline IVRIOBuffer *VR_CALLTYPE VRIOBuffer() { return OpenVRInternal_ModuleContext().VRIOBuffer(); }
5557 inline IVRSpatialAnchors *VR_CALLTYPE VRSpatialAnchors() { return OpenVRInternal_ModuleContext().VRSpatialAnchors(); }
5558 inline IVRNotifications *VR_CALLTYPE VRNotifications() { return OpenVRInternal_ModuleContext().VRNotifications(); }
5559 inline IVRDebug *VR_CALLTYPE VRDebug() { return OpenVRInternal_ModuleContext().VRDebug(); }
5560
5561 inline void COpenVRContext::Clear()
5562 {
5563 m_pVRSystem = nullptr;
5564 m_pVRChaperone = nullptr;
5565 m_pVRChaperoneSetup = nullptr;
5566 m_pVRCompositor = nullptr;
5567 m_pVROverlay = nullptr;
5568 m_pVROverlayView = nullptr;
5569 m_pVRHeadsetView = nullptr;
5570 m_pVRRenderModels = nullptr;
5571 m_pVRExtendedDisplay = nullptr;
5572 m_pVRSettings = nullptr;
5573 m_pVRApplications = nullptr;
5574 m_pVRTrackedCamera = nullptr;
5575 m_pVRResources = nullptr;
5576 m_pVRScreenshots = nullptr;
5577 m_pVRDriverManager = nullptr;
5578 m_pVRInput = nullptr;
5579 m_pVRIOBuffer = nullptr;
5580 m_pVRSpatialAnchors = nullptr;
5581 m_pVRNotifications = nullptr;
5582 m_pVRDebug = nullptr;
5583 }
5584
5585 VR_INTERFACE uint32_t VR_CALLTYPE VR_InitInternal2( EVRInitError *peError, EVRApplicationType eApplicationType, const char *pStartupInfo );
5586 VR_INTERFACE void VR_CALLTYPE VR_ShutdownInternal();
5587
5588 /** Finds the active installation of vrclient.dll and initializes it */
5589 inline IVRSystem *VR_Init( EVRInitError *peError, EVRApplicationType eApplicationType, const char *pStartupInfo )
5590 {
5591 IVRSystem *pVRSystem = nullptr;
5592
5593 EVRInitError eError;
5594 VRToken() = VR_InitInternal2( &eError, eApplicationType, pStartupInfo );
5595 COpenVRContext &ctx = OpenVRInternal_ModuleContext();
5596 ctx.Clear();
5597
5598 if ( eError == VRInitError_None )
5599 {
5600 if ( VR_IsInterfaceVersionValid( IVRSystem_Version ) )
5601 {
5602 pVRSystem = VRSystem();
5603 }
5604 else
5605 {
5606 VR_ShutdownInternal();
5607 eError = VRInitError_Init_InterfaceNotFound;
5608 }
5609 }
5610
5611 if ( peError )
5612 *peError = eError;
5613 return pVRSystem;
5614 }
5615
5616 /** unloads vrclient.dll. Any interface pointers from the interface are
5617 * invalid after this point */
5618 inline void VR_Shutdown()
5619 {
5620 VR_ShutdownInternal();
5621 }
5622
5623#endif // OPENVR_INTERFACE_INTERNAL
5624}